feedBack/tests/js/capabilities_claims.test.js
2026-06-16 18:47:13 +02:00

65 lines
2.7 KiB
JavaScript

const { test } = require('node:test');
const assert = require('node:assert/strict');
const { loadCapabilities } = require('./capabilities_test_harness');
function registerStemsOwner(api, calls) {
api.registerParticipant('stems', {
stems: {
roles: ['owner', 'provider'],
commands: ['mute', 'restore'],
runtime: true,
handlers: {
mute: (ctx) => {
calls.push(['mute', ctx.payload]);
return { outcome: 'handled', payload: { muted: true, restoreSnapshotRef: 'snap-1' } };
},
restore: (ctx) => {
calls.push(['restore', ctx.payload]);
return { outcome: 'handled', payload: { restored: true } };
},
},
},
});
}
test('claim dispatch release records lifecycle and removes active claim', async () => {
const window = loadCapabilities();
const api = window.slopsmith.capabilities;
const calls = [];
registerStemsOwner(api, calls);
const cleanup = api.claim({ capability: 'stems', claimId: 'nam.amp-active', requester: 'nam_tone', target: { kind: 'guitar' } });
let snapshot = api.snapshotDiagnostics();
assert.equal(snapshot.activeClaims.find(c => c.claimId === 'nam.amp-active').owner, 'stems');
const result = await api.dispatch({
capability: 'stems', command: 'mute', source: 'nam_tone',
claim: { claimId: 'nam.amp-active' }, args: { target: { kind: 'guitar' } },
});
assert.equal(result.status, 'applied');
assert.equal(calls.length, 1);
cleanup();
snapshot = api.snapshotDiagnostics();
assert.equal(snapshot.activeClaims.some(c => c.claimId === 'nam.amp-active'), false);
assert.equal(snapshot.claimLifecycle.some(c => c.claimId === 'nam.amp-active' && c.state === 'released'), true);
assert.equal(snapshot.claimLifecycle.find(c => c.claimId === 'nam.amp-active').restoreSnapshotRef, null);
});
test('manual override is terminal for matching active claim target', async () => {
const window = loadCapabilities();
const api = window.slopsmith.capabilities;
const calls = [];
registerStemsOwner(api, calls);
api.claim({ capability: 'stems', claimId: 'nam.amp-active', requester: 'nam_tone', target: { kind: 'guitar' } });
api.recordUserOverride({ capability: 'stems', source: 'user', target: { kind: 'guitar' }, reason: 'Player unmuted guitar' });
const result = await api.dispatch({
capability: 'stems', command: 'mute', source: 'nam_tone',
claim: { claimId: 'nam.amp-active' }, args: { target: { kind: 'guitar' } },
});
assert.equal(result.status, 'overridden');
assert.equal(calls.length, 0);
assert.match(result.reason, /user override/i);
});