forked from ChelseaKR/tods-validate
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_doctor.py
More file actions
96 lines (73 loc) · 3.83 KB
/
Copy pathtest_doctor.py
File metadata and controls
96 lines (73 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""``doctor``: one honest end-to-end pass composing validate/merge/gtfs-validator/stats."""
import json
from click.testing import CliRunner
from conftest import FIXTURES, VALID_GTFS, VALID_TODS
from tods_validate.cli import main
E201 = str(FIXTURES / "invalid" / "TODS-E201")
def invoke(*args: str):
return CliRunner().invoke(main, list(args))
def test_doctor_valid_feed_runs_all_stages() -> None:
result = invoke("doctor", str(VALID_TODS), "--gtfs", str(VALID_GTFS))
assert result.exit_code == 0, result.output
assert "== Validate: RAN ==" in result.output
assert "== Merge: RAN ==" in result.output
assert "== GTFS-validator:" in result.output
assert "== Stats: RAN ==" in result.output
# No java/jar available in the test environment, so gtfs-validator is
# honestly skipped, not silently passed.
assert "SKIPPED" in result.output
assert "GTFS validity NOT checked" in result.output
def test_doctor_no_companion_gtfs_skips_merge_and_validator_honestly() -> None:
result = invoke("doctor", E201)
assert result.exit_code == 1 # TODS-E201's error still fails the gate
assert "== Validate: RAN ==" in result.output
assert "== Merge: SKIPPED" in result.output
assert "== GTFS-validator: SKIPPED" in result.output
assert "== Stats: RAN ==" in result.output
assert "GTFS validity NOT checked" in result.output
# Skipping must never look like a pass: the reason is explicit.
assert "merge stage was skipped" in result.output
def test_doctor_without_java_or_jar_skips_validator_with_honest_label(monkeypatch) -> None:
import shutil
monkeypatch.setattr(shutil, "which", lambda name: None)
result = invoke("doctor", str(VALID_TODS), "--gtfs", str(VALID_GTFS))
assert result.exit_code == 0, result.output
assert "== GTFS-validator: SKIPPED" in result.output
assert "GTFS validity NOT checked" in result.output
assert "java was not found on PATH" in result.output
def test_doctor_json_has_per_stage_status() -> None:
result = invoke("doctor", str(VALID_TODS), "--gtfs", str(VALID_GTFS), "--format", "json")
payload = json.loads(result.output)
assert payload["validator"] == "tods-validate"
stages = {s["name"]: s for s in payload["stages"]}
assert set(stages) == {"validate", "merge", "gtfs-validator", "stats"}
assert stages["validate"]["status"] == "ran"
assert stages["merge"]["status"] == "ran"
assert stages["gtfs-validator"]["status"] == "skipped"
assert stages["gtfs-validator"]["reason"]
assert stages["stats"]["status"] == "ran"
assert "stats" in stages["stats"]
def test_doctor_json_no_gtfs_marks_merge_skipped() -> None:
result = invoke("doctor", E201, "--format", "json")
payload = json.loads(result.output)
stages = {s["name"]: s for s in payload["stages"]}
assert stages["merge"]["status"] == "skipped"
assert stages["gtfs-validator"]["status"] == "skipped"
assert stages["validate"]["errors"] >= 1
def test_doctor_markdown_labels_every_stage() -> None:
result = invoke("doctor", str(VALID_TODS), "--gtfs", str(VALID_GTFS), "--format", "markdown")
assert "# TODS doctor report:" in result.output
assert "## Validate: RAN" in result.output
assert "## Merge: RAN" in result.output
assert "## GTFS-validator: SKIPPED" in result.output
assert "## Stats: RAN" in result.output
def test_doctor_missing_path_exits_two() -> None:
result = invoke("doctor", "no-such-directory")
assert result.exit_code == 2
assert "error" in result.output
def test_doctor_valid_feed_alone_no_gtfs_flag() -> None:
"""VALID_TODS has no base GTFS files of its own, only *_supplement.txt,
so merge still runs (supplement-only additions) even without --gtfs."""
result = invoke("doctor", str(VALID_TODS))
assert result.exit_code == 0, result.output
assert "== Merge: RAN ==" in result.output