Este documento descreve a estratégia, as ferramentas e a estrutura das suítes de testes automatizados do InsightPop. A aplicação possui uma ampla cobertura dividida entre o Backend (Python) e o Mobile/Frontend (React Native).
- Estratégia de Testes
- 🐍 Testes do Backend (Python / FastAPI)
- 📱 Testes do Mobile (React Native)
- 🛠️ Resolução de Problemas & Infraestrutura
- 📝 Boas Práticas ao Criar Novos Testes
A abordagem atual foca na estabilidade das rotas críticas e nas lógicas de validação de interface do usuário, assegurando que o núcleo do sistema funcione adequadamente sem quebras de contrato.
- Testes de Integração (Backend): Foco em garantir que as requisições HTTP processem dados e persistam no banco de dados (MongoDB) corretamente.
- Testes Unitários de Backend: Cobertura de serviços isolados, lógicas de inteligência artificial (AI Processor) e interações estritas com o banco de dados via repositório.
- Testes de Componentes e Unitários (Frontend): Foco em garantir que a UI reage conforme o esperado dado um estado, validando entradas de dados, formatações de utilitários e integração correta das chamadas de API mockadas.
Nota sobre Validação de Formulários (Mobile): A validação de formulários do aplicativo agora utiliza a dupla React Hook Form + Zod, o que torna as validações assíncronas. Qualquer teste de interface (Jest/Testing Library) que simule erros ou fluxos de submissão em inputs deve obrigatoriamente envolver suas assertions (ou buscas de elementos) pela função
waitFor()nativa, caso contrário, o teste resultará em falso-negativo.
Os testes do backend garantem que os endpoints da API recebam e retornem as informações corretamente, interagindo com o banco de dados conforme as regras de negócio.
pytest: Framework principal para execução.pytest-asyncio: Para testar código assíncrono (Endpoints FastAPI e queries do MongoDB).httpx: Utilizado viaAsyncClientpara fazer requisições HTTP simuladas na aplicação.mock: Para interceptar e simular chamadas externas (ex: Google Gemini API).
Atenção (Variáveis de Ambiente): Devido à validação rigorosa com Pydantic Settings implementada na v0.4.1, os testes do backend só rodarão com sucesso se o ambiente Docker contiver um arquivo
.envválido. Caso contrário, a aplicação falhará antes mesmo da injeção das fixtures de teste.
Os testes devem ser rodados dentro do contêiner Docker para garantir que todas as dependências estejam corretas.
# Rodar toda a suíte de testes
docker compose run --rm backend pytest
# Rodar um arquivo específico
docker compose run --rm backend pytest tests/test_auth_endpoint.pytest_auth_endpoint.py- Testa o registro (
/signup) validando a criação do usuário, hash de senhas e retorno de token de acesso. - Testa a autenticação (
/auth/token) verificando credenciais válidas, inválidas e a emissão do JWT. - Testa a atualização de perfil (
PUT /profile), garantindo que o cabeçalho de autorização (Authorization: Bearer) funciona via a nova fixtureauthenticated_async_client. - Recuperação de Senha: Testa a solicitação de token (
/forgot-password) e a redefinição de senha (/reset-password). - Exclusão de Conta: Valida a funcionalidade (
DELETE /auth/account), testando se os repositórios excluem em cascata os insights, as diretrizes e a conta.
- Testa o registro (
- Fixtures de Segurança (
conftest.py):- Introduzidas novas fixtures (
test_user,authenticated_async_client) para lidar automaticamente com o ciclo de injeção de tokens JWT no contexto isolado de cada teste.
- Introduzidas novas fixtures (
test_confirm_endpoint.py- Testa a inserção direta de dados após validação do usuário.
- Verifica a busca inteligente de duplicidade (checando se o backend acusa "potential_match" quando e-mails/CPFs iguais são enviados) e valida o comportamento de ignore (
ignored_ids). - Mapeamento de Exceções: Valida se a edição de uma memória inexistente (ou apagada concorrentemente) retorna status
404 Not Foundem vez do genérico500.
test_consolidation.py- Testa a funcionalidade de "Unificar Memórias".
- Garante que o backend mescla listas de facts e triggers dentro da memória Principal e deleta as memórias Secundárias com sucesso.
test_insights_endpoint.py- Testa o funcionamento das listagens, filtros por workspace (Pessoal/Profissional) e buscas globais de memórias (
GET /insights). - Testa contagem total de memórias para o dashboard.
- Testa novos endpoints de alteração fina de gatilhos:
snoozeedelete_trigger.
- Testa o funcionamento das listagens, filtros por workspace (Pessoal/Profissional) e buscas globais de memórias (
test_process_endpoint.py- Testa o envio de arquivos e extração da IA. Usa os arquivos em
tests/test_data/(test_archive.zip,test_chat.txt,test_image.png) para simular uploads e garantir validação de MIME types.
- Testa o envio de arquivos e extração da IA. Usa os arquivos em
test_rules_endpoint.py- Verifica as operações sobre a coleção de diretrizes (
user_rules).
- Verifica as operações sobre a coleção de diretrizes (
test_onboarding_endpoint.py- Garante o fluxo de rotas HTTP do chat iterativo do onboarding (
/onboarding/starte/onboarding/message).
- Garante o fluxo de rotas HTTP do chat iterativo do onboarding (
test_gemini_client.py- Garante o funcionamento do algoritmo de Smart Scoring e resiliência (Fast-Fail, Multi-key fallback em caso de Quota Exceeded).
test_ai_processor.py- Testes isolados da lógica de processamento estruturado com o Gemini.
- Garante que lógicas de retry em falhas de JSON estrutural operem como esperado.
- Valida a aplicação de pós-processamentos rígidos (limpeza de datas expiradas em
action_triggers, remapeamento deopportunitiespara triggers, e conversão de datas raiz para facts padrão).
test_auth_service.pyetest_rule_service.py- Testam a camada de negócio disparando as exceções de domínio customizadas da aplicação (ex:
NotFoundError,ConflictError,UnauthorizedError) garantindo o isolamento da regra de negócio sem depender de instâncias do framework FastAPI.
- Testam a camada de negócio disparando as exceções de domínio customizadas da aplicação (ex:
test_chat_onboarding_service.py- Testes que validam as respostas automáticas da IA durante o Onboarding de usuário.
- Garante as transições de estado do robô, certificando de que ele entenda o perfil e conclua o onboarding corretamente (retornando a action do tipo
profile).
test_insight_repository.py- Testes estritos nas queries do MongoDB. Garante que métodos abstratos e de busca complexos (ex: find_candidates_by_identifiers) comportem-se com a máxima precisão antes mesmo de passarem pela camada de rotas.
Os testes do app validam a interface, as formatações e a lógica das regras de negócio executadas antes do disparo à API.
Para testes em dispositivos físicos, o arquivo mobile/src/services/api.ts foi configurado para apontar para o IP local da máquina de desenvolvimento (ex: http://192.168.1.73:8000/api/v1), garantindo que o app consiga se comunicar com o backend rodando no Docker.
jest: Framework base.@testing-library/react-native: Renderiza os componentes e simula toques e eventos textuais.
No terminal da sua máquina (dentro da pasta mobile):
# Limpar cache do Jest (útil se encontrar erros de "Element type is invalid")
npm test -- --clearCache
# Rodar toda a suíte
npm test
# Rodar testes de um arquivo específico (Regex)
npm test -- AuthScreenApp.test.tsx(Root)- Testa a inicialização do app, carregamento de sessão e navegação básica.
- Verifica a correta integração com os novos hooks refatorados (
useAuthSession,usePushNotifications,useDeepLinking). - Utiliza
act()para garantir que atualizações de estado assíncronas sejam processadas.
AuthScreen.test.tsx(Autenticação)- Testa renderização dos formulários, validação de campos obrigatórios vazios e alternância de telas (modo Cadastro vs Login).
- Mocka o
api.postgarantindo o envio correto do payload ao backend.
ConfirmScreen.test.tsx(Confirmação de Memórias)- Valida a exibição inicial dos dados processados (fatos e gatilhos).
- Cobre fluxos de adição/remoção e reordenação de fatos.
- Verifica a emissão de erros de validação (título vazio, falta de detalhes, datas inválidas/passadas).
- Garante o fluxo de unificação de memórias (do botão "Revisar e Unificar" à função de consolidação).
- Verifica ações de erro (incluindo falhas de conexão/offline) ao forçar a criação ou salvar registros regulares.
OnboardingChatScreen.test.tsx(Chat de Onboarding)- Testa o fluxo da IA guiando o usuário passo a passo.
- Valida estado de carregamento durante conversas demoradas e o redirecionamento final para aprovação de perfil.
ProfileReviewScreen.test.tsx(Revisão de Perfil)- Testa validações restritas de negócios: "Nome" exige 3+ palavras; "Email ou Telefone" precisam ser um contato com formato válido.
- Testa a diferença de renderização entre os modos de Inclusão (
/signup) e Edição (/profile).
UploadScreen.test.tsx(Upload)- Testa interações da interface (seleção de imagem, texto colado).
- Garante que a UI não trave durante os estados de carregamento da requisição
multipart/form-data.
HomeScreen.test.tsx(Dashboard)- Valida renderização dos cards ricos de insights, expansão de listas e exibição do alerta informativo para insights com datas expiradas.
- Testa entrada no Modo de Seleção (para unificar memórias).
- Preservação de Filtro: Valida se o termo de busca é mantido ao navegar entre telas.
- Mocks de Tempo e Background Tasks: Emprega
jest.useFakeTimers()para validar o comportamento acelerado do "quick snooze".
RulesScreen.test.tsx(Gestão de Regras)- Valida a listagem do CRUD, adição/exclusão de regras e exibe modal de confirmação para prevenir o abandono de dados não salvos no formulário.
SideMenu.test.tsxeWorkspaceSelector.test.tsx- Testam os menus laterais e seletor de contextos globais (Personal/Professional), assegurando sua visualização e ativação.
FeedbackModal.test.tsx- Testa a renderização correta de títulos, botões e tipos (erro, sucesso, alerta) deste modal global de comunicação.
api.test.ts(Network)- Mocka a instância do Axios para garantir que a interceptação de chamadas atue conforme o planejado no cliente HTTP global, enriquecendo erros genéricos de rede (Network Error) com mensagens amigáveis ("Servidor Offline").
Para evitar erros de import cíclico, o FeedbackModal não deve ser importado individualmente por cada tela.
- Solução: O modal é declarado no
App.tsxe as telas recebem a funçãoshowModalviaprops. - Nos Testes: Injetamos um mock
jest.fn()para validar se o modal seria aberto sem precisar renderizá-lo.
Componentes nativos não renderizam no Jest (Node.js).
- Configuração: Mockado globalmente no
mobile/jest.setup.js. - Comportamento: O mock renderiza um componente
Textcontendo o nome do ícone.
O módulo de push local causa quebras imediatas no Node.
- Configuração: Integrado no
mobile/jest.setup.js, providenciando stubs nativos para os métodos estáticos e mockando as constantes enumeradas.
Para facilitar testes manuais, auditorias e demonstrações sem consumir cotas da IA ou exigir arquivos reais, o aplicativo possui um "Modo Mock" escondido.
- Como Ativar/Desativar: Toque 7 vezes rápidas na logo do aplicativo no cabeçalho (Header).
- Funcionamento (Frontend): Ativa a flag
isMockModenauseDebugStore(persistida via AsyncStorage) e anexa o cabeçalhoX-Mock-Mode: trueem todas as requisições da API. Também burla o bloqueio de "data do dispositivo incorreta" noTimeService, permitindo testes de "viagem no tempo" com alarmes no passado. - Funcionamento (Backend): Através de Injeção de Dependências no FastAPI, o cabeçalho é interceptado. Se presente, os serviços de produção (Gemini) são substituídos por
MockServicesque devolvem respostas estáticas instantâneas, garantindo a execução do fluxo completo (UI) sem gastar cotas ou alterar o código de produção.
- Backend: Limpe o banco antes do teste para evitar vazamento de estado. O método
await db.collection.delete_many({})é o padrão nos testes atuais. - Frontend (React Native):
- O Jest falhará na compilação se uma nova dependência nativa for instalada sem mock correspondente.
- Envolva simulações que atualizam estado em
await act(async () => { ... }). - Use
waitForpara aguardar o desaparecimento de loaders antes de procurar elementos da interface final.