rss-news/backend/tests/test_api_auth.py

77 lines
2.7 KiB
Python

import os
import tempfile
import unittest
from pathlib import Path
from fastapi.testclient import TestClient
from backend.app import config as config_module
from backend.app.db import init_db
from backend.app.main import app
class TestApiAuth(unittest.TestCase):
def setUp(self) -> None:
self.tmp_dir = tempfile.TemporaryDirectory()
os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "api.db")
os.environ["APP_ADMIN_USERNAME"] = "admin"
os.environ["APP_ADMIN_PASSWORD"] = "secret"
config_module.get_settings.cache_clear()
init_db()
self.client = TestClient(app)
def tearDown(self) -> None:
config_module.get_settings.cache_clear()
os.environ.pop("APP_DB_PATH", None)
os.environ.pop("APP_ADMIN_USERNAME", None)
os.environ.pop("APP_ADMIN_PASSWORD", None)
self.tmp_dir.cleanup()
def test_login_and_protected_endpoint(self) -> None:
r = self.client.post("/auth/login", json={"username": "admin", "password": "secret"})
self.assertEqual(r.status_code, 200)
p = self.client.get("/api/protected")
self.assertEqual(p.status_code, 200)
self.assertTrue(p.json().get("ok"))
def test_protected_requires_auth(self) -> None:
r = self.client.get("/api/protected")
self.assertEqual(r.status_code, 401)
def test_run_detail_endpoint(self) -> None:
login = self.client.post("/auth/login", json={"username": "admin", "password": "secret"})
self.assertEqual(login.status_code, 200)
created = self.client.post("/api/runs", json={"run_type": "ingestion", "status": "running"})
self.assertEqual(created.status_code, 200)
run_id = created.json()["id"]
detail = self.client.get(f"/api/runs/{run_id}")
self.assertEqual(detail.status_code, 200)
self.assertEqual(detail.json()["item"]["id"], run_id)
def test_source_policy_check_endpoint(self) -> None:
login = self.client.post("/auth/login", json={"username": "admin", "password": "secret"})
self.assertEqual(login.status_code, 200)
created = self.client.post(
"/api/sources",
json={
"name": "Policy Source",
"risk_level": "yellow",
"is_enabled": True,
},
)
self.assertEqual(created.status_code, 200)
source_id = created.json()["id"]
check = self.client.get(f"/api/sources/{source_id}/policy-check")
self.assertEqual(check.status_code, 200)
body = check.json()
self.assertFalse(body["allowed"])
self.assertGreaterEqual(len(body["issues"]), 1)
if __name__ == "__main__":
unittest.main()