openvibers/openvibe.coupons Commits

npm test no longer counts a skipped test as passed (roadmap WS-Q task 7; openvibe-shared/test-runner, Shared v1.25.0). test/run.js counted every file that exited 0 as passed, so a file that printed that it skipped its work and checked nothing still read as green. It is now the shared runner through run() (same files, one at a time as before, 60 s timeout per file, VERBOSE=1 still prints every file's output): a test prints "<label>: skipped (<why>)" for what it could not run, and that file is listed with ○ and its reasons and not counted as passed; --strict makes a skip fail the run. No test here skips anything. openvibe-shared is pinned at v1.25.0 (from v1.22.0; 1.23 and 1.24 add the web runtime, release-watch fixes and the readiness skip, and /api/ready answers as before because its db check really runs; README and STATUS.json follow). npm test (Node 22) 13/13.

OP OpenVibers committed 28 Sept 2026 · 168262d1ba · 5 files, +19 −39


Changes

ddiff --git a/README.md b/README.md
iindex d95cf16..1d57702 100644
---- a/README.md
++++ b/README.md
@@@ -297,7 +297,7 @@ What Coupons calls elsewhere, and with which grant, is under
## Depends on
- **Packages** (all pinned by release tarball): `openvibe-publishing` v0.4.0 (seo gate, ssr,
-- index-hooks), `openvibe-contracts` v0.53.0, `openvibe-shared` v1.22.0 (chrome, app icon, footer,
++ index-hooks), `openvibe-contracts` v0.53.0, `openvibe-shared` v1.25.0 (chrome, app icon, footer,
legal, release, metrics, ready, seo), `openvibe-sdk` v0.12.0 (events outbox, service tokens,
per-actor limits).
- **OpenVibe.Network:**
ddiff --git a/STATUS.json b/STATUS.json
iindex b2386e1..c0dc731 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -8,7 +8,7 @@
"port": 4850,
"domain": "openvibe.coupons",
"contracts": "openvibe-contracts v0.53.0",
-- "packages": ["openvibe-publishing v0.4.0", "openvibe-contracts v0.53.0", "openvibe-shared v1.22.0", "openvibe-sdk v0.12.0"],
++ "packages": ["openvibe-publishing v0.4.0", "openvibe-contracts v0.53.0", "openvibe-shared v1.25.0", "openvibe-sdk v0.12.0"],
"capabilities": ["coupons.coupon.submit", "coupons.report.create", "coupons.merchant.resolve", "coupons.coupon.lookup", "coupons.status.update", "coupons.merchant.manage"],
"installScopes": ["coupons.lookup", "coupons.report"],
"capabilitiesRegistered": true,
ddiff --git a/package-lock.json b/package-lock.json
iindex 4e59fad..1b67ef4 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -18,7 +18,7 @@
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.53.0",
"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v0.4.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.12.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.22.0"
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.25.0"
},
"devDependencies": {
"jsonwebtoken": "^9.0.2"
@@@ -1058,9 +1058,9 @@
}
},
"node_modules/openvibe-shared": {
-- "version": "1.22.0",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.22.0",
-- "integrity": "sha512-FtqbR8h6YphOnJNqklJED3HyqvTwZJl58gyiZ3QgzmZtZcA16O2NMGq67O4p7grLojwaIG5DhXDMgmZcpScxJQ==",
++ "version": "1.25.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.25.0",
++ "integrity": "sha512-oqZ+PvljrWi8IEbtg6bDYai17ZV2sALFx/ezMptniELSr10TgFUiGUQt+b1IWwiHv0T2Y1U2iSrkirJxMNgjSw==",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0"
ddiff --git a/package.json b/package.json
iindex 4fe2890..1a29e6f 100644
---- a/package.json
++++ b/package.json
@@@ -23,7 +23,7 @@
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.53.0",
"openvibe-publishing": "https://codeload.github.com/OpenVibers/OpenVibe.Publishing/tar.gz/refs/tags/v0.4.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.12.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.22.0"
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v1.25.0"
},
"devDependencies": {
"jsonwebtoken": "^9.0.2"
ddiff --git a/test/run.js b/test/run.js
iindex 1ffd206..ab8efab 100644
---- a/test/run.js
++++ b/test/run.js
@@@ -6,39 +6,19 @@
*
* npm test # everything
* npm test -- schedule # only files whose name contains one of the words
++ * npm test -- --strict # a skipped test fails the run too
++ *
++ * A test that cannot run something here prints `<label>: skipped (<why>)`: that file is listed with
++ * ○ and not counted as passed (openvibe-shared/test-runner).
*/
'use strict';
--const { spawn } = require('child_process');
--const fs = require('fs');
--const path = require('path');
--
--const filters = process.argv.slice(2).filter((a) => !a.startsWith('-'));
--const files = fs.readdirSync(__dirname).filter((f) => f.endsWith('.test.js')).filter((f) => !filters.length || filters.some((w) => f.includes(w))).sort();
--const TIMEOUT_MS = 60000;
--
--function runOne(file) {
-- return new Promise((resolve) => {
-- const started = Date.now();
-- const child = spawn(process.execPath, [path.join(__dirname, file)], { cwd: path.join(__dirname, '..'), env: { ...process.env, NODE_ENV: 'test' }, stdio: ['ignore', 'pipe', 'pipe'] });
-- let output = '';
-- child.stdout.on('data', (c) => { output += c; });
-- child.stderr.on('data', (c) => { output += c; });
-- const timer = setTimeout(() => { output += `\n[run] timed out after ${TIMEOUT_MS}ms`; child.kill('SIGKILL'); }, TIMEOUT_MS);
-- child.on('close', (code, signal) => { clearTimeout(timer); resolve({ file, ok: code === 0, code: code ?? signal, ms: Date.now() - started, output }); });
-- });
--}
++const { run } = require('openvibe-shared/test-runner');
--(async () => {
-- if (!files.length) { console.error('no test files matched'); process.exit(1); }
-- const results = [];
-- for (const f of files) {
-- const r = await runOne(f);
-- results.push(r);
-- console.log(`${r.ok ? '✓' : '✗'} ${r.file.padEnd(34)} ${String(r.ms).padStart(6)}ms`);
-- if (process.env.VERBOSE) console.log(r.output);
++// VERBOSE=1 also prints every file's output, then the summary again.
++run({ dir: __dirname, timeoutMs: 60000, pad: 34, parallel: 1 }).then((r) => {
++ if (process.env.VERBOSE) {
++ for (const t of r.results) console.log(`\n── ${t.file} ──\n${t.output.trimEnd()}`);
++ console.log(`\n${r.summary}`);
}
-- const failed = results.filter((r) => !r.ok);
-- for (const r of failed) { console.log(`\n── ${r.file} (exit ${r.code}) ──`); console.log(r.output.split('\n').slice(-80).join('\n')); }
-- console.log(`\n${results.length - failed.length}/${results.length} test files passed`);
-- process.exit(failed.length ? 1 : 0);
--})();
++ process.exit(r.exitCode);
++}, (err) => { console.error(err); process.exit(1); });