rss-news/backend/tests/test_admin_ui.py

65 lines
2.3 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 TestAdminUi(unittest.TestCase):
def setUp(self) -> None:
self.tmp_dir = tempfile.TemporaryDirectory()
os.environ["APP_DB_PATH"] = str(Path(self.tmp_dir.name) / "admin_ui.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_admin_login_and_dashboard(self) -> None:
login_page = self.client.get("/admin/login")
self.assertEqual(login_page.status_code, 200)
self.assertIn("rss-news Admin", login_page.text)
login = self.client.post(
"/admin/login",
data={"username": "admin", "password": "secret"},
follow_redirects=True,
)
self.assertEqual(login.status_code, 200)
self.assertIn("Admin Dashboard", login.text)
def test_dashboard_redirects_if_not_logged_in(self) -> None:
res = self.client.get("/admin/dashboard", follow_redirects=False)
self.assertEqual(res.status_code, 303)
self.assertEqual(res.headers.get("location"), "/admin/login")
def test_create_feed_with_empty_source_id_does_not_error(self) -> None:
self.client.post(
"/admin/login",
data={"username": "admin", "password": "secret"},
follow_redirects=True,
)
# empty source_id used to cause validation issues in form parsing
res = self.client.post(
"/admin/feeds/create",
data={"name": "Feed X", "url": "https://example.org/feed.xml", "source_id": ""},
follow_redirects=False,
)
self.assertEqual(res.status_code, 303)
self.assertTrue(res.headers.get("location", "").startswith("/admin/dashboard"))
if __name__ == "__main__":
unittest.main()