77일차 실행 기록 분석: 실습 15개 · 강의(개요 30장 · 단계 문서 · 4단계 정리 · 05 바이브), 정답본 LAB-A · answers · VIBE-A · tlog 포함
This commit is contained in:
1 parent
036eae1c6a
commit
dcd4cdd66b
148 files changed
+40344
No files matched your search
@@ -0,0 +1,59 @@
|
||||
"""R5 · R7 · R8 · R10 · R12: JSON names, exit codes 0 · 1 · 2 · 4."""
|
||||
import json
|
||||
|
||||
from tlog import cli
|
||||
|
||||
DATA = "tests/data/run-logs.json"
|
||||
|
||||
|
||||
def test_summary_json_has_the_report_names(capsys):
|
||||
assert cli.main(["summary", "--file", DATA, "--from", "2026-10-26", "--to", "2026-10-30", "--json"]) == 0
|
||||
out = json.loads(capsys.readouterr().out)
|
||||
assert {"total", "errors", "error_rate", "p50_ms", "p95_ms", "by_route", "failures", "anomalies", "slo"} <= set(out)
|
||||
assert (out["total"], out["error_rate"]) == (357, 0.0588)
|
||||
|
||||
|
||||
def test_plain_summary(capsys):
|
||||
assert cli.main(["summary", "--file", DATA, "--from", "2026-10-19", "--to", "2026-10-30"]) == 0
|
||||
assert capsys.readouterr().out.startswith("666 runs · errors 21 (3.15%) · p50 1205ms · p95 2537ms")
|
||||
|
||||
|
||||
def test_exit_codes(capsys):
|
||||
assert cli.main(["summary"]) == 2 # no source
|
||||
assert cli.main(["summary", "--file", "/no/such.json"]) == 1 # cannot read
|
||||
assert cli.main(["slo", "--file", DATA, "--from", "2026-10-26", "--to", "2026-10-30"]) == 4
|
||||
assert cli.main(["slo", "--file", DATA, "--from", "2026-10-19", "--to", "2026-10-23", "--unanswered", "0.06"]) == 0
|
||||
assert "SLO ok" in capsys.readouterr().out
|
||||
|
||||
|
||||
def test_slo_json(capsys):
|
||||
cli.main(["slo", "--file", DATA, "--from", "2026-10-26", "--to", "2026-10-30", "--json"])
|
||||
out = json.loads(capsys.readouterr().out)
|
||||
assert out["breaches"] == ["error_rate", "unanswered_rate"] and out["values"]["p95_ms"] == 2598
|
||||
|
||||
|
||||
def test_usage_mistake_is_2():
|
||||
try:
|
||||
cli.main(["nope"])
|
||||
except SystemExit as stop:
|
||||
assert stop.code == 2
|
||||
|
||||
|
||||
def test_compare_and_weekly(capsys):
|
||||
args = ["--file", DATA, "--from", "2026-10-26", "--to", "2026-10-30", "--prev-from", "2026-10-19", "--prev-to", "2026-10-23"]
|
||||
assert cli.main(["compare", *args, "--json"]) == 0
|
||||
rows = {r["metric"]: r for r in json.loads(capsys.readouterr().out)}
|
||||
assert rows["total"]["prev"] == 309 and rows["total"]["now"] == 357 and rows["total"]["change"] == 48
|
||||
assert cli.main(["weekly", *args]) == 0
|
||||
assert "| 요청 | 309 | 357 |" in capsys.readouterr().out
|
||||
|
||||
|
||||
def test_data_api(api, capsys):
|
||||
assert cli.main(["summary", "--url", api, "--from", "2026-10-26", "--to", "2026-10-26", "--json"]) == 0
|
||||
assert json.loads(capsys.readouterr().out)["errors"] == 16
|
||||
|
||||
|
||||
def test_file_wins_over_tlog_url(monkeypatch, capsys):
|
||||
monkeypatch.setenv("TLOG_URL", "http://127.0.0.1:9") # nothing listens there
|
||||
assert cli.main(["summary", "--file", DATA, "--from", "2026-10-26", "--to", "2026-10-26", "--json"]) == 0
|
||||
assert json.loads(capsys.readouterr().out)["total"] == 70
|
||||
Reference in new issue
Block a user