rich/tests/test_traceback.py

92 lines
3.5 KiB
Python

import io
import sys
import pytest
from rich.console import Console
from rich.traceback import install, Traceback
from .render import render
try:
from ._exception_render import expected
except ImportError:
expected = None
CAPTURED_EXCEPTION = 'Traceback (most recent call last):\n╭──────────────────────────────────────────────────────────────────────────────────────────────────╮\n│ File "/Users/willmcgugan/projects/rich/tests/test_traceback.py", line 26, in test_handler │\n│ 23 try: │\n│ 24 old_handler = install(console=console, line_numbers=False) │\n│ 25 try: │\n│ ❱ 26 1 / 0 │\n│ 27 except Exception: │\n│ 28 exc_type, exc_value, traceback = sys.exc_info() │\n│ 29 sys.excepthook(exc_type, exc_value, traceback) │\n╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\nZeroDivisionError: division by zero\n'
def test_handler():
console = Console(file=io.StringIO(), width=100, color_system=None)
expected_old_handler = sys.excepthook
try:
old_handler = install(console=console, line_numbers=False)
try:
1 / 0
except Exception:
exc_type, exc_value, traceback = sys.exc_info()
sys.excepthook(exc_type, exc_value, traceback)
rendered_exception = console.file.getvalue()
print(repr(rendered_exception))
assert "Traceback" in rendered_exception
assert "ZeroDivisionError" in rendered_exception
finally:
sys.excepthook = old_handler
assert old_handler == expected_old_handler
def text_exception_render():
exc_render = render(get_exception())
assert exc_render == expected
def test_capture():
try:
1 / 0
except Exception:
tb = Traceback()
assert tb.trace.stacks[0].exc_type == "ZeroDivisionError"
def test_no_exception():
with pytest.raises(ValueError):
tb = Traceback()
def get_exception() -> Traceback:
def bar(a):
print(1 / a)
def foo(a):
bar(a)
try:
try:
foo(0)
except:
foobarbaz
except:
tb = Traceback()
return tb
def test_print_exception():
console = Console(width=100, file=io.StringIO())
try:
1 / 0
except Exception:
console.print_exception()
exception_text = console.file.getvalue()
assert "ZeroDivisionError" in exception_text
if __name__ == "__main__": # pragma: no cover
expected = render(get_exception())
with open("_exception_render.py", "wt") as fh:
exc_render = render(get_exception())
print(exc_render)
fh.write(f"expected={exc_render!r}")