Skip to content

Latest commit

 

History

History
207 lines (161 loc) · 14.5 KB

Testes.md

File metadata and controls

207 lines (161 loc) · 14.5 KB

Documentação de Testes - InsightPop

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).

🗂️ Índice


🎯 Estratégia de 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.


🐍 Testes do Backend (Python / FastAPI)

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.

Tecnologias Utilizadas

  • pytest: Framework principal para execução.
  • pytest-asyncio: Para testar código assíncrono (Endpoints FastAPI e queries do MongoDB).
  • httpx: Utilizado via AsyncClient para fazer requisições HTTP simuladas na aplicação.
  • mock: Para interceptar e simular chamadas externas (ex: Google Gemini API).

Como Executar os Testes do Backend

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 .env vá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.py

Suítes de Endpoint (Integração)

  • test_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 fixture authenticated_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.
  • 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.
  • 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 Found em vez do genérico 500.
  • 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: snooze e delete_trigger.
  • 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.
  • test_rules_endpoint.py
    • Verifica as operações sobre a coleção de diretrizes (user_rules).
  • test_onboarding_endpoint.py
    • Garante o fluxo de rotas HTTP do chat iterativo do onboarding (/onboarding/start e /onboarding/message).

Suítes de Serviços e Regras de Negócio

  • 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 de opportunities para triggers, e conversão de datas raiz para facts padrão).
  • test_auth_service.py e test_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.
  • 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).

Suítes de Repositório (Acesso a Dados)

  • 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.

📱 Testes do Mobile (React Native)

Os testes do app validam a interface, as formatações e a lógica das regras de negócio executadas antes do disparo à API.

Configuração de Rede (Desenvolvimento)

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.

Tecnologias Utilizadas

  • jest: Framework base.
  • @testing-library/react-native: Renderiza os componentes e simula toques e eventos textuais.

Como Executar os Testes do Frontend

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 -- AuthScreen

Testes de Telas (Screens)

  • App.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.post garantindo 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.

Testes de Componentes e Serviços

  • SideMenu.test.tsx e WorkspaceSelector.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").

🛠️ Resolução de Problemas & Infraestrutura

1. Dependência Circular (Modal Global)

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.tsx e as telas recebem a função showModal via props.
  • Nos Testes: Injetamos um mock jest.fn() para validar se o modal seria aberto sem precisar renderizá-lo.

2. Mock de Ícones (react-native-vector-icons)

Componentes nativos não renderizam no Jest (Node.js).

  • Configuração: Mockado globalmente no mobile/jest.setup.js.
  • Comportamento: O mock renderiza um componente Text contendo o nome do ícone.

3. Mock de Notificações (@notifee/react-native)

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.

4. Developer Mock Mode (Hack de Apresentação)

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 isMockMode na useDebugStore (persistida via AsyncStorage) e anexa o cabeçalho X-Mock-Mode: true em todas as requisições da API. Também burla o bloqueio de "data do dispositivo incorreta" no TimeService, 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 MockServices que 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.

📝 Boas Práticas ao Criar Novos Testes

  1. 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.
  2. 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 waitFor para aguardar o desaparecimento de loaders antes de procurar elementos da interface final.