Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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,
        }]
    }
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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)]
Exemplo n.º 8
0
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()
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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", )
Exemplo n.º 11
0
def test_model_value_one_field():
    expected = {"name": "flavor-1"}

    flavor = Flavor(name="flavor-1")
    actual = model_value(flavor, "name")

    assert expected == actual
Exemplo n.º 12
0
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] = []
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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
Exemplo n.º 19
0
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
Exemplo n.º 20
0
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
Exemplo n.º 21
0
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
Exemplo n.º 22
0
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
Exemplo n.º 23
0
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)
Exemplo n.º 24
0
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")
Exemplo n.º 25
0
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
Exemplo n.º 26
0
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
Exemplo n.º 27
0
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"
Exemplo n.º 28
0
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
Exemplo n.º 29
0
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
Exemplo n.º 30
0
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