test_cycle_manager.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. from datetime import datetime
  12. from taipy.common.config import Config
  13. from taipy.core.common.frequency import Frequency
  14. from taipy.core.common.scope import Scope
  15. from taipy.core.cycle._cycle_manager import _CycleManager
  16. from taipy.core.cycle.cycle import Cycle
  17. from taipy.core.cycle.cycle_id import CycleId
  18. from taipy.core.data._data_manager import _DataManager
  19. from taipy.core.job._job_manager import _JobManager
  20. from taipy.core.scenario._scenario_manager import _ScenarioManager
  21. from taipy.core.sequence._sequence_manager import _SequenceManager
  22. from taipy.core.task._task_manager import _TaskManager
  23. def test_save_and_get_cycle_entity(tmpdir, cycle, current_datetime):
  24. _CycleManager._repository.base_path = tmpdir
  25. assert len(_CycleManager._get_all()) == 0
  26. _CycleManager._set(cycle)
  27. assert _CycleManager._exists(cycle.id)
  28. cycle_1 = _CycleManager._get(cycle.id)
  29. assert cycle_1.id == cycle.id
  30. assert cycle_1.name == cycle.name
  31. assert cycle_1.properties == cycle.properties
  32. assert cycle_1.creation_date == cycle.creation_date
  33. assert cycle_1.start_date == cycle.start_date
  34. assert cycle_1.end_date == cycle.end_date
  35. assert cycle_1.frequency == cycle.frequency
  36. assert len(_CycleManager._get_all()) == 1
  37. assert _CycleManager._get(cycle.id) == cycle
  38. assert _CycleManager._get(cycle.id).name == cycle.name
  39. assert isinstance(_CycleManager._get(cycle.id).creation_date, datetime)
  40. assert _CycleManager._get(cycle.id).creation_date == cycle.creation_date
  41. assert _CycleManager._get(cycle.id).frequency == Frequency.DAILY
  42. cycle_2_id = CycleId("cycle_2")
  43. assert _CycleManager._get(cycle_2_id) is None
  44. assert not _CycleManager._exists(cycle_2_id)
  45. cycle_3 = Cycle(
  46. Frequency.MONTHLY,
  47. {},
  48. creation_date=current_datetime,
  49. start_date=current_datetime,
  50. end_date=current_datetime,
  51. name="bar",
  52. id=cycle_1.id,
  53. )
  54. _CycleManager._set(cycle_3)
  55. cycle_3 = _CycleManager._get(cycle_1.id)
  56. assert _CycleManager._exists(cycle_1.id)
  57. assert len(_CycleManager._get_all()) == 1
  58. assert cycle_3.id == cycle_1.id
  59. assert cycle_3.name == cycle_3.name
  60. assert cycle_3.properties == cycle_3.properties
  61. assert cycle_3.creation_date == current_datetime
  62. assert cycle_3.start_date == current_datetime
  63. assert cycle_3.end_date == current_datetime
  64. assert cycle_3.frequency == cycle_3.frequency
  65. def test_create_and_delete_cycle_entity(tmpdir):
  66. _CycleManager._repository.base_path = tmpdir
  67. assert len(_CycleManager._get_all()) == 0
  68. cycle_1 = _CycleManager._create(Frequency.DAILY, name="foo", key="value")
  69. assert cycle_1.id is not None
  70. assert cycle_1.name == "foo"
  71. assert cycle_1.properties == {"key": "value"}
  72. assert cycle_1.creation_date is not None
  73. assert cycle_1.start_date is not None
  74. assert cycle_1.end_date is not None
  75. assert cycle_1.start_date < cycle_1.creation_date < cycle_1.end_date
  76. assert cycle_1.properties["key"] == "value"
  77. assert cycle_1.frequency == Frequency.DAILY
  78. cycle_1_id = cycle_1.id
  79. assert _CycleManager._exists(cycle_1.id)
  80. assert len(_CycleManager._get_all()) == 1
  81. assert _CycleManager._get(cycle_1_id) == cycle_1
  82. assert _CycleManager._get(cycle_1_id).name == "foo"
  83. assert isinstance(_CycleManager._get(cycle_1_id).creation_date, datetime)
  84. assert _CycleManager._get(cycle_1_id).frequency == Frequency.DAILY
  85. cycle_2_id = CycleId("cycle_2")
  86. assert _CycleManager._get(cycle_2_id) is None
  87. assert not _CycleManager._exists(cycle_2_id)
  88. cycle_3 = _CycleManager._create(Frequency.MONTHLY, "bar")
  89. assert cycle_3.id is not None
  90. assert cycle_3.name == "bar"
  91. assert isinstance(cycle_3.creation_date, datetime)
  92. assert cycle_3.frequency == Frequency.MONTHLY
  93. cycle_3_id = cycle_3.id
  94. assert _CycleManager._exists(cycle_3_id)
  95. assert len(_CycleManager._get_all()) == 2
  96. assert _CycleManager._get(cycle_3_id).name == "bar"
  97. cycle_4 = _CycleManager._create(Frequency.YEARLY, "baz")
  98. cycle_4_id = cycle_4.id
  99. assert _CycleManager._exists(cycle_4_id)
  100. assert len(_CycleManager._get_all()) == 3
  101. _CycleManager._delete(cycle_4_id)
  102. assert len(_CycleManager._get_all()) == 2
  103. assert not _CycleManager._exists(cycle_4_id)
  104. assert _CycleManager._get(cycle_4_id) is None
  105. _CycleManager._delete_all()
  106. assert len(_CycleManager._get_all()) == 0
  107. assert not any(_CycleManager._exists(cycle_id) for cycle_id in [cycle_1_id, cycle_3_id, cycle_4_id])
  108. def test_get_cycle_start_date_and_end_date():
  109. creation_date_1 = datetime.fromisoformat("2021-11-11T11:11:01.000001")
  110. daily_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.DAILY, creation_date=creation_date_1)
  111. weekly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.WEEKLY, creation_date=creation_date_1)
  112. monthly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.MONTHLY, creation_date=creation_date_1)
  113. yearly_start_date_1 = _CycleManager._get_start_date_of_cycle(Frequency.YEARLY, creation_date=creation_date_1)
  114. assert daily_start_date_1 == datetime.fromisoformat("2021-11-11T00:00:00.000000")
  115. assert weekly_start_date_1 == datetime.fromisoformat("2021-11-08T00:00:00.000000")
  116. assert monthly_start_date_1 == datetime.fromisoformat("2021-11-01T00:00:00.000000")
  117. assert yearly_start_date_1 == datetime.fromisoformat("2021-01-01T00:00:00.000000")
  118. daily_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.DAILY, start_date=daily_start_date_1)
  119. weekly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.WEEKLY, start_date=weekly_start_date_1)
  120. monthly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.MONTHLY, start_date=monthly_start_date_1)
  121. yearly_end_date_1 = _CycleManager._get_end_date_of_cycle(Frequency.YEARLY, start_date=yearly_start_date_1)
  122. assert daily_end_date_1 == datetime.fromisoformat("2021-11-11T23:59:59.999999")
  123. assert weekly_end_date_1 == datetime.fromisoformat("2021-11-14T23:59:59.999999")
  124. assert monthly_end_date_1 == datetime.fromisoformat("2021-11-30T23:59:59.999999")
  125. assert yearly_end_date_1 == datetime.fromisoformat("2021-12-31T23:59:59.999999")
  126. creation_date_2 = datetime.now()
  127. daily_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.DAILY, creation_date=creation_date_2)
  128. daily_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.DAILY, daily_start_date_2)
  129. assert daily_start_date_2.date() == creation_date_2.date()
  130. assert daily_end_date_2.date() == creation_date_2.date()
  131. assert daily_start_date_2 < creation_date_2 < daily_end_date_2
  132. weekly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.WEEKLY, creation_date=creation_date_2)
  133. weekly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.WEEKLY, weekly_start_date_2)
  134. assert weekly_start_date_2 < creation_date_2 < weekly_end_date_2
  135. monthly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.MONTHLY, creation_date=creation_date_2)
  136. monthly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.MONTHLY, monthly_start_date_2)
  137. assert monthly_start_date_2.month == creation_date_2.month and monthly_start_date_2.day == 1
  138. assert monthly_end_date_2.month == creation_date_2.month
  139. assert monthly_start_date_2 < creation_date_2 < monthly_end_date_2
  140. yearly_start_date_2 = _CycleManager._get_start_date_of_cycle(Frequency.YEARLY, creation_date=creation_date_2)
  141. yearly_end_date_2 = _CycleManager._get_end_date_of_cycle(Frequency.YEARLY, yearly_start_date_2)
  142. assert yearly_start_date_2.year == creation_date_2.year
  143. assert yearly_start_date_2 == datetime(creation_date_2.year, 1, 1)
  144. assert yearly_end_date_2.year == creation_date_2.year
  145. assert yearly_end_date_2.date() == datetime(creation_date_2.year, 12, 31).date()
  146. assert yearly_start_date_2 < creation_date_2 < yearly_end_date_2
  147. def test_hard_delete_shared_entities():
  148. dn_config_1 = Config.configure_data_node("my_input_1", "pickle", scope=Scope.SCENARIO, default_data="testing")
  149. dn_config_2 = Config.configure_data_node("my_input_2", "pickle", scope=Scope.SCENARIO, default_data="testing")
  150. dn_config_3 = Config.configure_data_node("my_input_3", "pickle", scope=Scope.CYCLE, default_data="testing")
  151. dn_config_4 = Config.configure_data_node("my_input_4", "pickle", scope=Scope.GLOBAL, default_data="testing")
  152. task_config_1 = Config.configure_task("task_config_1", print, dn_config_1, dn_config_2)
  153. task_config_2 = Config.configure_task("task_config_2", print, dn_config_2, dn_config_3)
  154. task_config_3 = Config.configure_task("task_config_3", print, dn_config_3, dn_config_4) # scope = global
  155. creation_date = datetime.now()
  156. # Daily frequency so cycle attached to scenarios
  157. scenario_config_1 = Config.configure_scenario(
  158. "scenario_1",
  159. [task_config_1, task_config_2, task_config_3],
  160. creation_date=creation_date,
  161. frequency=Frequency.DAILY,
  162. )
  163. scenario_config_1.add_sequences(
  164. {
  165. "sequence_1": [task_config_1, task_config_2],
  166. "sequence_2": [task_config_1, task_config_2],
  167. "sequence_3": [task_config_3],
  168. }
  169. )
  170. # No Frequency so no cycle attached to scenarios
  171. scenario_config_2 = Config.configure_scenario("scenario_config_2", [task_config_2, task_config_3])
  172. scenario_config_2.add_sequences({"sequence_3": [task_config_3]})
  173. scenario_1 = _ScenarioManager._create(scenario_config_1)
  174. scenario_2 = _ScenarioManager._create(scenario_config_1)
  175. scenario_3 = _ScenarioManager._create(scenario_config_2)
  176. scenario_1.submit()
  177. scenario_2.submit()
  178. scenario_3.submit()
  179. assert len(_ScenarioManager._get_all()) == 3
  180. assert len(_SequenceManager._get_all()) == 7
  181. assert len(_TaskManager._get_all()) == 7
  182. assert len(_DataManager._get_all()) == 8
  183. assert len(_JobManager._get_all()) == 8
  184. assert len(_CycleManager._get_all()) == 1
  185. _CycleManager._hard_delete(scenario_1.cycle.id)
  186. assert len(_CycleManager._get_all()) == 0
  187. assert len(_ScenarioManager._get_all()) == 1
  188. assert len(_SequenceManager._get_all()) == 1
  189. assert len(_TaskManager._get_all()) == 2
  190. assert len(_JobManager._get_all()) == 2
  191. assert len(_DataManager._get_all()) == 3
  192. def test_get_primary(tmpdir, cycle, current_datetime):
  193. _CycleManager._repository.base_path = tmpdir
  194. assert len(_CycleManager._get_all()) == 0
  195. _CycleManager._set(cycle)
  196. cycle_1 = _CycleManager._get(cycle.id)
  197. cycle_2 = Cycle(Frequency.MONTHLY, {}, current_datetime, current_datetime, current_datetime, name="foo")
  198. _CycleManager._set(cycle_2)
  199. cycle_2 = _CycleManager._get(cycle_2.id)
  200. cycles = _CycleManager._get_all()
  201. assert len(_CycleManager._get_all()) == 2
  202. assert (
  203. len(_CycleManager._get_cycles_by_frequency_and_start_date(cycle_1.frequency, cycle_1.start_date, cycles)) == 1
  204. )
  205. assert (
  206. len(_CycleManager._get_cycles_by_frequency_and_start_date(cycle_2.frequency, cycle_2.start_date, cycles)) == 1
  207. )
  208. assert (
  209. len(
  210. _CycleManager._get_cycles_by_frequency_and_start_date(
  211. Frequency.WEEKLY, datetime(2000, 1, 1, 1, 0, 0, 0), cycles
  212. )
  213. )
  214. == 0
  215. )
  216. assert (
  217. len(
  218. _CycleManager._get_cycles_by_frequency_and_overlapping_date(
  219. cycle_1.frequency, cycle_1.creation_date, cycles
  220. )
  221. )
  222. == 1
  223. )
  224. assert (
  225. _CycleManager._get_cycles_by_frequency_and_overlapping_date(cycle_1.frequency, cycle_1.creation_date, cycles)[0]
  226. == cycle_1
  227. )
  228. assert (
  229. len(
  230. _CycleManager._get_cycles_by_frequency_and_overlapping_date(
  231. Frequency.WEEKLY, datetime(2000, 1, 1, 1, 0, 0, 0), cycles
  232. )
  233. )
  234. == 0
  235. )