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(role: StaffRole = StaffRole.DIRETOR) -> AuthenticatedStaffContext: return AuthenticatedStaffContext( principal=AuthenticatedStaffPrincipal( id=7 if role == StaffRole.DIRETOR else 8, email="diretor@empresa.com" if role == StaffRole.DIRETOR else "colaborador@empresa.com", display_name="Administrador" if role == StaffRole.DIRETOR else "Colaborador", role=role, 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_director_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(StaffRole.DIRETOR) 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("Cadastro de tools", response.text) self.assertIn("Revisao de tools", response.text) self.assertIn("Gestao de colaboradores", response.text) self.assertIn("/panel/tools/new", response.text) self.assertIn("/panel/tools/review", response.text) self.assertIn("/panel/colaboradores/gestao", response.text) self.assertIn("/panel/assets/styles/panel.css", response.text) self.assertNotIn("API pronta para ser plugada na UI", response.text) def test_admin_dashboard_hides_collaborator_management_for_colaborador_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(StaffRole.COLABORADOR) client = TestClient(app) try: response = client.get("/panel/admin") finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 200) self.assertNotIn("/panel/colaboradores/gestao", response.text) self.assertNotIn("Gerir equipe", response.text) def test_tool_intake_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/new", follow_redirects=False) self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/login")) def test_tool_intake_page_renders_real_form_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/new") finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 200) self.assertIn("Cadastro de nova tool", response.text) self.assertIn('data-admin-tool-intake="true"', response.text) self.assertIn('data-intake-endpoint="/panel/tools/drafts/intake"', response.text) self.assertIn('data-admin-tool-intake-form="true"', response.text) self.assertIn("Adicionar parametro", response.text) self.assertIn("Validar pre-cadastro", 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.assertIn('data-tool-review-code', response.text) self.assertIn('data-tool-review-decision-notes', response.text) self.assertIn('data-tool-review-action="deactivate"', response.text) self.assertIn('data-tool-review-action="rollback"', response.text) self.assertNotIn("Abrir login administrativo", response.text) def test_collaborator_management_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/colaboradores/gestao", follow_redirects=False) self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/login")) def test_collaborator_management_page_redirects_colaborador_to_dashboard(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(StaffRole.COLABORADOR) client = TestClient(app) try: response = client.get("/panel/colaboradores/gestao", follow_redirects=False) finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 302) self.assertTrue(response.headers["location"].endswith("/panel/admin")) def test_collaborator_management_page_renders_director_board_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(StaffRole.DIRETOR) client = TestClient(app) try: response = client.get("/panel/colaboradores/gestao") finally: app.dependency_overrides.clear() self.assertEqual(response.status_code, 200) self.assertIn("Gestao de colaboradores", response.text) self.assertIn('data-admin-collaborator-board="true"', response.text) self.assertIn('data-collaborator-collection-endpoint="/panel/colaboradores"', response.text) self.assertIn('data-admin-collaborator-form="true"', response.text) self.assertIn("Criar colaborador", response.text) self.assertIn("Atualizar lista", 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") intake_response = client.get("/admin/panel/tools/new", follow_redirects=False) review_response = client.get("/admin/panel/tools/review", follow_redirects=False) collaborator_response = client.get("/admin/panel/colaboradores/gestao", 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(intake_response.status_code, 302) self.assertEqual(review_response.status_code, 302) self.assertEqual(collaborator_response.status_code, 302) self.assertEqual(css_response.status_code, 200) self.assertTrue(panel_response.headers["location"].endswith("/admin/login")) self.assertTrue(intake_response.headers["location"].endswith("/admin/login")) self.assertTrue(review_response.headers["location"].endswith("/admin/login")) self.assertTrue(collaborator_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_pages_render_when_director_session_exists(self): app = create_app(AdminSettings(admin_api_prefix="/admin")) app.dependency_overrides[get_optional_panel_staff_context] = lambda: _build_panel_context(StaffRole.DIRETOR) client = TestClient(app) try: panel_response = client.get("/admin/panel/admin") intake_response = client.get("/admin/panel/tools/new") review_response = client.get("/admin/panel/tools/review") collaborator_response = client.get("/admin/panel/colaboradores/gestao") finally: app.dependency_overrides.clear() self.assertEqual(panel_response.status_code, 200) self.assertEqual(intake_response.status_code, 200) self.assertEqual(review_response.status_code, 200) self.assertEqual(collaborator_response.status_code, 200) self.assertIn("/admin/panel/tools/new", panel_response.text) self.assertIn("/admin/panel/colaboradores/gestao", panel_response.text) self.assertIn('data-intake-endpoint="/admin/panel/tools/drafts/intake"', intake_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) self.assertIn('data-collaborator-collection-endpoint="/admin/panel/colaboradores"', collaborator_response.text) if __name__ == "__main__": unittest.main()