Skip to content

Commit 266600b

Browse files
authored
test: generalize the "extract event from stdout" test function (#83)
1 parent ce103ba commit 266600b

File tree

2 files changed

+29
-19
lines changed

2 files changed

+29
-19
lines changed

tests/conftest.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from typing import Callable, Generator
1+
import json
2+
from typing import Any, Generator, Iterator
23
from unittest.mock import patch
34

45
import pytest
@@ -10,6 +11,9 @@
1011

1112
from . import fakes
1213

14+
Event = dict[str, Any]
15+
T_stdout = Iterator[Event]
16+
1317

1418
@pytest.fixture
1519
def mock_logger_env() -> Generator[None, None, None]:
@@ -43,10 +47,12 @@ def logger(mock_logger_env: None) -> Generator[WrappedLogger, None, None]:
4347

4448

4549
@pytest.fixture
46-
def stdout(capsys: CaptureFixture[str]) -> Callable[[], str]:
47-
def read() -> str:
50+
def stdout(capsys: CaptureFixture[str]) -> T_stdout:
51+
def read() -> Iterator[Event]:
4852
output = capsys.readouterr()
4953
assert "" == output.err
50-
return output.out
5154

52-
return read
55+
for line in output.out.split("\n"):
56+
yield json.loads(line)
57+
58+
return read()

tests/test_log.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import datetime
2-
import json
3-
from typing import Callable
42
from unittest.mock import patch
53

64
import structlog
5+
from _pytest.capture import CaptureFixture
76
from structlog.typing import WrappedLogger
87

98
import structlog_gcp
109

11-
T_stdout = Callable[[], str]
10+
from .conftest import T_stdout
1211

1312

1413
def test_normal(stdout: T_stdout, logger: WrappedLogger) -> None:
1514
logger.info("test")
1615

17-
msg = json.loads(stdout())
16+
msg = next(stdout)
1817

1918
expected = {
2019
"logging.googleapis.com/sourceLocation": {
@@ -35,7 +34,7 @@ def test_exception(stdout: T_stdout, logger: WrappedLogger) -> None:
3534
except ZeroDivisionError:
3635
logger.exception("oh noes", foo="bar")
3736

38-
msg = json.loads(stdout())
37+
msg = next(stdout)
3938

4039
expected = {
4140
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
@@ -70,7 +69,7 @@ def test_service_context_default(stdout: T_stdout, logger: WrappedLogger) -> Non
7069
except ZeroDivisionError:
7170
logger.exception("oh noes")
7271

73-
msg = json.loads(stdout())
72+
msg = next(stdout)
7473

7574
assert msg["serviceContext"] == {
7675
"service": "unknown service",
@@ -89,7 +88,7 @@ def test_service_context_envvar(stdout: T_stdout, mock_logger_env: None) -> None
8988
except ZeroDivisionError:
9089
logger.exception("oh noes")
9190

92-
msg = json.loads(stdout())
91+
msg = next(stdout)
9392

9493
assert msg["serviceContext"] == {
9594
"service": "test-service",
@@ -110,7 +109,7 @@ def test_service_context_custom(stdout: T_stdout, mock_logger_env: None) -> None
110109
except ZeroDivisionError:
111110
logger.exception("oh noes")
112111

113-
msg = json.loads(stdout())
112+
msg = next(stdout)
114113

115114
assert msg["serviceContext"] == {
116115
"service": "my-service",
@@ -128,7 +127,7 @@ def test_extra_labels(stdout: T_stdout, logger: WrappedLogger) -> None:
128127
test5={"date": datetime.date(2023, 1, 1)},
129128
)
130129

131-
msg = json.loads(stdout())
130+
msg = next(stdout)
132131

133132
expected = {
134133
"logging.googleapis.com/sourceLocation": {
@@ -156,7 +155,7 @@ def test_contextvars_supported(stdout: T_stdout, logger: WrappedLogger) -> None:
156155
)
157156

158157
logger.info("test")
159-
msg = json.loads(stdout())
158+
msg = next(stdout)
160159

161160
expected = {
162161
"logging.googleapis.com/sourceLocation": {
@@ -172,7 +171,9 @@ def test_contextvars_supported(stdout: T_stdout, logger: WrappedLogger) -> None:
172171
assert msg == expected
173172

174173

175-
def test_core_processors_only(stdout: T_stdout, mock_logger_env: None) -> None:
174+
def test_core_processors_only(
175+
capsys: CaptureFixture[str], mock_logger_env: None
176+
) -> None:
176177
processors = structlog_gcp.build_gcp_processors()
177178
processors.append(structlog.processors.KeyValueRenderer())
178179

@@ -185,7 +186,10 @@ def test_core_processors_only(stdout: T_stdout, mock_logger_env: None) -> None:
185186
)
186187

187188
logger.info("test")
188-
msg = stdout().strip()
189+
190+
output = capsys.readouterr()
191+
assert "" == output.err
192+
msg = output.out.strip()
189193

190194
# No JSON formmating, no contextvars
191195
expected = "message='test' time='2023-04-01T08:00:00.000000Z' severity='INFO' logging.googleapis.com/sourceLocation={'file': '/app/test.py', 'line': '42', 'function': 'test:test123'}"
@@ -199,7 +203,7 @@ def test_exception_different_level(stdout: T_stdout, logger: WrappedLogger) -> N
199203
except ZeroDivisionError as exc:
200204
logger.warning("oh no; anyways", exception=exc)
201205

202-
msg = json.loads(stdout())
206+
msg = next(stdout)
203207

204208
expected = {
205209
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
@@ -233,7 +237,7 @@ def test_exception_handled(stdout: T_stdout, logger: WrappedLogger) -> None:
233237
except ZeroDivisionError as exc:
234238
logger.info(f"I was expecting that error: {exc}")
235239

236-
msg = json.loads(stdout())
240+
msg = next(stdout)
237241

238242
expected = {
239243
"logging.googleapis.com/sourceLocation": {

0 commit comments

Comments
 (0)