goon/tests/test_auth.py
goon-foss ad0284585b Initial commit
Goon — self-hosted aggregator for adult-content scene metadata.

Indexes scenes from TPDB, StashDB, and 30+ public adult tube sites.
Cross-source deduplication via perceptual hash + Levenshtein distance.
FastAPI backend + APScheduler worker + React Native (Expo) mobile client.

FOSS, ad-free, donation-funded. See README for details.
2026-05-20 10:10:22 +02:00

66 lines
2.3 KiB
Python

"""Auth dependency — sprawdza że bez API_KEYS przepuszcza, a z API_KEYS wymaga klucza.
Endpointy /healthz i /readyz są poza auth (sprawdzane wprost), reszta przez dependency.
Testujemy bezpośrednio na funkcji `require_api_key`, niezależnie od DB.
"""
from __future__ import annotations
import pytest
from fastapi import HTTPException
from app.auth import require_api_key
from app.config import get_settings
def _reset_settings_cache() -> None:
get_settings.cache_clear()
@pytest.fixture(autouse=True)
def _restore_env(monkeypatch: pytest.MonkeyPatch) -> None:
# Każdy test startuje z czystą wartością API_KEYS i wyczyszczonym cache.
# setenv("") nadpisuje też wartość z .env (delenv tylko usuwa z os.environ).
monkeypatch.setenv("API_KEYS", "")
_reset_settings_cache()
yield
_reset_settings_cache()
def test_disabled_when_api_keys_empty() -> None:
# Z pustym API_KEYS auth jest disabled — przepuszcza nawet bez headera.
require_api_key(x_api_key=None, authorization=None)
def test_accepts_x_api_key_header(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("API_KEYS", "alice-secret,bob-secret")
_reset_settings_cache()
require_api_key(x_api_key="alice-secret", authorization=None)
def test_accepts_bearer_authorization(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("API_KEYS", "alice-secret")
_reset_settings_cache()
require_api_key(x_api_key=None, authorization="Bearer alice-secret")
def test_rejects_unknown_key(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("API_KEYS", "alice-secret")
_reset_settings_cache()
with pytest.raises(HTTPException) as exc:
require_api_key(x_api_key="hacker", authorization=None)
assert exc.value.status_code == 401
def test_rejects_missing_when_enabled(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("API_KEYS", "alice-secret")
_reset_settings_cache()
with pytest.raises(HTTPException) as exc:
require_api_key(x_api_key=None, authorization=None)
assert exc.value.status_code == 401
def test_settings_parses_csv_keys_with_whitespace(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setenv("API_KEYS", " alice , bob ,, charlie ")
_reset_settings_cache()
keys = get_settings().api_keys
assert keys == {"alice", "bob", "charlie"}