targo-backend/test/shifts.e2e-spec.ts

122 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import * as request from 'supertest';
import { INestApplication } from '@nestjs/common';
import { createApp } from './utils/testing-app';
import { PrismaService } from 'src/prisma/prisma.service';
import { makeShift, makeInvalidShift } from './factories/shift.factory';
const BASE = '/shifts';
describe('Shifts (e2e) — autonome', () => {
let app: INestApplication;
let prisma: PrismaService;
let createdId: number | null = null;
// FKs existants
let tsId: number; // any timesheet
let bcShiftId: number; // any bank code with categorie='SHIFT'
beforeAll(async () => {
app = await createApp();
prisma = app.get(PrismaService);
// récupère un timesheet existant
const ts = await prisma.timesheets.findFirst({ select: { id: true } });
if (!ts) throw new Error('No timesheet found — seed timesheets first.');
tsId = ts.id;
// récupère un bank code SHIFT (ta seed utilise 'SHIFT' en MAJ)
const bc = await prisma.bankCodes.findFirst({
where: { categorie: 'SHIFT' },
select: { id: true },
});
if (!bc) throw new Error('No SHIFT bank code found — seed bank codes first.');
bcShiftId = bc.id;
});
afterAll(async () => {
if (createdId) {
try {
await prisma.shifts.delete({ where: { id: createdId } });
} catch {}
}
await app.close();
await prisma.$disconnect();
});
it(`POST ${BASE} (valid) → 201 puis GET /:id → 200`, async () => {
const payload = makeShift(tsId, bcShiftId);
const createRes = await request(app.getHttpServer())
.post(BASE)
.send(payload);
if (createRes.status !== 201) {
console.log('Create error:', createRes.body || createRes.text);
}
expect(createRes.status).toBe(201);
expect(createRes.body).toEqual(
expect.objectContaining({
id: expect.any(Number),
timesheet_id: tsId,
bank_code_id: bcShiftId,
})
);
createdId = createRes.body.id;
const getRes = await request(app.getHttpServer()).get(`${BASE}/${createdId}`);
expect(getRes.status).toBe(200);
expect(getRes.body).toEqual(expect.objectContaining({ id: createdId }));
});
it(`PATCH ${BASE}/:id → 200 (description mise à jour)`, async () => {
if (!createdId) {
const created = await request(app.getHttpServer())
.post(BASE)
.send(makeShift(tsId, bcShiftId));
expect(created.status).toBe(201);
createdId = created.body.id;
}
const patchRes = await request(app.getHttpServer())
.patch(`${BASE}/${createdId}`)
.send({ description: 'Updated shift description' });
expect([200, 204]).toContain(patchRes.status);
const getRes = await request(app.getHttpServer()).get(`${BASE}/${createdId}`);
expect(getRes.status).toBe(200);
// on tolère labsence, mais si elle est là, on vérifie la valeur.
if (getRes.body?.description !== undefined) {
expect(getRes.body.description).toBe('Updated shift description');
}
});
it(`GET ${BASE}/999999 (not found) → 404/400`, async () => {
const res = await request(app.getHttpServer()).get(`${BASE}/999999`);
expect([404, 400]).toContain(res.status);
});
it(`POST ${BASE} (invalid payload) → 400`, async () => {
const res = await request(app.getHttpServer())
.post(BASE)
.send(makeInvalidShift());
expect(res.status).toBeGreaterThanOrEqual(400);
expect(res.status).toBeLessThan(500);
});
it(`DELETE ${BASE}/:id → 200/204`, async () => {
let id = createdId;
if (!id) {
const created = await request(app.getHttpServer())
.post(BASE)
.send(makeShift(tsId, bcShiftId));
expect(created.status).toBe(201);
id = created.body.id;
}
const del = await request(app.getHttpServer()).delete(`${BASE}/${id}`);
expect([200, 204]).toContain(del.status);
if (createdId === id) createdId = null;
});
});