test_dependent.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. # Licensed to the Apache Software Foundation (ASF) under one
  2. # or more contributor license agreements. See the NOTICE file
  3. # distributed with this work for additional information
  4. # regarding copyright ownership. The ASF licenses this file
  5. # to you under the Apache License, Version 2.0 (the
  6. # "License"); you may not use this file except in compliance
  7. # with the License. You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing,
  12. # software distributed under the License is distributed on an
  13. # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. # KIND, either express or implied. See the License for the
  15. # specific language governing permissions and limitations
  16. # under the License.
  17. """Test Task dependent."""
  18. import itertools
  19. from typing import Dict, List, Optional, Tuple, Union
  20. from unittest.mock import patch
  21. import pytest
  22. from pydolphinscheduler.exceptions import PyDSParamException
  23. from pydolphinscheduler.tasks.dependent import (
  24. And,
  25. Dependent,
  26. DependentDate,
  27. DependentItem,
  28. DependentOperator,
  29. Or,
  30. )
  31. TEST_PROJECT = "test-project"
  32. TEST_PROCESS_DEFINITION = "test-process-definition"
  33. TEST_TASK = "test-task"
  34. TEST_PROJECT_CODE, TEST_DEFINITION_CODE, TEST_TASK_CODE = 12345, 123456, 1234567
  35. TEST_OPERATOR_LIST = ("AND", "OR")
  36. @pytest.mark.parametrize(
  37. "dep_date, dep_cycle",
  38. [
  39. # hour
  40. (DependentDate.CURRENT_HOUR, "hour"),
  41. (DependentDate.LAST_ONE_HOUR, "hour"),
  42. (DependentDate.LAST_TWO_HOURS, "hour"),
  43. (DependentDate.LAST_THREE_HOURS, "hour"),
  44. (DependentDate.LAST_TWENTY_FOUR_HOURS, "hour"),
  45. # day
  46. (DependentDate.TODAY, "day"),
  47. (DependentDate.LAST_ONE_DAYS, "day"),
  48. (DependentDate.LAST_TWO_DAYS, "day"),
  49. (DependentDate.LAST_THREE_DAYS, "day"),
  50. (DependentDate.LAST_SEVEN_DAYS, "day"),
  51. # week
  52. (DependentDate.THIS_WEEK, "week"),
  53. (DependentDate.LAST_WEEK, "week"),
  54. (DependentDate.LAST_MONDAY, "week"),
  55. (DependentDate.LAST_TUESDAY, "week"),
  56. (DependentDate.LAST_WEDNESDAY, "week"),
  57. (DependentDate.LAST_THURSDAY, "week"),
  58. (DependentDate.LAST_FRIDAY, "week"),
  59. (DependentDate.LAST_SATURDAY, "week"),
  60. (DependentDate.LAST_SUNDAY, "week"),
  61. # month
  62. (DependentDate.THIS_MONTH, "month"),
  63. (DependentDate.LAST_MONTH, "month"),
  64. (DependentDate.LAST_MONTH_BEGIN, "month"),
  65. (DependentDate.LAST_MONTH_END, "month"),
  66. ],
  67. )
  68. @patch(
  69. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  70. return_value={
  71. "projectCode": TEST_PROJECT_CODE,
  72. "processDefinitionCode": TEST_DEFINITION_CODE,
  73. "taskDefinitionCode": TEST_TASK_CODE,
  74. },
  75. )
  76. def test_dependent_item_get_define(mock_task_info, dep_date, dep_cycle):
  77. """Test dependent.DependentItem get define.
  78. Here we have test some cases as below.
  79. ```py
  80. {
  81. "projectCode": "project code",
  82. "definitionCode": "definition code",
  83. "depTaskCode": "dep task code",
  84. "cycle": "day",
  85. "dateValue": "today"
  86. }
  87. ```
  88. """
  89. attr = {
  90. "project_name": TEST_PROJECT,
  91. "process_definition_name": TEST_PROCESS_DEFINITION,
  92. "dependent_task_name": TEST_TASK,
  93. "dependent_date": dep_date,
  94. }
  95. expect = {
  96. "projectCode": TEST_PROJECT_CODE,
  97. "definitionCode": TEST_DEFINITION_CODE,
  98. "depTaskCode": TEST_TASK_CODE,
  99. "cycle": dep_cycle,
  100. "dateValue": dep_date,
  101. }
  102. task = DependentItem(**attr)
  103. assert expect == task.get_define()
  104. def test_dependent_item_date_error():
  105. """Test error when pass None to dependent_date."""
  106. with pytest.raises(
  107. PyDSParamException, match="Parameter dependent_date must provider.*?"
  108. ):
  109. DependentItem(
  110. project_name=TEST_PROJECT,
  111. process_definition_name=TEST_PROCESS_DEFINITION,
  112. dependent_date=None,
  113. )
  114. @pytest.mark.parametrize(
  115. "task_name, result",
  116. [
  117. ({"dependent_task_name": TEST_TASK}, TEST_TASK),
  118. ({}, None),
  119. ],
  120. )
  121. def test_dependent_item_code_parameter(task_name: dict, result: Optional[str]):
  122. """Test dependent item property code_parameter."""
  123. dependent_item = DependentItem(
  124. project_name=TEST_PROJECT,
  125. process_definition_name=TEST_PROCESS_DEFINITION,
  126. **task_name,
  127. )
  128. expect = (TEST_PROJECT, TEST_PROCESS_DEFINITION, result)
  129. assert dependent_item.code_parameter == expect
  130. @pytest.mark.parametrize(
  131. "arg_list",
  132. [
  133. [1, 2],
  134. [
  135. DependentItem(
  136. project_name=TEST_PROJECT,
  137. process_definition_name=TEST_PROCESS_DEFINITION,
  138. ),
  139. 1,
  140. ],
  141. [
  142. And(
  143. DependentItem(
  144. project_name=TEST_PROJECT,
  145. process_definition_name=TEST_PROCESS_DEFINITION,
  146. )
  147. ),
  148. 1,
  149. ],
  150. [
  151. DependentItem(
  152. project_name=TEST_PROJECT,
  153. process_definition_name=TEST_PROCESS_DEFINITION,
  154. ),
  155. And(
  156. DependentItem(
  157. project_name=TEST_PROJECT,
  158. process_definition_name=TEST_PROCESS_DEFINITION,
  159. )
  160. ),
  161. ],
  162. ],
  163. )
  164. @patch(
  165. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  166. return_value={
  167. "projectCode": TEST_PROJECT_CODE,
  168. "processDefinitionCode": TEST_DEFINITION_CODE,
  169. "taskDefinitionCode": TEST_TASK_CODE,
  170. },
  171. )
  172. def test_dependent_operator_set_define_error(mock_code, arg_list):
  173. """Test dependent operator function :func:`set_define` with not support type."""
  174. dep_op = DependentOperator(*arg_list)
  175. with pytest.raises(PyDSParamException, match="Dependent .*? operator.*?"):
  176. dep_op.set_define_attr()
  177. @pytest.mark.parametrize(
  178. # Test dependent operator, Test dependent item parameters, expect operator define
  179. "operators, kwargs, expect",
  180. [
  181. # Test dependent operator (And | Or) with single dependent item
  182. (
  183. (And, Or),
  184. (
  185. {
  186. "project_name": TEST_PROJECT,
  187. "process_definition_name": TEST_PROCESS_DEFINITION,
  188. "dependent_task_name": TEST_TASK,
  189. "dependent_date": DependentDate.LAST_MONTH_END,
  190. },
  191. ),
  192. [
  193. {
  194. "relation": op,
  195. "dependItemList": [
  196. {
  197. "projectCode": TEST_PROJECT_CODE,
  198. "definitionCode": TEST_DEFINITION_CODE,
  199. "depTaskCode": TEST_TASK_CODE,
  200. "cycle": "month",
  201. "dateValue": DependentDate.LAST_MONTH_END,
  202. },
  203. ],
  204. }
  205. for op in TEST_OPERATOR_LIST
  206. ],
  207. ),
  208. # Test dependent operator (And | Or) with two dependent item
  209. (
  210. (And, Or),
  211. (
  212. {
  213. "project_name": TEST_PROJECT,
  214. "process_definition_name": TEST_PROCESS_DEFINITION,
  215. "dependent_task_name": TEST_TASK,
  216. "dependent_date": DependentDate.LAST_MONTH_END,
  217. },
  218. {
  219. "project_name": TEST_PROJECT,
  220. "process_definition_name": TEST_PROCESS_DEFINITION,
  221. "dependent_task_name": TEST_TASK,
  222. "dependent_date": DependentDate.LAST_WEEK,
  223. },
  224. ),
  225. [
  226. {
  227. "relation": op,
  228. "dependItemList": [
  229. {
  230. "projectCode": TEST_PROJECT_CODE,
  231. "definitionCode": TEST_DEFINITION_CODE,
  232. "depTaskCode": TEST_TASK_CODE,
  233. "cycle": "month",
  234. "dateValue": DependentDate.LAST_MONTH_END,
  235. },
  236. {
  237. "projectCode": TEST_PROJECT_CODE,
  238. "definitionCode": TEST_DEFINITION_CODE,
  239. "depTaskCode": TEST_TASK_CODE,
  240. "cycle": "week",
  241. "dateValue": DependentDate.LAST_WEEK,
  242. },
  243. ],
  244. }
  245. for op in TEST_OPERATOR_LIST
  246. ],
  247. ),
  248. # Test dependent operator (And | Or) with multiply dependent item
  249. (
  250. (And, Or),
  251. (
  252. {
  253. "project_name": TEST_PROJECT,
  254. "process_definition_name": TEST_PROCESS_DEFINITION,
  255. "dependent_task_name": TEST_TASK,
  256. "dependent_date": DependentDate.LAST_MONTH_END,
  257. },
  258. {
  259. "project_name": TEST_PROJECT,
  260. "process_definition_name": TEST_PROCESS_DEFINITION,
  261. "dependent_task_name": TEST_TASK,
  262. "dependent_date": DependentDate.LAST_WEEK,
  263. },
  264. {
  265. "project_name": TEST_PROJECT,
  266. "process_definition_name": TEST_PROCESS_DEFINITION,
  267. "dependent_task_name": TEST_TASK,
  268. "dependent_date": DependentDate.LAST_ONE_DAYS,
  269. },
  270. ),
  271. [
  272. {
  273. "relation": op,
  274. "dependItemList": [
  275. {
  276. "projectCode": TEST_PROJECT_CODE,
  277. "definitionCode": TEST_DEFINITION_CODE,
  278. "depTaskCode": TEST_TASK_CODE,
  279. "cycle": "month",
  280. "dateValue": DependentDate.LAST_MONTH_END,
  281. },
  282. {
  283. "projectCode": TEST_PROJECT_CODE,
  284. "definitionCode": TEST_DEFINITION_CODE,
  285. "depTaskCode": TEST_TASK_CODE,
  286. "cycle": "week",
  287. "dateValue": DependentDate.LAST_WEEK,
  288. },
  289. {
  290. "projectCode": TEST_PROJECT_CODE,
  291. "definitionCode": TEST_DEFINITION_CODE,
  292. "depTaskCode": TEST_TASK_CODE,
  293. "cycle": "day",
  294. "dateValue": DependentDate.LAST_ONE_DAYS,
  295. },
  296. ],
  297. }
  298. for op in TEST_OPERATOR_LIST
  299. ],
  300. ),
  301. ],
  302. )
  303. @patch(
  304. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  305. return_value={
  306. "projectCode": TEST_PROJECT_CODE,
  307. "processDefinitionCode": TEST_DEFINITION_CODE,
  308. "taskDefinitionCode": TEST_TASK_CODE,
  309. },
  310. )
  311. def test_operator_dependent_item(
  312. mock_code_info,
  313. operators: Tuple[DependentOperator],
  314. kwargs: Tuple[dict],
  315. expect: List[Dict],
  316. ):
  317. """Test DependentOperator(DependentItem) function get_define.
  318. Here we have test some cases as below, including single dependentItem and multiply dependentItem.
  319. ```py
  320. {
  321. "relation": "AND",
  322. "dependItemList": [
  323. {
  324. "projectCode": "project code",
  325. "definitionCode": "definition code",
  326. "depTaskCode": "dep task code",
  327. "cycle": "day",
  328. "dateValue": "today"
  329. },
  330. ...
  331. ]
  332. }
  333. ```
  334. """
  335. for idx, operator in enumerate(operators):
  336. # Use variable to keep one or more dependent item to test dependent operator behavior
  337. dependent_item_list = []
  338. for kwarg in kwargs:
  339. dependent_item = DependentItem(**kwarg)
  340. dependent_item_list.append(dependent_item)
  341. op = operator(*dependent_item_list)
  342. assert expect[idx] == op.get_define()
  343. @pytest.mark.parametrize(
  344. # Test dependent operator, Test dependent item parameters, expect operator define
  345. "operators, args, expect",
  346. [
  347. # Test dependent operator (And | Or) with single dependent task list
  348. (
  349. (And, Or),
  350. (
  351. (And, Or),
  352. (
  353. {
  354. "project_name": TEST_PROJECT,
  355. "process_definition_name": TEST_PROCESS_DEFINITION,
  356. "dependent_task_name": TEST_TASK,
  357. "dependent_date": DependentDate.LAST_MONTH_END,
  358. },
  359. ),
  360. ),
  361. [
  362. {
  363. "relation": par_op,
  364. "dependTaskList": [
  365. {
  366. "relation": chr_op,
  367. "dependItemList": [
  368. {
  369. "projectCode": TEST_PROJECT_CODE,
  370. "definitionCode": TEST_DEFINITION_CODE,
  371. "depTaskCode": TEST_TASK_CODE,
  372. "cycle": "month",
  373. "dateValue": DependentDate.LAST_MONTH_END,
  374. },
  375. ],
  376. }
  377. ],
  378. }
  379. for (par_op, chr_op) in itertools.product(
  380. TEST_OPERATOR_LIST, TEST_OPERATOR_LIST
  381. )
  382. ],
  383. ),
  384. # Test dependent operator (And | Or) with two dependent task list
  385. (
  386. (And, Or),
  387. (
  388. (And, Or),
  389. (
  390. {
  391. "project_name": TEST_PROJECT,
  392. "process_definition_name": TEST_PROCESS_DEFINITION,
  393. "dependent_task_name": TEST_TASK,
  394. "dependent_date": DependentDate.LAST_MONTH_END,
  395. },
  396. {
  397. "project_name": TEST_PROJECT,
  398. "process_definition_name": TEST_PROCESS_DEFINITION,
  399. "dependent_task_name": TEST_TASK,
  400. "dependent_date": DependentDate.LAST_WEEK,
  401. },
  402. ),
  403. ),
  404. [
  405. {
  406. "relation": par_op,
  407. "dependTaskList": [
  408. {
  409. "relation": chr_op,
  410. "dependItemList": [
  411. {
  412. "projectCode": TEST_PROJECT_CODE,
  413. "definitionCode": TEST_DEFINITION_CODE,
  414. "depTaskCode": TEST_TASK_CODE,
  415. "cycle": "month",
  416. "dateValue": DependentDate.LAST_MONTH_END,
  417. },
  418. {
  419. "projectCode": TEST_PROJECT_CODE,
  420. "definitionCode": TEST_DEFINITION_CODE,
  421. "depTaskCode": TEST_TASK_CODE,
  422. "cycle": "week",
  423. "dateValue": DependentDate.LAST_WEEK,
  424. },
  425. ],
  426. }
  427. ],
  428. }
  429. for (par_op, chr_op) in itertools.product(
  430. TEST_OPERATOR_LIST, TEST_OPERATOR_LIST
  431. )
  432. ],
  433. ),
  434. # Test dependent operator (And | Or) with multiply dependent task list
  435. (
  436. (And, Or),
  437. (
  438. (And, Or),
  439. (
  440. {
  441. "project_name": TEST_PROJECT,
  442. "process_definition_name": TEST_PROCESS_DEFINITION,
  443. "dependent_task_name": TEST_TASK,
  444. "dependent_date": DependentDate.LAST_MONTH_END,
  445. },
  446. {
  447. "project_name": TEST_PROJECT,
  448. "process_definition_name": TEST_PROCESS_DEFINITION,
  449. "dependent_task_name": TEST_TASK,
  450. "dependent_date": DependentDate.LAST_WEEK,
  451. },
  452. {
  453. "project_name": TEST_PROJECT,
  454. "process_definition_name": TEST_PROCESS_DEFINITION,
  455. "dependent_task_name": TEST_TASK,
  456. "dependent_date": DependentDate.LAST_ONE_DAYS,
  457. },
  458. ),
  459. ),
  460. [
  461. {
  462. "relation": par_op,
  463. "dependTaskList": [
  464. {
  465. "relation": chr_op,
  466. "dependItemList": [
  467. {
  468. "projectCode": TEST_PROJECT_CODE,
  469. "definitionCode": TEST_DEFINITION_CODE,
  470. "depTaskCode": TEST_TASK_CODE,
  471. "cycle": "month",
  472. "dateValue": DependentDate.LAST_MONTH_END,
  473. },
  474. {
  475. "projectCode": TEST_PROJECT_CODE,
  476. "definitionCode": TEST_DEFINITION_CODE,
  477. "depTaskCode": TEST_TASK_CODE,
  478. "cycle": "week",
  479. "dateValue": DependentDate.LAST_WEEK,
  480. },
  481. {
  482. "projectCode": TEST_PROJECT_CODE,
  483. "definitionCode": TEST_DEFINITION_CODE,
  484. "depTaskCode": TEST_TASK_CODE,
  485. "cycle": "day",
  486. "dateValue": DependentDate.LAST_ONE_DAYS,
  487. },
  488. ],
  489. }
  490. ],
  491. }
  492. for (par_op, chr_op) in itertools.product(
  493. TEST_OPERATOR_LIST, TEST_OPERATOR_LIST
  494. )
  495. ],
  496. ),
  497. ],
  498. )
  499. @patch(
  500. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  501. return_value={
  502. "projectCode": TEST_PROJECT_CODE,
  503. "processDefinitionCode": TEST_DEFINITION_CODE,
  504. "taskDefinitionCode": TEST_TASK_CODE,
  505. },
  506. )
  507. def test_operator_dependent_task_list_multi_dependent_item(
  508. mock_code_info,
  509. operators: Tuple[DependentOperator],
  510. args: Tuple[Union[Tuple, dict]],
  511. expect: List[Dict],
  512. ):
  513. """Test DependentOperator(DependentOperator(DependentItem)) single operator function get_define.
  514. Here we have test some cases as below. This test case only test single DependTaskList with one or
  515. multiply dependItemList.
  516. ```py
  517. {
  518. "relation": "OR",
  519. "dependTaskList": [
  520. {
  521. "relation": "AND",
  522. "dependItemList": [
  523. {
  524. "projectCode": "project code",
  525. "definitionCode": "definition code",
  526. "depTaskCode": "dep task code",
  527. "cycle": "day",
  528. "dateValue": "today"
  529. },
  530. ...
  531. ]
  532. },
  533. ]
  534. }
  535. ```
  536. """
  537. # variable expect_idx record idx should be use to get specific expect
  538. expect_idx = 0
  539. for op_idx, operator in enumerate(operators):
  540. dependent_operator = args[0]
  541. dependent_item_kwargs = args[1]
  542. for dop_idx, dpt_op in enumerate(dependent_operator):
  543. dependent_item_list = []
  544. for dpt_kwargs in dependent_item_kwargs:
  545. dpti = DependentItem(**dpt_kwargs)
  546. dependent_item_list.append(dpti)
  547. child_dep_op = dpt_op(*dependent_item_list)
  548. op = operator(child_dep_op)
  549. assert expect[expect_idx] == op.get_define()
  550. expect_idx += 1
  551. def get_dep_task_list(*operator):
  552. """Return dependent task list from given operators list."""
  553. result = []
  554. for op in operator:
  555. result.append(
  556. {
  557. "relation": op.operator_name(),
  558. "dependItemList": [
  559. {
  560. "projectCode": TEST_PROJECT_CODE,
  561. "definitionCode": TEST_DEFINITION_CODE,
  562. "depTaskCode": TEST_TASK_CODE,
  563. "cycle": "month",
  564. "dateValue": DependentDate.LAST_MONTH_END,
  565. },
  566. ],
  567. }
  568. )
  569. return result
  570. @pytest.mark.parametrize(
  571. # Test dependent operator, Test dependent item parameters, expect operator define
  572. "operators, args, expect",
  573. [
  574. # Test dependent operator (And | Or) with two dependent task list
  575. (
  576. (And, Or),
  577. (
  578. ((And, And), (And, Or), (Or, And), (Or, Or)),
  579. {
  580. "project_name": TEST_PROJECT,
  581. "process_definition_name": TEST_PROCESS_DEFINITION,
  582. "dependent_task_name": TEST_TASK,
  583. "dependent_date": DependentDate.LAST_MONTH_END,
  584. },
  585. ),
  586. [
  587. {
  588. "relation": parent_op.operator_name(),
  589. "dependTaskList": get_dep_task_list(*child_ops),
  590. }
  591. for parent_op in (And, Or)
  592. for child_ops in ((And, And), (And, Or), (Or, And), (Or, Or))
  593. ],
  594. ),
  595. # Test dependent operator (And | Or) with multiple dependent task list
  596. (
  597. (And, Or),
  598. (
  599. ((And, And, And), (And, And, And, And), (And, And, And, And, And)),
  600. {
  601. "project_name": TEST_PROJECT,
  602. "process_definition_name": TEST_PROCESS_DEFINITION,
  603. "dependent_task_name": TEST_TASK,
  604. "dependent_date": DependentDate.LAST_MONTH_END,
  605. },
  606. ),
  607. [
  608. {
  609. "relation": parent_op.operator_name(),
  610. "dependTaskList": get_dep_task_list(*child_ops),
  611. }
  612. for parent_op in (And, Or)
  613. for child_ops in (
  614. (And, And, And),
  615. (And, And, And, And),
  616. (And, And, And, And, And),
  617. )
  618. ],
  619. ),
  620. ],
  621. )
  622. @patch(
  623. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  624. return_value={
  625. "projectCode": TEST_PROJECT_CODE,
  626. "processDefinitionCode": TEST_DEFINITION_CODE,
  627. "taskDefinitionCode": TEST_TASK_CODE,
  628. },
  629. )
  630. def test_operator_dependent_task_list_multi_dependent_list(
  631. mock_code_info,
  632. operators: Tuple[DependentOperator],
  633. args: Tuple[Union[Tuple, dict]],
  634. expect: List[Dict],
  635. ):
  636. """Test DependentOperator(DependentOperator(DependentItem)) multiply operator function get_define.
  637. Here we have test some cases as below. This test case only test single DependTaskList with one or
  638. multiply dependTaskList.
  639. ```py
  640. {
  641. "relation": "OR",
  642. "dependTaskList": [
  643. {
  644. "relation": "AND",
  645. "dependItemList": [
  646. {
  647. "projectCode": "project code",
  648. "definitionCode": "definition code",
  649. "depTaskCode": "dep task code",
  650. "cycle": "day",
  651. "dateValue": "today"
  652. }
  653. ]
  654. },
  655. ...
  656. ]
  657. }
  658. ```
  659. """
  660. # variable expect_idx record idx should be use to get specific expect
  661. expect_idx = 0
  662. for op_idx, operator in enumerate(operators):
  663. dependent_operator = args[0]
  664. dependent_item_kwargs = args[1]
  665. for dop_idx, dpt_ops in enumerate(dependent_operator):
  666. dependent_task_list = [
  667. dpt_op(DependentItem(**dependent_item_kwargs)) for dpt_op in dpt_ops
  668. ]
  669. op = operator(*dependent_task_list)
  670. assert (
  671. expect[expect_idx] == op.get_define()
  672. ), f"Failed with operator syntax {operator}.{dpt_ops}"
  673. expect_idx += 1
  674. @patch(
  675. "pydolphinscheduler.tasks.dependent.DependentItem.get_code_from_gateway",
  676. return_value={
  677. "projectCode": TEST_PROJECT_CODE,
  678. "processDefinitionCode": TEST_DEFINITION_CODE,
  679. "taskDefinitionCode": TEST_TASK_CODE,
  680. },
  681. )
  682. @patch(
  683. "pydolphinscheduler.core.task.Task.gen_code_and_version",
  684. return_value=(123, 1),
  685. )
  686. def test_dependent_get_define(mock_code_version, mock_dep_code):
  687. """Test task dependent function get_define."""
  688. project_name = "test-dep-project"
  689. process_definition_name = "test-dep-definition"
  690. dependent_task_name = "test-dep-task"
  691. dep_operator = And(
  692. Or(
  693. # test dependence with add tasks
  694. DependentItem(
  695. project_name=project_name,
  696. process_definition_name=process_definition_name,
  697. )
  698. ),
  699. And(
  700. # test dependence with specific task
  701. DependentItem(
  702. project_name=project_name,
  703. process_definition_name=process_definition_name,
  704. dependent_task_name=dependent_task_name,
  705. )
  706. ),
  707. )
  708. name = "test_dependent_get_define"
  709. expect = {
  710. "code": 123,
  711. "name": name,
  712. "version": 1,
  713. "description": None,
  714. "delayTime": 0,
  715. "taskType": "DEPENDENT",
  716. "taskParams": {
  717. "resourceList": [],
  718. "localParams": [],
  719. "dependence": {
  720. "relation": "AND",
  721. "dependTaskList": [
  722. {
  723. "relation": "OR",
  724. "dependItemList": [
  725. {
  726. "projectCode": TEST_PROJECT_CODE,
  727. "definitionCode": TEST_DEFINITION_CODE,
  728. "depTaskCode": "0",
  729. "cycle": "day",
  730. "dateValue": "today",
  731. }
  732. ],
  733. },
  734. {
  735. "relation": "AND",
  736. "dependItemList": [
  737. {
  738. "projectCode": TEST_PROJECT_CODE,
  739. "definitionCode": TEST_DEFINITION_CODE,
  740. "depTaskCode": TEST_TASK_CODE,
  741. "cycle": "day",
  742. "dateValue": "today",
  743. }
  744. ],
  745. },
  746. ],
  747. },
  748. "conditionResult": {"successNode": [""], "failedNode": [""]},
  749. "waitStartTimeout": {},
  750. },
  751. "flag": "YES",
  752. "taskPriority": "MEDIUM",
  753. "workerGroup": "default",
  754. "failRetryTimes": 0,
  755. "failRetryInterval": 1,
  756. "timeoutFlag": "CLOSE",
  757. "timeoutNotifyStrategy": None,
  758. "timeout": 0,
  759. }
  760. task = Dependent(name, dependence=dep_operator)
  761. assert task.get_define() == expect