File size: 3,369 Bytes
8155d78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/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())