3
3
4
4
@pytest .fixture ()
5
5
def generate_pyproject (temp_pyproject ):
6
- """Return function which generates pyproject.toml with a given ignore_fail value."""
6
+ def generator (lvl1_ignore_fail = False , lvl2_ignore_fail = False ):
7
+ def fmt_ignore_fail (value ):
8
+ if value is True :
9
+ return "ignore_fail = true"
10
+ elif isinstance (value , str ):
11
+ return f'ignore_fail = "{ value } "'
12
+ else :
13
+ return ""
7
14
8
- def generator (ignore_fail ):
9
- project_tmpl = """
15
+ project_tmpl = f"""
10
16
[tool.poe.tasks]
11
- task_1 = { shell = "echo 'task 1 error'; exit 1;" }
12
- task_2 = { shell = "echo 'task 2 error'; exit 1;" }
13
- task_3 = { shell = "echo 'task 3 success'; exit 0;" }
17
+ task_0 = "echo 'task 0 success'"
18
+ task_1.shell = "echo 'task 1 error'; exit 1;"
19
+ task_2.shell = "echo 'task 2 error'; exit 1;"
20
+ task_3.shell = "echo 'task 3 success'; exit 0;"
14
21
15
- [tool.poe.tasks.all_tasks ]
22
+ [tool.poe.tasks.lvl1_seq ]
16
23
sequence = ["task_1", "task_2", "task_3"]
24
+ { fmt_ignore_fail (lvl1_ignore_fail )}
25
+
26
+ [tool.poe.tasks.lvl2_seq]
27
+ sequence = ["task_0", "lvl1_seq", "task_3"]
28
+ { fmt_ignore_fail (lvl2_ignore_fail )}
17
29
"""
18
- if isinstance (ignore_fail , bool ) and ignore_fail :
19
- project_tmpl += "\n ignore_fail = true"
20
- elif not isinstance (ignore_fail , bool ):
21
- project_tmpl += f'\n ignore_fail = "{ ignore_fail } "'
22
30
23
31
return temp_pyproject (project_tmpl )
24
32
@@ -27,17 +35,17 @@ def generator(ignore_fail):
27
35
28
36
@pytest .mark .parametrize ("fail_value" , [True , "return_zero" ])
29
37
def test_full_ignore (generate_pyproject , run_poe , fail_value ):
30
- project_path = generate_pyproject (ignore_fail = fail_value )
31
- result = run_poe ("all_tasks " , cwd = project_path )
38
+ project_path = generate_pyproject (lvl1_ignore_fail = fail_value )
39
+ result = run_poe ("lvl1_seq " , cwd = project_path )
32
40
assert result .code == 0 , "Expected zero result"
33
41
assert "task 1 error" in result .capture , "Expected first task in log"
34
42
assert "task 2 error" in result .capture , "Expected second task in log"
35
43
assert "task 3 success" in result .capture , "Expected third task in log"
36
44
37
45
38
46
def test_without_ignore (generate_pyproject , run_poe ):
39
- project_path = generate_pyproject (ignore_fail = False )
40
- result = run_poe ("all_tasks " , cwd = project_path )
47
+ project_path = generate_pyproject (lvl1_ignore_fail = False )
48
+ result = run_poe ("lvl1_seq " , cwd = project_path )
41
49
assert result .code == 1 , "Expected non-zero result"
42
50
assert "task 1 error" in result .capture , "Expected first task in log"
43
51
assert "task 2 error" not in result .capture , "Second task shouldn't run"
@@ -46,20 +54,72 @@ def test_without_ignore(generate_pyproject, run_poe):
46
54
47
55
48
56
def test_return_non_zero (generate_pyproject , run_poe ):
49
- project_path = generate_pyproject (ignore_fail = "return_non_zero" )
50
- result = run_poe ("all_tasks " , cwd = project_path )
57
+ project_path = generate_pyproject (lvl1_ignore_fail = "return_non_zero" )
58
+ result = run_poe ("lvl1_seq " , cwd = project_path )
51
59
assert result .code == 1 , "Expected non-zero result"
52
60
assert "task 1 error" in result .capture , "Expected first task in log"
53
61
assert "task 2 error" in result .capture , "Expected second task in log"
54
62
assert "task 3 success" in result .capture , "Expected third task in log"
55
- assert "Subtasks task_1, task_2 returned non-zero exit status" in result .capture
63
+ assert "Subtasks ' task_1', ' task_2' returned non-zero exit status" in result .capture
56
64
57
65
58
66
def test_invalid_ignore_value (generate_pyproject , run_poe ):
59
- project_path = generate_pyproject (ignore_fail = "invalid_value" )
60
- result = run_poe ("all_tasks " , cwd = project_path )
67
+ project_path = generate_pyproject (lvl1_ignore_fail = "invalid_value" )
68
+ result = run_poe ("lvl1_seq " , cwd = project_path )
61
69
assert result .code == 1 , "Expected non-zero result"
62
70
assert (
63
71
"| Option 'ignore_fail' must be one of "
64
72
"(True, False, 'return_zero', 'return_non_zero')\n "
65
73
) in result .capture
74
+
75
+
76
+ def test_nested_without_ignore (generate_pyproject , run_poe ):
77
+ project_path = generate_pyproject ()
78
+ result = run_poe ("lvl2_seq" , cwd = project_path )
79
+ assert result .code == 1 , "Expected non-zero result"
80
+ assert "task 0 success" in result .capture , "Expected zeroth task in log"
81
+ assert "task 1 error" in result .capture , "Expected first task in log"
82
+ assert "task 2 error" not in result .capture , "Second task shouldn't run"
83
+ assert "task 3 success" not in result .capture , "Third task shouldn't run"
84
+ assert "Sequence aborted after failed subtask 'task_1'" in result .capture
85
+
86
+
87
+ def test_nested_lvl1_return_non_zero (generate_pyproject , run_poe ):
88
+ project_path = generate_pyproject (lvl1_ignore_fail = "return_non_zero" )
89
+ result = run_poe ("lvl2_seq" , cwd = project_path )
90
+ assert result .code == 1 , "Expected non-zero result"
91
+ assert "task 1 error" in result .capture , "Expected first task in log"
92
+ assert "task 2 error" in result .capture , "Expected second task in log"
93
+ assert "task 3 success" in result .capture , "Expected third task in log"
94
+ assert "Subtasks 'task_1', 'task_2' returned non-zero exit status" in result .capture
95
+
96
+
97
+ def test_nested_lvl2_return_non_zero (generate_pyproject , run_poe ):
98
+ project_path = generate_pyproject (lvl2_ignore_fail = "return_non_zero" )
99
+ result = run_poe ("lvl2_seq" , cwd = project_path )
100
+ assert result .code == 1 , "Expected non-zero result"
101
+ assert "task 1 error" in result .capture , "Expected first task in log"
102
+ assert "task 2 error" not in result .capture , "Expected task 2 to be skipped"
103
+ assert "task 3 success" in result .capture , "Expected third task in log"
104
+ assert (
105
+ "Warning: Sequence aborted after failed subtask 'task_1'" in result .stdout
106
+ ) # TODO log warnings to capture
107
+ assert "Error: Subtask 'lvl1_seq' returned non-zero exit status" in result .capture
108
+
109
+
110
+ def test_nested_both_return_non_zero (generate_pyproject , run_poe ):
111
+ project_path = generate_pyproject (
112
+ lvl1_ignore_fail = "return_non_zero" , lvl2_ignore_fail = "return_non_zero"
113
+ )
114
+ result = run_poe ("lvl2_seq" , cwd = project_path )
115
+ assert result .code == 1 , "Expected non-zero result"
116
+ assert "task 1 error" in result .capture , "Expected first task in log"
117
+ assert "task 2 error" in result .capture , "Expected second task in log"
118
+ assert "task 3 success" in result .capture , "Expected third task in log"
119
+ assert (
120
+ "Warning: Subtasks 'task_1', 'task_2' returned non-zero exit status"
121
+ in result .stdout
122
+ ) # TODO log warnings to capture
123
+ assert (
124
+ "Error: Subtask 'lvl1_seq' returned non-zero exit status" in result .capture
125
+ ) # TODO log warnings to capture
0 commit comments