Skip to content

Commit 646949b

Browse files
committed
test: ✅ test dictConfig external reference support
1 parent ec424ae commit 646949b

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed

tests/test_dictconfig.py

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
### IMPORTS
2+
### ============================================================================
3+
## Future
4+
from __future__ import annotations
5+
6+
## Standard Library
7+
from dataclasses import dataclass
8+
import datetime
9+
import enum
10+
import io
11+
import json
12+
import logging
13+
from logging.config import ConvertingDict
14+
import sys
15+
import traceback
16+
from types import TracebackType
17+
from typing import Any, Generator
18+
import uuid
19+
20+
if sys.version_info >= (3, 9):
21+
import zoneinfo
22+
else:
23+
from backports import zoneinfo
24+
25+
## Installed
26+
import freezegun
27+
import pytest
28+
29+
## Application
30+
import pythonjsonlogger
31+
import pythonjsonlogger.defaults
32+
from pythonjsonlogger.core import RESERVED_ATTRS, BaseJsonFormatter, merge_record_extra
33+
from pythonjsonlogger.json import JsonFormatter
34+
35+
if pythonjsonlogger.ORJSON_AVAILABLE:
36+
from pythonjsonlogger.orjson import OrjsonFormatter
37+
38+
if pythonjsonlogger.MSGSPEC_AVAILABLE:
39+
from pythonjsonlogger.msgspec import MsgspecFormatter
40+
41+
### SETUP
42+
### ============================================================================
43+
ALL_FORMATTERS: list[type[BaseJsonFormatter]] = [JsonFormatter]
44+
if pythonjsonlogger.ORJSON_AVAILABLE:
45+
ALL_FORMATTERS.append(OrjsonFormatter)
46+
if pythonjsonlogger.MSGSPEC_AVAILABLE:
47+
ALL_FORMATTERS.append(MsgspecFormatter)
48+
49+
_LOGGER_COUNT = 0
50+
EXT_VAL = 999
51+
52+
LOGGING_CONFIG = {
53+
"version": 1,
54+
"disable_existing_loggers": False,
55+
"formatters": {
56+
"default": {
57+
"()": "pythonjsonlogger.json.JsonFormatter",
58+
"static_fields": {"ext-val": "ext://tests.test_dictconfig.EXT_VAL"},
59+
}
60+
},
61+
"handlers": {
62+
"default": {
63+
"level": "DEBUG",
64+
"formatter": "default",
65+
"class": "logging.StreamHandler",
66+
"stream": "ext://sys.stdout", # Default is stderr
67+
},
68+
},
69+
"loggers": {
70+
"": {"handlers": ["default"], "level": "WARNING", "propagate": False}, # root logger
71+
},
72+
}
73+
74+
75+
@dataclass
76+
class LoggingEnvironment:
77+
logger: logging.Logger
78+
buffer: io.StringIO
79+
80+
def load_json(self) -> Any:
81+
return json.loads(self.buffer.getvalue())
82+
83+
84+
@pytest.fixture
85+
def env() -> Generator[LoggingEnvironment, None, None]:
86+
global _LOGGER_COUNT # pylint: disable=global-statement
87+
_LOGGER_COUNT += 1
88+
logging.config.dictConfig(LOGGING_CONFIG)
89+
default_formatter = logging.root.handlers[0].formatter
90+
logger = logging.getLogger(f"pythonjsonlogger.tests.{_LOGGER_COUNT}")
91+
logger.setLevel(logging.DEBUG)
92+
buffer = io.StringIO()
93+
handler = logging.StreamHandler(buffer)
94+
handler.setFormatter(default_formatter)
95+
logger.addHandler(handler)
96+
yield LoggingEnvironment(logger=logger, buffer=buffer)
97+
logger.removeHandler(handler)
98+
logger.setLevel(logging.NOTSET)
99+
buffer.close()
100+
return
101+
102+
103+
### TESTS
104+
### ============================================================================
105+
def test_external_reference_support(env: LoggingEnvironment):
106+
env.logger.info("hello")
107+
log_json = env.load_json()
108+
109+
assert log_json["ext-val"] == EXT_VAL
110+
return

0 commit comments

Comments
 (0)