Просмотр исходного кода

added tests for new submittable mechansism

Toan Quach 1 год назад
Родитель
Сommit
559772cf5f

+ 56 - 4
tests/core/scenario/test_scenario_manager.py

@@ -38,6 +38,7 @@ from taipy.core.exceptions.exceptions import (
     UnauthorizedTagError,
 )
 from taipy.core.job._job_manager import _JobManager
+from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
 from taipy.core.scenario._scenario_manager import _ScenarioManager
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario.scenario import Scenario
@@ -933,21 +934,72 @@ def test_hard_delete_shared_entities():
 def test_is_submittable():
     assert len(_ScenarioManager._get_all()) == 0
 
-    dn_config = Config.configure_in_memory_data_node("dn", 10)
-    task_config = Config.configure_task("task", print, [dn_config])
+    dn_config_1 = Config.configure_in_memory_data_node("dn_1", 10)
+    dn_config_2 = Config.configure_in_memory_data_node("dn_2", 10)
+    task_config = Config.configure_task("task", print, [dn_config_1, dn_config_2])
     scenario_config = Config.configure_scenario("sc", {task_config}, set(), Frequency.DAILY)
     scenario = _ScenarioManager._create(scenario_config)
+    dn_1 = scenario.dn_1
+    dn_2 = scenario.dn_2
 
     assert len(_ScenarioManager._get_all()) == 1
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
     assert _ScenarioManager._is_submittable(scenario)
     assert _ScenarioManager._is_submittable(scenario.id)
     assert not _ScenarioManager._is_submittable("Scenario_temp")
 
-    scenario.dn.edit_in_progress = True
+    dn_1.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited."
+    )
+    assert not _ScenarioManager._is_submittable(scenario)
+    assert not _ScenarioManager._is_submittable(scenario.id)
+
+    dn_1.edit_in_progress = False
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert _ScenarioManager._is_submittable(scenario)
+    assert _ScenarioManager._is_submittable(scenario.id)
+
+    dn_1.last_edit_date = None
+    dn_2.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert not _ScenarioManager._is_submittable(scenario)
+    assert not _ScenarioManager._is_submittable(scenario.id)
+
+    dn_1.last_edit_date = datetime.now()
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
     assert not _ScenarioManager._is_submittable(scenario)
     assert not _ScenarioManager._is_submittable(scenario.id)
 
-    scenario.dn.edit_in_progress = False
+    dn_2.edit_in_progress = False
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert dn_2.id not in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
     assert _ScenarioManager._is_submittable(scenario)
     assert _ScenarioManager._is_submittable(scenario.id)
 

+ 94 - 5
tests/core/sequence/test_sequence_manager.py

@@ -10,6 +10,7 @@
 # specific language governing permissions and limitations under the License.
 
 import json
+from datetime import datetime
 from pathlib import Path
 from typing import Callable, Iterable, Optional
 from unittest import mock
@@ -34,6 +35,7 @@ from taipy.core.exceptions.exceptions import (
     SequenceBelongsToNonExistingScenario,
 )
 from taipy.core.job._job_manager import _JobManager
+from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
 from taipy.core.scenario._scenario_manager import _ScenarioManager
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.sequence._sequence_manager import _SequenceManager
@@ -192,26 +194,113 @@ def test_get_all_on_multiple_versions_environment():
 def test_is_submittable():
     task_id = "TASK_task_id"
     scenario_id = "SCENARIO_scenario_id"
-    dn = PickleDataNode("dn", Scope.SCENARIO, parent_ids={task_id, scenario_id}, properties={"default_data": 10})
-    task = Task("task", {}, print, [dn], id=task_id, parent_ids={scenario_id})
+    dn_1 = PickleDataNode("dn_1", Scope.SCENARIO, parent_ids={task_id, scenario_id}, properties={"default_data": 10})
+    dn_2 = PickleDataNode("dn_2", Scope.SCENARIO, parent_ids={task_id, scenario_id}, properties={"default_data": 10})
+    task = Task("task", {}, print, [dn_1, dn_2], id=task_id, parent_ids={scenario_id})
     scenario = Scenario("scenario", {task}, {}, set(), scenario_id=scenario_id)
-    _DataManager._set(dn)
+    _DataManager._set(dn_1)
+    _DataManager._set(dn_2)
     _TaskManager._set(task)
     _ScenarioManager._set(scenario)
 
+    dn_1 = scenario.dn_1
+    dn_2 = scenario.dn_2
+
     scenario.add_sequences({"sequence": [task]})
     sequence = scenario.sequences["sequence"]
     assert len(_SequenceManager._get_all()) == 1
+    assert sequence.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
     assert _SequenceManager._is_submittable(sequence)
     assert _SequenceManager._is_submittable(sequence.id)
+    assert _ScenarioManager._is_submittable(scenario)
     assert not _SequenceManager._is_submittable("Sequence_temp")
     assert not _SequenceManager._is_submittable("SEQUENCE_temp_SCENARIO_scenario")
 
-    scenario.dn.edit_in_progress = True
+    dn_1.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert sequence.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert sequence.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is being edited."
+    )
+    assert not _ScenarioManager._is_submittable(scenario)
+    assert not _SequenceManager._is_submittable(sequence)
+    assert not _SequenceManager._is_submittable(sequence.id)
+
+    dn_1.edit_in_progress = False
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert sequence.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert _SequenceManager._is_submittable(sequence)
+    assert _SequenceManager._is_submittable(sequence.id)
+    assert _ScenarioManager._is_submittable(scenario)
+
+    dn_1.last_edit_date = None
+    dn_2.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert sequence.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert sequence.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert sequence.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[sequence.id][dn_1.id] == f"DataNode {dn_1.id} is not written."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert not _ScenarioManager._is_submittable(scenario)
+    assert not _SequenceManager._is_submittable(sequence)
+    assert not _SequenceManager._is_submittable(sequence.id)
+
+    dn_1.last_edit_date = datetime.now()
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert sequence.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert sequence.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[sequence.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert not _ScenarioManager._is_submittable(scenario)
     assert not _SequenceManager._is_submittable(sequence)
     assert not _SequenceManager._is_submittable(sequence.id)
 
-    scenario.dn.edit_in_progress = False
+    dn_2.edit_in_progress = False
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert sequence.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_2.id not in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id not in SubmittableStatusCache.submittable_id_datanodes[sequence.id]
+    assert dn_2.id not in SubmittableStatusCache.datanode_id_submittables
+    assert _ScenarioManager._is_submittable(scenario)
     assert _SequenceManager._is_submittable(sequence)
     assert _SequenceManager._is_submittable(sequence.id)
 

+ 104 - 15
tests/core/task/test_task_manager.py

@@ -10,6 +10,7 @@
 # specific language governing permissions and limitations under the License.
 
 import uuid
+from datetime import datetime
 from unittest import mock
 
 import pytest
@@ -22,6 +23,8 @@ from taipy.core._version._version_manager import _VersionManager
 from taipy.core.data._data_manager import _DataManager
 from taipy.core.data.in_memory import InMemoryDataNode
 from taipy.core.exceptions.exceptions import ModelNotFound, NonExistingTask
+from taipy.core.notification._submittable_status_cache import SubmittableStatusCache
+from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.task._task_manager import _TaskManager
 from taipy.core.task._task_manager_factory import _TaskManagerFactory
 from taipy.core.task.task import Task
@@ -303,23 +306,109 @@ def test_hard_delete():
 
 
 def test_is_submittable():
+    task_manager = _TaskManagerFactory._build_manager()
+    scenario_manager = _ScenarioManagerFactory._build_manager()
     assert len(_TaskManager._get_all()) == 0
-    dn_config = Config.configure_in_memory_data_node("dn", 10)
-    task_config = Config.configure_task("task", print, [dn_config])
-    task = _TaskManager._bulk_get_or_create([task_config])[0]
-
-    assert len(_TaskManager._get_all()) == 1
-    assert _TaskManager._is_submittable(task)
-    assert _TaskManager._is_submittable(task.id)
-    assert not _TaskManager._is_submittable("Task_temp")
-
-    task.input["dn"].edit_in_progress = True
-    assert not _TaskManager._is_submittable(task)
-    assert not _TaskManager._is_submittable(task.id)
 
-    task.input["dn"].edit_in_progress = False
-    assert _TaskManager._is_submittable(task)
-    assert _TaskManager._is_submittable(task.id)
+    dn_config_1 = Config.configure_pickle_data_node("dn_1", default_data=10)
+    dn_config_2 = Config.configure_pickle_data_node("dn_2", default_data=15)
+    task_config = Config.configure_task("task", print, [dn_config_1, dn_config_2])
+    scenario_config = Config.configure_scenario("scenario", [task_config])
+
+    scenario = scenario_manager._create(scenario_config)
+    task = scenario.tasks["task"]
+    dn_1 = scenario.dn_1
+    dn_2 = scenario.dn_2
+
+    assert len(task_manager._get_all()) == 1
+    assert len(scenario_manager._get_all()) == 1
+
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert task_manager._is_submittable(task)
+    assert task_manager._is_submittable(task.id)
+    assert scenario_manager._is_submittable(scenario)
+    assert scenario_manager._is_submittable(scenario.id)
+    assert not task_manager._is_submittable("Task_temp")
+
+    dn_1.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert task.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is being edited."
+    )
+    assert SubmittableStatusCache.submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is being edited."
+    assert not scenario_manager._is_submittable(scenario)
+    assert not task_manager._is_submittable(task)
+    assert not task_manager._is_submittable(task.id)
+
+    dn_1.edit_in_progress = False
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert scenario_manager._is_submittable(scenario)
+    assert task_manager._is_submittable(task)
+    assert task_manager._is_submittable(task.id)
+
+    dn_1.last_edit_date = None
+    dn_2.edit_in_progress = True
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_1.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert task.id in SubmittableStatusCache.datanode_id_submittables[dn_1.id]
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert task.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_1.id] == f"DataNode {dn_1.id} is not written."
+    )
+    assert SubmittableStatusCache.submittable_id_datanodes[task.id][dn_1.id] == f"DataNode {dn_1.id} is not written."
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert SubmittableStatusCache.submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    assert not scenario_manager._is_submittable(scenario)
+    assert not task_manager._is_submittable(task)
+    assert not task_manager._is_submittable(task.id)
+
+    dn_1.last_edit_date = datetime.now()
+    assert scenario.id in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_1.id not in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_1.id not in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_1.id not in SubmittableStatusCache.datanode_id_submittables
+    assert dn_2.id in SubmittableStatusCache.datanode_id_submittables
+    assert scenario.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert task.id in SubmittableStatusCache.datanode_id_submittables[dn_2.id]
+    assert (
+        SubmittableStatusCache.submittable_id_datanodes[scenario.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    )
+    assert SubmittableStatusCache.submittable_id_datanodes[task.id][dn_2.id] == f"DataNode {dn_2.id} is being edited."
+    assert not scenario_manager._is_submittable(scenario)
+    assert not task_manager._is_submittable(task)
+    assert not task_manager._is_submittable(task.id)
+
+    dn_2.edit_in_progress = False
+    assert scenario.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert task.id not in SubmittableStatusCache.submittable_id_datanodes
+    assert dn_2.id not in SubmittableStatusCache.submittable_id_datanodes[scenario.id]
+    assert dn_2.id not in SubmittableStatusCache.submittable_id_datanodes[task.id]
+    assert dn_2.id not in SubmittableStatusCache.datanode_id_submittables
+    assert scenario_manager._is_submittable(scenario)
+    assert task_manager._is_submittable(task)
+    assert task_manager._is_submittable(task.id)
 
 
 def test_submit_task():