test_context_is_editable.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. from unittest.mock import Mock, patch
  2. import pytest
  3. from src.taipy.gui_core._context import _GuiCoreContext
  4. from taipy.config.common.scope import Scope
  5. from taipy.core import Job, Scenario, Task
  6. from taipy.core.data.pickle import PickleDataNode
  7. from taipy.gui import Gui
  8. a_scenario = Scenario("scenario_config_id", [], {}, sequences={"sequence": {}})
  9. a_task = Task("task_config_id", {}, print)
  10. a_job = Job("JOB_job_id", a_task, "submit_id", a_scenario.id)
  11. a_job.isfinished = lambda s: True
  12. a_datanode = PickleDataNode("data_node_config_id", Scope.SCENARIO)
  13. def mock_core_get(entity_id):
  14. if entity_id == a_scenario.id:
  15. return a_scenario
  16. if entity_id == a_job.id:
  17. return a_job
  18. if entity_id == a_datanode.id:
  19. return a_datanode
  20. return a_task
  21. def mock_is_editable_false(entity_id):
  22. return False
  23. def mock_is_true(entity_id):
  24. return True
  25. class MockState:
  26. def __init__(self, **kwargs) -> None:
  27. self.assign = kwargs.get("assign")
  28. class TestGuiCoreContext_is_editable:
  29. def test_crud_scenario(self):
  30. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  31. gui_core_context = _GuiCoreContext(Mock())
  32. assign = Mock()
  33. gui_core_context.crud_scenario(
  34. MockState(assign=assign),
  35. "",
  36. {
  37. "args": [
  38. True,
  39. False,
  40. {"name": "name", "id": a_scenario.id},
  41. ]
  42. },
  43. )
  44. assign.assert_not_called()
  45. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  46. assign.reset_mock()
  47. gui_core_context.crud_scenario(
  48. MockState(assign=assign),
  49. "",
  50. {
  51. "args": [
  52. True,
  53. False,
  54. {"name": "name", "id": a_scenario.id},
  55. ]
  56. },
  57. )
  58. assign.assert_called_once()
  59. assert assign.call_args.args[0] == "gui_core_sc_error"
  60. assert str(assign.call_args.args[1]).endswith("is not editable.")
  61. def test_edit_entity(self):
  62. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  63. gui_core_context = _GuiCoreContext(Mock())
  64. assign = Mock()
  65. gui_core_context.edit_entity(
  66. MockState(assign=assign),
  67. "",
  68. {
  69. "args": [
  70. {"name": "name", "id": a_scenario.id},
  71. ]
  72. },
  73. )
  74. assign.assert_called_once()
  75. assert assign.call_args.args[0] == "gui_core_sv_error"
  76. assert assign.call_args.args[1] == ""
  77. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  78. assign.reset_mock()
  79. gui_core_context.edit_entity(
  80. MockState(assign=assign),
  81. "",
  82. {
  83. "args": [
  84. {"name": "name", "id": a_scenario.id},
  85. ]
  86. },
  87. )
  88. assign.assert_called_once()
  89. assert assign.call_args.args[0] == "gui_core_sv_error"
  90. assert str(assign.call_args.args[1]).endswith("is not editable.")
  91. def test_act_on_jobs(self):
  92. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get), patch(
  93. "src.taipy.gui_core._context.is_deletable", side_effect=mock_is_true
  94. ):
  95. gui_core_context = _GuiCoreContext(Mock())
  96. assign = Mock()
  97. gui_core_context.act_on_jobs(
  98. MockState(assign=assign),
  99. "",
  100. {
  101. "args": [
  102. {"id": [a_job.id], "action": "cancel"},
  103. ]
  104. },
  105. )
  106. assign.assert_called_once()
  107. assert assign.call_args.args[0] == "gui_core_js_error"
  108. assert str(assign.call_args.args[1]).find("is not editable.") == -1
  109. assign.reset_mock()
  110. with patch("src.taipy.gui_core._context.is_readable", side_effect=mock_is_editable_false):
  111. gui_core_context.act_on_jobs(
  112. MockState(assign=assign),
  113. "",
  114. {
  115. "args": [
  116. {"id": [a_job.id], "action": "cancel"},
  117. ]
  118. },
  119. )
  120. assign.assert_called_once()
  121. assert assign.call_args.args[0] == "gui_core_js_error"
  122. assert str(assign.call_args.args[1]).endswith("is not readable.")
  123. def test_edit_data_node(self):
  124. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  125. gui_core_context = _GuiCoreContext(Mock())
  126. assign = Mock()
  127. gui_core_context.edit_data_node(
  128. MockState(assign=assign),
  129. "",
  130. {
  131. "args": [
  132. {"id": a_datanode.id},
  133. ]
  134. },
  135. )
  136. assign.assert_called_once()
  137. assert assign.call_args.args[0] == "gui_core_dv_error"
  138. assert assign.call_args.args[1] == ""
  139. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  140. assign.reset_mock()
  141. gui_core_context.edit_data_node(
  142. MockState(assign=assign),
  143. "",
  144. {
  145. "args": [
  146. {"id": a_datanode.id},
  147. ]
  148. },
  149. )
  150. assign.assert_called_once()
  151. assert assign.call_args.args[0] == "gui_core_dv_error"
  152. assert str(assign.call_args.args[1]).endswith("is not editable.")
  153. def test_lock_datanode_for_edit(self):
  154. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  155. mockGui = Mock(Gui)
  156. mockGui._get_client_id = lambda: "a_client_id"
  157. gui_core_context = _GuiCoreContext(mockGui)
  158. assign = Mock()
  159. gui_core_context.lock_datanode_for_edit(
  160. MockState(assign=assign),
  161. "",
  162. {
  163. "args": [
  164. {"id": a_datanode.id},
  165. ]
  166. },
  167. )
  168. assign.assert_called_once()
  169. assert assign.call_args.args[0] == "gui_core_dv_error"
  170. assert assign.call_args.args[1] == ""
  171. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  172. assign.reset_mock()
  173. gui_core_context.lock_datanode_for_edit(
  174. MockState(assign=assign),
  175. "",
  176. {
  177. "args": [
  178. {"id": a_datanode.id},
  179. ]
  180. },
  181. )
  182. assign.assert_called_once()
  183. assert assign.call_args.args[0] == "gui_core_dv_error"
  184. assert str(assign.call_args.args[1]).endswith("is not editable.")
  185. def test_update_data(self):
  186. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  187. mockGui = Mock(Gui)
  188. mockGui._get_client_id = lambda: "a_client_id"
  189. gui_core_context = _GuiCoreContext(mockGui)
  190. assign = Mock()
  191. gui_core_context.update_data(
  192. MockState(assign=assign),
  193. "",
  194. {
  195. "args": [
  196. {"id": a_datanode.id},
  197. ]
  198. },
  199. )
  200. assign.assert_called()
  201. assert assign.call_args_list[0].args[0] == "gui_core_dv_error"
  202. assert assign.call_args_list[0].args[1] == ""
  203. assign.reset_mock()
  204. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  205. gui_core_context.update_data(
  206. MockState(assign=assign),
  207. "",
  208. {
  209. "args": [
  210. {"id": a_datanode.id},
  211. ]
  212. },
  213. )
  214. assign.assert_called_once()
  215. assert assign.call_args.args[0] == "gui_core_dv_error"
  216. assert str(assign.call_args.args[1]).endswith("is not editable.")
  217. def test_tabular_data_edit(self):
  218. with patch("src.taipy.gui_core._context.core_get", side_effect=mock_core_get):
  219. mockGui = Mock(Gui)
  220. mockGui._get_client_id = lambda: "a_client_id"
  221. gui_core_context = _GuiCoreContext(mockGui)
  222. assign = Mock()
  223. gui_core_context.tabular_data_edit(
  224. MockState(assign=assign),
  225. "",
  226. {
  227. "user_data": {"dn_id": a_datanode.id},
  228. },
  229. )
  230. assign.assert_called_once()
  231. assert assign.call_args_list[0].args[0] == "gui_core_dv_error"
  232. assert (
  233. assign.call_args_list[0].args[1]
  234. == "Error updating Datanode tabular value: type does not support at[] indexer."
  235. )
  236. assign.reset_mock()
  237. with patch("src.taipy.gui_core._context.is_editable", side_effect=mock_is_editable_false):
  238. gui_core_context.tabular_data_edit(
  239. MockState(assign=assign),
  240. "",
  241. {
  242. "user_data": {"dn_id": a_datanode.id},
  243. },
  244. )
  245. assign.assert_called_once()
  246. assert assign.call_args.args[0] == "gui_core_dv_error"
  247. assert str(assign.call_args.args[1]).endswith("is not editable.")