from datetime import datetime, timedelta, timezone

from app.core.security import (
    hash_password,
    verify_password,
    create_session_token,
    session_expires_at,
    is_session_expired,
)


def test_hash_and_verify_password():
    pw = "secret123"
    hashed = hash_password(pw)
    assert hashed != pw
    assert verify_password(pw, hashed)


def test_verify_wrong_password():
    hashed = hash_password("correct")
    assert not verify_password("wrong", hashed)


def test_create_session_token_is_unique():
    t1 = create_session_token()
    t2 = create_session_token()
    assert t1 != t2
    assert len(t1) > 20


def test_session_expires_at_is_future():
    expires = session_expires_at()
    dt = datetime.fromisoformat(expires)
    if dt.tzinfo is None:
        dt = dt.replace(tzinfo=timezone.utc)
    assert dt > datetime.now(timezone.utc)


def test_is_session_expired_false():
    future = (datetime.now(timezone.utc) + timedelta(hours=1)).isoformat()
    assert not is_session_expired(future)


def test_is_session_expired_true():
    past = (datetime.now(timezone.utc) - timedelta(hours=1)).isoformat()
    assert is_session_expired(past)
