1+ import io
12import logging
3+ import sys
24from logging .config import dictConfig
35
4- from pytest import LogCaptureFixture
6+ from pytest import LogCaptureFixture , MonkeyPatch
7+ from rich .logging import RichHandler
58
6- from fastapi_cli .utils .cli import CustomFormatter , get_uvicorn_log_config
9+ from fastapi_cli import logging as cli_logging
10+ from fastapi_cli .logging import PlainFormatter
11+ from fastapi_cli .utils .cli import (
12+ CustomFormatter ,
13+ get_uvicorn_log_config ,
14+ should_use_rich_logs ,
15+ )
716
817
918def test_get_uvicorn_config_uses_custom_formatter () -> None :
@@ -14,6 +23,68 @@ def test_get_uvicorn_config_uses_custom_formatter() -> None:
1423 assert config ["loggers" ]["uvicorn" ]["propagate" ] is False
1524
1625
26+ def test_should_use_rich_logs_is_false_without_tty (
27+ monkeypatch : MonkeyPatch ,
28+ ) -> None :
29+ monkeypatch .setattr (sys , "stdout" , io .StringIO ())
30+
31+ assert should_use_rich_logs () is False
32+
33+
34+ def test_plain_formatter_strips_rich_markup () -> None :
35+ formatter = PlainFormatter ("%(levelname)s:%(name)s:%(message)s" )
36+ record = logging .LogRecord (
37+ name = "fastapi_cli.discover" ,
38+ level = logging .WARNING ,
39+ pathname = "" ,
40+ lineno = 0 ,
41+ msg = "Ensure all the package directories have an [blue]__init__.py[/blue] file" ,
42+ args = (),
43+ exc_info = None ,
44+ )
45+
46+ assert (
47+ formatter .format (record )
48+ == "WARNING:fastapi_cli.discover:Ensure all the package directories have an __init__.py file"
49+ )
50+
51+
52+ def test_plain_formatter_preserves_invalid_markup () -> None :
53+ formatter = PlainFormatter ("%(message)s" )
54+ record = logging .LogRecord (
55+ name = "fastapi_cli.discover" ,
56+ level = logging .WARNING ,
57+ pathname = "" ,
58+ lineno = 0 ,
59+ msg = "[/blue]" ,
60+ args = (),
61+ exc_info = None ,
62+ )
63+
64+ assert formatter .format (record ) == "[/blue]"
65+
66+
67+ def test_setup_logging_uses_rich_handler_when_enabled (
68+ monkeypatch : MonkeyPatch ,
69+ ) -> None :
70+ logger = logging .getLogger ("fastapi_cli" )
71+ original_handlers = logger .handlers .copy ()
72+ original_level = logger .level
73+ original_propagate = logger .propagate
74+ logger .handlers .clear ()
75+ monkeypatch .setattr (cli_logging , "should_use_rich_logs" , lambda : True )
76+ try :
77+ cli_logging .setup_logging (level = logging .DEBUG )
78+
79+ assert isinstance (logger .handlers [0 ], RichHandler )
80+ assert logger .level == logging .DEBUG
81+ assert logger .propagate is False
82+ finally :
83+ logger .handlers = original_handlers
84+ logger .setLevel (original_level )
85+ logger .propagate = original_propagate
86+
87+
1788def test_custom_formatter () -> None :
1889 formatter = CustomFormatter ()
1990
0 commit comments