test_submission_repositories.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. # Copyright 2023 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 os
  12. import pytest
  13. from src.taipy.core.data._data_manager_factory import _DataManagerFactory
  14. from src.taipy.core.exceptions import ModelNotFound
  15. from src.taipy.core.job._job_manager_factory import _JobManagerFactory
  16. from src.taipy.core.submission._submission_manager_factory import _SubmissionManagerFactory
  17. from src.taipy.core.submission.submission import Submission
  18. from src.taipy.core.task._task_manager_factory import _TaskManagerFactory
  19. from src.taipy.core.task.task import Task
  20. from taipy.config.config import Config
  21. from tests.core.conftest import init_sql_repo
  22. def configure_fs_repo():
  23. Config.configure_core(repository_type="default")
  24. def configure_sql_repo():
  25. init_sql_repo
  26. class TestSubmissionRepository:
  27. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  28. def test_save_and_load(self, data_node, job, configure_repo):
  29. configure_repo()
  30. _DataManagerFactory._build_manager()._repository._save(data_node)
  31. task = Task("task_config_id", {}, print, [data_node], [data_node])
  32. _TaskManagerFactory._build_manager()._repository._save(task)
  33. job._task = task
  34. _JobManagerFactory._build_manager()._repository._save(job)
  35. submission = Submission(task.id, task._ID_PREFIX)
  36. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  37. submission_repository._save(submission)
  38. submission.jobs = [job]
  39. obj = submission_repository._load(submission.id)
  40. assert isinstance(obj, Submission)
  41. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  42. def test_exists(self, configure_repo):
  43. configure_repo()
  44. submission = Submission("entity_id", "ENTITY_TYPE")
  45. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  46. submission_repository._save(submission)
  47. assert submission_repository._exists(submission.id)
  48. assert not submission_repository._exists("not-existed-submission")
  49. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  50. def test_load_all(self, configure_repo):
  51. configure_repo()
  52. repository = _SubmissionManagerFactory._build_manager()._repository
  53. submission = Submission("entity_id", "ENTITY_TYPE")
  54. for i in range(10):
  55. submission.id = f"submission-{i}"
  56. repository._save(submission)
  57. submissions = repository._load_all()
  58. assert len(submissions) == 10
  59. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  60. def test_delete(self, configure_repo):
  61. configure_repo()
  62. repository = _SubmissionManagerFactory._build_manager()._repository
  63. submission = Submission("entity_id", "ENTITY_TYPE")
  64. repository._save(submission)
  65. repository._delete(submission.id)
  66. with pytest.raises(ModelNotFound):
  67. repository._load(submission.id)
  68. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  69. def test_delete_all(self, configure_repo):
  70. configure_repo()
  71. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  72. submission = Submission("entity_id", "ENTITY_TYPE")
  73. for i in range(10):
  74. submission.id = f"submission-{i}"
  75. submission_repository._save(submission)
  76. assert len(submission_repository._load_all()) == 10
  77. submission_repository._delete_all()
  78. assert len(submission_repository._load_all()) == 0
  79. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  80. def test_delete_many(self, configure_repo):
  81. configure_repo()
  82. submission = Submission("entity_id", "ENTITY_TYPE")
  83. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  84. for i in range(10):
  85. submission.id = f"submission-{i}"
  86. submission_repository._save(submission)
  87. objs = submission_repository._load_all()
  88. assert len(objs) == 10
  89. ids = [x.id for x in objs[:3]]
  90. submission_repository._delete_many(ids)
  91. assert len(submission_repository._load_all()) == 7
  92. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  93. def test_delete_by(self, configure_repo):
  94. configure_repo()
  95. # Create 5 entities with version 1.0 and 5 entities with version 2.0
  96. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  97. submission = Submission("entity_id", "ENTITY_TYPE")
  98. for i in range(10):
  99. submission.id = f"submission-{i}"
  100. submission._version = f"{(i+1) // 5}.0"
  101. submission_repository._save(submission)
  102. objs = submission_repository._load_all()
  103. assert len(objs) == 10
  104. submission_repository._delete_by("version", "1.0")
  105. assert len(submission_repository._load_all()) == 5
  106. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  107. def test_search(self, configure_repo):
  108. configure_repo()
  109. submission_repository = _SubmissionManagerFactory._build_manager()._repository
  110. submission = Submission("entity_id", "ENTITY_TYPE", version="random_version_number")
  111. for i in range(10):
  112. submission.id = f"submission-{i}"
  113. submission_repository._save(submission)
  114. assert len(submission_repository._load_all()) == 10
  115. objs = submission_repository._search("id", "submission-2")
  116. assert len(objs) == 1
  117. assert isinstance(objs[0], Submission)
  118. objs = submission_repository._search("id", "submission-2", filters=[{"version": "random_version_number"}])
  119. assert len(objs) == 1
  120. assert isinstance(objs[0], Submission)
  121. assert submission_repository._search("id", "submission-2", filters=[{"version": "non_existed_version"}]) == []
  122. @pytest.mark.parametrize("configure_repo", [configure_fs_repo, configure_sql_repo])
  123. def test_export(self, tmpdir, configure_repo):
  124. configure_repo()
  125. repository = _SubmissionManagerFactory._build_manager()._repository
  126. submission = Submission("entity_id", "ENTITY_TYPE")
  127. repository._save(submission)
  128. repository._export(submission.id, tmpdir.strpath)
  129. dir_path = (
  130. repository.dir_path
  131. if Config.core.repository_type == "default"
  132. else os.path.join(tmpdir.strpath, "submission")
  133. )
  134. assert os.path.exists(os.path.join(dir_path, f"{submission.id}.json"))