corentin_wakdo/tests/js/nav.test.js
Imugiii 3f026d96c6
All checks were successful
CI / php-lint (pull_request) Successful in 32s
CI / secret-scan (pull_request) Successful in 11s
CI / static-tests (pull_request) Successful in 1m14s
CI / js-tests (pull_request) Successful in 42s
CI / secret-scan (push) Successful in 13s
CI / php-lint (push) Successful in 33s
CI / static-tests (push) Successful in 1m12s
CI / js-tests (push) Successful in 37s
fix(borne): panier unique = panneau persistant (retrait cart.html + product.html)
Le panier avait deux vues divergentes : la page cart.html et le panneau de
droite. On garde le PANNEAU comme unique vue panier et on supprime :
- cart.html + page-cart.js (page panier separee) ;
- product.html + page-product.js (fiche produit fantome non atteinte : le clic
  produit ouvre une modale) ;
- l'icone panier de l'en-tete (le panneau montre la commande).

Le panneau devient un panier complet : stepper +/- par ligne (decrementer a 0
retire la ligne), en plus du bouton retrait. Cibles tactiles 44px.

Repointe le lien retour de payment.html et la redirection panier-vide vers
categories.html ; neutralise le href de repli des cartes produit ; nettoie le
CSS mort (cart-*, product-detail*, site-header__cart). E2E reecrit (modale
options + panneau au lieu de product.html / cart.html). JS 101 verts.
2026-06-24 10:15:34 +00:00

53 lines
2.6 KiB
JavaScript

/*
* nav.test.js — Garde du mode de consommation borne (helpers PURS de nav.js).
*
* nav.js n'enregistre son listener DOMContentLoaded que derriere `typeof document`,
* donc l'import est sans effet de bord en node pur : on teste needsModeRedirect et
* modeLabel sans jsdom. Couvre la cause du 422 INVALID_SERVICE_MODE : atteindre une
* page de commande sans mode memorise (localStorage vide) doit renvoyer a l'accueil,
* et le badge ne doit jamais afficher un faux "Sur place" quand aucun mode n'est choisi.
*/
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { needsModeRedirect, modeLabel } from '../../src/public/borne/assets/js/nav.js';
/* --- modeLabel ----------------------------------------------------------- */
test('modeLabel: libelle humain ; vide si mode absent ou inconnu (ne ment pas)', () => {
assert.equal(modeLabel('sur-place'), 'Sur place');
assert.equal(modeLabel('a-emporter'), 'A emporter');
assert.equal(modeLabel(null), '');
assert.equal(modeLabel(undefined), '');
assert.equal(modeLabel('bidon'), '');
});
/* --- needsModeRedirect --------------------------------------------------- */
test('needsModeRedirect: page profonde SANS mode valide -> redirige', () => {
assert.equal(needsModeRedirect('/payment.html', null), true);
assert.equal(needsModeRedirect('/products.html', undefined), true);
assert.equal(needsModeRedirect('/payment.html', 'bidon'), true);
assert.equal(needsModeRedirect('/categories.html', ''), true);
});
test('needsModeRedirect: mode valide -> pas de redirection', () => {
assert.equal(needsModeRedirect('/payment.html', 'sur-place'), false);
assert.equal(needsModeRedirect('/products.html', 'a-emporter'), false);
});
test('needsModeRedirect: ecran d accueil jamais redirige (le mode s y choisit)', () => {
assert.equal(needsModeRedirect('/', null), false);
assert.equal(needsModeRedirect('/index.html', null), false);
assert.equal(needsModeRedirect('/index.html', 'bidon'), false);
});
/* --- Cablage de la chaine de persistance (regression) -------------------- */
test('categories.html charge nav.js (sinon le mode recu en ?mode= n est jamais persiste)', () => {
// 1re page post-accueil : elle recoit ?mode= depuis index.html et DOIT le persister
// via syncModeFromURL. Sans nav.js ici, le mode n atteint pas localStorage et la
// garde renverrait en boucle un utilisateur legitime vers l accueil (regression revue).
const html = readFileSync(new URL('../../src/public/borne/categories.html', import.meta.url), 'utf8');
assert.match(html, /assets\/js\/nav\.js/);
});