1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
|
import pytest
from . import test_registries
import persisting_theory
persisting_theory.meta_registry.look_into = "test_registries"
TEST_APPS = (
"tests.app1",
"tests.app2",
)
def test_can_infer_name_from_class_function_and_instance():
registry = persisting_theory.Registry()
def something():
pass
class MyClass:
pass
assert registry.get_object_name(something) == "something"
assert registry.get_object_name(MyClass) == "MyClass"
with pytest.raises(ValueError):
assert registry.get_object_name(MyClass()) == "MyClass"
def test_can_register_data_to_registry():
data = "something"
registry = persisting_theory.Registry()
registry.register(data, name="key")
assert len(registry) == 1
assert registry.get("key") == data
def test_can_restric_registered_data():
class RestrictedRegistry(persisting_theory.Registry):
def validate(self, obj):
"""Only accept integer values"""
return isinstance(obj, int)
registry = RestrictedRegistry()
registry.register(12, name="twelve")
with pytest.raises(ValueError):
registry.register("not an int", name="not an int")
def test_can_register_class_and_function_via_decorator():
registry = persisting_theory.Registry()
@registry.register
class ToRegister:
pass
assert registry.get("ToRegister") == ToRegister
@registry.register
def something():
pass
assert registry.get("something") == something
def test_can_register_via_decorator_using_custom_name():
registry = persisting_theory.Registry()
@registry.register(name="custom_name")
def something():
pass
assert registry.get("custom_name") == something
def test_meta_registry_can_autodiscovering_registries_and_trigger_their_autodiscover_method():
registry = persisting_theory.meta_registry
registry.autodiscover(apps=TEST_APPS)
assert len(registry) == 2
assert registry.get("awesome_people") == test_registries.awesome_people
assert registry.get("vegetable_registry") == test_registries.vegetable_registry
registry = test_registries.awesome_people
assert len(registry) == 2
assert registry.get("AlainDamasio", None) is not None
assert registry.get("FrederikPeeters", None) is not None
registry = test_registries.vegetable_registry
assert len(registry) == 2
assert registry.get("Potato", None) is not None
assert registry.get("Ketchup", None) is not None
def test_registry_can_autodiscover():
registry = test_registries.awesome_people
registry.autodiscover(apps=TEST_APPS)
assert len(registry) == 2
assert registry.get("AlainDamasio", None) is not None
assert registry.get("FrederikPeeters", None) is not None
registry.clear()
def test_autodiscover_raises_an_error_if_there_is_an_error_in_imported_module():
with pytest.raises(NameError):
registry = test_registries.awesome_people
registry.autodiscover(apps=("tests.buggy_app",))
def test_can_manipulate_data_before_registering():
class ModifyData(persisting_theory.Registry):
def prepare_data(self, data):
return "hello " + data
r = ModifyData()
r.register("agate", name="agate")
r.register("roger", name="roger")
assert r.get("agate") == "hello agate"
assert r.get("roger") == "hello roger"
def test_can_manipulate_key_before_registering():
class ModifyKey(persisting_theory.Registry):
def prepare_name(self, data, key=None):
return "custom_key " + data.first_name
r = ModifyKey()
class N:
def __init__(self, first_name):
self.first_name = first_name
n1 = N(first_name="agate")
n2 = N(first_name="alain")
r.register(n1)
r.register(n2)
assert r.get("custom_key agate") == n1
assert r.get("custom_key alain") == n2
def test_can_post_register_triggers_correctly():
class PostRegisterException(Exception):
pass
class PostRegister(persisting_theory.Registry):
def post_register(self, data, name):
raise PostRegisterException("Post register triggered")
r = PostRegister()
with pytest.raises(PostRegisterException):
r.register("hello", name="world")
class FakeObject(object):
def __init__(self, name, **kwargs):
self.name = name
for key, value in kwargs.items():
setattr(self, key, value)
def __repr__(self):
return self.name
@pytest.fixture
def parents():
return [
FakeObject(name="parent_1"),
FakeObject(name="parent_2"),
]
@pytest.fixture
def objects(parents):
return [
FakeObject(name="test_1", order=2, a=1, parent=parents[0]),
FakeObject(name="test_2", order=3, a=1, parent=parents[0]),
FakeObject(name="test_3", order=1, a=2, parent=parents[1]),
FakeObject(name="test_4", order=4, a=2, parent=parents[1]),
]
@pytest.fixture
def registry(objects):
class R(persisting_theory.Registry):
def prepare_name(self, data, key=None):
return data.name
registry = R()
for o in objects:
registry.register(o)
return registry
def test_default_order(registry, objects):
assert list(registry.objects.all()) == objects
def test_can_get_using_attribute(registry, objects):
assert registry.objects.get(name="test_1") == objects[0]
def test_can_filter(registry, objects):
assert registry.objects.filter(a=1) == objects[:2]
def test_can_combine_filters(registry, objects):
assert registry.objects.filter(a=1, name="test_2") == objects[1:2]
assert registry.objects.filter(a=1).filter(name="test_2") == objects[1:2]
def test_related_lookups(registry, objects):
assert registry.objects.filter(parent__name="parent_1") == objects[:2]
assert registry.objects.exclude(parent__name="parent_1") == objects[2:]
assert registry.objects.get(parent__name="parent_1", order=2) == objects[0]
def test_can_exclude(registry, objects):
assert registry.objects.exclude(a=1) == objects[2:]
def test_can_combine_exclude(registry, objects):
assert registry.objects.exclude(a=1).exclude(name="test_4") == objects[2:3]
assert registry.objects.exclude(a=2, name="test_4") == objects[:3]
def test_can_count(registry):
assert registry.objects.filter(a=1).count() == 2
def test_first(registry):
assert registry.objects.filter(a=123).first() is None
assert registry.objects.filter(a=1).first() is not None
def test_ordering(registry, objects):
assert registry.objects.order_by("order")[:2] == [objects[2], objects[0]]
assert registry.objects.order_by("-order")[:2] == [objects[3], objects[1]]
def test_last(registry):
assert registry.objects.filter(a=123).last() is None
assert registry.objects.filter(a=1).last() is not None
def test_exists(registry):
assert registry.objects.filter(a=123).exists() is False
assert registry.objects.filter(a=1).exists() is True
def test_get_raise_exception_on_multiple_objects_returned(registry):
with pytest.raises(persisting_theory.MultipleObjectsReturned):
registry.objects.get(a=1)
def test_get_raise_exception_on_does_not_exist(registry):
with pytest.raises(persisting_theory.DoesNotExist):
registry.objects.get(a=123)
|