conftest.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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 os
  12. import shutil
  13. import uuid
  14. from datetime import datetime, timedelta
  15. import pandas as pd
  16. import pytest
  17. from dotenv import load_dotenv
  18. from taipy.config import Config
  19. from taipy.config.common.frequency import Frequency
  20. from taipy.config.common.scope import Scope
  21. from taipy.core import Cycle, DataNodeId, Job, JobId, Scenario, Sequence, Task
  22. from taipy.core.cycle._cycle_manager import _CycleManager
  23. from taipy.core.data.in_memory import InMemoryDataNode
  24. from taipy.core.job._job_manager import _JobManager
  25. from taipy.core.task._task_manager import _TaskManager
  26. from taipy.rest.app import create_app
  27. from .setup.shared.algorithms import evaluate, forecast
  28. @pytest.fixture
  29. def setup_end_to_end():
  30. model_cfg = Config.configure_data_node("model", path="setup/my_model.p", storage_type="pickle")
  31. day_cfg = Config.configure_data_node(id="day")
  32. forecasts_cfg = Config.configure_data_node(id="forecasts")
  33. forecast_task_cfg = Config.configure_task(
  34. id="forecast_task",
  35. input=[model_cfg, day_cfg],
  36. function=forecast,
  37. output=forecasts_cfg,
  38. )
  39. historical_temperature_cfg = Config.configure_data_node(
  40. "historical_temperature",
  41. storage_type="csv",
  42. path="setup/historical_temperature.csv",
  43. has_header=True,
  44. )
  45. evaluation_cfg = Config.configure_data_node("evaluation")
  46. evaluate_task_cfg = Config.configure_task(
  47. "evaluate_task",
  48. input=[historical_temperature_cfg, forecasts_cfg, day_cfg],
  49. function=evaluate,
  50. output=evaluation_cfg,
  51. )
  52. scenario_config = Config.configure_scenario(
  53. "scenario", [forecast_task_cfg, evaluate_task_cfg], frequency=Frequency.DAILY
  54. )
  55. scenario_config.add_sequences({"sequence": [forecast_task_cfg, evaluate_task_cfg]})
  56. @pytest.fixture()
  57. def app():
  58. load_dotenv(".testenv")
  59. app = create_app(testing=True)
  60. app.config.update(
  61. {
  62. "TESTING": True,
  63. }
  64. )
  65. with app.app_context(), app.test_request_context():
  66. yield app
  67. @pytest.fixture()
  68. def client(app):
  69. return app.test_client()
  70. @pytest.fixture
  71. def datanode_data():
  72. return {
  73. "name": "foo",
  74. "storage_type": "in_memory",
  75. "scope": "scenario",
  76. "default_data": ["1991-01-01T00:00:00"],
  77. }
  78. @pytest.fixture
  79. def task_data():
  80. return {
  81. "config_id": "foo",
  82. "input_ids": ["DATASOURCE_foo_3b888e17-1974-4a56-a42c-c7c96bc9cd54"],
  83. "function_name": "print",
  84. "function_module": "builtins",
  85. "output_ids": ["DATASOURCE_foo_4d9923b8-eb9f-4f3c-8055-3a1ce8bee309"],
  86. }
  87. @pytest.fixture
  88. def sequence_data():
  89. return {
  90. "name": "foo",
  91. "task_ids": ["TASK_foo_3b888e17-1974-4a56-a42c-c7c96bc9cd54"],
  92. }
  93. @pytest.fixture
  94. def scenario_data():
  95. return {
  96. "name": "foo",
  97. "sequence_ids": ["SEQUENCE_foo_3b888e17-1974-4a56-a42c-c7c96bc9cd54"],
  98. "properties": {},
  99. }
  100. @pytest.fixture
  101. def default_datanode():
  102. return InMemoryDataNode(
  103. "input_ds",
  104. Scope.SCENARIO,
  105. DataNodeId("f"),
  106. "my name",
  107. "owner_id",
  108. properties={"default_data": [1, 2, 3, 4, 5, 6]},
  109. )
  110. @pytest.fixture
  111. def default_df_datanode():
  112. return InMemoryDataNode(
  113. "input_ds",
  114. Scope.SCENARIO,
  115. DataNodeId("id_uio2"),
  116. "my name",
  117. "owner_id",
  118. properties={"default_data": pd.DataFrame([{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}])},
  119. )
  120. @pytest.fixture
  121. def default_datanode_config():
  122. return Config.configure_data_node(f"taipy_{uuid.uuid4().hex}", "in_memory", Scope.SCENARIO)
  123. @pytest.fixture
  124. def default_datanode_config_list():
  125. configs = []
  126. for i in range(10):
  127. configs.append(Config.configure_data_node(id=f"ds_{i}", storage_type="in_memory", scope=Scope.SCENARIO))
  128. return configs
  129. def __default_task():
  130. input_ds = InMemoryDataNode(
  131. "input_ds",
  132. Scope.SCENARIO,
  133. DataNodeId("id_uio"),
  134. "my name",
  135. "owner_id",
  136. properties={"default_data": "In memory Data Source"},
  137. )
  138. output_ds = InMemoryDataNode(
  139. "output_ds",
  140. Scope.SCENARIO,
  141. DataNodeId("id_uio"),
  142. "my name",
  143. "owner_id",
  144. properties={"default_data": "In memory Data Source"},
  145. )
  146. return Task(
  147. config_id="foo",
  148. properties={},
  149. function=print,
  150. input=[input_ds],
  151. output=[output_ds],
  152. id=None,
  153. )
  154. @pytest.fixture
  155. def default_task():
  156. return __default_task()
  157. @pytest.fixture
  158. def default_task_config():
  159. return Config.configure_task("task1", print, [], [])
  160. @pytest.fixture
  161. def default_task_config_list():
  162. configs = []
  163. for i in range(10):
  164. configs.append(Config.configure_task(f"task_{i}", print, [], []))
  165. return configs
  166. def __default_sequence():
  167. return Sequence(properties={"name": "foo"}, tasks=[__default_task()], sequence_id="SEQUENCE_foo_SCENARIO_acb")
  168. def __task_config():
  169. return Config.configure_task("task1", print, [], [])
  170. @pytest.fixture
  171. def default_sequence():
  172. return __default_sequence()
  173. @pytest.fixture
  174. def default_scenario_config():
  175. task_config = __task_config()
  176. scenario_config = Config.configure_scenario(
  177. f"taipy_{uuid.uuid4().hex}",
  178. [task_config],
  179. )
  180. scenario_config.add_sequences({"sequence": [task_config]})
  181. return scenario_config
  182. @pytest.fixture
  183. def default_scenario_config_list():
  184. configs = []
  185. for _ in range(10):
  186. task_config = Config.configure_task(f"taipy_{uuid.uuid4().hex}", print)
  187. scenario_config = Config.configure_scenario(
  188. f"taipy_{uuid.uuid4().hex}",
  189. [task_config],
  190. )
  191. scenario_config.add_sequences({"sequence": [task_config]})
  192. configs.append(scenario_config)
  193. return configs
  194. @pytest.fixture
  195. def default_scenario():
  196. return Scenario(config_id="foo", properties={}, tasks=[__default_task()], scenario_id="SCENARIO_scenario_id")
  197. def __create_cycle(name="foo"):
  198. now = datetime.now()
  199. return Cycle(
  200. name=name,
  201. frequency=Frequency.DAILY,
  202. properties={},
  203. creation_date=now,
  204. start_date=now,
  205. end_date=now + timedelta(days=5),
  206. )
  207. @pytest.fixture
  208. def create_cycle_list():
  209. cycles = []
  210. manager = _CycleManager
  211. for i in range(10):
  212. c = __create_cycle(f"cycle_{i}")
  213. manager._set(c)
  214. return cycles
  215. @pytest.fixture
  216. def cycle_data():
  217. return {
  218. "name": "foo",
  219. "frequency": "daily",
  220. "properties": {},
  221. "creation_date": "2022-02-03T22:17:27.317114",
  222. "start_date": "2022-02-03T22:17:27.317114",
  223. "end_date": "2022-02-08T22:17:27.317114",
  224. }
  225. @pytest.fixture
  226. def default_cycle():
  227. return __create_cycle()
  228. def __create_job():
  229. task_manager = _TaskManager
  230. task = __default_task()
  231. task_manager._set(task)
  232. submit_id = f"SUBMISSION_{str(uuid.uuid4())}"
  233. return Job(id=JobId(f"JOB_{uuid.uuid4()}"), task=task, submit_id=submit_id, submit_entity_id=task.id)
  234. @pytest.fixture
  235. def default_job():
  236. return __create_job()
  237. @pytest.fixture
  238. def create_job_list():
  239. jobs = []
  240. manager = _JobManager
  241. for _ in range(10):
  242. c = __create_job()
  243. manager._set(c)
  244. return jobs
  245. @pytest.fixture(scope="function", autouse=True)
  246. def cleanup_files(reset_configuration_singleton, inject_core_sections):
  247. reset_configuration_singleton()
  248. inject_core_sections()
  249. Config.configure_core(repository_type="filesystem")
  250. if os.path.exists(".data"):
  251. shutil.rmtree(".data", ignore_errors=True)
  252. if os.path.exists(".my_data"):
  253. shutil.rmtree(".my_data", ignore_errors=True)
  254. yield
  255. for path in [".data", ".my_data", "user_data", ".taipy"]:
  256. if os.path.exists(path):
  257. shutil.rmtree(path, ignore_errors=True)