26
26
27
27
28
28
@pytest .fixture
29
- def add_handler_mocker (mocker ):
29
+ def logger_mocker (mocker ):
30
+ original_levels = {}
31
+
30
32
def setup_mock (* logger_names ):
33
+ nonlocal original_levels
34
+
31
35
loggers = [logging .getLogger (name ) for name in logger_names ]
32
36
for logger in loggers :
33
- logger .addHandler = mocker .Mock ()
34
- logger .removeHandler = mocker .Mock ()
35
- logger .setLevel = mocker .Mock ()
37
+ original_levels [logger ] = logger .level
38
+ mocker .patch .object (logger , "addHandler" )
39
+ mocker .patch .object (logger , "removeHandler" )
40
+ mocker .spy (logger , "setLevel" )
36
41
return loggers
37
42
38
- return setup_mock
43
+ yield setup_mock
44
+
45
+ for logger , level in original_levels .items ():
46
+ logger .setLevel (level )
39
47
40
48
41
- def test_watch_returns_watcher (add_handler_mocker ):
49
+ def test_watch_returns_watcher (logger_mocker ):
42
50
logger_name = "neo4j"
43
- add_handler_mocker (logger_name )
51
+ logger_mocker (logger_name )
44
52
watcher = neo4j_debug .watch (logger_name )
45
53
assert isinstance (watcher , neo4j_debug .Watcher )
46
54
47
55
48
56
@pytest .mark .parametrize ("logger_names" ,
49
57
(("neo4j" ,), ("foobar" ,), ("neo4j" , "foobar" )))
50
- def test_watch_enables_logging (logger_names , add_handler_mocker ):
51
- loggers = add_handler_mocker (* logger_names )
58
+ def test_watch_enables_logging (logger_names , logger_mocker ):
59
+ loggers = logger_mocker (* logger_names )
52
60
neo4j_debug .watch (* logger_names )
53
61
for logger in loggers :
54
62
logger .addHandler .assert_called_once ()
55
63
56
64
57
- def test_watcher_watch_adds_logger (add_handler_mocker ):
65
+ def test_watcher_watch_adds_logger (logger_mocker ):
58
66
logger_name = "neo4j"
59
- logger = add_handler_mocker (logger_name )[0 ]
67
+ logger = logger_mocker (logger_name )[0 ]
60
68
watcher = neo4j_debug .Watcher (logger_name )
61
69
62
70
logger .addHandler .assert_not_called ()
63
71
watcher .watch ()
64
72
logger .addHandler .assert_called_once ()
65
73
66
74
67
- def test_watcher_stop_removes_logger (add_handler_mocker ):
75
+ def test_watcher_stop_removes_logger (logger_mocker ):
68
76
logger_name = "neo4j"
69
- logger = add_handler_mocker (logger_name )[0 ]
77
+ logger = logger_mocker (logger_name )[0 ]
70
78
watcher = neo4j_debug .Watcher (logger_name )
71
79
72
80
watcher .watch ()
@@ -89,31 +97,84 @@ def test_watcher_context_manager(mocker):
89
97
watcher .stop .assert_called_once ()
90
98
91
99
92
- @pytest .mark .parametrize (
93
- ("level" , "expected_level" ),
94
- (
95
- (None , logging .DEBUG ),
96
- (logging .DEBUG , logging .DEBUG ),
97
- (logging .WARNING , logging .WARNING ),
98
- (1 , 1 ),
99
- )
100
+ WATCH_ARGS = (
101
+ # level, expected_level
102
+ (None , logging .DEBUG ),
103
+ (logging .DEBUG , logging .DEBUG ),
104
+ (logging .WARNING , logging .WARNING ),
105
+ (1 , 1 ),
100
106
)
101
- def test_watcher_level ( add_handler_mocker , level , expected_level ):
102
- logger_name = "neo4j"
103
- logger = add_handler_mocker (logger_name )[ 0 ]
107
+
108
+
109
+ def _setup_watch (logger_name , level ):
104
110
watcher = neo4j_debug .Watcher (logger_name )
105
111
kwargs = {}
106
112
if level is not None :
107
113
kwargs ["level" ] = level
108
114
watcher .watch (** kwargs )
109
115
116
+
117
+ @pytest .mark .parametrize (("level" , "expected_level" ), WATCH_ARGS )
118
+ @pytest .mark .parametrize (
119
+ "effective_level" ,
120
+ (logging .DEBUG , logging .WARNING , logging .INFO , logging .ERROR )
121
+ )
122
+ def test_watcher_level (
123
+ logger_mocker , level , expected_level , effective_level ,
124
+ ):
125
+ logger_name = "neo4j"
126
+ logger = logger_mocker (logger_name )[0 ]
127
+ logger .setLevel (effective_level )
128
+ logger .setLevel .reset_mock ()
129
+ _setup_watch (logger_name , level )
130
+
110
131
(handler ,), _ = logger .addHandler .call_args
111
- assert handler .level == logging .NOTSET
112
- logger .setLevel .assert_called_once_with (expected_level )
132
+ assert handler .level == expected_level
133
+ if effective_level <= expected_level :
134
+ logger .setLevel .assert_not_called ()
135
+ else :
136
+ logger .setLevel .assert_called_once_with (expected_level )
137
+
138
+
139
+ @pytest .mark .parametrize (("level1" , "expected_level1" ), WATCH_ARGS )
140
+ @pytest .mark .parametrize (("level2" , "expected_level2" ), WATCH_ARGS )
141
+ @pytest .mark .parametrize (
142
+ "effective_level" ,
143
+ (logging .DEBUG , logging .WARNING , logging .INFO , logging .ERROR )
144
+ )
145
+ def test_watcher_level_multiple_watchers (
146
+ logger_mocker , level1 , expected_level1 , level2 , expected_level2 ,
147
+ effective_level ,
148
+ ):
149
+ logger_name = "neo4j"
150
+ logger = logger_mocker (logger_name )[0 ]
151
+ logger .setLevel (effective_level )
152
+ logger .setLevel .reset_mock ()
153
+ _setup_watch (logger_name , level1 )
154
+ _setup_watch (logger_name , level2 )
155
+
156
+ assert logger .addHandler .call_count == 2
157
+ (handler1 ,), _ = logger .addHandler .call_args_list [0 ]
158
+ (handler2 ,), _ = logger .addHandler .call_args_list [1 ]
159
+
160
+ assert handler1 .level == expected_level1
161
+ assert handler2 .level == expected_level2
162
+
163
+ expected_logger_level = min (expected_level1 , expected_level2 )
164
+ if effective_level <= expected_logger_level :
165
+ logger .setLevel .assert_not_called ()
166
+ else :
167
+ if effective_level > expected_level1 > expected_level2 :
168
+ assert logger .setLevel .call_count == 2
169
+ else :
170
+ assert logger .setLevel .call_count == 1
171
+ (level ,), _ = logger .setLevel .call_args_list [- 1 ]
172
+ assert level == expected_logger_level
113
173
114
174
115
175
custom_log_out = io .StringIO ()
116
176
177
+
117
178
@pytest .mark .parametrize (
118
179
("out" , "expected_out" ),
119
180
(
@@ -123,9 +184,9 @@ def test_watcher_level(add_handler_mocker, level, expected_level):
123
184
(custom_log_out , custom_log_out ),
124
185
)
125
186
)
126
- def test_watcher_out (add_handler_mocker , out , expected_out ):
187
+ def test_watcher_out (logger_mocker , out , expected_out ):
127
188
logger_name = "neo4j"
128
- logger = add_handler_mocker (logger_name )[0 ]
189
+ logger = logger_mocker (logger_name )[0 ]
129
190
watcher = neo4j_debug .Watcher (logger_name )
130
191
kwargs = {}
131
192
if out is not None :
@@ -137,9 +198,9 @@ def test_watcher_out(add_handler_mocker, out, expected_out):
137
198
assert handler .stream == expected_out
138
199
139
200
140
- def test_watcher_colour (add_handler_mocker ):
201
+ def test_watcher_colour (logger_mocker ):
141
202
logger_name = "neo4j"
142
- logger = add_handler_mocker (logger_name )[0 ]
203
+ logger = logger_mocker (logger_name )[0 ]
143
204
watcher = neo4j_debug .Watcher (logger_name )
144
205
watcher .watch ()
145
206
@@ -148,9 +209,9 @@ def test_watcher_colour(add_handler_mocker):
148
209
assert isinstance (handler .formatter , neo4j_debug .ColourFormatter )
149
210
150
211
151
- def test_watcher_format (add_handler_mocker ):
212
+ def test_watcher_format (logger_mocker ):
152
213
logger_name = "neo4j"
153
- logger = add_handler_mocker (logger_name )[0 ]
214
+ logger = logger_mocker (logger_name )[0 ]
154
215
watcher = neo4j_debug .Watcher (logger_name )
155
216
watcher .watch ()
156
217
0 commit comments