test_manager.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. # Copyright 2021-2025 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. import dataclasses
  12. import pathlib
  13. from dataclasses import dataclass
  14. from typing import Any, Dict, Iterable, List, Optional, Union
  15. from taipy.common.config import Config
  16. from taipy.core._manager._manager import _Manager
  17. from taipy.core._repository._abstract_converter import _AbstractConverter
  18. from taipy.core._repository._abstract_repository import _AbstractRepository
  19. from taipy.core._repository._filesystem_repository import _FileSystemRepository
  20. from taipy.core._version._version_manager import _VersionManager
  21. @dataclass
  22. class MockModel:
  23. id: str
  24. name: str
  25. version: str
  26. def to_dict(self):
  27. return dataclasses.asdict(self)
  28. @staticmethod
  29. def from_dict(data: Dict[str, Any]):
  30. return MockModel(id=data["id"], name=data["name"], version=data["version"])
  31. @dataclass
  32. class MockEntity:
  33. def __init__(self, id: str, name: str, version: str = None) -> None:
  34. self.id = id
  35. self.name = name
  36. if version:
  37. self._version = version
  38. else:
  39. self._version = _VersionManager._get_latest_version()
  40. class MockConverter(_AbstractConverter):
  41. @classmethod
  42. def _entity_to_model(cls, entity: MockEntity) -> MockModel:
  43. return MockModel(id=entity.id, name=entity.name, version=entity._version)
  44. @classmethod
  45. def _model_to_entity(cls, model: MockModel) -> MockEntity:
  46. return MockEntity(id=model.id, name=model.name, version=model.version)
  47. class MockRepository(_AbstractRepository): # type: ignore
  48. def __init__(self, **kwargs):
  49. self.repo = _FileSystemRepository(**kwargs, converter=MockConverter)
  50. def _to_model(self, obj: MockEntity):
  51. return MockModel(obj.id, obj.name, obj._version)
  52. def _from_model(self, model: MockModel):
  53. return MockEntity(model.id, model.name, model.version)
  54. def _load(self, entity_id: str) -> MockEntity:
  55. return self.repo._load(entity_id)
  56. def _load_all(self, filters: Optional[List[Dict]] = None) -> List[MockEntity]:
  57. return self.repo._load_all(filters)
  58. def _save(self, entity: MockEntity):
  59. return self.repo._save(entity)
  60. def _exists(self, entity_id: str) -> bool:
  61. return self.repo._exists(entity_id)
  62. def _delete(self, entity_id: str):
  63. return self.repo._delete(entity_id)
  64. def _delete_all(self):
  65. return self.repo._delete_all()
  66. def _delete_many(self, ids: Iterable[str]):
  67. return self.repo._delete_many(ids)
  68. def _delete_by(self, attribute: str, value: str):
  69. return self.repo._delete_by(attribute, value)
  70. def _search(self, attribute: str, value: Any, filters: Optional[List[Dict]] = None) -> List[MockEntity]:
  71. return self.repo._search(attribute, value, filters)
  72. def _export(self, entity_id: str, folder_path: Union[str, pathlib.Path]):
  73. return self.repo._export(self, entity_id, folder_path)
  74. @property
  75. def _storage_folder(self) -> pathlib.Path:
  76. return pathlib.Path(Config.core.storage_folder) # type: ignore
  77. class MockManager(_Manager[MockEntity]):
  78. _ENTITY_NAME = MockEntity.__name__
  79. _repository = MockRepository(model_type=MockModel, dir_name="foo")
  80. class TestManager:
  81. def test_save_and_fetch_model(self):
  82. m = MockEntity("uuid", "foo")
  83. MockManager._repository._save(m)
  84. fetched_model = MockManager._get(m.id)
  85. assert m == fetched_model
  86. def test_exists(self):
  87. m = MockEntity("uuid", "foo")
  88. MockManager._repository._save(m)
  89. assert MockManager._exists(m.id)
  90. def test_get(self):
  91. m = MockEntity("uuid", "foo")
  92. MockManager._repository._save(m)
  93. assert MockManager._get(m.id) == m
  94. def test_get_all(self):
  95. MockManager._delete_all()
  96. objs = []
  97. for i in range(5):
  98. m = MockEntity(f"uuid-{i}", f"Foo{i}")
  99. objs.append(m)
  100. MockManager._repository._save(m)
  101. _objs = MockManager._get_all()
  102. assert len(_objs) == 5
  103. def test_delete(self):
  104. m = MockEntity("uuid", "foo")
  105. MockManager._repository._save(m)
  106. MockManager._delete(m.id)
  107. assert MockManager._get(m.id) is None
  108. def test_delete_all(self):
  109. objs = []
  110. for i in range(5):
  111. m = MockEntity(f"uuid-{i}", f"Foo{i}")
  112. objs.append(m)
  113. MockManager._repository._save(m)
  114. MockManager._delete_all()
  115. assert MockManager._get_all() == []
  116. def test_delete_many(self):
  117. objs = []
  118. for i in range(5):
  119. m = MockEntity(f"uuid-{i}", f"Foo{i}")
  120. objs.append(m)
  121. MockManager._repository._save(m)
  122. MockManager._delete_many(["uuid-0", "uuid-1"])
  123. assert len(MockManager._get_all()) == 3
  124. def test_is_editable(self):
  125. m = MockEntity("uuid", "Foo")
  126. MockManager._repository._save(m)
  127. assert MockManager._is_editable(m)
  128. rc = MockManager._is_editable("some_entity")
  129. assert not rc
  130. assert "Entity 'some_entity' does not exist in the repository." in rc.reasons
  131. def test_is_readable(self):
  132. m = MockEntity("uuid", "Foo")
  133. MockManager._repository._save(m)
  134. assert MockManager._is_readable(m)
  135. rc = MockManager._is_editable("some_entity")
  136. assert not rc
  137. assert "Entity 'some_entity' does not exist in the repository." in rc.reasons