71 lines
2.0 KiB
Python
71 lines
2.0 KiB
Python
"""Schema contract tests: round-trip, JSON-schema export, query-term logic."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from recon_triage.schema import (
|
|
ExploitDBMatch,
|
|
Host,
|
|
Port,
|
|
ReconReport,
|
|
Service,
|
|
export_json_schema,
|
|
)
|
|
|
|
|
|
def test_recon_report_minimal_valid():
|
|
r = ReconReport(run_id="t1")
|
|
assert r.run_id == "t1"
|
|
assert r.hosts == []
|
|
assert "Authorized use only" in r.notice
|
|
|
|
|
|
def test_round_trip_json():
|
|
r = ReconReport(
|
|
run_id="t1",
|
|
hosts=[
|
|
Host(
|
|
hostname="api.example.com",
|
|
ips=["1.2.3.4"],
|
|
ports=[
|
|
Port(
|
|
number=443,
|
|
service=Service(
|
|
name="http",
|
|
product="Apache httpd",
|
|
version="2.4.49",
|
|
exploitdb_candidates=[
|
|
ExploitDBMatch(edb_id="50383", title="x", path="p")
|
|
],
|
|
),
|
|
)
|
|
],
|
|
)
|
|
],
|
|
)
|
|
dumped = r.model_dump_json()
|
|
restored = ReconReport.model_validate_json(dumped)
|
|
assert restored.hosts[0].ports[0].service.product == "Apache httpd"
|
|
assert restored.hosts[0].ports[0].service.exploitdb_candidates[0].verified is False
|
|
|
|
|
|
def test_exploitdb_match_always_unverified():
|
|
m = ExploitDBMatch(edb_id="1", title="t", path="p")
|
|
assert m.verified is False
|
|
assert m.source == "exploit-db"
|
|
|
|
|
|
def test_query_term():
|
|
assert Service(product="Apache httpd", version="2.4.49").query_term() == "Apache httpd 2.4.49"
|
|
assert Service(product="nginx").query_term() == "nginx"
|
|
assert Service(name="http").query_term() is None
|
|
|
|
|
|
def test_export_json_schema(tmp_path):
|
|
p = export_json_schema(tmp_path)
|
|
assert p.exists()
|
|
doc = json.loads(p.read_text())
|
|
assert "properties" in doc and "hosts" in doc["properties"]
|
|
assert (tmp_path / "triage_report.schema.json").exists()
|