from __future__ import annotations

from types import SimpleNamespace

import pytest
from fastapi import HTTPException

from witty_service.api import auth


class RequestStub:
    def __init__(self, method: str) -> None:
        self.method = method


def test_require_bearer_auth_skips_options() -> None:
    auth.require_bearer_auth(RequestStub("OPTIONS"), authorization=None)


@pytest.mark.parametrize(
    "authorization",
    [None, "Basic token", "Bearer ", "Bearer wrong-token"],
)
def test_require_bearer_auth_rejects_invalid_token(
    monkeypatch,
    authorization: str | None,
) -> None:
    monkeypatch.setattr(
        auth,
        "get_settings",
        lambda: SimpleNamespace(auth_token="expected-token"),
    )

    with pytest.raises(HTTPException) as exc_info:
        auth.require_bearer_auth(RequestStub("GET"), authorization=authorization)

    assert exc_info.value.status_code == 401
    assert exc_info.value.detail == "Unauthorized"
    assert exc_info.value.headers == {"WWW-Authenticate": "Bearer"}


def test_require_bearer_auth_accepts_expected_token(monkeypatch) -> None:
    monkeypatch.setattr(
        auth,
        "get_settings",
        lambda: SimpleNamespace(auth_token="expected-token"),
    )

    auth.require_bearer_auth(
        RequestStub("GET"),
        authorization="Bearer expected-token",
    )