test_repositories.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # Copyright 2021-2024 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 json
  12. import os
  13. import pathlib
  14. import shutil
  15. import pytest
  16. from taipy.core.exceptions.exceptions import ModelNotFound
  17. from .mocks import MockConverter, MockFSRepository, MockModel, MockObj
  18. class TestRepositoriesStorage:
  19. def test_load_from_non_existent_file_on_fs_repo(self):
  20. r = MockFSRepository(model_type=MockModel, dir_name="mock_model", converter=MockConverter)
  21. # The file does not exist should raise ModelNotFound exception
  22. with pytest.raises(ModelNotFound):
  23. r._load("non_existent_file")
  24. # The file exists but is empty should also raise ModelNotFound exception
  25. os.makedirs(r.dir_path)
  26. with open(r.dir_path / "empty_file.json", "w") as f:
  27. f.write("")
  28. assert r._exists("empty_file")
  29. with pytest.raises(ModelNotFound):
  30. r._load("empty_file")
  31. @pytest.mark.parametrize(
  32. "mock_repo,params",
  33. [
  34. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  35. ],
  36. )
  37. def test_save_and_fetch_model(self, mock_repo, params):
  38. r = mock_repo(**params)
  39. m = MockObj("uuid", "foo")
  40. r._save(m)
  41. fetched_model = r._load(m.id)
  42. assert m == fetched_model
  43. @pytest.mark.parametrize(
  44. "mock_repo,params",
  45. [
  46. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  47. ],
  48. )
  49. def test_exists(self, mock_repo, params):
  50. r = mock_repo(**params)
  51. m = MockObj("uuid", "foo")
  52. r._save(m)
  53. assert r._exists(m.id)
  54. assert not r._exists("not-existed-model")
  55. @pytest.mark.parametrize(
  56. "mock_repo,params",
  57. [
  58. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  59. ],
  60. )
  61. def test_get_all(self, mock_repo, params):
  62. objs = []
  63. r = mock_repo(**params)
  64. r._delete_all()
  65. for i in range(5):
  66. m = MockObj(f"uuid-{i}", f"Foo{i}")
  67. objs.append(m)
  68. r._save(m)
  69. _objs = r._load_all()
  70. assert len(_objs) == 5
  71. for obj in _objs:
  72. assert isinstance(obj, MockObj)
  73. assert sorted(objs, key=lambda o: o.id) == sorted(_objs, key=lambda o: o.id)
  74. @pytest.mark.parametrize(
  75. "mock_repo,params",
  76. [
  77. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  78. ],
  79. )
  80. def test_delete_all(self, mock_repo, params):
  81. r = mock_repo(**params)
  82. r._delete_all()
  83. for i in range(5):
  84. m = MockObj(f"uuid-{i}", f"Foo{i}")
  85. r._save(m)
  86. _models = r._load_all()
  87. assert len(_models) == 5
  88. r._delete_all()
  89. _models = r._load_all()
  90. assert len(_models) == 0
  91. @pytest.mark.parametrize(
  92. "mock_repo,params",
  93. [
  94. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  95. ],
  96. )
  97. def test_delete_many(self, mock_repo, params):
  98. r = mock_repo(**params)
  99. r._delete_all()
  100. for i in range(5):
  101. m = MockObj(f"uuid-{i}", f"Foo{i}")
  102. r._save(m)
  103. _models = r._load_all()
  104. assert len(_models) == 5
  105. r._delete_many(["uuid-0", "uuid-1"])
  106. _models = r._load_all()
  107. assert len(_models) == 3
  108. @pytest.mark.parametrize(
  109. "mock_repo,params",
  110. [
  111. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  112. ],
  113. )
  114. def test_search(self, mock_repo, params):
  115. r = mock_repo(**params)
  116. r._delete_all()
  117. m = MockObj("uuid", "foo")
  118. r._save(m)
  119. m1 = r._search("name", "bar")
  120. m2 = r._search("name", "foo")
  121. assert m1 == []
  122. assert m2 == [m]
  123. @pytest.mark.parametrize(
  124. "mock_repo,params",
  125. [
  126. (MockFSRepository, {"model_type": MockModel, "dir_name": "mock_model", "converter": MockConverter}),
  127. ],
  128. )
  129. @pytest.mark.parametrize("export_path", ["tmp"])
  130. def test_export(self, mock_repo, params, export_path):
  131. r = mock_repo(**params)
  132. m = MockObj("uuid", "foo")
  133. r._save(m)
  134. r._export("uuid", export_path)
  135. assert pathlib.Path(os.path.join(export_path, "mock_model/uuid.json")).exists()
  136. with open(os.path.join(export_path, "mock_model/uuid.json"), "r") as exported_file:
  137. exported_data = json.load(exported_file)
  138. assert exported_data["id"] == "uuid"
  139. assert exported_data["name"] == "foo"
  140. # Export to same location again should work
  141. r._export("uuid", export_path)
  142. assert pathlib.Path(os.path.join(export_path, "mock_model/uuid.json")).exists()
  143. shutil.rmtree(export_path, ignore_errors=True)