forked from yvv/decision
- rien n'est parti (nœud muet avant la signature, refus, fenêtre fermée avant) : la page lâche le bulletin ; signé, ou montré en code Ğecko, il est gardé et le serveur le confirme sans la page ; le refus de la chaîne se dit (« chain ») ; - le reçu : téléchargeable depuis la fenêtre de vote, et la page « Tes bulletins » (/bulletins) qui garde l'historique et vérifie un reçu dans le navigateur, sans le serveur (lib/receipt.ts, mêmes vecteurs que le moteur) ; - le panier ne dit plus « Tes votes comptent dès l'envoi » quand le vote est fermé ; - @noble/hashes déclaré (utilisé par e2e/chain-mock.mjs et le reçu) ; - chaîne simulée : finalité, pages, filtres, nœud qui tombe ; contrôles C32, C33. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 lines
1.4 KiB
TypeScript
30 lines
1.4 KiB
TypeScript
// What the end-to-end tests import is declared: a package found only as the
|
|
// dependency of another (as @noble/hashes under polkadot-api) may vanish with it.
|
|
import { readdirSync, readFileSync } from 'node:fs';
|
|
import { builtinModules } from 'node:module';
|
|
import { join } from 'node:path';
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
const root = join(__dirname, '../..');
|
|
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as {
|
|
dependencies?: Record<string, string>;
|
|
devDependencies?: Record<string, string>;
|
|
};
|
|
const declared = new Set([...Object.keys(pkg.dependencies ?? {}), ...Object.keys(pkg.devDependencies ?? {})]);
|
|
|
|
/** `@scope/name/sub.js` → `@scope/name`; `name/sub` → `name`. */
|
|
const packageOf = (spec: string) => spec.split('/').slice(0, spec.startsWith('@') ? 2 : 1).join('/');
|
|
|
|
describe('the end-to-end tests', () => {
|
|
it('import only declared packages', () => {
|
|
const dir = join(root, 'e2e');
|
|
for (const file of readdirSync(dir).filter((f) => /\.(mjs|ts)$/.test(f))) {
|
|
const text = readFileSync(join(dir, file), 'utf8');
|
|
for (const [, spec] of text.matchAll(/^import[^'"]*['"]([^'"]+)['"]/gm)) {
|
|
if (!spec || spec.startsWith('.') || spec.startsWith('node:') || builtinModules.includes(spec)) continue;
|
|
expect(declared.has(packageOf(spec)), `${file}: ${spec}`).toBe(true);
|
|
}
|
|
}
|
|
});
|
|
});
|