import pytest from flask import url_for from functions.database import Usuario, get_db_connection from werkzeug.security import generate_password_hash import json @pytest.fixture def admin_user(client): """Fixture que cria um usuário admin para testes""" db = get_db_connection() try: admin = Usuario( username='admin_test', email='admin@test.com', password_hash=generate_password_hash('admin123'), is_admin=True, is_active=True ) db.add(admin) db.commit() return admin finally: db.close() @pytest.fixture def auth_admin_client(client, admin_user): """Fixture que retorna um cliente autenticado como admin""" client.post('/login', data={ 'email': 'admin@test.com', 'password': 'admin123' }) return client def test_dashboard_access_sem_login(client): """Testa acesso ao dashboard sem login""" response = client.get('/admin/') assert response.status_code == 302 assert '/login' in response.headers['Location'] def test_dashboard_access_com_login(auth_admin_client): """Testa acesso ao dashboard com login de admin""" response = auth_admin_client.get('/admin/') assert response.status_code == 200 assert b'Dashboard Administrativo' in response.data def test_lista_usuarios(auth_admin_client): """Testa listagem de usuários""" response = auth_admin_client.get('/admin/users') assert response.status_code == 200 assert b'Lista de' in response.data assert b'admin_test' in response.data def test_reset_otp(auth_admin_client, admin_user): """Testa reset de OTP""" response = auth_admin_client.post(f'/admin/users/{admin_user.id}/reset-otp') assert response.status_code == 302 assert 'success' in response.headers['Location'] def test_reset_password(auth_admin_client, admin_user): """Testa reset de senha""" response = auth_admin_client.post(f'/admin/users/{admin_user.id}/reset-password') assert response.status_code == 302 assert 'success' in response.headers['Location'] def test_toggle_status(auth_admin_client, admin_user): """Testa alteração de status do usuário""" response = auth_admin_client.post( f'/admin/users/{admin_user.id}/toggle-status', headers={'Content-Type': 'application/json'} ) data = json.loads(response.data) assert response.status_code == 200 assert data['success'] is True def test_acesso_nao_admin(client): """Testa acesso de usuário não admin""" db = get_db_connection() try: # Criar usuário normal user = Usuario( username='normal_user', email='user@test.com', password_hash=generate_password_hash('user123'), is_admin=False, is_active=True ) db.add(user) db.commit() # Login client.post('/login', data={ 'email': 'user@test.com', 'password': 'user123' }) # Tentar acessar área admin response = client.get('/admin/') assert response.status_code == 403 finally: db.close()