test_context_submission_status.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. from unittest.mock import Mock, patch
  2. import pytest
  3. from src.taipy.gui_core._context import _GuiCoreContext, _SubmissionStatus
  4. from taipy.core import Status
  5. class MockJob:
  6. def __init__(self, id: str, status):
  7. self.status = status
  8. self.id = id
  9. def is_failed(self):
  10. return self.status == Status.FAILED
  11. def is_canceled(self):
  12. return self.status == Status.CANCELED
  13. def is_blocked(self):
  14. return self.status == Status.BLOCKED
  15. def is_pending(self):
  16. return self.status == Status.PENDING
  17. def is_running(self):
  18. return self.status == Status.RUNNING
  19. def is_completed(self):
  20. return self.status == Status.COMPLETED
  21. def is_skipped(self):
  22. return self.status == Status.SKIPPED
  23. def is_abandoned(self):
  24. return self.status == Status.ABANDONED
  25. def is_submitted(self):
  26. return self.status == Status.SUBMITTED
  27. def mock_core_get(entity_id):
  28. jobs = {
  29. "job0_submitted": MockJob("job0_submitted", Status.SUBMITTED),
  30. "job1_failed": MockJob("job1_failed", Status.FAILED),
  31. "job2_canceled": MockJob("job2_canceled", Status.CANCELED),
  32. "job3_blocked": MockJob("job3_blocked", Status.BLOCKED),
  33. "job4_pending": MockJob("job4_pending", Status.PENDING),
  34. "job5_running": MockJob("job5_running", Status.RUNNING),
  35. "job6_completed": MockJob("job6_completed", Status.COMPLETED),
  36. "job7_skipped": MockJob("job7_skipped", Status.SKIPPED),
  37. "job8_abandoned": MockJob("job8_abandoned", Status.ABANDONED),
  38. }
  39. return jobs[entity_id]
  40. class TestGuiCoreContext_SubmissionStatus:
  41. @pytest.mark.parametrize(
  42. "job_ids, expected_status",
  43. [
  44. (["job1_failed"], _SubmissionStatus.FAILED),
  45. (["job2_canceled"], _SubmissionStatus.CANCELED),
  46. (["job3_blocked"], _SubmissionStatus.BLOCKED),
  47. (["job4_pending"], _SubmissionStatus.WAITING),
  48. (["job5_running"], _SubmissionStatus.RUNNING),
  49. (["job6_completed"], _SubmissionStatus.COMPLETED),
  50. (["job7_skipped"], _SubmissionStatus.COMPLETED),
  51. (["job8_abandoned"], _SubmissionStatus.UNDEFINED),
  52. ],
  53. )
  54. def test_single_job(self, job_ids, expected_status):
  55. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  56. gui_core_context = _GuiCoreContext(Mock())
  57. status = gui_core_context._get_submittable_status(job_ids)
  58. assert status == expected_status
  59. @pytest.mark.parametrize(
  60. "job_ids, expected_status",
  61. [
  62. (["job1_failed", "job1_failed"], _SubmissionStatus.FAILED),
  63. (["job1_failed", "job2_canceled"], _SubmissionStatus.FAILED),
  64. (["job1_failed", "job3_blocked"], _SubmissionStatus.FAILED),
  65. (["job1_failed", "job4_pending"], _SubmissionStatus.FAILED),
  66. (["job1_failed", "job5_running"], _SubmissionStatus.FAILED),
  67. (["job1_failed", "job6_completed"], _SubmissionStatus.FAILED),
  68. (["job1_failed", "job7_skipped"], _SubmissionStatus.FAILED),
  69. (["job1_failed", "job8_abandoned"], _SubmissionStatus.FAILED),
  70. (["job2_canceled", "job1_failed"], _SubmissionStatus.FAILED),
  71. (["job3_blocked", "job1_failed"], _SubmissionStatus.FAILED),
  72. (["job4_pending", "job1_failed"], _SubmissionStatus.FAILED),
  73. (["job5_running", "job1_failed"], _SubmissionStatus.FAILED),
  74. (["job6_completed", "job1_failed"], _SubmissionStatus.FAILED),
  75. (["job7_skipped", "job1_failed"], _SubmissionStatus.FAILED),
  76. (["job8_abandoned", "job1_failed"], _SubmissionStatus.FAILED),
  77. ],
  78. )
  79. def test_one_failed_job(self, job_ids, expected_status):
  80. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  81. gui_core_context = _GuiCoreContext(Mock())
  82. status = gui_core_context._get_submittable_status(job_ids)
  83. assert status == expected_status
  84. @pytest.mark.parametrize(
  85. "job_ids, expected_status",
  86. [
  87. (["job2_canceled", "job2_canceled"], _SubmissionStatus.CANCELED),
  88. (["job2_canceled", "job3_blocked"], _SubmissionStatus.CANCELED),
  89. (["job2_canceled", "job4_pending"], _SubmissionStatus.CANCELED),
  90. (["job2_canceled", "job5_running"], _SubmissionStatus.CANCELED),
  91. (["job2_canceled", "job6_completed"], _SubmissionStatus.CANCELED),
  92. (["job2_canceled", "job7_skipped"], _SubmissionStatus.CANCELED),
  93. (["job2_canceled", "job8_abandoned"], _SubmissionStatus.CANCELED),
  94. (["job3_blocked", "job2_canceled"], _SubmissionStatus.CANCELED),
  95. (["job4_pending", "job2_canceled"], _SubmissionStatus.CANCELED),
  96. (["job5_running", "job2_canceled"], _SubmissionStatus.CANCELED),
  97. (["job6_completed", "job2_canceled"], _SubmissionStatus.CANCELED),
  98. (["job7_skipped", "job2_canceled"], _SubmissionStatus.CANCELED),
  99. (["job8_abandoned", "job2_canceled"], _SubmissionStatus.CANCELED),
  100. ],
  101. )
  102. def test_no_failed_one_cancel(self, job_ids, expected_status):
  103. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  104. gui_core_context = _GuiCoreContext(Mock())
  105. status = gui_core_context._get_submittable_status(job_ids)
  106. assert status == expected_status
  107. @pytest.mark.parametrize(
  108. "job_ids, expected_status",
  109. [
  110. (["job4_pending", "job3_blocked"], _SubmissionStatus.WAITING),
  111. (["job4_pending", "job4_pending"], _SubmissionStatus.WAITING),
  112. (["job4_pending", "job6_completed"], _SubmissionStatus.WAITING),
  113. (["job4_pending", "job7_skipped"], _SubmissionStatus.WAITING),
  114. (["job3_blocked", "job4_pending"], _SubmissionStatus.WAITING),
  115. (["job6_completed", "job4_pending"], _SubmissionStatus.WAITING),
  116. (["job7_skipped", "job4_pending"], _SubmissionStatus.WAITING),
  117. ],
  118. )
  119. def test_no_failed_or_cancel_one_pending(self, job_ids, expected_status):
  120. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  121. gui_core_context = _GuiCoreContext(Mock())
  122. status = gui_core_context._get_submittable_status(job_ids)
  123. assert status == expected_status
  124. @pytest.mark.parametrize(
  125. "job_ids, expected_status",
  126. [
  127. (["job5_running", "job3_blocked"], _SubmissionStatus.RUNNING),
  128. (["job5_running", "job4_pending"], _SubmissionStatus.RUNNING),
  129. (["job5_running", "job5_running"], _SubmissionStatus.RUNNING),
  130. (["job5_running", "job6_completed"], _SubmissionStatus.RUNNING),
  131. (["job5_running", "job7_skipped"], _SubmissionStatus.RUNNING),
  132. (["job3_blocked", "job5_running"], _SubmissionStatus.RUNNING),
  133. (["job4_pending", "job5_running"], _SubmissionStatus.RUNNING),
  134. (["job6_completed", "job5_running"], _SubmissionStatus.RUNNING),
  135. (["job7_skipped", "job5_running"], _SubmissionStatus.RUNNING),
  136. ],
  137. )
  138. def test_no_failed_cancel_nor_pending_one_running(self, job_ids, expected_status):
  139. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  140. gui_core_context = _GuiCoreContext(Mock())
  141. status = gui_core_context._get_submittable_status(job_ids)
  142. assert status == expected_status
  143. @pytest.mark.parametrize(
  144. "job_ids, expected_status",
  145. [
  146. (["job3_blocked", "job3_blocked"], _SubmissionStatus.BLOCKED),
  147. (["job3_blocked", "job6_completed"], _SubmissionStatus.BLOCKED),
  148. (["job3_blocked", "job7_skipped"], _SubmissionStatus.BLOCKED),
  149. (["job6_completed", "job3_blocked"], _SubmissionStatus.BLOCKED),
  150. (["job7_skipped", "job3_blocked"], _SubmissionStatus.BLOCKED),
  151. ],
  152. )
  153. def test_no_failed_cancel_pending_nor_running_one_blocked(self, job_ids, expected_status):
  154. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  155. gui_core_context = _GuiCoreContext(Mock())
  156. status = gui_core_context._get_submittable_status(job_ids)
  157. assert status == expected_status
  158. @pytest.mark.parametrize(
  159. "job_ids, expected_status",
  160. [
  161. (["job6_completed", "job6_completed"], _SubmissionStatus.COMPLETED),
  162. (["job6_completed", "job7_skipped"], _SubmissionStatus.COMPLETED),
  163. (["job7_skipped", "job6_completed"], _SubmissionStatus.COMPLETED),
  164. (["job7_skipped", "job7_skipped"], _SubmissionStatus.COMPLETED),
  165. ],
  166. )
  167. def test_only_completed_or_skipped(self, job_ids, expected_status):
  168. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  169. gui_core_context = _GuiCoreContext(Mock())
  170. status = gui_core_context._get_submittable_status(job_ids)
  171. assert status == expected_status
  172. @pytest.mark.parametrize(
  173. "job_ids, expected_status",
  174. [
  175. (["job3_blocked", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  176. (["job4_pending", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  177. (["job5_running", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  178. (["job6_completed", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  179. (["job7_skipped", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  180. (["job8_abandoned", "job8_abandoned"], _SubmissionStatus.UNDEFINED),
  181. (["job8_abandoned", "job3_blocked"], _SubmissionStatus.UNDEFINED),
  182. (["job8_abandoned", "job4_pending"], _SubmissionStatus.UNDEFINED),
  183. (["job8_abandoned", "job5_running"], _SubmissionStatus.UNDEFINED),
  184. (["job8_abandoned", "job6_completed"], _SubmissionStatus.UNDEFINED),
  185. (["job8_abandoned", "job7_skipped"], _SubmissionStatus.UNDEFINED),
  186. ],
  187. )
  188. def test_WRONG_CASE_abandoned_without_cancel_or_failed(self, job_ids, expected_status):
  189. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  190. gui_core_context = _GuiCoreContext(Mock())
  191. status = gui_core_context._get_submittable_status(job_ids)
  192. assert status == expected_status
  193. def test_no_job(self):
  194. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  195. gui_core_context = _GuiCoreContext(Mock())
  196. status = gui_core_context._get_submittable_status([])
  197. assert status == _SubmissionStatus.UNDEFINED