gestion_table_tournante_libre/src/interface/evenement/differe.test.js

71 lines
3 KiB
JavaScript
Raw Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// La demande unique d'une section chargée à part (differe.js) : un
// composant rendu tel quel se rend de façon synchrone, sans rappel ; une
// promesse se partage d'une demande à l'autre, puis cède la place au
// composant résolu ; un rejet oublie le chargement, et la demande suivante
// rappelle charger ; ce qui n'est pas un composant est refusé. Les
// composants sont des fonctions inventées.
import assert from 'node:assert/strict';
import { describe, test } from '../../../test/lanceur.js';
import { creerChargeurSection } from './differe.js';
// Un chargeur qui compte ses appels et rend, à chacun, la valeur suivante
// de rendus.
function compteur(...rendus) {
const suivi = { appels: 0 };
suivi.charger = () => {
suivi.appels += 1;
return rendus[suivi.appels - 1];
};
return suivi;
}
function Composant() {}
describe('creerChargeurSection (differe.js)', () => {
test('un composant rendu tel quel se rend aussitôt, sans promesse, et charger ne sert qu’une fois', () => {
const suivi = compteur(Composant);
const demander = creerChargeurSection(suivi.charger);
assert.equal(suivi.appels, 0);
assert.equal(demander(), Composant);
assert.equal(demander(), Composant);
assert.equal(suivi.appels, 1);
});
test('une promesse se partage entre les demandes, puis le composant résolu se rend de façon synchrone', async () => {
let resoudre;
const suivi = compteur(new Promise((r) => (resoudre = r)));
const demander = creerChargeurSection(suivi.charger);
const premiere = demander();
assert.equal(typeof premiere.then, 'function');
assert.equal(demander(), premiere);
resoudre(Composant);
assert.equal(await premiere, Composant);
assert.equal(demander(), Composant);
assert.equal(suivi.appels, 1);
});
test('un rejet oublie le chargement : la demande suivante rappelle charger', async () => {
const panne = new Error('morceau introuvable');
const suivi = compteur(Promise.reject(panne), Promise.resolve(Composant));
const demander = creerChargeurSection(suivi.charger);
await assert.rejects(demander(), (erreur) => erreur === panne);
const reprise = demander();
assert.equal(suivi.appels, 2);
assert.equal(await reprise, Composant);
assert.equal(demander(), Composant);
});
test('ce qui n’est pas un composant est refusé : levé tout de suite, ou rejeté, puis redemandé', async () => {
assert.throws(() => creerChargeurSection(null), TypeError);
assert.throws(() => creerChargeurSection(() => ({ default: Composant }))(), /composant attendu, reçu object/);
const suivi = compteur(Promise.resolve(null), Promise.resolve(Composant));
const demander = creerChargeurSection(suivi.charger);
await assert.rejects(demander(), /composant attendu, reçu null/);
assert.equal(await demander(), Composant);
assert.equal(suivi.appels, 2);
});
});