13cf6e7c1a085f5456998f15f8308261c6fe096a
[pytest-output-to-files.git] / tests / test_output_to_files.py
1 import pytest
2 import sys
3 from pathlib import Path
4 from pytest_output_to_files import _DEFAULT_LINE_LIMIT
5
6
7 def test_help_message(testdir):
8 # type: (pytest.Testdir) -> None
9 result = testdir.runpytest(
10 '--help',
11 )
12 # fnmatch_lines does an assertion internally
13 result.stdout.fnmatch_lines([
14 'shortening output:',
15 '*--shorten-output-dir=DIR*',
16 '*shorten test outputs by storing them in files in DIR and*',
17 '*returning just the first/last few lines. disable by*',
18 '*using --shorten-output-dir=""*',
19 ])
20
21
22 def do_stdout_stderr_check(testdir, additional_args, stdout_lines,
23 stderr_lines, enabled):
24 # type: (pytest.Testdir, list[str], int, int, bool) -> pytest.RunResult
25 testdir.makepyfile(test_print=f"""
26 import sys
27
28 def test_print():
29 for i in range({stdout_lines}):
30 print(f'in stdout {{i}}')
31 for i in range({stderr_lines}):
32 print(f'in stderr {{i}}', file=sys.stderr)
33 assert False
34 """)
35
36 full_stdout = ''.join(f'in stdout {i}\n' for i in range(stdout_lines))
37 full_stderr = ''.join(f'in stderr {i}\n' for i in range(stderr_lines))
38
39 result = testdir.runpytest('-v', *additional_args)
40
41 test_out_path = Path(testdir.tmpdir)
42 test_out_path /= "test-out"
43 test_print_path = test_out_path / "test_print_py"
44 test_print_path /= "test_print"
45 call_stdout_path = test_print_path / "call-stdout.txt"
46 call_stderr_path = test_print_path / "call-stderr.txt"
47
48 lines = ['*--- Captured stdout call ---*']
49 hr = '-' * 50
50 if enabled and stdout_lines >= 2 * _DEFAULT_LINE_LIMIT:
51 trimmed_msg = ("Output Trimmed, Full output in: "
52 "test-out/test_print_py/test_print/call-stdout.txt")
53 lines.append(trimmed_msg)
54 lines.append(hr)
55 for i in range(_DEFAULT_LINE_LIMIT):
56 lines.append(f'in stdout {i}')
57 lines.append(hr)
58 lines.append(trimmed_msg)
59 lines.append(hr)
60 for i in range(stdout_lines - _DEFAULT_LINE_LIMIT, stdout_lines):
61 lines.append(f'in stdout {i}')
62 lines.append(hr)
63 lines.append(trimmed_msg)
64 else:
65 for i in range(stdout_lines):
66 lines.append(f'in stdout {i}')
67 lines.append('*--- Captured stderr call ---*')
68 if enabled and stderr_lines >= 2 * _DEFAULT_LINE_LIMIT:
69 trimmed_msg = ("Output Trimmed, Full output in: "
70 "test-out/test_print_py/test_print/call-stderr.txt")
71 lines.append(trimmed_msg)
72 lines.append(hr)
73 for i in range(_DEFAULT_LINE_LIMIT):
74 lines.append(f'in stderr {i}')
75 lines.append(hr)
76 lines.append(trimmed_msg)
77 lines.append(hr)
78 for i in range(stderr_lines - _DEFAULT_LINE_LIMIT, stderr_lines):
79 lines.append(f'in stderr {i}')
80 lines.append(hr)
81 lines.append(trimmed_msg)
82 else:
83 for i in range(stderr_lines):
84 lines.append(f'in stderr {i}')
85 lines.append("*====*")
86
87 result.stdout.fnmatch_lines(lines, consecutive=True)
88
89 result.stdout.fnmatch_lines([
90 'FAILED test_print.py::test_print *',
91 ])
92
93 if enabled:
94 for empty_file in ("setup-stdout.txt", "setup-stderr.txt",
95 "teardown-stdout.txt", "teardown-stderr.txt"):
96 assert (test_print_path / empty_file).read_text("utf-8") == ""
97 assert call_stdout_path.read_text("utf-8") == full_stdout
98 assert call_stderr_path.read_text("utf-8") == full_stderr
99 call_stdout_path.unlink() # remove big files
100 call_stderr_path.unlink() # remove big files
101 else:
102 assert not test_out_path.exists()
103 assert result.ret != 0
104
105 return result
106
107
108 def test_ini_setting(testdir):
109 # type: (pytest.Testdir) -> None
110 testdir.makeini("""
111 [pytest]
112 shorten-output-dir = test-out
113 """)
114
115 do_stdout_stderr_check(testdir, [], 1, 1, True)
116
117
118 def test_nothing(testdir):
119 # type: (pytest.Testdir) -> None
120 do_stdout_stderr_check(testdir, [], 1, 1, False)
121
122
123 def test_arg(testdir):
124 # type: (pytest.Testdir) -> None
125 do_stdout_stderr_check(
126 testdir, ["--shorten-output-dir=test-out"], 1, 1, True)
127
128
129 def test_arg_override_ini(testdir):
130 # type: (pytest.Testdir) -> None
131 testdir.makeini("""
132 [pytest]
133 shorten-output-dir = test-out
134 """)
135
136 do_stdout_stderr_check(
137 testdir, ["--shorten-output-dir="], 1, 1, False)
138
139
140 def test_disable_capture(testdir):
141 # type: (pytest.Testdir) -> None
142 testdir.makeini("""
143 [pytest]
144 shorten-output-dir = test-out
145 """)
146
147 testdir.makepyfile(test_print=f"""
148 import sys
149
150 def test_print():
151 print(f'in stdout')
152 print(f'in stderr', file=sys.stderr)
153 assert False
154 """)
155
156 result = testdir.runpytest('-v', '-s')
157
158 test_out_path = Path(testdir.tmpdir)
159 test_out_path /= "test-out"
160
161 assert not test_out_path.exists()
162
163 result.stdout.fnmatch_lines(['test_print.py::test_print*in stdout'])
164 result.stderr.fnmatch_lines(['in stderr'])
165
166 assert result.ret != 0
167
168
169 def test_20k_disabled(testdir):
170 # type: (pytest.Testdir) -> None
171 do_stdout_stderr_check(testdir, [], 20000, 20000, False)
172
173
174 def test_20k(testdir):
175 # type: (pytest.Testdir) -> None
176 do_stdout_stderr_check(
177 testdir, ["--shorten-output-dir=test-out"], 20000, 20000, True)
178
179
180 def test_21k(testdir):
181 # type: (pytest.Testdir) -> None
182 do_stdout_stderr_check(
183 testdir, ["--shorten-output-dir=test-out"], 21000, 21000, True)
184
185
186 def test_22k(testdir):
187 # type: (pytest.Testdir) -> None
188 do_stdout_stderr_check(
189 testdir, ["--shorten-output-dir=test-out"], 22000, 22000, True)
190
191
192 def test_1x(testdir):
193 # type: (pytest.Testdir) -> None
194 lines = _DEFAULT_LINE_LIMIT
195 do_stdout_stderr_check(
196 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
197
198
199 def test_50_percent_more(testdir):
200 # type: (pytest.Testdir) -> None
201 lines = _DEFAULT_LINE_LIMIT + _DEFAULT_LINE_LIMIT // 2
202 do_stdout_stderr_check(
203 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
204
205
206 def test_2x_minus_two(testdir):
207 # type: (pytest.Testdir) -> None
208 lines = _DEFAULT_LINE_LIMIT * 2 - 2
209 do_stdout_stderr_check(
210 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
211
212
213 def test_2x_minus_one(testdir):
214 # type: (pytest.Testdir) -> None
215 lines = _DEFAULT_LINE_LIMIT * 2 - 1
216 do_stdout_stderr_check(
217 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
218
219
220 def test_2x(testdir):
221 # type: (pytest.Testdir) -> None
222 lines = _DEFAULT_LINE_LIMIT * 2
223 do_stdout_stderr_check(
224 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
225
226
227 def test_2x_plus_one(testdir):
228 # type: (pytest.Testdir) -> None
229 lines = _DEFAULT_LINE_LIMIT * 2 + 1
230 do_stdout_stderr_check(
231 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
232
233
234 def test_2x_plus_two(testdir):
235 # type: (pytest.Testdir) -> None
236 lines = _DEFAULT_LINE_LIMIT * 2 + 2
237 do_stdout_stderr_check(
238 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
239
240
241 def test_1M(testdir):
242 # type: (pytest.Testdir) -> None
243 lines = 1_000_000
244 do_stdout_stderr_check(
245 testdir, ["--shorten-output-dir=test-out"], lines, lines, True)
246
247
248 if __name__ == "__main__":
249 sys.exit(pytest.main())