File size: 3,568 Bytes
f74bce1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import importlib.util
import json
from datetime import datetime, timezone
from pathlib import Path


SCRIPT_PATH = Path(__file__).resolve().parents[1] / "scripts" / "devpost_event_snapshot.py"
SPEC = importlib.util.spec_from_file_location("devpost_event_snapshot", SCRIPT_PATH)
devpost_event_snapshot = importlib.util.module_from_spec(SPEC)
assert SPEC.loader is not None
SPEC.loader.exec_module(devpost_event_snapshot)


OVERVIEW_HTML = """
<html><body>
Backblaze Generative Media Hackathon
Deadline: Aug 3, 2026 @ 5:00pm EDT
$ 10,000 in cash
Participants (343)
Backblaze B2 Genblaze
</body></html>
"""

RULES_HTML = """
<html><body>
Participants (338)
Registration and Submission Period: June 22, 2026 at 9:00 AM EDT to August 3, 2026 at 5:00 PM EDT Judging Period:
August 3, 2026 at 5:00 PM EDT to August 12, 2026 at 5:00 PM EDT Winners Announced:
August 12, 2026 at 5:00 PM EDT Requirements
Provide a URL to a working application
Provide a URL to your public or private GitHub code repository
Include a demonstration video less than three (3) minutes
YouTube, Vimeo, or Youku
Backblaze B2
Genblaze
Real-world Utility
Production Readiness
B2 Storage + Data Orchestration
Use of Genblaze
Feedback Prize
</body></html>
"""


def test_snapshot_parses_official_overview_and_rules():
    snapshot = devpost_event_snapshot.build_snapshot_from_text(
        OVERVIEW_HTML,
        RULES_HTML,
        fetched_at="2026-06-27T16:00:00Z",
    )

    assert snapshot["schema"] == devpost_event_snapshot.SCHEMA
    assert snapshot["event"]["participant_count_observed"] == 343
    assert snapshot["event"]["deadline_utc"] == "2026-08-03T21:00:00Z"
    assert snapshot["event"]["deadline_beijing"] == "2026-08-04 05:00 Asia/Shanghai"
    assert snapshot["rules"]["requirements"]["working_app_url"] is True
    assert all(criterion["present"] for criterion in snapshot["rules"]["judging_criteria"])
    assert "different dynamic participant counts" in snapshot["event"]["participant_count_note"]


def test_snapshot_validation_passes_before_deadline():
    snapshot = devpost_event_snapshot.build_snapshot_from_text(
        OVERVIEW_HTML,
        RULES_HTML,
        fetched_at="2026-06-27T16:00:00Z",
    )

    validation = devpost_event_snapshot.validate_snapshot(
        snapshot,
        now=datetime(2026, 6, 28, tzinfo=timezone.utc),
    )

    assert validation["ok"] is True
    assert validation["submission_open"] is True


def test_snapshot_validation_fails_when_stale():
    snapshot = devpost_event_snapshot.build_snapshot_from_text(
        OVERVIEW_HTML,
        RULES_HTML,
        fetched_at="2026-05-01T00:00:00Z",
    )

    validation = devpost_event_snapshot.validate_snapshot(
        snapshot,
        max_age_days=14,
        now=datetime(2026, 6, 28, tzinfo=timezone.utc),
    )

    assert validation["ok"] is False
    assert any("days old" in finding for finding in validation["findings"])


def test_snapshot_writes_json_and_markdown(tmp_path):
    snapshot = devpost_event_snapshot.build_snapshot_from_text(
        OVERVIEW_HTML,
        RULES_HTML,
        fetched_at="2026-06-27T16:00:00Z",
    )
    json_path = tmp_path / "event.json"
    markdown_path = tmp_path / "event.md"

    devpost_event_snapshot.write_outputs(snapshot, json_path, markdown_path)

    saved = json.loads(json_path.read_text(encoding="utf-8"))
    markdown = markdown_path.read_text(encoding="utf-8")
    assert saved["schema"] == devpost_event_snapshot.SCHEMA
    assert "# ProofFrame Devpost Event Snapshot" in markdown
    assert "## Judging Criteria" in markdown