|
@@ -0,0 +1,182 @@
|
|
|
+# This module is a copy paste of test_repository.py
|
|
|
+
|
|
|
+from typing import List
|
|
|
+from unittest import mock
|
|
|
+
|
|
|
+import pytest
|
|
|
+
|
|
|
+from clean_python import BadRequest
|
|
|
+from clean_python import DoesNotExist
|
|
|
+from clean_python import Filter
|
|
|
+from clean_python import InMemorySyncGateway
|
|
|
+from clean_python import Page
|
|
|
+from clean_python import PageOptions
|
|
|
+from clean_python import RootEntity
|
|
|
+from clean_python import SyncRepository
|
|
|
+
|
|
|
+
|
|
|
+class User(RootEntity):
|
|
|
+ name: str
|
|
|
+
|
|
|
+
|
|
|
+@pytest.fixture
|
|
|
+def users():
|
|
|
+ return [
|
|
|
+ User.create(id=1, name="a"),
|
|
|
+ User.create(id=2, name="b"),
|
|
|
+ User.create(id=3, name="c"),
|
|
|
+ ]
|
|
|
+
|
|
|
+
|
|
|
+class UserSyncRepository(SyncRepository[User]):
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+@pytest.fixture
|
|
|
+def user_repository(users: List[User]):
|
|
|
+ return UserSyncRepository(
|
|
|
+ gateway=InMemorySyncGateway(data=[x.model_dump() for x in users])
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+@pytest.fixture
|
|
|
+def page_options():
|
|
|
+ return PageOptions(limit=10, offset=0, order_by="id")
|
|
|
+
|
|
|
+
|
|
|
+def test_entity_attr(user_repository):
|
|
|
+ assert user_repository.entity is User
|
|
|
+
|
|
|
+
|
|
|
+def test_get(user_repository):
|
|
|
+ actual = user_repository.get(1)
|
|
|
+ assert actual.name == "a"
|
|
|
+
|
|
|
+
|
|
|
+def test_get_does_not_exist(user_repository):
|
|
|
+ with pytest.raises(DoesNotExist):
|
|
|
+ user_repository.get(4)
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(SyncRepository, "filter")
|
|
|
+def test_all(filter_m, user_repository, page_options):
|
|
|
+ filter_m.return_value = Page(total=0, items=[])
|
|
|
+ assert user_repository.all(page_options) is filter_m.return_value
|
|
|
+
|
|
|
+ filter_m.assert_called_once_with([], params=page_options)
|
|
|
+
|
|
|
+
|
|
|
+def test_add(user_repository: UserSyncRepository):
|
|
|
+ actual = user_repository.add(User.create(name="d"))
|
|
|
+ assert actual.name == "d"
|
|
|
+ assert user_repository.gateway.data[4] == actual.model_dump()
|
|
|
+
|
|
|
+
|
|
|
+def test_add_json(user_repository: UserSyncRepository):
|
|
|
+ actual = user_repository.add({"name": "d"})
|
|
|
+ assert actual.name == "d"
|
|
|
+ assert user_repository.gateway.data[4] == actual.model_dump()
|
|
|
+
|
|
|
+
|
|
|
+def test_add_json_validates(user_repository: UserSyncRepository):
|
|
|
+ with pytest.raises(BadRequest):
|
|
|
+ user_repository.add({"id": "d"})
|
|
|
+
|
|
|
+
|
|
|
+def test_update(user_repository: UserSyncRepository):
|
|
|
+ actual = user_repository.update(id=2, values={"name": "d"})
|
|
|
+ assert actual.name == "d"
|
|
|
+ assert user_repository.gateway.data[2] == actual.model_dump()
|
|
|
+
|
|
|
+
|
|
|
+def test_update_does_not_exist(user_repository: UserSyncRepository):
|
|
|
+ with pytest.raises(DoesNotExist):
|
|
|
+ user_repository.update(id=4, values={"name": "d"})
|
|
|
+
|
|
|
+
|
|
|
+def test_update_validates(user_repository: UserSyncRepository):
|
|
|
+ with pytest.raises(BadRequest):
|
|
|
+ user_repository.update(id=2, values={"id": 6})
|
|
|
+
|
|
|
+
|
|
|
+def test_remove(user_repository: UserSyncRepository):
|
|
|
+ assert user_repository.remove(2)
|
|
|
+ assert 2 not in user_repository.gateway.data
|
|
|
+
|
|
|
+
|
|
|
+def test_remove_does_not_exist(user_repository: UserSyncRepository):
|
|
|
+ assert not user_repository.remove(4)
|
|
|
+
|
|
|
+
|
|
|
+def test_upsert_updates(user_repository: UserSyncRepository):
|
|
|
+ actual = user_repository.upsert(User.create(id=2, name="d"))
|
|
|
+ assert actual.name == "d"
|
|
|
+ assert user_repository.gateway.data[2] == actual.model_dump()
|
|
|
+
|
|
|
+
|
|
|
+def test_upsert_adds(user_repository: UserSyncRepository):
|
|
|
+ actual = user_repository.upsert(User.create(id=4, name="d"))
|
|
|
+ assert actual.name == "d"
|
|
|
+ assert user_repository.gateway.data[4] == actual.model_dump()
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(InMemorySyncGateway, "count")
|
|
|
+def test_filter(count_m, user_repository: UserSyncRepository, users):
|
|
|
+ actual = user_repository.filter([Filter(field="name", values=["b"])])
|
|
|
+ assert actual == Page(total=1, items=[users[1]], limit=None, offest=None)
|
|
|
+ assert not count_m.called
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(InMemorySyncGateway, "count")
|
|
|
+def test_filter_with_pagination(
|
|
|
+ count_m, user_repository: UserSyncRepository, users, page_options
|
|
|
+):
|
|
|
+ actual = user_repository.filter([Filter(field="name", values=["b"])], page_options)
|
|
|
+ assert actual == Page(
|
|
|
+ total=1, items=[users[1]], limit=page_options.limit, offset=page_options.offset
|
|
|
+ )
|
|
|
+ assert not count_m.called
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.parametrize(
|
|
|
+ "page_options",
|
|
|
+ [
|
|
|
+ PageOptions(limit=3, offset=0, order_by="id"),
|
|
|
+ PageOptions(limit=10, offset=1, order_by="id"),
|
|
|
+ ],
|
|
|
+)
|
|
|
+@mock.patch.object(InMemorySyncGateway, "count")
|
|
|
+def test_filter_with_pagination_calls_count(
|
|
|
+ count_m, user_repository: UserSyncRepository, users, page_options
|
|
|
+):
|
|
|
+ count_m.return_value = 123
|
|
|
+ actual = user_repository.filter([], page_options)
|
|
|
+ assert actual == Page(
|
|
|
+ total=count_m.return_value,
|
|
|
+ items=users[page_options.offset :],
|
|
|
+ limit=page_options.limit,
|
|
|
+ offset=page_options.offset,
|
|
|
+ )
|
|
|
+ assert count_m.called
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(SyncRepository, "filter")
|
|
|
+def test_by(filter_m, user_repository: UserSyncRepository, page_options):
|
|
|
+ filter_m.return_value = Page(total=0, items=[])
|
|
|
+ assert user_repository.by("name", "b", page_options) is filter_m.return_value
|
|
|
+
|
|
|
+ filter_m.assert_called_once_with(
|
|
|
+ [Filter(field="name", values=["b"])], params=page_options
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(InMemorySyncGateway, "count")
|
|
|
+def test_count(gateway_count, user_repository):
|
|
|
+ assert user_repository.count("foo") is gateway_count.return_value
|
|
|
+ gateway_count.assert_called_once_with("foo")
|
|
|
+
|
|
|
+
|
|
|
+@mock.patch.object(InMemorySyncGateway, "exists")
|
|
|
+def test_exists(gateway_exists, user_repository):
|
|
|
+ assert user_repository.exists("foo") is gateway_exists.return_value
|
|
|
+ gateway_exists.assert_called_once_with("foo")
|