33import logging
44
55import pytest
6- from pytest_mock import MockerFixture
7- from rich .logging import RichHandler
86
97from constants import (
10- DEFAULT_LOG_FORMAT ,
11- LIGHTSPEED_STACK_DISABLE_RICH_HANDLER_ENV_VAR ,
8+ DEFAULT_LOGGER_NAME ,
129 LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR ,
1310)
14- from log import create_log_handler , get_logger , resolve_log_level
11+ from log import get_logger , resolve_log_level , setup_logging
12+
13+
14+ @pytest .fixture (autouse = True )
15+ def clear_logging_cache ():
16+ setup_logging .cache_clear ()
1517
1618
1719def test_get_logger () -> None :
1820 """Check the function to retrieve logger."""
19- logger_name = "foo"
20- logger = get_logger (logger_name )
21- assert logger is not None
22- assert logger .name == logger_name
21+ setup_logging ()
2322
24- # at least one handler need to be set
25- assert len (logger .handlers ) >= 1
23+ logger = get_logger (__name__ )
24+
25+ assert logger is not None
26+ assert logger .name == f"{ DEFAULT_LOGGER_NAME } .tests.unit.test_log"
27+ assert logger .hasHandlers ()
2628
2729
2830def test_get_logger_invalid_env_var_fallback (monkeypatch : pytest .MonkeyPatch ) -> None :
2931 """Test that invalid env var value falls back to INFO level."""
3032 monkeypatch .setenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , "FOOBAR" )
3133
32- logger = get_logger ("test_invalid" )
33- assert logger .level == logging .INFO
34+ setup_logging ()
35+
36+ logger = get_logger (__name__ )
37+ assert logger .getEffectiveLevel () == logging .INFO
3438
3539
3640@pytest .mark .parametrize (
@@ -59,16 +63,20 @@ def test_get_logger_log_level(
5963 """
6064 monkeypatch .setenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , level_name )
6165
62- logger = get_logger (f"test_{ level_name } " )
63- assert logger .level == expected_level
66+ setup_logging ()
67+
68+ logger = get_logger (__name__ )
69+ assert logger .getEffectiveLevel () == expected_level
6470
6571
6672def test_get_logger_default_log_level (monkeypatch : pytest .MonkeyPatch ) -> None :
6773 """Test that get_logger() uses INFO level by default when env var is not set."""
6874 monkeypatch .delenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , raising = False )
6975
70- logger = get_logger ("test_default" )
71- assert logger .level == logging .INFO
76+ setup_logging ()
77+
78+ logger = get_logger (__name__ )
79+ assert logger .getEffectiveLevel () == logging .INFO
7280
7381
7482@pytest .mark .parametrize (
@@ -88,73 +96,25 @@ def test_resolve_log_level(
8896) -> None :
8997 """Test that resolve_log_level correctly resolves valid level names."""
9098 monkeypatch .setenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , level_name )
99+
100+ setup_logging ()
101+
91102 assert resolve_log_level () == expected_level
92103
93104
94105def test_resolve_log_level_invalid_fallback (monkeypatch : pytest .MonkeyPatch ) -> None :
95106 """Test that resolve_log_level falls back to INFO for invalid values."""
96107 monkeypatch .setenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , "BOGUS" )
108+
109+ setup_logging ()
110+
97111 assert resolve_log_level () == logging .INFO
98112
99113
100114def test_resolve_log_level_default (monkeypatch : pytest .MonkeyPatch ) -> None :
101115 """Test that resolve_log_level defaults to INFO when env var is unset."""
102116 monkeypatch .delenv (LIGHTSPEED_STACK_LOG_LEVEL_ENV_VAR , raising = False )
103- assert resolve_log_level () == logging .INFO
104-
105117
106- def test_create_log_handler_tty (mocker : MockerFixture ) -> None :
107- """Test that create_log_handler returns RichHandler when TTY is available."""
108- mocker .patch ("sys.stderr.isatty" , return_value = True )
109- handler = create_log_handler ()
110- assert isinstance (handler , RichHandler )
118+ setup_logging ()
111119
112-
113- def test_create_log_handler_non_tty (mocker : MockerFixture ) -> None :
114- """Test that create_log_handler returns StreamHandler when no TTY."""
115- mocker .patch ("sys.stderr.isatty" , return_value = False )
116- handler = create_log_handler ()
117- assert isinstance (handler , logging .StreamHandler )
118- assert not isinstance (handler , RichHandler )
119-
120-
121- def test_create_log_handler_non_tty_format (mocker : MockerFixture ) -> None :
122- """Test that non-TTY handler uses DEFAULT_LOG_FORMAT."""
123- mocker .patch ("sys.stderr.isatty" , return_value = False )
124- handler = create_log_handler ()
125- assert handler .formatter is not None
126- # pylint: disable=protected-access
127- assert handler .formatter ._fmt == DEFAULT_LOG_FORMAT
128-
129-
130- def test_create_log_handler_disable_rich_with_tty (
131- mocker : MockerFixture , monkeypatch : pytest .MonkeyPatch
132- ) -> None :
133- """Test that RichHandler is disabled when env var is set, even with TTY."""
134- mocker .patch ("sys.stderr.isatty" , return_value = True )
135- monkeypatch .setenv (LIGHTSPEED_STACK_DISABLE_RICH_HANDLER_ENV_VAR , "1" )
136- handler = create_log_handler ()
137- assert isinstance (handler , logging .StreamHandler )
138- assert not isinstance (handler , RichHandler )
139-
140-
141- def test_create_log_handler_disable_rich_format (
142- mocker : MockerFixture , monkeypatch : pytest .MonkeyPatch
143- ) -> None :
144- """Test that disabled RichHandler uses DEFAULT_LOG_FORMAT."""
145- mocker .patch ("sys.stderr.isatty" , return_value = True )
146- monkeypatch .setenv (LIGHTSPEED_STACK_DISABLE_RICH_HANDLER_ENV_VAR , "true" )
147- handler = create_log_handler ()
148- assert handler .formatter is not None
149- # pylint: disable=protected-access
150- assert handler .formatter ._fmt == DEFAULT_LOG_FORMAT
151-
152-
153- def test_create_log_handler_enable_rich_when_env_var_empty (
154- mocker : MockerFixture , monkeypatch : pytest .MonkeyPatch
155- ) -> None :
156- """Test that RichHandler is used when env var is empty string."""
157- mocker .patch ("sys.stderr.isatty" , return_value = True )
158- monkeypatch .setenv (LIGHTSPEED_STACK_DISABLE_RICH_HANDLER_ENV_VAR , "" )
159- handler = create_log_handler ()
160- assert isinstance (handler , RichHandler )
120+ assert resolve_log_level () == logging .INFO
0 commit comments