Files
PleinR/tests/mail-outbox.test.ts
T
Claude 0c8542f894 Tests : file d'envoi, destinataires, navigation et invariants
`tests/security.test.ts` gagne cinq blocs qui verrouillent ce qui compte
et qu'aucun type ne protège :

- les cinq actions qui émettent un mot de passe appellent `sendNow` et
  jamais `queueMail`, et la trace journalisée porte un corps vide ;
- l'écran Boîte mail ne déchiffre aucun secret, saisit en champ masqué et
  annonce qu'un champ vide conserve la valeur enregistrée ;
- les trois fonctions qui écrivent un secret en base le chiffrent ;
- ni copie ni copie cachée dans la chaîne d'envoi, et `to_address` reste
  une adresse unique et obligatoire ;
- aucune lecture publique ne touche aux informations, et rien de ce qui
  les rend n'emprunte `dangerouslySetInnerHTML` ;
- chaque boucle de fond garde son interrupteur et reste hors du bundle
  edge.

`tests/backend-nav.test.ts` attrape l'oubli qu'on ne voit qu'à l'écran :
ajouter une page demande de toucher aux titres, aux sections et au jeu
d'icônes, et rater l'un des trois donne un en-tête vide ou une icône
absente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QsLjRAnuLwivqxCbM4WeP
2026-09-14 16:22:07 +00:00

29 lines
1.1 KiB
TypeScript

import { test } from "node:test";
import assert from "node:assert/strict";
import { MAX_ATTEMPTS, backoffDelayMs, shouldGiveUp } from "../src/lib/mail-outbox";
test("l'attente entre deux tentatives croît et reste plafonnée", () => {
const delays = [1, 2, 3, 4, 5].map(backoffDelayMs);
for (let i = 1; i < delays.length; i += 1) {
assert.ok(delays[i] > delays[i - 1], `la tentative ${i + 1} devrait attendre plus longtemps`);
}
assert.equal(backoffDelayMs(1), 2 * 60_000);
assert.equal(backoffDelayMs(4), 16 * 60_000);
// Au-delà du plafond, l'attente ne double plus indéfiniment.
assert.equal(backoffDelayMs(50), backoffDelayMs(MAX_ATTEMPTS));
});
test("une valeur aberrante ne produit pas une attente absurde", () => {
assert.equal(backoffDelayMs(0), backoffDelayMs(1));
assert.equal(backoffDelayMs(-3), backoffDelayMs(1));
assert.ok(Number.isFinite(backoffDelayMs(1000)));
});
test("on abandonne après cinq tentatives, pas avant", () => {
assert.equal(shouldGiveUp(1), false);
assert.equal(shouldGiveUp(MAX_ATTEMPTS - 1), false);
assert.equal(shouldGiveUp(MAX_ATTEMPTS), true);
assert.equal(shouldGiveUp(MAX_ATTEMPTS + 1), true);
});