test_internal_gateway.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from typing import cast
  2. import pytest
  3. from pydantic import Field
  4. from clean_python import Filter
  5. from clean_python import InMemoryGateway
  6. from clean_python import InternalGateway
  7. from clean_python import Manage
  8. from clean_python import Repository
  9. from clean_python import RootEntity
  10. from clean_python import ValueObject
  11. # domain - other module
  12. class User(RootEntity):
  13. name: str = Field(min_length=1)
  14. class UserRepository(Repository[User]):
  15. pass
  16. # application - other module
  17. class ManageUser(Manage[User]):
  18. def __init__(self):
  19. self.repo = UserRepository(gateway=InMemoryGateway([]))
  20. # domain - this module
  21. class UserObj(ValueObject):
  22. id: int
  23. name: str
  24. # infrastructure - this module
  25. class UserGateway(InternalGateway[User, UserObj]):
  26. def __init__(self, manage: ManageUser):
  27. self._manage = manage
  28. @property
  29. def manage(self) -> ManageUser:
  30. return self._manage
  31. def _map(self, obj: User) -> UserObj:
  32. return UserObj(id=cast(int, obj.id), name=obj.name)
  33. @pytest.fixture
  34. def internal_gateway():
  35. return UserGateway(manage=ManageUser())
  36. async def test_get_not_existing(internal_gateway: UserGateway):
  37. assert await internal_gateway.get(1) is None
  38. async def test_add(internal_gateway: UserGateway):
  39. actual = await internal_gateway.add(UserObj(id=12, name="foo"))
  40. assert actual == UserObj(id=12, name="foo")
  41. @pytest.fixture
  42. async def internal_gateway_with_record(internal_gateway):
  43. await internal_gateway.add(UserObj(id=12, name="foo"))
  44. return internal_gateway
  45. async def test_get(internal_gateway_with_record):
  46. assert await internal_gateway_with_record.get(12) == UserObj(id=12, name="foo")
  47. async def test_filter(internal_gateway_with_record: UserGateway):
  48. assert await internal_gateway_with_record.filter([]) == [UserObj(id=12, name="foo")]
  49. async def test_filter_2(internal_gateway_with_record: UserGateway):
  50. assert (
  51. await internal_gateway_with_record.filter([Filter(field="id", values=[1])])
  52. == []
  53. )
  54. async def test_remove(internal_gateway_with_record: UserGateway):
  55. assert await internal_gateway_with_record.remove(12)
  56. assert internal_gateway_with_record.manage.repo.gateway.data == {}
  57. async def test_remove_does_not_exist(internal_gateway: UserGateway):
  58. assert not await internal_gateway.remove(12)
  59. async def test_add_bad_request(internal_gateway: UserGateway):
  60. # a 'bad request' should be reraised as a ValueError; errors in gateways
  61. # are an internal affair.
  62. with pytest.raises(ValueError):
  63. await internal_gateway.add(UserObj(id=12, name=""))
  64. async def test_count(internal_gateway_with_record: UserGateway):
  65. assert await internal_gateway_with_record.count([]) == 1
  66. async def test_count_2(internal_gateway_with_record: UserGateway):
  67. assert (
  68. await internal_gateway_with_record.count([Filter(field="id", values=[1])]) == 0
  69. )
  70. async def test_exists(internal_gateway_with_record: UserGateway):
  71. assert await internal_gateway_with_record.exists([]) is True
  72. async def test_exists_2(internal_gateway_with_record: UserGateway):
  73. assert (
  74. await internal_gateway_with_record.exists([Filter(field="id", values=[1])])
  75. is False
  76. )