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("Register user", async () => { const res = await request(app) .post("/api/auth/register") .send({ firstname: "Test", lastname: "User", email: "test@test.com", password: "Password123", }); expect([201, 409]).toContain(res.statusCode); }); // ------------------------ // 2. LOGIN // ------------------------ 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", }); expect(res.statusCode).toBe(200); expect(res.body.token).toBeDefined(); token = res.body.token; }); // ------------------------ // 3. 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); console.log("Ticket in DB before participate:", ticketCode); }); // ------------------------ // 4. 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(); }); // ------------------------ // 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 () => { 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(); }); });