|
1 | 1 | import io
|
2 | 2 | import re
|
3 | 3 | import sys
|
| 4 | +from typing import List |
4 | 5 |
|
5 | 6 | import pytest
|
6 | 7 |
|
@@ -307,6 +308,42 @@ def test_suppress():
|
307 | 308 | assert "foo" in traceback.suppress[1]
|
308 | 309 |
|
309 | 310 |
|
| 311 | +@pytest.mark.parametrize( |
| 312 | + "rich_traceback_omit_for_level2,expected_frames_length,expected_frame_names", |
| 313 | + ( |
| 314 | + # fmt: off |
| 315 | + [True, 3, ["test_rich_traceback_omit_optional_local_flag", "level1", "level3"]], |
| 316 | + [False, 4, ["test_rich_traceback_omit_optional_local_flag", "level1", "level2", "level3"]], |
| 317 | + # fmt: on |
| 318 | + ), |
| 319 | +) |
| 320 | +def test_rich_traceback_omit_optional_local_flag( |
| 321 | + rich_traceback_omit_for_level2: bool, |
| 322 | + expected_frames_length: int, |
| 323 | + expected_frame_names: List[str], |
| 324 | +): |
| 325 | + def level1(): |
| 326 | + return level2() |
| 327 | + |
| 328 | + def level2(): |
| 329 | + # true-ish values are enough to trigger the opt-out: |
| 330 | + _rich_traceback_omit = 1 if rich_traceback_omit_for_level2 else 0 |
| 331 | + return level3() |
| 332 | + |
| 333 | + def level3(): |
| 334 | + return 1 / 0 |
| 335 | + |
| 336 | + try: |
| 337 | + level1() |
| 338 | + except Exception: |
| 339 | + exc_type, exc_value, traceback = sys.exc_info() |
| 340 | + trace = Traceback.from_exception(exc_type, exc_value, traceback).trace |
| 341 | + frames = trace.stacks[0].frames |
| 342 | + assert len(frames) == expected_frames_length |
| 343 | + frame_names = [f.name for f in frames] |
| 344 | + assert frame_names == expected_frame_names |
| 345 | + |
| 346 | + |
310 | 347 | if __name__ == "__main__": # pragma: no cover
|
311 | 348 |
|
312 | 349 | expected = render(get_exception())
|
|
0 commit comments