|
@@ -0,0 +1,222 @@
|
|
|
+from unittest.mock import Mock, patch
|
|
|
+
|
|
|
+import pytest
|
|
|
+
|
|
|
+from src.taipy.gui_core._context import _GuiCoreContext, _SubmissionStatus
|
|
|
+from taipy.core import Status
|
|
|
+
|
|
|
+
|
|
|
+class MockJob:
|
|
|
+ def __init__(self, id: str, status):
|
|
|
+ self.status = status
|
|
|
+ self.id = id
|
|
|
+
|
|
|
+ def is_failed(self):
|
|
|
+ return self.status == Status.FAILED
|
|
|
+
|
|
|
+ def is_canceled(self):
|
|
|
+ return self.status == Status.CANCELED
|
|
|
+
|
|
|
+ def is_blocked(self):
|
|
|
+ return self.status == Status.BLOCKED
|
|
|
+
|
|
|
+ def is_pending(self):
|
|
|
+ return self.status == Status.PENDING
|
|
|
+
|
|
|
+ def is_running(self):
|
|
|
+ return self.status == Status.RUNNING
|
|
|
+
|
|
|
+ def is_completed(self):
|
|
|
+ return self.status == Status.COMPLETED
|
|
|
+
|
|
|
+ def is_skipped(self):
|
|
|
+ return self.status == Status.SKIPPED
|
|
|
+
|
|
|
+ def is_abandoned(self):
|
|
|
+ return self.status == Status.ABANDONED
|
|
|
+
|
|
|
+ def is_submitted(self):
|
|
|
+ return self.status == Status.SUBMITTED
|
|
|
+
|
|
|
+
|
|
|
+def mock_core_get(entity_id):
|
|
|
+ jobs = {
|
|
|
+ "job0_submitted": MockJob("job0_submitted", Status.SUBMITTED),
|
|
|
+ "job1_failed": MockJob("job1_failed", Status.FAILED),
|
|
|
+ "job2_canceled": MockJob("job2_canceled", Status.CANCELED),
|
|
|
+ "job3_blocked": MockJob("job3_blocked", Status.BLOCKED),
|
|
|
+ "job4_pending": MockJob("job4_pending", Status.PENDING),
|
|
|
+ "job5_running": MockJob("job5_running", Status.RUNNING),
|
|
|
+ "job6_completed": MockJob("job6_completed", Status.COMPLETED),
|
|
|
+ "job7_skipped": MockJob("job7_skipped", Status.SKIPPED),
|
|
|
+ "job8_abandoned": MockJob("job8_abandoned", Status.ABANDONED),
|
|
|
+ }
|
|
|
+ return jobs[entity_id]
|
|
|
+
|
|
|
+
|
|
|
+class TestGuiCoreContext_SubmissionStatus:
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job3_blocked"], _SubmissionStatus.BLOCKED),
|
|
|
+ (["job4_pending"], _SubmissionStatus.WAITING),
|
|
|
+ (["job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job6_completed"], _SubmissionStatus.COMPLETED),
|
|
|
+ (["job7_skipped"], _SubmissionStatus.COMPLETED),
|
|
|
+ (["job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_single_job(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job1_failed", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job2_canceled"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job3_blocked"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job4_pending"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job5_running"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job6_completed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job7_skipped"], _SubmissionStatus.FAILED),
|
|
|
+ (["job1_failed", "job8_abandoned"], _SubmissionStatus.FAILED),
|
|
|
+ (["job2_canceled", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job3_blocked", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job4_pending", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job5_running", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job6_completed", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job7_skipped", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ (["job8_abandoned", "job1_failed"], _SubmissionStatus.FAILED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_one_failed_job(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job2_canceled", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job3_blocked"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job4_pending"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job5_running"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job6_completed"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job7_skipped"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job2_canceled", "job8_abandoned"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job3_blocked", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job4_pending", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job5_running", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job6_completed", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job7_skipped", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ (["job8_abandoned", "job2_canceled"], _SubmissionStatus.CANCELED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_no_failed_one_cancel(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job4_pending", "job3_blocked"], _SubmissionStatus.WAITING),
|
|
|
+ (["job4_pending", "job4_pending"], _SubmissionStatus.WAITING),
|
|
|
+ (["job4_pending", "job6_completed"], _SubmissionStatus.WAITING),
|
|
|
+ (["job4_pending", "job7_skipped"], _SubmissionStatus.WAITING),
|
|
|
+ (["job3_blocked", "job4_pending"], _SubmissionStatus.WAITING),
|
|
|
+ (["job6_completed", "job4_pending"], _SubmissionStatus.WAITING),
|
|
|
+ (["job7_skipped", "job4_pending"], _SubmissionStatus.WAITING),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_no_failed_or_cancel_one_pending(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job5_running", "job3_blocked"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job5_running", "job4_pending"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job5_running", "job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job5_running", "job6_completed"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job5_running", "job7_skipped"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job3_blocked", "job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job4_pending", "job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job6_completed", "job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ (["job7_skipped", "job5_running"], _SubmissionStatus.RUNNING),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_no_failed_cancel_nor_pending_one_running(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job3_blocked", "job3_blocked"], _SubmissionStatus.BLOCKED),
|
|
|
+ (["job3_blocked", "job6_completed"], _SubmissionStatus.BLOCKED),
|
|
|
+ (["job3_blocked", "job7_skipped"], _SubmissionStatus.BLOCKED),
|
|
|
+ (["job6_completed", "job3_blocked"], _SubmissionStatus.BLOCKED),
|
|
|
+ (["job7_skipped", "job3_blocked"], _SubmissionStatus.BLOCKED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_no_failed_cancel_pending_nor_running_one_blocked(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job6_completed", "job6_completed"], _SubmissionStatus.COMPLETED),
|
|
|
+ (["job6_completed", "job7_skipped"], _SubmissionStatus.COMPLETED),
|
|
|
+ (["job7_skipped", "job6_completed"], _SubmissionStatus.COMPLETED),
|
|
|
+ (["job7_skipped", "job7_skipped"], _SubmissionStatus.COMPLETED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_only_completed_or_skipped(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ @pytest.mark.parametrize(
|
|
|
+ "job_ids, expected_status",
|
|
|
+ [
|
|
|
+ (["job3_blocked", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job4_pending", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job5_running", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job6_completed", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job7_skipped", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job3_blocked"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job4_pending"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job5_running"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job6_completed"], _SubmissionStatus.UNDEFINED),
|
|
|
+ (["job8_abandoned", "job7_skipped"], _SubmissionStatus.UNDEFINED),
|
|
|
+ ],
|
|
|
+ )
|
|
|
+ def test_WRONG_CASE_abandoned_without_cancel_or_failed(self, job_ids, expected_status):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status(job_ids)
|
|
|
+ assert status == expected_status
|
|
|
+
|
|
|
+ def test_no_job(self):
|
|
|
+ with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
|
|
|
+ gui_core_context = _GuiCoreContext(Mock())
|
|
|
+ status = gui_core_context._get_submittable_status([])
|
|
|
+ assert status == _SubmissionStatus.UNDEFINED
|