def test_happy_path(component): flavor = Flavor() flavor.save() pk = component.get_pk({"name": "flavor", "pk": flavor.pk}, 1) assert pk == flavor.pk assert 1 == component.something
def test_model_many_to_many(django_assert_num_queries): flavor_one = Flavor(name="name1", label="label1") flavor_one.save() taste1 = Taste(name="Bitter1") taste1.save() taste2 = Taste(name="Bitter2") taste2.save() taste3 = Taste(name="Bitter3") taste3.save() flavor_one.taste_set.add(taste1) flavor_one.taste_set.add(taste2) flavor_one.taste_set.add(taste3) with django_assert_num_queries(2): actual = serializer.dumps(flavor_one) expected = { "name": "name1", "label": "label1", "parent": None, "float_value": None, "decimal_value": None, "uuid": str(flavor_one.uuid), "datetime": None, "date": None, "time": None, "duration": None, "pk": 1, "taste_set": [taste1.pk, taste2.pk, taste3.pk], "origins": [], } assert expected == json.loads(actual)
def test_get_model_dict_many_to_many_is_referenced(): taste = Taste(name="Bitter") taste.save() flavor_one = Flavor(name="name1", label="label1") flavor_one.save() flavor_one.taste_set.add(taste) actual = serializer._get_model_dict(flavor_one) expected = { "pk": 1, "name": "name1", "label": "label1", "parent": None, "decimal_value": None, "float_value": None, "uuid": str(flavor_one.uuid), "date": None, "datetime": None, "time": None, "duration": None, "taste_set": [taste.pk], "origins": [], } assert expected == actual
def test_message_db_input_update(client): flavor = Flavor(id=1, name="Enzymatic-Flowery") flavor.save() data = {"flavors": [{"pk": flavor.pk, "title": flavor.name}]} message = { "actionQueue": [ { "payload": { "model": "flavors", "db": { "pk": flavor.pk, "name": "flavor" }, "fields": { "name": "Flowery-Floral" }, }, "type": "dbInput", }, { "type": "callMethod", "payload": { "name": "$refresh", "params": [] } }, ], "data": data, "checksum": generate_checksum(orjson.dumps(data)), "id": "FDHcbzGf", } response = client.post( "/message/tests.views.fake_components.FakeModelComponent", message, content_type="application/json", ) flavor = Flavor.objects.get(id=1) assert flavor.name == "Flowery-Floral" body = orjson.loads(response.content) assert not body["errors"] assert body["data"] == { "flavors": [{ "pk": 1, "name": "Flowery-Floral", "decimal_value": None, "float_value": None, "label": "", "parent": None, }] }
def test_get_model_dict_many_to_many_references_model(): taste = Taste(name="Bitter") taste.save() flavor_one = Flavor(name="name1", label="label1") flavor_one.save() flavor_one.taste_set.add(taste) actual = serializer._get_model_dict(taste) expected = {"name": taste.name, "flavor": [flavor_one.pk], "pk": taste.pk} assert expected == actual
def test_model(): flavor = Flavor(name="first-flavor") flavor.save() str_data = dumps({"flavor": flavor}) data = loads(str_data) flavor_data = data["flavor"] actual = _construct_model(Flavor, flavor_data) assert actual.pk == flavor.id assert actual.name == flavor.name assert actual.parent is None
class ModelsView(UnicornView): flavors = Flavor.objects.none() # Demonstrates how to use an instantiated model; class attributes get stored on # the class, so django-unicorn handles clearing this with `_resettable_attributes_cache` # in components.py class_flavor: Flavor = Flavor() def __init__(self, **kwargs): # Demonstrates how to use an instance variable on the class self.instance_flavor = Flavor() # super() `has` to be called at the end super().__init__(**kwargs) def hydrate(self): # Using `hydrate` is the best way to make sure that QuerySets # are re-queried every time the component is loaded self.flavors = Flavor.objects.all().order_by("-id")[:2] def add_instance_flavor(self): self.instance_flavor.save() id = self.instance_flavor.id self.reset() # return HashUpdate(f"#createdId={id}") return LocationUpdate(redirect(f"/models?createdId={id}"), title="new title") def add_class_flavor(self): self.class_flavor.save() id = self.class_flavor.id self.reset() # Note: this can cause inputs to appear to be cached return redirect(f"/models?createdId={id}") @db_model def delete(self, model): model.delete() @cached_property def available_flavors(self): flavors = Flavor.objects.all() if self.instance_flavor and self.instance_flavor.pk: return flavors.exclude(pk=self.instance_flavor.pk) return flavors class Meta: db_models = [DbModel("flavor", Flavor)]
class FakeComponent(UnicornView): string = "property_view" integer = 99 datetime = datetime(2020, 1, 1) array: List[str] = [] model = Flavor(name="initial-flavor") queryset = Flavor.objects.none()
def test_get_model_dict(): flavor_one = Flavor(name="name1", label="label1") actual = serializer._get_model_dict(flavor_one) expected = {"pk": None, "name": "name1", "label": "label1", "parent": None} assert expected == actual
class ModelsView(UnicornView): flavor: Flavor = Flavor() flavors: QuerySetType[Flavor] = Flavor.objects.none() def mount(self): self.refresh_flavors() def refresh_flavors(self): self.flavors = Flavor.objects.all().order_by("-id")[:2] def save_flavor(self): self.flavor.save() self.flavor = Flavor() self.refresh_flavors() def save(self, flavor_idx: int): flavor_data = self.flavors[flavor_idx] flavor_data.save() def delete(self, flavor_to_delete: Flavor): flavor_to_delete.delete() self.refresh_flavors() def available_flavors(self): return Flavor.objects.all() class Meta: javascript_exclude = ("available_flavors", )
def test_model_value_one_field(): expected = {"name": "flavor-1"} flavor = Flavor(name="flavor-1") actual = model_value(flavor, "name") assert expected == actual
class FakeComponent(UnicornView): string = "property_view" integer = 99 datetime = datetime(2020, 1, 1) array: List[str] = [] model = Flavor(name="test-initial") queryset = Flavor.objects.none() queryset_with_typehint: QuerySetType[Flavor] = []
def test_queryset_values(): test_component = FakeComponent(component_name="test", component_id="asdf") assert test_component.flavors.count() == 0 flavor = Flavor(name="values-first-flavor") flavor.save() flavors = Flavor.objects.filter(name="values-first-flavor").values("uuid") str_data = dumps({"flavors": flavors}) data = loads(str_data) flavors_data = data["flavors"] set_property_from_data(test_component, "flavors", flavors_data) assert test_component.flavors.count() == 1 assert test_component.flavors[0].uuid == str(flavor.uuid) assert test_component.flavors[0].id is None
def test_model_many_to_many_with_excludes(django_assert_num_queries): flavor_one = Flavor(name="name1", label="label1") flavor_one.save() taste1 = Taste(name="Bitter1") taste1.save() taste2 = Taste(name="Bitter2") taste2.save() taste3 = Taste(name="Bitter3") taste3.save() flavor_one.taste_set.add(taste1) flavor_one.taste_set.add(taste2) flavor_one.taste_set.add(taste3) flavor_one = Flavor.objects.prefetch_related( "taste_set", "origins").get(pk=flavor_one.pk) # This shouldn't make any database calls because of the prefetch_related with django_assert_num_queries(0): actual = serializer.dumps( {"flavor": flavor_one}, exclude_field_attributes=( "flavor.taste_set", "flavor.origins", ), ) expected = { "flavor": { "name": "name1", "label": "label1", "parent": None, "float_value": None, "decimal_value": None, "uuid": str(flavor_one.uuid), "datetime": None, "date": None, "time": None, "duration": None, "pk": 1, } } assert expected == json.loads(actual)
def test_set_property_value_many_to_many_is_referenced(): component = FakeComponent(component_name="test", component_id="12345678") component.model.save() assert component.model.taste_set.count() == 0 taste = Taste(name="Bitter") taste.save() flavor = Flavor(name="test-flavor") flavor.save() flavor.taste_set.add(taste) data = {"model": {}} set_property_value( component, "model.taste_set", [taste.pk], data, ) assert data["model"]["taste_set"] == [taste.pk] assert component.model.taste_set.count() == 1
def test_model_value_multiple_field(): expected = { "pk": 77, "name": "flavor-1", } flavor = Flavor(name="flavor-1", id=77) actual = model_value(flavor, "pk", "name") assert expected == actual
def test_dumps_queryset(db): flavor_one = Flavor(name="name1", label="label1") flavor_one.save() flavor_two = Flavor(name="name2", label="label2", parent=flavor_one) flavor_two.save() flavors = Flavor.objects.all() expected = '{"flavors":[{"name":"name1","label":"label1","parent":null,"float_value":null,"decimal_value":null,"pk":1},{"name":"name2","label":"label2","parent":1,"float_value":null,"decimal_value":null,"pk":2}]}' actual = serializer.dumps({"flavors": flavors}) assert expected == actual
def test_set_property_value_model(): component = FakeComponent(component_name="test", component_id="12345678") assert "initial-flavor" == component.model.name set_property_value( component, "model", Flavor(name="test-flavor"), {"model": {"name": "test-flavor"}}, ) assert "test-flavor" == component.model.name
def test_get_model_dict_many_to_many_is_referenced_prefetched( django_assert_num_queries, ): flavor_one = Flavor(name="name1", label="label1") flavor_one.save() taste1 = Taste(name="Bitter") taste1.save() taste2 = Taste(name="Bitter2") taste2.save() taste3 = Taste(name="Bitter3") taste3.save() flavor_one.taste_set.add(taste1) flavor_one.taste_set.add(taste2) flavor_one.taste_set.add(taste3) expected = { "pk": 1, "name": "name1", "label": "label1", "parent": None, "decimal_value": None, "float_value": None, "uuid": str(flavor_one.uuid), "date": None, "datetime": None, "time": None, "duration": None, "taste_set": [taste1.pk, taste2.pk, taste3.pk], "origins": [], } flavor_one = (Flavor.objects.prefetch_related("taste_set").filter( id=flavor_one.id).first()) # prefetch_related should reduce the database calls with django_assert_num_queries(1): actual = serializer._get_model_dict(flavor_one) assert expected == actual
def test_set_property_value_model(): component = FakeComponent(component_name="test", component_id="12345678") assert "initial-flavor" == component.model.name model = Flavor(name="test-flavor") data = {"model": {}} set_property_value( component, "model", model, data, ) assert component.model.name == model.name assert data["model"] == model
def test_model_foreign_key(): parent = Flavor(name="parent-flavor") parent.save() flavor = Flavor(name="first-flavor", parent=parent) flavor.save() str_data = dumps({"flavor": flavor}) data = loads(str_data) flavor_data = data["flavor"] actual = _construct_model(Flavor, flavor_data) assert actual.pk == flavor.id assert actual.name == flavor.name assert actual.parent.pk == parent.id assert actual.parent.name == parent.name
def test_set_property_value_queryset(): component = FakeComponent(component_name="test", component_id="12345678") assert len(component.queryset) == 0 flavor_one = Flavor(name="test-flavor-one") flavor_one.save() flavor_two = Flavor(name="test-flavor-two") flavor_two.save() queryset = Flavor.objects.all()[:2] data = {"queryset": []} set_property_value( component, "queryset", queryset, data, ) assert len(queryset) == 2 assert data["queryset"] == queryset
def test_dumps_queryset(db): flavor_one = Flavor(name="name1", label="label1") flavor_one.save() flavor_two = Flavor(name="name2", label="label2", parent=flavor_one) flavor_two.save() flavors = Flavor.objects.all() expected_data = { "flavors": [ { "name": "name1", "label": "label1", "parent": None, "float_value": None, "decimal_value": None, "uuid": str(flavor_one.uuid), "date": None, "datetime": None, "time": None, "duration": None, "pk": 1, "taste_set": [], "origins": [], }, { "name": "name2", "label": "label2", "parent": 1, "float_value": None, "decimal_value": None, "uuid": str(flavor_two.uuid), "date": None, "datetime": None, "time": None, "duration": None, "pk": 2, "taste_set": [], "origins": [], }, ] } actual = serializer.dumps({"flavors": flavors}) assert expected_data == json.loads(actual)
def test_unicorn_render_parent_with_model_pk(settings): settings.DEBUG = True token = Token( TokenType.TEXT, "unicorn 'tests.templatetags.test_unicorn_render.FakeComponentKwargs' parent=view model=model", ) unicorn_node = unicorn(None, token) view = FakeComponentParent(component_name="test", component_id="asdf") flavor = Flavor(pk=187) context = {"view": view, "model": flavor} unicorn_node.render(context) assert ( unicorn_node.component_id == "asdf:tests.templatetags.test_unicorn_render.FakeComponentKwargs:187")
def test_construct_model_recursive_foreign_key(): flavor = Flavor(name="first-flavor") flavor.save() parent = Flavor(name="parent-flavor") parent.save() model_data = { "pk": flavor.pk, "name": flavor.name, "parent": parent.pk, } actual = _construct_model(Flavor, model_data) assert actual.pk == flavor.pk assert actual.name == flavor.name assert actual.parent.pk == parent.pk assert actual.parent.name == parent.name
def test_set_property_value_queryset(): component = FakeComponent(component_name="test", component_id="12345678") assert len(component.queryset) == 0 flavor_one = Flavor(name="test-flavor-one") flavor_one.save() flavor_two = Flavor(name="test-flavor-two") flavor_two.save() queryset = Flavor.objects.all()[:2] set_property_value( component, "queryset", queryset, {"queryset": [{"name": "test-flavor-one"}, {"name": "test-flavor-two"}]}, ) assert len(queryset) == 2
def test_set_property_value_array(): flavor_one = Flavor(name="initial 1") flavor_one.save() flavor_two = Flavor(name="initial 2") flavor_two.save() component = FakeComponent(component_name="test", component_id="12345678") set_property_value( component, "flavors.0.name", "test 1", {"flavors": [{ "name": "test" }, { "name": "something" }]}, ) assert component.flavors[0].name == "test 1"
def test_set_property_value_foreign_key(): flavor = Flavor(name="initial 1") flavor.save() parent = Flavor(name="initial 2") parent.save() component = FakeComponent(component_name="test", component_id="12345678") set_property_value( component, "flavors.0.parent", parent.pk, {"flavors": [ { "name": flavor.name, "parent": None }, ]}, ) assert component.flavors[0].parent_id == parent.pk
def test_get_model_dict(): flavor_one = Flavor(name="name1", label="label1") actual = serializer._get_model_dict(flavor_one) expected = { "pk": None, "name": "name1", "label": "label1", "parent": None, "decimal_value": None, "float_value": None, "uuid": str(flavor_one.uuid), "date": None, "datetime": None, "time": None, "duration": None, } assert expected == actual
def test_model_value_all_fields(): flavor = Flavor(name="flavor-1") expected = { "date": None, "datetime": None, "decimal_value": None, "duration": None, "float_value": None, "name": flavor.name, "label": "", "parent": None, "pk": None, "time": None, "uuid": str(flavor.uuid), } actual = model_value(flavor) assert expected == actual