"""Tests for the provider-agnostic auth routes. ``GET /api/auth/providers`` feeds the SPA's login buttons; ``/auth/login`` and ``/auth/logout`` are the generic aliases that redirect to the right per-provider kaya route. """ from __future__ import annotations import unittest from unittest import mock from httpx import ASGITransport, AsyncClient from helpers import async_test, make_platform class AuthProvidersRouteTest(unittest.TestCase): @async_test async def test_lists_providers_in_configuration_order(self) -> None: app, _platform, _tortoise = make_platform(oidc_providers=("default", "google")) transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://127.0.0.1") as client: response = await client.get("/api/auth/providers") self.assertEqual(200, response.status_code) self.assertEqual( { "providers": [ {"name": "default", "login_url": "/auth/default/login"}, {"name": "google", "login_url": "/auth/google/login"}, ] }, response.json(), ) class GenericAuthRedirectTest(unittest.TestCase): @async_test async def test_login_redirects_to_the_first_provider(self) -> None: app, _platform, _tortoise = make_platform(oidc_providers=("google", "github")) transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://127.0.0.1") as client: response = await client.get("/auth/login", follow_redirects=False) self.assertEqual(302, response.status_code) self.assertEqual("/auth/google/login", response.headers["location"]) @async_test async def test_logout_redirects_to_the_logged_in_provider(self) -> None: app, platform, _tortoise = make_platform() with mock.patch.object( platform.oidc, "logged_in_providers", return_value=["default"] ): transport = ASGITransport(app=app) async with AsyncClient( transport=transport, base_url="http://127.0.0.1" ) as client: response = await client.get("/auth/logout", follow_redirects=False) self.assertEqual(302, response.status_code) self.assertEqual("/auth/default/logout", response.headers["location"]) @async_test async def test_logout_without_a_session_redirects_home(self) -> None: app, _platform, _tortoise = make_platform() transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://127.0.0.1") as client: response = await client.get("/auth/logout", follow_redirects=False) self.assertEqual(302, response.status_code) self.assertEqual("/", response.headers["location"])