11import json
22import logging
3- import pytest
4- from unittest .mock import patch , MagicMock
3+ from unittest .mock import MagicMock , patch
4+
5+ from common .logger .app_logger import AppLogger , LogLevel # Adjust the import based on your actual path
56
6- from src . backend . common . logger . app_logger import AppLogger , LogLevel
7+ import pytest
78
89
910@pytest .fixture
@@ -12,11 +13,16 @@ def logger_name():
1213
1314
1415@pytest .fixture
15- def app_logger (logger_name ):
16- return AppLogger (logger_name )
16+ def logger_instance (logger_name ):
17+ """Fixture to return AppLogger with mocked handler"""
18+ with patch ("common.logger.app_logger.logging.getLogger" ) as mock_get_logger :
19+ mock_logger = MagicMock ()
20+ mock_get_logger .return_value = mock_logger
21+ yield AppLogger (logger_name )
1722
1823
19- def test_log_level_constants ():
24+ def test_log_levels ():
25+ """Ensure log levels are set correctly"""
2026 assert LogLevel .NONE == logging .NOTSET
2127 assert LogLevel .DEBUG == logging .DEBUG
2228 assert LogLevel .INFO == logging .INFO
@@ -25,90 +31,64 @@ def test_log_level_constants():
2531 assert LogLevel .CRITICAL == logging .CRITICAL
2632
2733
28- @patch ("src.backend.common.logger.app_logger.logging.getLogger" )
29- def test_app_logger_init (mock_get_logger , logger_name ):
30- mock_logger = MagicMock ()
31- mock_get_logger .return_value = mock_logger
32-
33- logger = AppLogger (logger_name )
34-
35- assert logger .logger == mock_logger
36- mock_logger .setLevel .assert_called_once_with (logging .DEBUG )
37-
38- # New Correct Check: Check that addHandler was called with StreamHandler
39- assert mock_logger .addHandler .called
40- handler_arg = mock_logger .addHandler .call_args [0 ][0 ]
41- assert isinstance (handler_arg , logging .StreamHandler )
42-
43-
44-
45- def test_format_message_without_kwargs (app_logger ):
46- message = "test message"
47- formatted = app_logger ._format_message (message )
48- expected = json .dumps ({"message" : message })
49- assert formatted == expected
34+ def test_format_message_basic (logger_instance ):
35+ result = logger_instance ._format_message ("Test message" )
36+ parsed = json .loads (result )
37+ assert parsed ["message" ] == "Test message"
38+ assert "context" not in parsed
5039
5140
52- def test_format_message_with_kwargs (app_logger ):
53- message = "test message"
54- context = {"user" : "john" , "action" : "login" }
55- formatted = app_logger ._format_message (message , ** context )
56- expected = json .dumps ({"message" : message , "context" : context })
57- assert formatted == expected
41+ def test_format_message_with_context (logger_instance ):
42+ result = logger_instance ._format_message ("Contextual message" , key1 = "value1" , key2 = "value2" )
43+ parsed = json .loads (result )
44+ assert parsed ["message" ] == "Contextual message"
45+ assert parsed ["context" ] == {"key1" : "value1" , "key2" : "value2" }
5846
5947
60- @patch .object (logging .Logger , "debug" )
61- def test_debug (mock_debug , app_logger ):
62- app_logger .debug ("Debug Message" , user = "test" )
63- assert mock_debug .called
64- args , kwargs = mock_debug .call_args
65- log_entry = json .loads (args [0 ])
66- assert log_entry ["message" ] == "Debug Message"
67- assert "context" in log_entry
68- assert log_entry ["context" ]["user" ] == "test"
48+ def test_debug_log (logger_instance ):
49+ with patch .object (logger_instance .logger , "debug" ) as mock_debug :
50+ logger_instance .debug ("Debug log" , user = "tester" )
51+ mock_debug .assert_called_once ()
52+ log_json = json .loads (mock_debug .call_args [0 ][0 ])
53+ assert log_json ["message" ] == "Debug log"
54+ assert log_json ["context" ]["user" ] == "tester"
6955
7056
71- @ patch . object ( logging . Logger , "info" )
72- def test_info ( mock_info , app_logger ) :
73- app_logger .info ("Info Message " , user = "test " )
74- assert mock_info .called
75- args , kwargs = mock_info .call_args
76- log_entry = json . loads ( args [ 0 ])
77- assert log_entry [ "message" ] == "Info Message "
57+ def test_info_log ( logger_instance ):
58+ with patch . object ( logger_instance . logger , "info" ) as mock_info :
59+ logger_instance .info ("Info log " , module = "log_module " )
60+ mock_info .assert_called_once ()
61+ log_json = json . loads ( mock_info .call_args [ 0 ][ 0 ])
62+ assert log_json [ "message" ] == "Info log"
63+ assert log_json [ "context" ][ "module" ] == "log_module "
7864
7965
80- @patch .object (logging .Logger , "warning" )
81- def test_warning (mock_warning , app_logger ):
82- app_logger .warning ("Warning Message" , user = "test" )
83- assert mock_warning .called
84- args , kwargs = mock_warning .call_args
85- log_entry = json .loads (args [0 ])
86- assert log_entry ["message" ] == "Warning Message"
66+ def test_warning_log (logger_instance ):
67+ with patch .object (logger_instance .logger , "warning" ) as mock_warning :
68+ logger_instance .warning ("Warning log" )
69+ mock_warning .assert_called_once ()
8770
8871
89- @ patch . object ( logging . Logger , "error" )
90- def test_error ( mock_error , app_logger ) :
91- app_logger .error ("Error Message " , user = "test" )
92- assert mock_error .called
93- args , kwargs = mock_error .call_args
94- log_entry = json . loads ( args [ 0 ])
95- assert log_entry [ "message" ] == "Error Message"
72+ def test_error_log ( logger_instance ):
73+ with patch . object ( logger_instance . logger , "error" ) as mock_error :
74+ logger_instance .error ("Error log " , error_code = 500 )
75+ mock_error .assert_called_once ()
76+ log_json = json . loads ( mock_error .call_args [ 0 ][ 0 ])
77+ assert log_json [ "message" ] == "Error log"
78+ assert log_json [ "context" ][ "error_code" ] == 500
9679
9780
98- @patch .object (logging .Logger , "critical" )
99- def test_critical (mock_critical , app_logger ):
100- app_logger .critical ("Critical Message" , user = "test" )
101- assert mock_critical .called
102- args , kwargs = mock_critical .call_args
103- log_entry = json .loads (args [0 ])
104- assert log_entry ["message" ] == "Critical Message"
81+ def test_critical_log (logger_instance ):
82+ with patch .object (logger_instance .logger , "critical" ) as mock_critical :
83+ logger_instance .critical ("Critical log" )
84+ mock_critical .assert_called_once ()
10585
10686
107- @ patch ( "src.backend.common.logger.app_logger.logging.getLogger" )
108- def test_set_min_log_level ( mock_get_logger ) :
109- mock_logger = MagicMock ()
110- mock_get_logger .return_value = mock_logger
87+ def test_set_min_log_level ():
88+ with patch ( "common.logger.app_logger.logging.getLogger" ) as mock_get_logger :
89+ mock_logger = MagicMock ()
90+ mock_get_logger .return_value = mock_logger
11191
112- AppLogger .set_min_log_level (LogLevel .ERROR )
92+ AppLogger .set_min_log_level (LogLevel .ERROR )
11393
114- mock_logger .setLevel .assert_called_with (LogLevel .ERROR )
94+ mock_logger .setLevel .assert_called_once_with (LogLevel .ERROR )
0 commit comments