Skip to content
Open
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
112 changes: 112 additions & 0 deletions backend/src/tests/tests-iniciales.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import type { Request, Response } from 'express';

describe('Creación de candidatos - recepción de datos', () => {
beforeEach(() => {
jest.resetModules();
jest.clearAllMocks();
});

test('debe recibir los datos del candidato y responder 201 cuando se crea correctamente', async () => {
const candidateData = {
firstName: 'Alejandro',
lastName: 'Nicolaide',
email: 'alejandro@example.com',
phone: '612345678',
address: 'Córdoba',
};

const savedCandidate = {
id: 1,
...candidateData,
};

const addCandidateMock = jest.fn().mockResolvedValue(savedCandidate);

jest.doMock('../application/services/candidateService', () => ({
addCandidate: addCandidateMock,
}));

const { addCandidateController } = require(
'../presentation/controllers/candidateController'
);

const req = {
body: candidateData,
} as Request;

const res = {
status: jest.fn().mockReturnThis(),
json: jest.fn(),
} as unknown as Response;

await addCandidateController(req, res);

expect(addCandidateMock).toHaveBeenCalledTimes(1);
expect(addCandidateMock).toHaveBeenCalledWith(candidateData);
expect(res.status).toHaveBeenCalledWith(201);

expect(res.json).toHaveBeenCalledWith({
message: 'Candidate added successfully',
data: savedCandidate,
});
});
});

describe('Creación de candidatos - guardado', () => {
beforeEach(() => {
jest.resetModules();
jest.clearAllMocks();
});

test('debe guardar un candidato válido y devolver el candidato guardado', async () => {
const candidateData = {
firstName: 'Alejandro',
lastName: 'Nicolaide',
email: 'alejandro@example.com',
phone: '612345678',
address: 'Córdoba',
};

const savedCandidate = {
id: 1,
...candidateData,
};

const saveMock = jest.fn().mockResolvedValue(savedCandidate);

const CandidateMock = jest.fn().mockImplementation(() => ({
save: saveMock,
education: [],
workExperience: [],
resumes: [],
}));

jest.doMock('../domain/models/Candidate', () => ({
Candidate: CandidateMock,
}));

jest.doMock('../domain/models/Education', () => ({
Education: jest.fn(),
}));

jest.doMock('../domain/models/WorkExperience', () => ({
WorkExperience: jest.fn(),
}));

jest.doMock('../domain/models/Resume', () => ({
Resume: jest.fn(),
}));

jest.dontMock('../application/services/candidateService');

const { addCandidate } = require(
'../application/services/candidateService'
);

const result = await addCandidate(candidateData);

expect(CandidateMock).toHaveBeenCalledWith(candidateData);
expect(saveMock).toHaveBeenCalledTimes(1);
expect(result).toEqual(savedCandidate);
});
});
43 changes: 43 additions & 0 deletions prompts/prompts-iniciales.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Prompts iniciales

## Prompt 1 - Identificación de casos de prueba

Analiza la funcionalidad de creación de candidatos del proyecto y propone una suite mínima de tests unitarios con Jest.

Debes cubrir al menos dos familias:
1. Recepción de los datos enviados al controller.
2. Guardado del candidato mediante el servicio.

Ten en cuenta la estructura actual del proyecto y evita modificar código productivo salvo que sea estrictamente necesario.

## Prompt 2 - Test de recepción de datos

Genera un test unitario en Jest para `addCandidateController`.

El test debe:
- simular un `Request` de Express con datos válidos de candidato en `req.body`;
- mockear el servicio `addCandidate`;
- comprobar que el servicio recibe exactamente los datos del request;
- comprobar que el controller responde con código HTTP 201;
- comprobar la respuesta JSON esperada.

## Prompt 3 - Test de guardado

Genera un test unitario en Jest para la función `addCandidate`.

El test debe:
- utilizar datos válidos de candidato;
- evitar cualquier acceso real a base de datos;
- mockear los modelos `Candidate`, `Education`, `WorkExperience` y `Resume` cuando sea necesario;
- comprobar que el método `save` del candidato se ejecuta;
- comprobar que la función devuelve el candidato guardado.

## Ajustes manuales realizados

La primera aproximación al test de guardado importaba directamente `Candidate.ts`, lo que provocó errores de compilación relacionados con Prisma.

Se modificó el enfoque para mockear los modelos antes de cargar `candidateService`, evitando inicializar Prisma y manteniendo el test aislado de la base de datos.

También se verificó que ambos tests pasaran correctamente con:

`npm test -- tests-iniciales.test.ts`