test_root_entity.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from datetime import datetime
  2. from datetime import timezone
  3. from unittest import mock
  4. import pytest
  5. from clean_python import RootEntity
  6. SOME_DATETIME = datetime(2023, 1, 1, tzinfo=timezone.utc)
  7. class User(RootEntity):
  8. name: str
  9. @pytest.fixture
  10. def user():
  11. return User(
  12. id=4,
  13. name="jan",
  14. created_at=datetime(2010, 1, 1, tzinfo=timezone.utc),
  15. updated_at=datetime(2020, 1, 1, tzinfo=timezone.utc),
  16. )
  17. @pytest.fixture
  18. def patched_now():
  19. with mock.patch(
  20. "clean_python.base.domain.root_entity.now", return_value=SOME_DATETIME
  21. ):
  22. yield
  23. def test_create(patched_now):
  24. obj = User.create(name="piet")
  25. assert obj.id is None
  26. assert obj.name == "piet"
  27. assert obj.created_at == SOME_DATETIME
  28. assert obj.updated_at == SOME_DATETIME
  29. def test_create_with_id():
  30. obj = User.create(id=42, name="piet")
  31. assert obj.id == 42
  32. def test_update(user, patched_now):
  33. actual = user.update(name="piet")
  34. assert actual is not user
  35. assert actual.name == "piet"
  36. assert actual.updated_at == SOME_DATETIME
  37. assert actual.created_at == datetime(2010, 1, 1, tzinfo=timezone.utc)
  38. def test_update_including_id(user):
  39. actual = user.update(id=4, name="piet")
  40. assert actual is not user
  41. assert actual.name == "piet"
  42. @pytest.mark.parametrize("new_id", [None, 42, "foo"])
  43. def test_update_with_wrong_id(user, new_id):
  44. with pytest.raises(ValueError):
  45. user.update(id=new_id, name="piet")
  46. @pytest.mark.parametrize("new_id", [None, 42])
  47. def test_update_give_id(new_id):
  48. user_without_id = User.create(name="jan")
  49. actual = user_without_id.update(id=new_id, name="piet")
  50. assert actual.id == new_id