From 8e00161a7521b245b85625b66d614443a1638916 Mon Sep 17 00:00:00 2001 From: Anilzer Date: Mon, 29 Jun 2026 18:00:25 +0200 Subject: [PATCH] fix bug des tests --- backend/jest.config.js | 2 +- backend/package-lock.json | 31 +++++++-- backend/tests/e2e.flow.test.js | 113 +++++++++++++++++++++++++-------- backend/tests/setup.js | 21 +++++- 4 files changed, 135 insertions(+), 32 deletions(-) diff --git a/backend/jest.config.js b/backend/jest.config.js index 951ecda..5296fb1 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -22,5 +22,5 @@ module.exports = { testPathIgnorePatterns: ["/node_modules/"], // Configuration pour Jest avec Supertest - setupFilesAfterEnv: ["/tests/setup.js"] + //setupFilesAfterEnv: ["/tests/setup.js"] }; \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 42a99ff..40a1584 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -108,7 +108,6 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -604,6 +603,31 @@ "dev": true, "license": "MIT" }, + "node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -611,6 +635,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -1962,7 +1987,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2281,7 +2305,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -3148,7 +3171,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -5872,7 +5894,6 @@ "integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/config": "6.19.3", "@prisma/engines": "6.19.3" diff --git a/backend/tests/e2e.flow.test.js b/backend/tests/e2e.flow.test.js index 960cf4e..fd0b741 100644 --- a/backend/tests/e2e.flow.test.js +++ b/backend/tests/e2e.flow.test.js @@ -1,15 +1,35 @@ const request = require("supertest"); const app = require("../src/app"); +const prisma = require("../src/config/prisma"); + +// ------------------------ +// Mock du mailer pour éviter envoi réel +// ------------------------ +jest.mock("../src/config/mailer", () => ({ + sendMail: jest.fn().mockResolvedValue(true), +})); + +// ------------------------ +// Réinitialisation DB avant tests +// ------------------------ +beforeAll(async () => { + await prisma.claim.deleteMany(); + await prisma.participation.deleteMany(); + await prisma.ticket.deleteMany(); + await prisma.user.deleteMany(); +}); + +afterAll(async () => { + await prisma.$disconnect(); +}); describe("THE TIP TOP - FULL E2E FLOW", () => { - let token; let ticketCode = "ABC123"; + // ------------------------ // 1. REGISTER // ------------------------ - - // Test de l'inscription d'un utilisateur test("Register user", async () => { const res = await request(app) .post("/api/auth/register") @@ -17,73 +37,116 @@ describe("THE TIP TOP - FULL E2E FLOW", () => { firstname: "Test", lastname: "User", email: "test@test.com", - password: "Password123" + password: "Password123", }); - // Vérification du code de statut attendu (201 pour succès, 409 si l'utilisateur existe déjà) expect([201, 409]).toContain(res.statusCode); }); // ------------------------ // 2. LOGIN // ------------------------ - // Test de la connexion d'un utilisateur test("Login user", async () => { + // Validation du user pour bypasser vérification email + await prisma.user.update({ + where: { email: "test@test.com" }, + data: { isEmailVerified: true }, + }); + const res = await request(app) .post("/api/auth/login") .send({ email: "test@test.com", - password: "Password123" + password: "Password123", }); - // Vérification du code de statut attendu (200 pour succès) expect(res.statusCode).toBe(200); expect(res.body.token).toBeDefined(); - token = res.body.token; }); // ------------------------ // 3. PARTICIPATE GAME // ------------------------ - // Test de la participation à un jeu test("Participate to game", async () => { const res = await request(app) .post("/api/game/participate") .set("Authorization", `Bearer ${token}`) .send({ code: ticketCode }); - // Vérification du code de statut attendu expect([200, 201, 404, 409, 400]).toContain(res.statusCode); + console.log("Ticket in DB before participate:", ticketCode); }); // ------------------------ // 4. MY GAINS // ------------------------ - // Test de la récupération des gains d'un utilisateur - test("Get my gains", async () => { const res = await request(app) .get("/api/game/my-gains") .set("Authorization", `Bearer ${token}`); - // Vérification du code de statut attendu + expect(res.statusCode).toBe(200); + expect(res.body.gains).toBeDefined(); + }); + + // ------------------------ + // 3. GENERER UN TICKET + // ------------------------ + test("Create a ticket for testing", async () => { + const lot = await prisma.lot.create({ + data: { + name: "Lot Test", + description: "Lot pour test E2E", + value: 10, + percentage: 100 + }, + }); + + const ticket = await prisma.ticket.create({ + data: { + code: ticketCode, + lotId: lot.id + } + }); + + expect(ticket).toBeDefined(); + expect(ticket.code).toBe(ticketCode); + }); + + // ------------------------ + // 4. PARTICIPATE GAME + // ------------------------ + test("Participate to game", async () => { + const res = await request(app) + .post("/api/game/participate") + .set("Authorization", `Bearer ${token}`) + .send({ code: ticketCode }); + + expect([200, 201, 404, 409, 400]).toContain(res.statusCode); + }); + + // ------------------------ + // 5. MY GAINS + // ------------------------ + test("Get my gains", async () => { + const res = await request(app) + .get("/api/game/my-gains") + .set("Authorization", `Bearer ${token}`); + expect(res.statusCode).toBe(200); expect(res.body.gains).toBeDefined(); }); // ------------------------ - // 5. ADMIN STATS + // 6. ADMIN STATS (CLIENT access denied) // ------------------------ test("Admin stats - CLIENT access denied", async () => { - const res = await request(app) - .get("/api/admin/stats") - .set("Authorization", `Bearer ${token}`); + const res = await request(app) + .get("/api/admin/stats") + .set("Authorization", `Bearer ${token}`); - expect(res.statusCode).toBe(403); - expect(res.body.message || res.body).toBeDefined(); -}); - -}); - -// Nous avons validé un flux E2E complet garantissant le bon fonctionnement global du système. La couverture actuelle est partielle et peut être enrichie pour couvrir les cas limites et les erreurs métier. \ No newline at end of file + expect(res.statusCode).toBe(403); + expect(res.body.message || res.body).toBeDefined(); + }); +}); \ No newline at end of file diff --git a/backend/tests/setup.js b/backend/tests/setup.js index 0e167a5..0f5b280 100644 --- a/backend/tests/setup.js +++ b/backend/tests/setup.js @@ -5,8 +5,27 @@ beforeAll(async () => { await prisma.participation.deleteMany(); await prisma.ticket.deleteMany(); await prisma.user.deleteMany(); + + // Création de lots + await prisma.lot.createMany({ + data: [ + { name: "Infuseur", value: 10, percentage: 60, description: "Infuseur à thé" }, + { name: "Thé Détox", value: 15, percentage: 20, description: "Thé détox bio" }, + { name: "Thé Signature", value: 20, percentage: 10, description: "Thé signature" }, + { name: "Coffret 39€", value: 39, percentage: 6, description: "Coffret découverte" }, + { name: "Coffret 69€", value: 69, percentage: 4, description: "Coffret premium" }, + ] + }); + + // Création d'un ticket + await prisma.ticket.create({ + data: { + code: "ABC123", + lotId: 1 + } + }); }); afterAll(async () => { await prisma.$disconnect(); -}); \ No newline at end of file +});