"""Generator SSE tickets must survive reconnect (not one-shot burn).""" from __future__ import annotations def test_validate_ticket_reusable_until_ttl(): from core.ticket_store import mint_ticket, validate_ticket, consume_ticket tid = mint_ticket("user_abc", "proj-1", ttl_seconds=60) u1 = validate_ticket(tid, "proj-1", consume=False) u2 = validate_ticket(tid, "proj-1", consume=False) assert u1 == "user_abc" assert u2 == "user_abc" # still consumable u3 = consume_ticket(tid, "proj-1") assert u3 == "user_abc" # gone after consume try: validate_ticket(tid, "proj-1", consume=False) assert False, "expected invalid after consume" except ValueError as e: assert "invalid" in str(e) or "expired" in str(e) def test_validate_ticket_project_mismatch(): from core.ticket_store import mint_ticket, validate_ticket tid = mint_ticket("user_x", "proj-a", ttl_seconds=30) try: validate_ticket(tid, "proj-b", consume=False) assert False, "expected project_mismatch" except ValueError as e: assert str(e) == "project_mismatch"