"""The app's own signed cookies: session + view-as state. Tampering,
expiry, and cross-user replay all read as 'no state' (never raise)."""

from app.services.auth import session as auth_session


def test_session_roundtrip():
    token = auth_session.mint_session(username="rian", email="rian@rian.ca")
    claims = auth_session.verify_session(token)
    assert claims["username"] == "rian"
    assert claims["email"] == "rian@rian.ca"


def test_session_expired_reads_as_none():
    token = auth_session.mint_session(username="rian", now=0)  # exp long past
    assert auth_session.verify_session(token) is None


def test_session_tamper_reads_as_none():
    token = auth_session.mint_session(username="rian")
    value, sig = token.rsplit("|", 1)
    other_value = auth_session.mint_session(username="mallory").rsplit("|", 1)[0]
    assert auth_session.verify_session(f"{other_value}|{sig}") is None
    assert auth_session.verify_session(value) is None  # no signature at all
    assert auth_session.verify_session("garbage") is None
    assert auth_session.verify_session("") is None


def test_view_as_cookie_roundtrip_and_binding():
    token = auth_session.mint_view_as("rian", "zeina")
    state = auth_session.read_view_as(token, "rian")
    assert state == {"target": "zeina", "mode": "readonly"}
    # Bound to the REAL user: inert on any other session.
    assert auth_session.read_view_as(token, "erin") is None
    assert auth_session.read_view_as(token, "") is None


def test_view_as_cookie_never_a_session():
    # A view-as token must not verify as an app session (distinct keys).
    token = auth_session.mint_view_as("rian", "zeina")
    assert auth_session.verify_session(token) is None
    session_token = auth_session.mint_session(username="rian")
    assert auth_session.read_view_as(session_token, "rian") is None


def test_view_as_cookie_expiry_and_garbage():
    expired = auth_session.mint_view_as("rian", "zeina", now=0)
    assert auth_session.read_view_as(expired, "rian") is None
    assert auth_session.read_view_as("junk", "rian") is None
    forged_mode = auth_session.mint_view_as("rian", "zeina", mode="superpowers")
    assert auth_session.read_view_as(forged_mode, "rian")["mode"] == "readonly"
