Skip to content

Commit 2490193

Browse files
committed
add log tests
1 parent 3672a5e commit 2490193

File tree

4 files changed

+106
-3
lines changed

4 files changed

+106
-3
lines changed

.coveragerc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ omit =
33
src/_monitors/*
44
src/_monitors_load/*
55
src/tmp/*
6-
src/main.py
7-
src/utils/log.py
86
exclude_lines =
97
pragma: no cover
108
if TYPE_CHECKING:

configs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ logging:
1818
timestamp: created
1919
level: levelname
2020
file_path: pathname
21-
logger_name: name
2221
function_name: funcName
2322
line_number: lineno
23+
logger_name: name
2424
message: message
2525

2626
# Application database pool settings

src/main.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# pragma: no cover
2+
13
import asyncio
24
import logging
35
import sys

tests/utils/test_log.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import json
2+
import logging
3+
import re
4+
5+
import pytest
6+
7+
import utils.log as log
8+
from configs import FriendlyLogConfig, JsonLogConfig, configs
9+
10+
TIMESTAMP_PATTERN = r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d*"
11+
12+
13+
@pytest.fixture(scope="module", autouse=True)
14+
def reset_logging_config():
15+
"""Reset logging configuration after the log tests"""
16+
yield
17+
log.setup()
18+
19+
20+
@pytest.fixture(scope="module", autouse=True)
21+
def force_logging_setup(monkeypatch, reset_logging_config):
22+
"""Force the logging setup to reconfigure the logging configuration"""
23+
logging_basicConfig = logging.basicConfig
24+
monkeypatch.setattr(
25+
logging,
26+
"basicConfig",
27+
lambda *args, **kwargs: logging_basicConfig(*args, force=True, **kwargs),
28+
)
29+
30+
31+
def set_friendly_formatter(monkeypatch, log_format: str) -> None:
32+
"""Set the friendly formatter for the logging configuration"""
33+
monkeypatch.setattr(configs, "logging", FriendlyLogConfig(mode="friendly", format=log_format))
34+
log.setup()
35+
36+
37+
def set_json_formatter(monkeypatch, fields: dict[str, str]) -> None:
38+
"""Set the JSON formatter for the logging configuration"""
39+
monkeypatch.setattr(configs, "logging", JsonLogConfig(mode="json", fields=fields))
40+
log.setup()
41+
42+
43+
@pytest.mark.parametrize(
44+
"log_format",
45+
[
46+
"%(asctime)s %(levelname)s: %(message)s",
47+
"%(asctime)s %(levelname)s %(message)s",
48+
"%(levelname)s %(message)s",
49+
],
50+
)
51+
@pytest.mark.parametrize("level", ["info", "warning", "error"])
52+
def test_friendly_formatter(caplog, monkeypatch, log_format, level):
53+
"""'friendly' formatter should format the log message in a friendly way using the provided log
54+
format"""
55+
set_friendly_formatter(monkeypatch, log_format)
56+
57+
logger = logging.getLogger("test_friendly_formatter")
58+
message = f"message for '{level}' level"
59+
getattr(logger, level)(message)
60+
61+
expected_levelname = level.upper()
62+
log_format = log_format.format(asctime=TIMESTAMP_PATTERN)
63+
64+
match = re.match(
65+
log_format.format(levelname=expected_levelname, message=message),
66+
caplog.records[0].message,
67+
)
68+
assert match is not None
69+
70+
71+
@pytest.mark.parametrize(
72+
"fields",
73+
[
74+
{"message": "message"},
75+
{"some_message": "message"},
76+
{"message": "message", "level": "level"},
77+
{"some_message": "message", "log_level": "level"},
78+
{"message": "message", "level": "level", "time": "asctime"},
79+
{"some_message": "message", "log_level": "level", "timestamp": "asctime"},
80+
81+
],
82+
)
83+
@pytest.mark.parametrize("level", ["info", "warning", "error"])
84+
def test_json_formatter(caplog, monkeypatch, fields, level):
85+
"""'json' formatter should format the log message as a JSON object using the provided fields"""
86+
set_json_formatter(monkeypatch, fields)
87+
88+
logger = logging.getLogger("test_json_formatter")
89+
message = f"message for '{level}' level"
90+
getattr(logger, level)(message)
91+
92+
log_info = json.loads(caplog.records[0].message)
93+
94+
for key, value in log_info.items():
95+
if key in ("message", "some_message"):
96+
assert value == message
97+
elif key in ("level", "log_level"):
98+
assert value == level.upper()
99+
elif key in ("time", "timestamp"):
100+
match = re.match(TIMESTAMP_PATTERN, value)
101+
assert match is not None
102+
else:
103+
assert False, "Unexpected field in log"

0 commit comments

Comments
 (0)