Feature/refatoramento monorepo#11
Conversation
Added demo images to showcase the bot's functionality.
Add demo section with images to README
… workspaces - Updated package.json to define a monorepo structure with workspaces for frontend and backend. - Removed obsolete files related to job scraping and exporting functionalities. - Deleted configuration, logger, and server files as part of the refactor. - Removed tests associated with the deleted functionalities. - Introduced new scripts for concurrent development of frontend and backend.
…components - Created unit tests for backend services, including app, browser, exporter, and linkedinScraper. - Added tests for utility functions and configuration handling. - Implemented integration tests for frontend hooks and components, ensuring proper functionality and state management. - Established Vitest configuration for both backend and frontend, including coverage thresholds. - Introduced mock implementations for external dependencies to isolate tests.
There was a problem hiding this comment.
Pull request overview
Refatora o projeto para um monorepo com workspaces frontend e backend, atualizando scripts, Docker/Compose e CI, e adicionando configuração de testes/coverage + uma suíte inicial de testes unitários/integrados.
Changes:
- Migração do
package.jsonraiz para workspaces (scripts de dev/build/test/coverage centralizados) e ajustes no CI para rodar coverage por workspace. - Separação de configuração do Vitest por workspace (
frontend/vitest.config.jsebackend/vitest.config.js) e adição de testes para hooks/serviços/componentes (frontend) e utilitários/serviços/API (backend). - Ajustes de Docker/Compose para build por pasta (
./frontend,./backend) e mudança do serviçoapiparabackend.
Reviewed changes
Copilot reviewed 35 out of 50 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| vitest.config.js | Remove configuração global do Vitest (agora por workspace). |
| package.json | Converte para raiz de monorepo (workspaces + scripts agregadores). |
| frontend/vitest.config.js | Configura Vitest do frontend (jsdom, setup, coverage, alias). |
| frontend/tsconfig.json | Inclui tipos e pasta de testes no TS. |
| frontend/tests/** | Adiciona testes unitários/integrados para hooks, services e componentes. |
| frontend/tests/setup.js | Setup do jest-dom para Vitest no frontend. |
| frontend/package.json | Adiciona scripts e deps de test/coverage no frontend. |
| frontend/Dockerfile | Ajusta COPY para build com context ./frontend. |
| docker-compose.yml | Ajusta serviços para backend/frontend com contexts separados e remove scraper dedicado. |
| backend/vitest.config.js | Configura Vitest do backend (node + coverage thresholds). |
| backend/tests/** | Adiciona/atualiza testes unitários e integrados do backend. |
| backend/src/jobsApiApp.js | Garante criação do diretório de output na listagem de arquivos. |
| backend/package.json | Cria package do backend com scripts/deps próprios. |
| TESTING.md | Documenta estratégia de testes e comandos do monorepo. |
| README.md | Atualiza documentação para estrutura monorepo e novos comandos. |
| .github/workflows/ci.yml | Troca pipeline para rodar coverage por workspace + lint/build do frontend. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| it("nao permite pagina menor que 1", () => { | ||
| const { result } = renderHook(() => useJobsPagination({ filteredJobs: JOBS, initialPageSize: 2 })); | ||
| result.current.setCurrentPage(0); | ||
| expect(result.current.currentPage).toBe(1); | ||
| }); |
There was a problem hiding this comment.
Atualizações de estado disparadas por hooks (ex.: setCurrentPage) devem ser envolvidas por act(...) (ou então aguardar re-render com waitFor) para garantir que o estado tenha sido aplicado antes do assert. Do jeito atual, o teste pode ficar intermitente ou falhar em ambientes/versões diferentes do React/testing-library.
|
|
||
| describe("jobsService", () => { | ||
| afterEach(() => { | ||
| vi.restoreAllMocks(); |
There was a problem hiding this comment.
vi.restoreAllMocks() não reverte necessariamente vi.stubGlobal(...). Como estes testes fazem vi.stubGlobal('fetch', ...), o stub pode vazar para outros arquivos de teste. Sugestão: no afterEach, também chamar vi.unstubAllGlobals() (ou garantir que fetch seja restaurado explicitamente) para isolar os testes.
| vi.restoreAllMocks(); | |
| vi.restoreAllMocks(); | |
| vi.unstubAllGlobals(); |
| import cors from "cors"; | ||
| import express from "express"; | ||
| import { existsSync, readdirSync, statSync } from "fs"; | ||
| import { existsSync, mkdirSync, readdirSync, statSync } from "fs"; |
There was a problem hiding this comment.
Depois de mkdirSync(outputDir, { recursive: true }), o existsSync(outputDir) tende a ser redundante (se mkdirSync falhar, vai lançar e cair no catch do handler). Além disso, mkdirSync é executado a cada request que chama listXlsxFiles(). Recomendações: (1) inverter a ordem para checar existsSync antes e só então criar; ou (2) mover a criação do diretório para a inicialização do app (fora do caminho quente de request), mantendo o fluxo mais eficiente e claro.
| app.use(cors()); | ||
|
|
||
| function listXlsxFiles() { | ||
| // Garante que a pasta exista tambem no primeiro boot em ambiente Docker. | ||
| mkdirSync(outputDir, { recursive: true }); | ||
|
|
There was a problem hiding this comment.
Depois de mkdirSync(outputDir, { recursive: true }), o existsSync(outputDir) tende a ser redundante (se mkdirSync falhar, vai lançar e cair no catch do handler). Além disso, mkdirSync é executado a cada request que chama listXlsxFiles(). Recomendações: (1) inverter a ordem para checar existsSync antes e só então criar; ou (2) mover a criação do diretório para a inicialização do app (fora do caminho quente de request), mantendo o fluxo mais eficiente e claro.
| app.use(cors()); | |
| function listXlsxFiles() { | |
| // Garante que a pasta exista tambem no primeiro boot em ambiente Docker. | |
| mkdirSync(outputDir, { recursive: true }); | |
| // Garante que a pasta exista tambem no primeiro boot em ambiente Docker. | |
| mkdirSync(outputDir, { recursive: true }); | |
| app.use(cors()); | |
| function listXlsxFiles() { |
| beforeEach(() => { | ||
| vi.resetModules(); | ||
| vi.clearAllMocks(); | ||
| process.env.PORT = "3100"; | ||
| vi.spyOn(console, "log").mockImplementation(mocks.consoleLog); | ||
| }); |
There was a problem hiding this comment.
O console.log é espionado e mockado em beforeEach, mas não há afterEach restaurando (mockRestore/vi.restoreAllMocks). Isso pode vazar para outros testes e também tornar o segundo spyOn na mesma função frágil dependendo do runner. Sugestão: adicionar afterEach(() => vi.restoreAllMocks()) (ou restaurar apenas o spy do console) para garantir isolamento.
| const created = []; | ||
|
|
||
| afterEach(() => { | ||
| created.length = 0; | ||
| }); |
There was a problem hiding this comment.
O array created é populado, mas o afterEach apenas zera a lista e não remove os arquivos/diretórios temporários criados com mkdtempSync. Isso pode poluir o ambiente de execução local/CI com lixo em /tmp. Sugestão: remover created se não for necessário, ou usá-lo para fazer cleanup real (remover arquivos e/ou o diretório temporário) no afterEach.
No description provided.