JAA-ATS-Tool / scripts /verify_history.py
saitejatirunagari's picture
feat: non-destructive tailoring + reliable PDF + persistent side panel + history (Phase 8)
8155d78
Raw
History Blame
3.37 kB
#!/usr/bin/env python3
"""Deterministic static-analysis regression for Phase 08-04: generated-resume
history (R19). The extension JS can't run headless, so we assert the wiring
CONTRACT by source inspection. ASCII-only output.
Proves:
* popup.html has a collapsible History UI (#history-toggle + #history-list).
* popup.js renders a restorable history list (renderHistory / restoreFromHistory
reusing applyResult, reading ats_results via RESULTS_KEY, refreshing on
chrome.storage.onChanged, showing per-entry scores + status).
* background.js raises MAX_SAVED above 10 and guards the chrome.storage.local
quota (approxSize + stripOldestArtifacts + BYTE_BUDGET) without changing the
R15 contract (normalizeUrl + ats_results + status:'running').
Exit code: 0 when every assertion passes, 1 otherwise.
"""
import os
import re
import sys
REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
EXT = os.path.join(REPO_ROOT, "extension")
POPUP_HTML = os.path.join(EXT, "popup", "popup.html")
POPUP_JS = os.path.join(EXT, "popup", "popup.js")
BG = os.path.join(EXT, "background.js")
_failures = []
def _read(path):
with open(path, encoding="utf-8") as fh:
return fh.read()
def check(condition, message):
if condition:
print(f" [PASS] {message}")
else:
print(f" [FAIL] {message}")
_failures.append(message)
def test_popup_html():
print("[1] popup.html has the collapsible History UI")
h = _read(POPUP_HTML)
check("history-list" in h, "popup.html has #history-list container")
check("history-toggle" in h, "popup.html has #history-toggle control")
def test_popup_js():
print("[2] popup.js renders a restorable, re-downloadable history list")
js = _read(POPUP_JS)
for token in ("renderHistory", "restoreFromHistory", "applyResult", "RESULTS_KEY"):
check(token in js, f"popup.js references '{token}'")
check("chrome.storage.onChanged" in js,
"history refreshes on chrome.storage.onChanged")
check(("external_score" in js or "external_coverage_pct" in js) and "status" in js,
"history surfaces per-entry external score + status")
def test_background():
print("[3] background.js raises retention + guards the quota (R15 intact)")
js = _read(BG)
m = re.search(r"MAX_SAVED\s*=\s*(\d+)", js)
check(bool(m) and int(m.group(1)) > 10,
f"MAX_SAVED raised above 10 (got {m.group(1) if m else 'n/a'})")
for token in ("approxSize", "stripOldestArtifacts", "BYTE_BUDGET"):
check(token in js, f"quota guard references '{token}'")
check("normalizeUrl" in js and "ats_results" in js,
"ats_results key + normalizeUrl contract unchanged")
check("status: 'running'" in js or 'status: "running"' in js
or "'running'" in js,
"R15 running marker preserved")
def main():
print("=" * 66)
print("Phase 08-04 verification: generated-resume history (R19)")
print("=" * 66)
test_popup_html()
test_popup_js()
test_background()
print("-" * 66)
if _failures:
print(f"FAIL - {len(_failures)} check(s) failed:")
for f in _failures:
print(f" - {f}")
return 1
print("PASS - history browse/restore UI + quota-guarded retention verified")
return 0
if __name__ == "__main__":
sys.exit(main())