test_q4b_ui_integrity.py
python
sha256:0e9549ec7b463911bc08b7d586dc320b1ac9b1f5c943ee7e3865dcc6cb0f6f83
chore(governance): sync handover+roadmap to 84db8c8 (drift:…
Human
9 hours ago
| 1 | """Data-integrity tests for Track Q / Q4b Path B UI redesign (§Q4A.15).""" |
| 2 | |
| 3 | from __future__ import annotations |
| 4 | |
| 5 | import hashlib |
| 6 | import xml.etree.ElementTree as ET |
| 7 | from pathlib import Path |
| 8 | |
| 9 | from tools.app.server import STATIC_ROOT |
| 10 | |
| 11 | DIAGRAM_FILES = ( |
| 12 | "lanes.svg", |
| 13 | "regimes.svg", |
| 14 | "layers.svg", |
| 15 | "kit-consumer.svg", |
| 16 | ) |
| 17 | |
| 18 | CREDENTIAL_MARKERS = ( |
| 19 | "test-session-credential", |
| 20 | "test-csrf-token", |
| 21 | "session_credential:", |
| 22 | "csrf_token:", |
| 23 | ) |
| 24 | |
| 25 | |
| 26 | def _digest(path: Path) -> str: |
| 27 | return hashlib.sha256(path.read_bytes()).hexdigest() |
| 28 | |
| 29 | |
| 30 | def test_diagram_svgs_well_formed_and_checksum_stable() -> None: |
| 31 | digests_first: dict[str, str] = {} |
| 32 | for name in DIAGRAM_FILES: |
| 33 | path = STATIC_ROOT / "assets" / "diagrams" / name |
| 34 | raw = path.read_bytes() |
| 35 | assert len(raw) > 0 |
| 36 | root = ET.fromstring(raw) |
| 37 | assert root.tag.endswith("svg") |
| 38 | digests_first[name] = _digest(path) |
| 39 | |
| 40 | digests_second = { |
| 41 | name: _digest(STATIC_ROOT / "assets" / "diagrams" / name) for name in DIAGRAM_FILES |
| 42 | } |
| 43 | assert digests_first == digests_second |
| 44 | |
| 45 | |
| 46 | def test_no_credential_leakage_in_static_assets() -> None: |
| 47 | targets = [ |
| 48 | STATIC_ROOT / "index.html", |
| 49 | STATIC_ROOT / "assets" / "app.js", |
| 50 | STATIC_ROOT / "assets" / "app.css", |
| 51 | *[STATIC_ROOT / "assets" / "diagrams" / name for name in DIAGRAM_FILES], |
| 52 | ] |
| 53 | for path in targets: |
| 54 | text = path.read_text(encoding="utf-8") |
| 55 | for marker in CREDENTIAL_MARKERS: |
| 56 | assert marker not in text |
File History
1 commit
sha256:6abcf1fa82a7a621ccbc945f19acdba5bc0db54569599404a1452fb4a096a199
fix(ISR): default require_independent_second_reviewer to require
Human
minor
⚠
9 hours ago