123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- 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
|