Initial FastAPI admin auth scaffold

This commit is contained in:
2026-06-05 17:10:30 +08:00
commit 5635da9ea5
65 changed files with 1407 additions and 0 deletions

View File

@@ -0,0 +1,88 @@
import os
import tempfile
import unittest
from pathlib import Path
DB_PATH = Path(tempfile.gettempdir()) / "py_server_admin_login_test.db"
DB_PATH.unlink(missing_ok=True)
os.environ["DATABASE_PATH"] = str(DB_PATH)
os.environ["JWT_ADMIN_SECRET"] = "test_admin_secret"
os.environ["ADMIN_SEED_USERNAME"] = "admin"
os.environ["ADMIN_SEED_PASSWORD"] = "admin"
from httpx import ASGITransport, AsyncClient
from app.core.dependencies import bootstrap_database
from app.main import app
class AdminLoginFlowTest(unittest.IsolatedAsyncioTestCase):
async def asyncSetUp(self) -> None:
await bootstrap_database()
self.client = AsyncClient(
transport=ASGITransport(app=app),
base_url="http://testserver",
)
async def asyncTearDown(self) -> None:
await self.client.aclose()
async def test_login_access_and_refresh_flow(self) -> None:
login_response = await self.client.post(
"/admin/login/login",
json={"username": "admin", "password": "admin"},
)
login_payload = login_response.json()
self.assertEqual(login_payload["code"], 0)
self.assertIn("access_token", login_payload["data"])
self.assertIn("refresh_token", login_payload["data"])
self.assertEqual(login_payload["data"]["expire_at"], 3600)
access_token = login_payload["data"]["access_token"]
refresh_token = login_payload["data"]["refresh_token"]
current_response = await self.client.get(
"/admin/profile/current",
headers={"Authorization": f"Bearer {access_token}"},
)
current_payload = current_response.json()
self.assertEqual(current_payload["code"], 0)
self.assertEqual(current_payload["data"]["username"], "admin")
refresh_response = await self.client.post(
"/admin/login/refresh",
headers={"Authorization": f"Bearer {refresh_token}"},
)
refresh_payload = refresh_response.json()
self.assertEqual(refresh_payload["code"], 0)
self.assertNotEqual(refresh_payload["data"]["refresh_token"], refresh_token)
reused_response = await self.client.post(
"/admin/login/refresh",
headers={"Authorization": f"Bearer {refresh_token}"},
)
reused_payload = reused_response.json()
self.assertEqual(reused_payload["code"], 10001)
async def test_refresh_endpoint_rejects_access_token(self) -> None:
login_response = await self.client.post(
"/admin/login/login",
json={"username": "admin", "password": "admin"},
)
access_token = login_response.json()["data"]["access_token"]
refresh_response = await self.client.post(
"/admin/login/refresh",
headers={"Authorization": f"Bearer {access_token}"},
)
refresh_payload = refresh_response.json()
self.assertEqual(refresh_payload["code"], 10002)
if __name__ == "__main__":
unittest.main()