fix bug des tests
This commit is contained in:
@@ -22,5 +22,5 @@ module.exports = {
|
|||||||
testPathIgnorePatterns: ["/node_modules/"],
|
testPathIgnorePatterns: ["/node_modules/"],
|
||||||
|
|
||||||
// Configuration pour Jest avec Supertest
|
// Configuration pour Jest avec Supertest
|
||||||
setupFilesAfterEnv: ["<rootDir>/tests/setup.js"]
|
//setupFilesAfterEnv: ["<rootDir>/tests/setup.js"]
|
||||||
};
|
};
|
||||||
31
backend/package-lock.json
generated
31
backend/package-lock.json
generated
@@ -108,7 +108,6 @@
|
|||||||
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
"integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.29.7",
|
"@babel/code-frame": "^7.29.7",
|
||||||
"@babel/generator": "^7.29.7",
|
"@babel/generator": "^7.29.7",
|
||||||
@@ -604,6 +603,31 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"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": {
|
"node_modules/@emnapi/wasi-threads": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
|
||||||
@@ -611,6 +635,7 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.4.0"
|
"tslib": "^2.4.0"
|
||||||
}
|
}
|
||||||
@@ -1962,7 +1987,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
|
||||||
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
|
"integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-deep-equal": "^3.1.3",
|
"fast-deep-equal": "^3.1.3",
|
||||||
"fast-uri": "^3.0.1",
|
"fast-uri": "^3.0.1",
|
||||||
@@ -2281,7 +2305,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.10.38",
|
"baseline-browser-mapping": "^2.10.38",
|
||||||
"caniuse-lite": "^1.0.30001799",
|
"caniuse-lite": "^1.0.30001799",
|
||||||
@@ -3148,7 +3171,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
|
||||||
"integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
|
"integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"accepts": "^2.0.0",
|
"accepts": "^2.0.0",
|
||||||
"body-parser": "^2.2.1",
|
"body-parser": "^2.2.1",
|
||||||
@@ -5872,7 +5894,6 @@
|
|||||||
"integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
|
"integrity": "sha512-++ZJ0ijLrDJF6hNB4t4uxg2br3fC4H9Yc9tcbjr2fcNFP3rh/SBNrAgjhsqBU4Ght8JPrVofG/ZkXfnSfnYsFg==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/config": "6.19.3",
|
"@prisma/config": "6.19.3",
|
||||||
"@prisma/engines": "6.19.3"
|
"@prisma/engines": "6.19.3"
|
||||||
|
|||||||
@@ -1,15 +1,35 @@
|
|||||||
const request = require("supertest");
|
const request = require("supertest");
|
||||||
const app = require("../src/app");
|
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", () => {
|
describe("THE TIP TOP - FULL E2E FLOW", () => {
|
||||||
|
|
||||||
let token;
|
let token;
|
||||||
let ticketCode = "ABC123";
|
let ticketCode = "ABC123";
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// 1. REGISTER
|
// 1. REGISTER
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
// Test de l'inscription d'un utilisateur
|
|
||||||
test("Register user", async () => {
|
test("Register user", async () => {
|
||||||
const res = await request(app)
|
const res = await request(app)
|
||||||
.post("/api/auth/register")
|
.post("/api/auth/register")
|
||||||
@@ -17,63 +37,109 @@ describe("THE TIP TOP - FULL E2E FLOW", () => {
|
|||||||
firstname: "Test",
|
firstname: "Test",
|
||||||
lastname: "User",
|
lastname: "User",
|
||||||
email: "test@test.com",
|
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);
|
expect([201, 409]).toContain(res.statusCode);
|
||||||
});
|
});
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// 2. LOGIN
|
// 2. LOGIN
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Test de la connexion d'un utilisateur
|
|
||||||
test("Login user", async () => {
|
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)
|
const res = await request(app)
|
||||||
.post("/api/auth/login")
|
.post("/api/auth/login")
|
||||||
.send({
|
.send({
|
||||||
email: "test@test.com",
|
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.statusCode).toBe(200);
|
||||||
expect(res.body.token).toBeDefined();
|
expect(res.body.token).toBeDefined();
|
||||||
|
|
||||||
token = res.body.token;
|
token = res.body.token;
|
||||||
});
|
});
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// 3. PARTICIPATE GAME
|
// 3. PARTICIPATE GAME
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Test de la participation à un jeu
|
|
||||||
test("Participate to game", async () => {
|
test("Participate to game", async () => {
|
||||||
const res = await request(app)
|
const res = await request(app)
|
||||||
.post("/api/game/participate")
|
.post("/api/game/participate")
|
||||||
.set("Authorization", `Bearer ${token}`)
|
.set("Authorization", `Bearer ${token}`)
|
||||||
.send({ code: ticketCode });
|
.send({ code: ticketCode });
|
||||||
|
|
||||||
// Vérification du code de statut attendu
|
|
||||||
expect([200, 201, 404, 409, 400]).toContain(res.statusCode);
|
expect([200, 201, 404, 409, 400]).toContain(res.statusCode);
|
||||||
|
console.log("Ticket in DB before participate:", ticketCode);
|
||||||
});
|
});
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// 4. MY GAINS
|
// 4. MY GAINS
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// Test de la récupération des gains d'un utilisateur
|
|
||||||
|
|
||||||
test("Get my gains", async () => {
|
test("Get my gains", async () => {
|
||||||
const res = await request(app)
|
const res = await request(app)
|
||||||
.get("/api/game/my-gains")
|
.get("/api/game/my-gains")
|
||||||
.set("Authorization", `Bearer ${token}`);
|
.set("Authorization", `Bearer ${token}`);
|
||||||
|
|
||||||
// Vérification du code de statut attendu
|
|
||||||
expect(res.statusCode).toBe(200);
|
expect(res.statusCode).toBe(200);
|
||||||
expect(res.body.gains).toBeDefined();
|
expect(res.body.gains).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// 5. ADMIN STATS
|
// 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();
|
||||||
|
});
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// 6. ADMIN STATS (CLIENT access denied)
|
||||||
// ------------------------
|
// ------------------------
|
||||||
test("Admin stats - CLIENT access denied", async () => {
|
test("Admin stats - CLIENT access denied", async () => {
|
||||||
const res = await request(app)
|
const res = await request(app)
|
||||||
@@ -83,7 +149,4 @@ describe("THE TIP TOP - FULL E2E FLOW", () => {
|
|||||||
expect(res.statusCode).toBe(403);
|
expect(res.statusCode).toBe(403);
|
||||||
expect(res.body.message || res.body).toBeDefined();
|
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.
|
|
||||||
@@ -5,6 +5,25 @@ beforeAll(async () => {
|
|||||||
await prisma.participation.deleteMany();
|
await prisma.participation.deleteMany();
|
||||||
await prisma.ticket.deleteMany();
|
await prisma.ticket.deleteMany();
|
||||||
await prisma.user.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 () => {
|
afterAll(async () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user