Merge remote-tracking branch 'origin/Alexis' into Emmanuel
Récupère la FAQ de la page d'accueil et la refonte de la page Contact, ainsi que la chaîne CI/CD et l'infrastructure VPS HTTPS venues de main. Résolution des 13 conflits : - Footer : les deux corrections sont conservées. FooterLink sort du composant (Alexis), la grille passe en une colonne sous 640 px et l'adresse email peut se couper (audit responsive). - Admin : le BOM du CSV adopte la séquence échappée d'Alexis, plus lisible que le caractère invisible et sans règle de lint à désactiver. - Contact : version d'Alexis retenue, plus complète, avec son formulaire. - Connexion, Inscription : logos SVG conservés dans leur version nettoyée, avec aria-hidden ; les gestionnaires OAuth et les champs d'inscription restent en place. - UserNav, Profile, services/admin : versions locales conservées. - docker-compose : structure Traefik et domaines HTTPS d'Alexis, sur lesquels sont regreffés FRONTEND_URL et les identifiants OAuth par substitution. - Les deux package-lock régénérés depuis les package.json fusionnés. Aligne au passage les derniers chemins d'API restés relatifs sur VITE_API_URL, sans quoi le bouton Google et la configuration du jeu visaient le domaine du front en déploiement. Fiabilise trois tests de tirage au sort : la table GrandPrizeWinner est unique pour tout le jeu et le vivier contient de vrais comptes, donc les suites mettent désormais un éventuel tirage réel de côté et n'attendent plus de connaître le gagnant à l'avance.
This commit is contained in:
@@ -30,7 +30,30 @@ const jourJ = (d) =>
|
||||
data: { startDate: new Date(Date.now() - d * DAY) },
|
||||
});
|
||||
|
||||
|
||||
// Un tirage reel peut exister en base : la table GrandPrizeWinner est unique
|
||||
// pour tout le jeu. On la met de cote le temps du test, puis on la restaure.
|
||||
async function mettreDeCoteLeGagnant() {
|
||||
const existant = await prisma.grandPrizeWinner.findFirst();
|
||||
if (existant) await prisma.grandPrizeWinner.delete({ where: { id: existant.id } });
|
||||
return existant;
|
||||
}
|
||||
|
||||
async function restaurerLeGagnant(sauvegarde) {
|
||||
if (!sauvegarde) return;
|
||||
await prisma.grandPrizeWinner.deleteMany({});
|
||||
await prisma.grandPrizeWinner.create({
|
||||
data: {
|
||||
id: sauvegarde.id,
|
||||
userId: sauvegarde.userId,
|
||||
prize: sauvegarde.prize,
|
||||
drawnAt: sauvegarde.drawnAt,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
beforeAll(async () => {
|
||||
ctx.gagnantSauvegarde = await mettreDeCoteLeGagnant();
|
||||
await cleanup();
|
||||
const row = await prisma.gameSettings.findFirst({ orderBy: { id: "asc" } });
|
||||
ctx.settingsId = row.id;
|
||||
@@ -51,6 +74,7 @@ beforeAll(async () => {
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await restaurerLeGagnant(ctx.gagnantSauvegarde);
|
||||
await prisma.gameSettings.update({ where: { id: ctx.settingsId }, data: { startDate: ctx.startDateOriginale } });
|
||||
await cleanup();
|
||||
await prisma.$disconnect();
|
||||
@@ -67,13 +91,16 @@ describe("Notification du grand gagnant", () => {
|
||||
expect(res.body.emailSent).toBe(true);
|
||||
expect(mailer.sendMail).toHaveBeenCalledTimes(1);
|
||||
|
||||
// Le tirage est aleatoire parmi tous les participants : on verifie que
|
||||
// l email part bien au gagnant annonce, quel qu il soit.
|
||||
const gagnant = res.body.winner.user;
|
||||
const envoi = mailer.sendMail.mock.calls[0][0];
|
||||
expect(envoi.to).toBe(ctx.client.email);
|
||||
expect(envoi.to).toBe(gagnant.email);
|
||||
expect(envoi.subject).toMatch(/gros lot/i);
|
||||
expect(envoi.html).toContain("Chloe");
|
||||
expect(envoi.html).toContain(gagnant.firstname);
|
||||
expect(envoi.html).toContain("360");
|
||||
|
||||
await prisma.grandPrizeWinner.deleteMany({ where: { userId: ctx.client.id } });
|
||||
await prisma.grandPrizeWinner.deleteMany({});
|
||||
});
|
||||
|
||||
test("un SMTP en panne n invalide pas le tirage", async () => {
|
||||
@@ -86,10 +113,11 @@ describe("Notification du grand gagnant", () => {
|
||||
expect(res.body.message).toMatch(/contacter directement/);
|
||||
|
||||
// Le tirage reste enregistre : c est un acte irreversible.
|
||||
const enBase = await prisma.grandPrizeWinner.findFirst({ where: { userId: ctx.client.id } });
|
||||
const enBase = await prisma.grandPrizeWinner.findFirst();
|
||||
expect(enBase).not.toBeNull();
|
||||
expect(enBase.userId).toBe(res.body.winner.user.id);
|
||||
|
||||
await prisma.grandPrizeWinner.deleteMany({ where: { userId: ctx.client.id } });
|
||||
await prisma.grandPrizeWinner.deleteMany({});
|
||||
});
|
||||
|
||||
test("aucun email n est envoye si le tirage est refuse", async () => {
|
||||
|
||||
Reference in New Issue
Block a user