import unittest from fastapi.testclient import TestClient from admin_app.api.dependencies import get_optional_panel_staff_context from admin_app.app_factory import create_app from admin_app.core import AdminSettings, AuthenticatedStaffContext, AuthenticatedStaffPrincipal from shared.contracts import StaffRole def _build_panel_context() -> AuthenticatedStaffContext: return AuthenticatedStaffContext( principal=AuthenticatedStaffPrincipal( id=7, email="admin@empresa.com", display_name="Administrador", role=StaffRole.ADMIN, is_active=True, ), session_id=77, ) class AdminViewBootstrapTests(unittest.TestCase): def test_panel_entry_redirects_to_login_without_session(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) client = TestClient(app) response = client.get("/panel", follow_redirects=False) self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/login")) def test_panel_entry_redirects_to_admin_dashboard_with_session(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context() client = TestClient(app) try: response = client.get("/panel", follow_redirects=False) finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/panel/admin")) def test_login_page_redirects_to_dashboard_when_session_exists(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context() client = TestClient(app) try: response = client.get("/login", follow_redirects=False) finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/panel/admin")) def test_login_page_renders_focused_auth_experience(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) client = TestClient(app) response = client.get("/login") self.assertEqual(response.status_code, 200) self.assertIn("Login administrativo", response.text) self.assertIn("Acesso restrito", response.text) self.assertIn('data-admin-login-form="true"', response.text) self.assertIn('data-auth-endpoint="/panel/auth/login"', response.text) self.assertIn('data-dashboard-href="http://testserver/panel/admin"', response.text) self.assertNotIn('data-session-endpoint=', response.text) self.assertNotIn('data-logout-endpoint=', response.text) self.assertNotIn("Voltar ao dashboard", response.text) self.assertNotIn("/panel/tools/review", response.text) def test_admin_dashboard_renders_bootstrap_dashboard_when_session_exists(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context() client = TestClient(app) try: response = client.get("/panel/admin") finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 200) self.assertIn("text/html", response.headers["content-type"]) self.assertIn("Painel Administrativo", response.text) self.assertIn("Dashboard do administrador", response.text) self.assertIn("Areas do sistema", response.text) self.assertIn("Entradas claras para as areas protegidas", response.text) self.assertIn("Revisao de tools", response.text) self.assertIn("/panel/tools/review", response.text) self.assertIn("/panel/assets/styles/panel.css", response.text) self.assertNotIn("API pronta para ser plugada na UI", response.text) def test_tool_review_page_redirects_to_login_without_session(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) client = TestClient(app) response = client.get("/panel/tools/review", follow_redirects=False) self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/login")) def test_tool_review_page_renders_web_data_endpoints_when_session_exists(self): app = create_app(AdminSettings(admin_app_name="Admin Interno", admin_version="1.4.0")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context() client = TestClient(app) try: response = client.get("/panel/tools/review") finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 200) self.assertIn("Revisao, aprovacao e ativacao", response.text) self.assertIn('data-admin-tool-review-board="true"', response.text) self.assertIn('data-overview-endpoint="/panel/tools/overview"', response.text) self.assertIn('data-contracts-endpoint="/panel/tools/contracts"', response.text) self.assertIn('data-review-queue-endpoint="/panel/tools/review-queue"', response.text) self.assertIn('data-publications-endpoint="/panel/tools/publications"', response.text) self.assertNotIn("Abrir login administrativo", response.text) def test_prefixed_panel_routes_apply_auth_gate(self): app = create_app(AdminSettings(admin_api_prefix="/admin")) client = TestClient(app) panel_response = client.get("/admin/panel", follow_redirects=False) login_response = client.get("/admin/login") review_response = client.get("/admin/panel/tools/review", follow_redirects=False) css_response = client.get("/admin/panel/assets/styles/panel.css") self.assertEqual(panel_response.status_code, 302) self.assertEqual(login_response.status_code, 200) self.assertEqual(review_response.status_code, 302) self.assertEqual(css_response.status_code, 200) self.assertTrue(panel_response.headers["location"].endswith("/admin/login")) self.assertTrue(review_response.headers["location"].endswith("/admin/login")) self.assertIn('data-auth-endpoint="/admin/panel/auth/login"', login_response.text) self.assertIn('data-dashboard-href="http://testserver/admin/panel/admin"', login_response.text) self.assertNotIn('data-session-endpoint=', login_response.text) self.assertNotIn('data-logout-endpoint=', login_response.text) self.assertIn("/admin/panel/assets/styles/panel.css", login_response.text) self.assertIn("--admin-bg", css_response.text) def test_prefixed_admin_dashboard_and_review_render_when_session_exists(self): app = create_app(AdminSettings(admin_api_prefix="/admin")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context() client = TestClient(app) try: panel_response = client.get("/admin/panel/admin") review_response = client.get("/admin/panel/tools/review") finally: app.dependency_overrides.clear() self.assertEqual(panel_response.status_code, 200) self.assertEqual(review_response.status_code, 200) self.assertIn("Dashboard do administrador", panel_response.text) self.assertIn("/admin/panel/tools/review", panel_response.text) self.assertIn('data-overview-endpoint="/admin/panel/tools/overview"', review_response.text) self.assertIn('data-publications-endpoint="/admin/panel/tools/publications"', review_response.text) if __name__ == "__main__": unittest.main()