import unittest from app import create_app, db from app.models.user import User class TestRoleDashboardAndMenu(unittest.TestCase): def setUp(self): self.app = create_app() self.app.config['TESTING'] = True self.app.config['WTF_CSRF_ENABLED'] = False self.client = self.app.test_client() self.app_context = self.app.app_context() self.app_context.push() # Usar usuario administrador para autenticación en sesión de pruebas self.user = User.query.filter_by(is_active=True).first() if self.user: with self.client.session_transaction() as sess: sess['_user_id'] = str(self.user.id) sess['_fresh'] = True def tearDown(self): self.app_context.pop() def test_user_role_methods(self): """Verifica la normalización y detección de roles en el modelo User""" u = User(name="Test Teacher", email="prof@test.edu", role="Docente") self.assertEqual(u.get_institutional_role(), "docente") self.assertTrue(u.is_docente()) self.assertFalse(u.is_admin()) self.assertFalse(u.is_alumno()) self.assertFalse(u.is_bedelia()) u_bedelia = User(name="Test Bedelia", email="bedelia@test.edu", role="Bedelia") self.assertEqual(u_bedelia.get_institutional_role(), "bedelia") self.assertTrue(u_bedelia.is_bedelia()) u_student = User(name="Test Student", email="student@test.edu", role="Alumno") self.assertEqual(u_student.get_institutional_role(), "alumno") self.assertTrue(u_student.is_alumno()) u_admin = User(name="Test Admin", email="admin@test.edu", role="ADMIN") self.assertEqual(u_admin.get_institutional_role(), "admin") self.assertTrue(u_admin.is_admin()) badge = u_admin.role_badge_display self.assertIn("badge-admin", badge["class"]) self.assertIn("Administrador", badge["label"]) def test_admin_dashboard_rendered(self): """Verifica que el dashboard administrativo renderiza KPIs y accesos de administración""" res = self.client.get('/?view_as=admin') self.assertEqual(res.status_code, 200) html = res.get_data(as_text=True) self.assertIn('Aulas Totales', html) self.assertIn('Oferta de Materias', html) self.assertIn('Usuarios Activos', html) self.assertIn('Módulos de Gestión & Visualización de Menús', html) self.assertIn('Espacios & Sedes', html) self.assertIn('Auditoría & RBAC', html) def test_bedelia_dashboard_rendered(self): """Verifica que el dashboard de bedelía renderiza métricas operativas de campus""" res = self.client.get('/?view_as=bedelia') self.assertEqual(res.status_code, 200) html = res.get_data(as_text=True) self.assertIn('Aulas Presenciales', html) self.assertIn('Salas Virtuales', html) self.assertIn('Acciones Rápidas & Menús Operativos de Bedelía', html) self.assertIn('Cartelera del Día', html) self.assertIn('Sincronizar Sheets', html) def test_docente_dashboard_rendered(self): """Verifica que el dashboard del docente renderiza sus clases y accesos directos""" res = self.client.get('/?view_as=docente') self.assertEqual(res.status_code, 200) html = res.get_data(as_text=True) self.assertIn('Mis Clases Hoy', html) self.assertIn('Mis Reservas Activas', html) self.assertIn('Reservar Aula', html) self.assertIn('Accesos Directos de Docencia & Visualización de Menús', html) self.assertIn('Mis Clases Programadas para Hoy', html) def test_alumno_dashboard_rendered(self): """Verifica que el dashboard del alumno muestra la brújula diaria y herramientas de cursada""" res = self.client.get('/?view_as=alumno') self.assertEqual(res.status_code, 200) html = res.get_data(as_text=True) self.assertIn('¿Dónde curso hoy? - Cartelera del Alumno', html) self.assertIn('Menú del Alumno & Herramientas de Cursada', html) self.assertIn('Cartelera de Hoy', html) self.assertIn('Cronograma Semanal', html) self.assertIn('Aulas Virtuales', html) def test_audit_logs_view(self): """Verifica que la vista de auditoría institucional responde correctamente""" res = self.client.get('/admin/audit-logs') self.assertEqual(res.status_code, 200) html = res.get_data(as_text=True) self.assertIn('Registro de Auditoría Institucional', html) self.assertIn('Trazabilidad completa de operaciones', html) if __name__ == '__main__': unittest.main()