import pytest import asyncio from app.main import app from httpx import AsyncClient from datetime import datetime, timedelta from app.database.models import Base, RbacUser, RbacPapel, RbacPermissao # from fastapi_users_db_sqlalchemy import SQLAlchemyBaseUserTableUUID from app.config import URL_BD_TESTE, SECRET from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.ext.asyncio import async_sessionmaker from app.rbac.classes_customizadas import CustomJWTStrategy from app.rbac.auth import current_active_user # Criação do engine de testes com o URL do banco de dados engine = create_async_engine(URL_BD_TESTE) # Configurando o async_sessionmaker para usar AsyncSession TestSessionLocal = async_sessionmaker( bind=engine, class_=AsyncSession, autoflush=False, autocommit=False, ) print("Configuração do sessionmaker concluída") # Definindo a permissão fictícia que o papel de teste irá possuir test_permissao = RbacPermissao( id=1, # "ID" fictício, certifique-se de que o valor seja único e não cause conflitos nome="Permissao_Fake" ) # Definindo o papel fictício que o usuário de teste irá possuir test_papel = RbacPapel( # uuid=uuid.uuid4(), nome="Teste_Papel", permissoes=[test_permissao] # Adicione permissões conforme necessário para simular o comportamento real ) # Definindo o usuário de teste que será simulado, incluindo o papel test_user = RbacUser( # id=uuid.uuid4(), # Gere um UUID único email="test@email.com", hashed_password="hashed-password", # Senha fictícia, pois a verificação não será feita username="testuser", full_name="Test User", is_active=True, is_superuser=False, papeis=[test_papel] # Incluindo o papel definido anteriormente ) def fake_current_user(): return test_user # Variável definida com o usuário fictício # Suponha que você tenha uma lista de permissões que deseja simular required_permissions_for_test = [1, 2] # "IDs" artificiais de permissões para o teste # Função para criar e destruir o banco de dados de testes async def create_test_database(): print("Dentro da função de criação do Banco de Dados") async with engine.begin() as conn: print("Apagando todas as tabelas...") await conn.run_sync(Base.metadata.drop_all) print("Criando todas as tabelas...") await conn.run_sync(Base.metadata.create_all) @pytest.fixture(scope="session") def anyio_backend(): return "asyncio" @pytest.fixture(scope="session") async def client(): print("Iniciando Cliente") # Chama a função para criar o banco de dados de teste await create_test_database() # Inicializa permissões e papéis após a criação do banco de dados # Definindo a sobrecarga de usuário app.dependency_overrides[current_active_user] = fake_current_user # Instanciando a estratégia JWT e gerando o token strategy = CustomJWTStrategy(secret=SECRET, lifetime_seconds=3600) token = await strategy.write_token(test_user) async with AsyncClient(app=app, base_url="http://test") as client: client.headers.update({"Authorization": f"Bearer {token}"}) yield client # FUNÇÕES PARA ROTAS QUE REQUEREM AUTENTICAÇÃO # MODULOS COM UUID PARA TESTES @pytest.fixture(scope="session") def datas_referencia(): data_atual = datetime.now().date() return { "data_atual": data_atual, "data_anterior": data_atual - timedelta(days=1), "data_posterior": data_atual + timedelta(days=1), } @pytest.fixture(scope="session") def uuid_store_relacao_comercial(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e20", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e30", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, } @pytest.fixture(scope="session") def uuid_store_tipo_endereco(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e40", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e50", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento } @pytest.fixture(scope="session") def uuid_store_pessoa(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e60", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e70", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, "uuid_7": None, "uuid_8": None, } @pytest.fixture(scope="session") def uuid_store_endereco(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e80", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e90", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, "uuid_7": None, "uuid_8": None, } @pytest.fixture(scope="session") def uuid_store_setor(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e21", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e32", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, } @pytest.fixture(scope="session") def uuid_store_tipo_equipamento(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e22", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e31", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, } @pytest.fixture(scope="session") def uuid_store_equipamento(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e23", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e32", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, } @pytest.fixture(scope="session") def uuid_store_itens_equipamento(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e24", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e33", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, } @pytest.fixture(scope="session") def uuid_store_manutencao_equipamento(): return { "uuid_1": "01915caf-2c4d-7270-a071-d928c87f8e25", # UUID inválido para testes "uuid_2": "01915caf-2c4d-7270-a071-d928c87f8e34", # UUID inválido para testes "uuid_3": None, "uuid_4": None, "uuid_5": None, "uuid_6": None, # UUID para Relacionamento "uuid_7": None, # UUID para Relacionamento "uuid_8": None, # UUID para Relacionamento "uuid_9": None, "uuid_10": None, "uuid_11": None, }