49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
|
|
import pytest
|
||
|
|
|
||
|
|
import gen_overview
|
||
|
|
|
||
|
|
|
||
|
|
CFG = {
|
||
|
|
"required_fields": ["hostname", "kind", "status"],
|
||
|
|
"enums": {
|
||
|
|
"kind": ["server", "switch", "pdu"],
|
||
|
|
"status": ["in-use", "staging", "spare"],
|
||
|
|
},
|
||
|
|
"key_field": "hostname",
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def validate(stem, fm):
|
||
|
|
from pathlib import Path
|
||
|
|
gen_overview.validate(Path(f"{stem}.md"), fm, CFG)
|
||
|
|
|
||
|
|
|
||
|
|
def test_missing_required_field_names_field_and_lists_allowed():
|
||
|
|
with pytest.raises(gen_overview.SchemaError) as ei:
|
||
|
|
validate("srv06", {"hostname": "srv06", "kind": "server"})
|
||
|
|
msg = str(ei.value)
|
||
|
|
assert "status" in msg # which field
|
||
|
|
assert "in-use" in msg # an allowed value, so a novice knows what to type
|
||
|
|
|
||
|
|
|
||
|
|
def test_enum_violation_lists_allowed_values():
|
||
|
|
with pytest.raises(gen_overview.SchemaError) as ei:
|
||
|
|
validate("x", {"hostname": "x", "kind": "router", "status": "in-use"})
|
||
|
|
msg = str(ei.value)
|
||
|
|
assert "router" in msg # the offending value
|
||
|
|
assert "server" in msg # an allowed value
|
||
|
|
|
||
|
|
|
||
|
|
def test_filename_mismatch_explains_the_rename():
|
||
|
|
with pytest.raises(gen_overview.SchemaError) as ei:
|
||
|
|
validate("srv06", {"hostname": "srv07", "kind": "server", "status": "in-use"})
|
||
|
|
msg = str(ei.value).lower()
|
||
|
|
assert "srv07.md" in msg or "rename" in msg
|
||
|
|
|
||
|
|
|
||
|
|
def test_error_report_points_to_the_guide(capsys):
|
||
|
|
gen_overview.report_errors(["srv06.md: missing required field 'status'"], "hardware")
|
||
|
|
err = capsys.readouterr().err
|
||
|
|
assert "make docs-index" in err
|
||
|
|
assert gen_overview.GUIDE_URL in err
|