Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ Estado atual, próximas fases e visão de longo prazo do projeto.
| **Hamburger menu (mobile)** — header limpo com alerta urgência + bottom sheet de ações | ✅ |
| **Mobile Pipeline compacto** — busca + sort inline, chips menores, mais espaço para cards | ✅ |
| **Desktop hover actions** — arquivar/deletar aparecem ao hover no card sem precisar clicar+segurar | ✅ |
| Suite de testes — 255 testes (unit + component + integration), CI bloqueia build em falha | ✅ |
| Suite de testes — 187 testes (unit + component + integration), CI bloqueia build em falha | ✅ |
| `.env.example` com todas as variáveis documentadas | ✅ |

### Infraestrutura
Expand Down Expand Up @@ -272,3 +272,7 @@ Em produção Componentizado IA Avançada Plataforma
| `VagaTab` — dados da vaga + próxima etapa com auto-stage + notas, substituindo OverviewTab | ✅ |
| Cards compactos sem preview de nota | ✅ |
| Arquivos obsoletos removidos (TimelineTab, AITab, OverviewTab, MessagesTab) | ✅ |
| **VagaTab accordion** — cards Próxima etapa / Dados da vaga / Anotações com padrão visual uniforme e abre/fecha | ✅ |
| **InlineTags compact** — input "+ tag" compacto e centralizado, sem corte no mobile | ✅ |
| **Desktop hover actions** — botão arquivar/deletar aparece no hover do card, sem sobreposição no Badge | ✅ |
| **Remoção de código morto** — NewProcessModal, ImportModal, ImportChatGPTModal, RecruiterMessageModal, importHelpers, isUrgent (-1847 linhas) | ✅ |
33 changes: 18 additions & 15 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

## 1. Estado atual

**255 testes passando. Zero falhas.**
**187 testes passando. Zero falhas.**

| Camada | Arquivos | Testes |
|---|---|---|
| Unit | 9 arquivos | ~197 |
| Component | 6 arquivos | ~58 |
| Integration | 1 arquivo | |
| **Total** | **17 arquivos** | **255** |
| Unit | 7 arquivos | ~155 |
| Component | 7 arquivos | ~22 |
| Integration | 1 arquivo | ~10 |
| **Total** | **15 arquivos** | **187** |

**CI:** `npm run test:run` executa antes de `npm run build` em todo PR e push para `main`. Build só acontece se todos os testes passarem.

Expand All @@ -34,29 +34,31 @@
```
src/__tests__/
├── unit/
│ ├── buildPrompt.test.js # buildCVPrompt — montagem de prompt de adaptação de CV
│ ├── channel.test.js # CONTACT_CHANNELS — valores e ícones
│ ├── constants.test.js # STAGE, ACTIVE_STAGES, CHANNELS, SCENARIOS
│ ├── dateUtils.test.js # fmtDate, daysDiff — formatação e diff de datas
│ ├── edgeFunction.test.js # anthropic-proxy — rate limit, CORS, validação de payload
│ ├── buildPrompt.test.js # buildCVPrompt — montagem de prompt de adaptação de CV
│ ├── channel.test.js # CONTACT_CHANNELS — valores e ícones
│ ├── constants.test.js # STAGE, ACTIVE_STAGES, CHANNELS, SCENARIOS
│ ├── dateUtils.test.js # fmtDate, daysDiff — formatação e diff de datas
│ ├── edgeFunction.test.js # anthropic-proxy — rate limit, CORS, validação de payload
│ ├── extractTextFromPdf.test.js # extractTextFromPdf — extração de texto de PDFs
│ ├── filterProcesses.test.js # filterProcesses — busca e filtro por stage
│ ├── importHelpers.test.js # parseCSV, normalizeProcess, detectFormat
│ ├── sort.test.js # sortProcesses — urgência, empresa, stage, recente
│ └── supabase.test.js # rowToProcess, processToRow — mapeadores snake_case ↔ camelCase
│ ├── filterProcesses.test.js # filterProcesses — busca e filtro por stage
│ ├── sort.test.js # sortProcesses — urgência, empresa, stage, recente
│ └── supabase.test.js # rowToProcess, processToRow — mapeadores snake_case ↔ camelCase
├── components/
│ ├── CVTab.test.jsx # CVTab — fluxo 4 etapas (input → analyzing → review → result)
│ ├── InlineTags.test.jsx # InlineTags — adicionar, remover, tecla Enter/Escape
│ ├── ProcessCard.test.jsx # ProcessCard — render, urgência, swipe mobile, ações
│ ├── ProfileSetupModal.test.jsx # ProfileSetupModal — abas, salvar, upload PDF
│ ├── RecruiterMessageModal.test.jsx # RecruiterMessageModal — fluxo 3 etapas
│ └── ResumesModal.test.jsx # ResumesModal — listagem, criar, editar, excluir
└── integration/
└── resumes.test.js # useResumes hook — CRUD completo com Supabase mockado (MSW)
```

**Removidos nesta sessão:**
- `importHelpers.test.js` — removido junto com `importHelpers.js` (código morto)
- `RecruiterMessageModal.test.jsx` — removido junto com `RecruiterMessageModal.jsx` (código morto)

---

## 4. Regra: testes com toda nova funcionalidade
Expand Down Expand Up @@ -164,5 +166,6 @@ Todo push para `main` e todo PR disparam esse pipeline. O deploy na Vercel só a

| Data | Testes | Falhas | Observação |
|---|---|---|---|
| 2026-06-07 | 187 | 0 | Remoção de código morto: ImportModal, ImportChatGPTModal, NewProcessModal, RecruiterMessageModal, importHelpers, isUrgent; VagaTab accordion; InlineTags compact |
| 2026-05-30 | 253 | 0 | Correção: constants.test (ACTIVE_STAGES 4 itens), ProfileSetupModal (mock extractTextFromPdf, label aba "CV") |
| Sessão anterior | 252 | 8 | ACTIVE_STAGES esperava 5 itens; ProfileSetupModal mockava pdfjs diretamente (não funcionava com lazy import) |
Binary file added public/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
218 changes: 0 additions & 218 deletions src/__tests__/components/RecruiterMessageModal.test.jsx

This file was deleted.

20 changes: 1 addition & 19 deletions src/__tests__/unit/dateUtils.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { fmtDate, daysDiff, isUrgent } from "../../utils/dateUtils.js";
import { fmtDate, daysDiff } from "../../utils/dateUtils.js";

describe("fmtDate", () => {
it("formata data válida em pt-BR", () => {
Expand Down Expand Up @@ -68,21 +68,3 @@ describe("daysDiff", () => {
expect(daysDiff("2026-06-20")).toBeGreaterThan(0);
});
});

describe("isUrgent", () => {
beforeEach(() => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-05-20T12:00:00"));
});

afterEach(() => {
vi.useRealTimers();
});

it("null não é urgente", () => expect(isUrgent(null)).toBe(false));
it("hoje (diff=0) é urgente", () => expect(isUrgent("2026-05-20")).toBe(true));
it("amanhã (diff=1) é urgente", () => expect(isUrgent("2026-05-21")).toBe(true));
it("depois de amanhã (diff=2) é urgente", () => expect(isUrgent("2026-05-22")).toBe(true));
it("3 dias (diff=3) não é urgente", () => expect(isUrgent("2026-05-23")).toBe(false));
it("ontem (diff=-1) não é urgente", () => expect(isUrgent("2026-05-19")).toBe(false));
});
Loading
Loading