浏览代码

added tests for new submittable mechansism

Toan Quach 1 年之前
父节点
当前提交
559772cf5f

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

@@ -38,6 +38,7 @@ from taipy.core.exceptions.exceptions import (
     UnauthorizedTagError,
     UnauthorizedTagError,
 )
 )
 from taipy.core.job._job_manager import _JobManager
 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 import _ScenarioManager
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario._scenario_manager_factory import _ScenarioManagerFactory
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.scenario.scenario import Scenario
@@ -933,21 +934,72 @@ def test_hard_delete_shared_entities():
 def test_is_submittable():
 def test_is_submittable():
     assert len(_ScenarioManager._get_all()) == 0
     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_config = Config.configure_scenario("sc", {task_config}, set(), Frequency.DAILY)
     scenario = _ScenarioManager._create(scenario_config)
     scenario = _ScenarioManager._create(scenario_config)
+    dn_1 = scenario.dn_1
+    dn_2 = scenario.dn_2
 
 
     assert len(_ScenarioManager._get_all()) == 1
     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)
     assert _ScenarioManager._is_submittable(scenario.id)
     assert _ScenarioManager._is_submittable(scenario.id)
     assert not _ScenarioManager._is_submittable("Scenario_temp")
     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)
     assert not _ScenarioManager._is_submittable(scenario.id)
     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)
     assert _ScenarioManager._is_submittable(scenario.id)
     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.
 # specific language governing permissions and limitations under the License.
 
 
 import json
 import json
+from datetime import datetime
 from pathlib import Path
 from pathlib import Path
 from typing import Callable, Iterable, Optional
 from typing import Callable, Iterable, Optional
 from unittest import mock
 from unittest import mock
@@ -34,6 +35,7 @@ from taipy.core.exceptions.exceptions import (
     SequenceBelongsToNonExistingScenario,
     SequenceBelongsToNonExistingScenario,
 )
 )
 from taipy.core.job._job_manager import _JobManager
 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 import _ScenarioManager
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.scenario.scenario import Scenario
 from taipy.core.sequence._sequence_manager import _SequenceManager
 from taipy.core.sequence._sequence_manager import _SequenceManager
@@ -192,26 +194,113 @@ def test_get_all_on_multiple_versions_environment():
 def test_is_submittable():
 def test_is_submittable():
     task_id = "TASK_task_id"
     task_id = "TASK_task_id"
     scenario_id = "SCENARIO_scenario_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)
     scenario = Scenario("scenario", {task}, {}, set(), scenario_id=scenario_id)
-    _DataManager._set(dn)
+    _DataManager._set(dn_1)
+    _DataManager._set(dn_2)
     _TaskManager._set(task)
     _TaskManager._set(task)
     _ScenarioManager._set(scenario)
     _ScenarioManager._set(scenario)
 
 
+    dn_1 = scenario.dn_1
+    dn_2 = scenario.dn_2
+
     scenario.add_sequences({"sequence": [task]})
     scenario.add_sequences({"sequence": [task]})
     sequence = scenario.sequences["sequence"]
     sequence = scenario.sequences["sequence"]
     assert len(_SequenceManager._get_all()) == 1
     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)
     assert _SequenceManager._is_submittable(sequence.id)
     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")
     assert not _SequenceManager._is_submittable("SEQUENCE_temp_SCENARIO_scenario")
     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)
     assert not _SequenceManager._is_submittable(sequence.id)
     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)
     assert _SequenceManager._is_submittable(sequence.id)
     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.
 # specific language governing permissions and limitations under the License.
 
 
 import uuid
 import uuid
+from datetime import datetime
 from unittest import mock
 from unittest import mock
 
 
 import pytest
 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._data_manager import _DataManager
 from taipy.core.data.in_memory import InMemoryDataNode
 from taipy.core.data.in_memory import InMemoryDataNode
 from taipy.core.exceptions.exceptions import ModelNotFound, NonExistingTask
 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 import _TaskManager
 from taipy.core.task._task_manager_factory import _TaskManagerFactory
 from taipy.core.task._task_manager_factory import _TaskManagerFactory
 from taipy.core.task.task import Task
 from taipy.core.task.task import Task
@@ -303,23 +306,109 @@ def test_hard_delete():
 
 
 
 
 def test_is_submittable():
 def test_is_submittable():
+    task_manager = _TaskManagerFactory._build_manager()
+    scenario_manager = _ScenarioManagerFactory._build_manager()
     assert len(_TaskManager._get_all()) == 0
     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():
 def test_submit_task():