Skip to content

Commit 9211194

Browse files
committed
Add unit tests for logging helper
1 parent 4379c61 commit 9211194

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed

tests/unit/common/test_debug.py

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
# Copyright (c) "Neo4j"
2+
# Neo4j Sweden AB [https://neo4j.com]
3+
#
4+
# This file is part of Neo4j.
5+
#
6+
# Licensed under the Apache License, Version 2.0 (the "License");
7+
# you may not use this file except in compliance with the License.
8+
# You may obtain a copy of the License at
9+
#
10+
# https://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing, software
13+
# distributed under the License is distributed on an "AS IS" BASIS,
14+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
# See the License for the specific language governing permissions and
16+
# limitations under the License.
17+
18+
19+
import io
20+
import logging
21+
import sys
22+
23+
import pytest
24+
25+
from neo4j import debug as neo4j_debug
26+
27+
28+
@pytest.fixture
29+
def add_handler_mocker(mocker):
30+
def setup_mock(*logger_names):
31+
loggers = [logging.getLogger(name) for name in logger_names]
32+
for logger in loggers:
33+
logger.addHandler = mocker.Mock()
34+
logger.removeHandler = mocker.Mock()
35+
logger.setLevel = mocker.Mock()
36+
return loggers
37+
38+
return setup_mock
39+
40+
41+
def test_watch_returns_watcher(add_handler_mocker):
42+
logger_name = "neo4j"
43+
add_handler_mocker(logger_name)
44+
watcher = neo4j_debug.watch(logger_name)
45+
assert isinstance(watcher, neo4j_debug.Watcher)
46+
47+
48+
@pytest.mark.parametrize("logger_names",
49+
(("neo4j",), ("foobar",), ("neo4j", "foobar")))
50+
def test_watch_enables_logging(logger_names, add_handler_mocker):
51+
loggers = add_handler_mocker(*logger_names)
52+
neo4j_debug.watch(*logger_names)
53+
for logger in loggers:
54+
logger.addHandler.assert_called_once()
55+
56+
57+
def test_watcher_watch_adds_logger(add_handler_mocker):
58+
logger_name = "neo4j"
59+
logger = add_handler_mocker(logger_name)[0]
60+
watcher = neo4j_debug.Watcher(logger_name)
61+
62+
logger.addHandler.assert_not_called()
63+
watcher.watch()
64+
logger.addHandler.assert_called_once()
65+
66+
67+
def test_watcher_stop_removes_logger(add_handler_mocker):
68+
logger_name = "neo4j"
69+
logger = add_handler_mocker(logger_name)[0]
70+
watcher = neo4j_debug.Watcher(logger_name)
71+
72+
watcher.watch()
73+
(handler,), _ = logger.addHandler.call_args
74+
75+
logger.removeHandler.assert_not_called()
76+
watcher.stop()
77+
logger.removeHandler.assert_called_once_with(handler)
78+
79+
80+
def test_watcher_context_manager(mocker):
81+
logger_name = "neo4j"
82+
watcher = neo4j_debug.Watcher(logger_name)
83+
watcher.watch = mocker.Mock()
84+
watcher.stop = mocker.Mock()
85+
86+
with watcher:
87+
watcher.watch.assert_called_once()
88+
watcher.stop.assert_not_called()
89+
watcher.stop.assert_called_once()
90+
91+
92+
@pytest.mark.parametrize(
93+
("default_level", "level", "expected_level"),
94+
(
95+
(None, None, logging.DEBUG),
96+
(logging.WARNING, None, logging.WARNING),
97+
(logging.WARNING, logging.DEBUG, logging.DEBUG),
98+
(logging.DEBUG, logging.WARNING, logging.WARNING),
99+
(1, None, 1),
100+
(None, 1, 1),
101+
)
102+
)
103+
def test_watcher_level(add_handler_mocker, default_level, level,
104+
expected_level):
105+
logger_name = "neo4j"
106+
logger = add_handler_mocker(logger_name)[0]
107+
kwargs = {}
108+
if default_level is not None:
109+
kwargs["default_level"] = default_level
110+
watcher = neo4j_debug.Watcher(logger_name, **kwargs)
111+
kwargs = {}
112+
if level is not None:
113+
kwargs["level"] = level
114+
watcher.watch(**kwargs)
115+
116+
(handler,), _ = logger.addHandler.call_args
117+
assert handler.level == logging.NOTSET
118+
logger.setLevel.assert_called_once_with(expected_level)
119+
120+
121+
custom_log_out = io.StringIO()
122+
123+
@pytest.mark.parametrize(
124+
("default_out", "out", "expected_out"),
125+
(
126+
(None, None, sys.stderr),
127+
(sys.stdout, None, sys.stdout),
128+
(sys.stdout, sys.stderr, sys.stderr),
129+
(sys.stderr, sys.stdout, sys.stdout),
130+
(custom_log_out, None, custom_log_out),
131+
(None, custom_log_out, custom_log_out),
132+
)
133+
)
134+
def test_watcher_out(add_handler_mocker, default_out, out,
135+
expected_out):
136+
logger_name = "neo4j"
137+
logger = add_handler_mocker(logger_name)[0]
138+
kwargs = {}
139+
if default_out is not None:
140+
kwargs["default_out"] = default_out
141+
watcher = neo4j_debug.Watcher(logger_name, **kwargs)
142+
kwargs = {}
143+
if out is not None:
144+
kwargs["out"] = out
145+
watcher.watch(**kwargs)
146+
147+
(handler,), _ = logger.addHandler.call_args
148+
assert isinstance(handler, logging.StreamHandler)
149+
assert handler.stream == expected_out
150+
151+
152+
@pytest.mark.parametrize("colour", (True, False))
153+
def test_watcher_colour(add_handler_mocker, colour):
154+
logger_name = "neo4j"
155+
logger = add_handler_mocker(logger_name)[0]
156+
watcher = neo4j_debug.Watcher(logger_name, colour=colour)
157+
watcher.watch()
158+
159+
(handler,), _ = logger.addHandler.call_args
160+
assert isinstance(handler, logging.Handler)
161+
assert isinstance(handler.formatter, logging.Formatter)
162+
if colour:
163+
assert isinstance(handler.formatter, neo4j_debug.ColourFormatter)
164+
else:
165+
assert not isinstance(handler.formatter, neo4j_debug.ColourFormatter)
166+
167+
168+
@pytest.mark.parametrize("colour", (True, False))
169+
def test_watcher_format(add_handler_mocker, colour):
170+
logger_name = "neo4j"
171+
logger = add_handler_mocker(logger_name)[0]
172+
watcher = neo4j_debug.Watcher(logger_name, colour=colour)
173+
watcher.watch()
174+
175+
(handler,), _ = logger.addHandler.call_args
176+
assert isinstance(handler, logging.Handler)
177+
assert isinstance(handler.formatter, logging.Formatter)
178+
# Don't look at me like that. It's just for testing.
179+
format = handler.formatter._fmt
180+
if colour:
181+
assert format == "%(threadName)s(%(thread)d) %(asctime)s %(message)s"
182+
else:
183+
assert format == "[%(levelname)s] " \
184+
"%(threadName)s(%(thread)d) %(asctime)s %(message)s"

0 commit comments

Comments
 (0)