Skip to content

Commit 084dffd

Browse files
committed
Fix tests fails (since pytest upgrade) due to standard logging misuse
1 parent 9a40e58 commit 084dffd

File tree

4 files changed

+143
-133
lines changed

4 files changed

+143
-133
lines changed

tests/conftest.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import contextlib
23
import loguru
34
import logging
45
import itertools
@@ -62,8 +63,6 @@ def reset():
6263
loguru._logger.Core(), None, 0, False, False, False, False, True, None, {}
6364
)
6465
loguru._logger.context.set({})
65-
logging.Logger.manager.loggerDict.clear()
66-
logging.root = logging.RootLogger("WARNING")
6766

6867
reset()
6968
yield
@@ -134,20 +133,20 @@ def patched_localtime(t):
134133
return monkeypatch_date
135134

136135

137-
@pytest.fixture
138-
def make_logging_logger():
139-
def make_logging_logger(name, handler, fmt="%(message)s", level="DEBUG"):
140-
logging_logger = logging.getLogger(name)
141-
logging_logger.setLevel(level)
142-
formatter = logging.Formatter(fmt)
143-
144-
handler.setLevel(level)
145-
handler.setFormatter(formatter)
146-
logging_logger.addHandler(handler)
136+
@contextlib.contextmanager
137+
def make_logging_logger(name, handler, fmt="%(message)s", level="DEBUG"):
138+
logging_logger = logging.getLogger(name)
139+
logging_logger.setLevel(level)
140+
formatter = logging.Formatter(fmt)
147141

148-
return logging_logger
142+
handler.setLevel(level)
143+
handler.setFormatter(formatter)
144+
logging_logger.addHandler(handler)
149145

150-
yield make_logging_logger
146+
try:
147+
yield logging_logger
148+
finally:
149+
logging_logger.removeHandler(handler)
151150

152151

153152
@pytest.fixture

tests/test_coroutine_sink.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -369,9 +369,9 @@ async def main():
369369
assert lines[-1] == "--- End of logging error ---"
370370

371371

372-
def test_exception_in_coroutine_not_caught(capsys):
372+
def test_exception_in_coroutine_not_caught(capsys, caplog):
373373
async def sink(msg):
374-
raise Exception("Oh no")
374+
raise ValueError("Oh no")
375375

376376
async def main():
377377
logger.add(sink, catch=False)
@@ -382,10 +382,19 @@ async def main():
382382
asyncio.run(main())
383383

384384
out, err = capsys.readouterr()
385-
assert out == ""
386-
assert "Logging error in Loguru Handler" not in err
387-
assert "was never retrieved" not in err
388-
assert err.strip().endswith("Exception: Oh no")
385+
assert out == err == ""
386+
387+
records = caplog.records
388+
assert len(records) == 1
389+
record = records[0]
390+
391+
message = record.getMessage()
392+
assert "Logging error in Loguru Handler" not in message
393+
assert "was never retrieved" not in message
394+
395+
exc_type, exc_value, _ = record.exc_info
396+
assert exc_type == ValueError
397+
assert str(exc_value) == "Oh no"
389398

390399

391400
def test_exception_in_coroutine_during_complete_caught(capsys):
@@ -410,10 +419,10 @@ async def main():
410419
assert lines[-1] == "--- End of logging error ---"
411420

412421

413-
def test_exception_in_coroutine_during_complete_not_caught(capsys):
422+
def test_exception_in_coroutine_during_complete_not_caught(capsys, caplog):
414423
async def sink(msg):
415424
await asyncio.sleep(0.1)
416-
raise Exception("Oh no")
425+
raise ValueError("Oh no")
417426

418427
async def main():
419428
logger.add(sink, catch=False)
@@ -423,12 +432,19 @@ async def main():
423432
asyncio.run(main())
424433

425434
out, err = capsys.readouterr()
426-
lines = err.strip().splitlines()
435+
assert out == err == ""
427436

428-
assert out == ""
429-
assert "Logging error in Loguru Handler" not in err
430-
assert "was never retrieved" not in err
431-
assert err.strip().endswith("Exception: Oh no")
437+
records = caplog.records
438+
assert len(records) == 1
439+
record = records[0]
440+
441+
message = record.getMessage()
442+
assert "Logging error in Loguru Handler" not in message
443+
assert "was never retrieved" not in message
444+
445+
exc_type, exc_value, _ = record.exc_info
446+
assert exc_type == ValueError
447+
assert str(exc_value) == "Oh no"
432448

433449

434450
@pytest.mark.skipif(sys.version_info < (3, 5, 3), reason="Coroutine can't access running loop")

tests/test_interception.py

Lines changed: 61 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import logging
22

3+
from .conftest import make_logging_logger
4+
35
from loguru import logger
46

57

@@ -20,139 +22,132 @@ def emit(self, record):
2022
logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
2123

2224

23-
def test_formatting(writer, make_logging_logger):
25+
def test_formatting(writer):
2426
fmt = "{name} - {file.name} - {function} - {level.name} - {level.no} - {line} - {module} - {message}"
2527
expected = "tests.test_interception - test_interception.py - test_formatting - DEBUG - 10 - 31 - test_interception - This is the message\n"
2628

27-
logging_logger = make_logging_logger("tests", InterceptHandler())
28-
29-
logger.add(writer, format=fmt)
30-
31-
logging_logger.debug("This is the %s", "message")
29+
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
30+
logger.add(writer, format=fmt)
31+
logging_logger.debug("This is the %s", "message")
3232

3333
result = writer.read()
3434
assert result == expected
3535

3636

37-
def test_intercept(writer, make_logging_logger):
38-
logging_logger = make_logging_logger(None, InterceptHandler())
39-
40-
logging_logger.info("Nope")
41-
42-
logger.add(writer, format="{message}")
43-
44-
logging_logger.info("Test")
37+
def test_intercept(writer):
38+
with make_logging_logger(None, InterceptHandler()) as logging_logger:
39+
logging_logger.info("Nope")
40+
logger.add(writer, format="{message}")
41+
logging_logger.info("Test")
4542

4643
result = writer.read()
4744
assert result == "Test\n"
4845

4946

50-
def test_add_before_intercept(writer, make_logging_logger):
47+
def test_add_before_intercept(writer):
5148
logger.add(writer, format="{message}")
52-
logging_logger = make_logging_logger(None, InterceptHandler())
5349

54-
logging_logger.info("Test")
50+
with make_logging_logger(None, InterceptHandler()) as logging_logger:
51+
logging_logger.info("Test")
5552

5653
result = writer.read()
5754
assert result == "Test\n"
5855

5956

60-
def test_remove_interception(writer, make_logging_logger):
57+
def test_remove_interception(writer):
6158
h = InterceptHandler()
62-
logging_logger = make_logging_logger("foobar", h)
63-
logger.add(writer, format="{message}")
64-
logging_logger.debug("1")
65-
logging_logger.removeHandler(h)
66-
logging_logger.debug("2")
59+
60+
with make_logging_logger("foobar", h) as logging_logger:
61+
logger.add(writer, format="{message}")
62+
logging_logger.debug("1")
63+
logging_logger.removeHandler(h)
64+
logging_logger.debug("2")
6765

6866
result = writer.read()
6967
assert result == "1\n"
7068

7169

72-
def test_intercept_too_low(writer, make_logging_logger):
73-
make_logging_logger("tests.test_interception", InterceptHandler())
74-
logger.add(writer, format="{message}")
75-
logging.getLogger("tests").error("Nope 1")
76-
logging.getLogger("foobar").error("Nope 2")
70+
def test_intercept_too_low(writer):
71+
with make_logging_logger("tests.test_interception", InterceptHandler()):
72+
logger.add(writer, format="{message}")
73+
logging.getLogger("tests").error("Nope 1")
74+
logging.getLogger("foobar").error("Nope 2")
75+
7776
result = writer.read()
7877
assert result == ""
7978

8079

81-
def test_multiple_intercept(writer, make_logging_logger):
82-
logging_logger_1 = make_logging_logger("test_1", InterceptHandler())
83-
logging_logger_2 = make_logging_logger("test_2", InterceptHandler())
84-
85-
logger.add(writer, format="{message}")
86-
87-
logging_logger_1.info("1")
88-
logging_logger_2.info("2")
80+
def test_multiple_intercept(writer):
81+
with make_logging_logger("test_1", InterceptHandler()) as logging_logger_1:
82+
with make_logging_logger("test_2", InterceptHandler()) as logging_logger_2:
83+
logger.add(writer, format="{message}")
84+
logging_logger_1.info("1")
85+
logging_logger_2.info("2")
8986

9087
result = writer.read()
9188
assert result == "1\n2\n"
9289

9390

94-
def test_exception(writer, make_logging_logger):
95-
logging_logger = make_logging_logger("tests.test_interception", InterceptHandler())
96-
logger.add(writer, format="{message}")
91+
def test_exception(writer):
92+
with make_logging_logger("tests.test_interception", InterceptHandler()) as logging_logger:
93+
logger.add(writer, format="{message}")
9794

98-
try:
99-
1 / 0
100-
except:
101-
logging_logger.exception("Oops...")
95+
try:
96+
1 / 0
97+
except:
98+
logging_logger.exception("Oops...")
10299

103100
lines = writer.read().strip().splitlines()
104101
assert lines[0] == "Oops..."
105102
assert lines[-1] == "ZeroDivisionError: division by zero"
106103
assert sum(line.startswith("> ") for line in lines) == 1
107104

108105

109-
def test_level_is_no(writer, make_logging_logger):
110-
logging_logger = make_logging_logger("tests", InterceptHandler())
111-
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
112-
113-
logging_logger.log(12, "Hop")
106+
def test_level_is_no(writer):
107+
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
108+
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
109+
logging_logger.log(12, "Hop")
114110

115111
result = writer.read()
116112
assert result == "12 - Level 12 - Hop\x1b[0m\n"
117113

118114

119-
def test_level_does_not_exist(writer, make_logging_logger):
115+
def test_level_does_not_exist(writer):
120116
logging.addLevelName(152, "FANCY_LEVEL")
121-
logging_logger = make_logging_logger("tests", InterceptHandler())
122-
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
123117

124-
logging_logger.log(152, "Nop")
118+
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
119+
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
120+
logging_logger.log(152, "Nop")
125121

126122
result = writer.read()
127123
assert result == "152 - Level 152 - Nop\x1b[0m\n"
128124

129125

130-
def test_level_exist_builtin(writer, make_logging_logger):
131-
logging_logger = make_logging_logger("tests", InterceptHandler())
132-
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
133-
134-
logging_logger.error("Error...")
126+
def test_level_exist_builtin(writer):
127+
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
128+
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
129+
logging_logger.error("Error...")
135130

136131
result = writer.read()
137132
assert result == "\x1b[31m\x1b[1m40 - ERROR - Error...\x1b[0m\n"
138133

139134

140-
def test_level_exists_custom(writer, make_logging_logger):
135+
def test_level_exists_custom(writer):
141136
logging.addLevelName(99, "ANOTHER_FANCY_LEVEL")
142137
logger.level("ANOTHER_FANCY_LEVEL", no=99, color="<green>", icon="")
143-
logging_logger = make_logging_logger("tests", InterceptHandler())
144138

145-
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
146-
147-
logging_logger.log(99, "Yep!")
139+
with make_logging_logger("tests", InterceptHandler()) as logging_logger:
140+
logger.add(writer, format="<lvl>{level.no} - {level.name} - {message}</lvl>", colorize=True)
141+
logging_logger.log(99, "Yep!")
148142

149143
result = writer.read()
150144
assert result == "\x1b[32m99 - ANOTHER_FANCY_LEVEL - Yep!\x1b[0m\n"
151145

152146

153147
def test_using_logging_function(writer):
154-
logging.getLogger(None).addHandler(InterceptHandler())
155-
logger.add(writer, format="{function} {line} {module} {file.name} {message}")
156-
logging.warning("ABC")
148+
with make_logging_logger(None, InterceptHandler()):
149+
logger.add(writer, format="{function} {line} {module} {file.name} {message}")
150+
logging.warning("ABC")
151+
157152
result = writer.read()
158-
assert result == "test_using_logging_function 156 test_interception test_interception.py ABC\n"
153+
assert result == "test_using_logging_function 150 test_interception test_interception.py ABC\n"

0 commit comments

Comments
 (0)