Skip to content

Commit b35a05b

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

File tree

4 files changed

+94
-3
lines changed

4 files changed

+94
-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: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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(monkeypatch_module):
15+
"""Reset the logging configuration during the log tests"""
16+
monkeypatch_module.setattr(logging.root, "handlers", [])
17+
18+
19+
def set_friendly_formatter(monkeypatch, log_format: str) -> None:
20+
"""Set the friendly formatter for the logging configuration"""
21+
monkeypatch.setattr(configs, "logging", FriendlyLogConfig(mode="friendly", format=log_format))
22+
log.setup()
23+
24+
25+
def set_json_formatter(monkeypatch, fields: dict[str, str]) -> None:
26+
"""Set the JSON formatter for the logging configuration"""
27+
monkeypatch.setattr(configs, "logging", JsonLogConfig(mode="json", fields=fields))
28+
log.setup()
29+
30+
31+
@pytest.mark.parametrize(
32+
"log_format",
33+
[
34+
"%(asctime)s %(levelname)s: %(message)s",
35+
"%(asctime)s %(levelname)s %(message)s",
36+
"%(levelname)s %(message)s",
37+
],
38+
)
39+
@pytest.mark.parametrize("level", ["info", "warning", "error"])
40+
def test_friendly_formatter(caplog, monkeypatch, log_format, level):
41+
"""'friendly' formatter should format the log message in a friendly way using the provided log
42+
format"""
43+
set_friendly_formatter(monkeypatch, log_format)
44+
45+
logger = logging.getLogger("test_friendly_formatter")
46+
message = f"message for '{level}' level"
47+
getattr(logger, level)(message)
48+
49+
expected_levelname = level.upper()
50+
log_format = log_format.format(asctime=TIMESTAMP_PATTERN)
51+
52+
match = re.match(
53+
log_format.format(levelname=expected_levelname, message=message),
54+
caplog.records[0].message,
55+
)
56+
assert match is not None
57+
58+
59+
@pytest.mark.parametrize(
60+
"fields",
61+
[
62+
{"message": "message"},
63+
{"some_message": "message"},
64+
{"message": "message", "level": "level"},
65+
{"some_message": "message", "log_level": "level"},
66+
{"message": "message", "level": "level", "time": "asctime"},
67+
{"some_message": "message", "log_level": "level", "timestamp": "asctime"},
68+
69+
],
70+
)
71+
@pytest.mark.parametrize("level", ["info", "warning", "error"])
72+
def test_json_formatter(caplog, monkeypatch, fields, level):
73+
"""'json' formatter should format the log message as a JSON object using the provided fields"""
74+
set_json_formatter(monkeypatch, fields)
75+
76+
logger = logging.getLogger("test_json_formatter")
77+
message = f"message for '{level}' level"
78+
getattr(logger, level)(message)
79+
80+
log_info = json.loads(caplog.records[0].message)
81+
82+
for key, value in log_info.items():
83+
if key in ("message", "some_message"):
84+
assert value == message
85+
elif key in ("level", "log_level"):
86+
assert value == level.upper()
87+
elif key in ("time", "timestamp"):
88+
match = re.match(TIMESTAMP_PATTERN, value)
89+
assert match is not None
90+
else:
91+
assert False, "Unexpected field in log"

0 commit comments

Comments
 (0)