@@ -1,3 +1,7 @@
|
||||
import { mkdtempSync } from 'node:fs';
|
||||
import { tmpdir } from 'node:os';
|
||||
import path from 'node:path';
|
||||
process.env.XDG_STATE_HOME = mkdtempSync(path.join(tmpdir(), 'jarvis-daemon-test-'));
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { VoiceStateMachine } from '../daemon/voice-state.js';
|
||||
@@ -145,3 +149,24 @@ test('QVAC scheduler prioritizes voice and keeps one active job', async () => {
|
||||
assert.deepEqual(order, ['first', 'voice', 'media']);
|
||||
assert.deepEqual(scheduler.status(), { running: 0, queued: [] });
|
||||
});
|
||||
|
||||
test('shutdown still closes the harness when recovery or voice cleanup fails', async () => {
|
||||
const daemon = new JarvisDaemon(); let closed = false;
|
||||
daemon.recovery.save = () => { throw new Error('disk full'); };
|
||||
daemon.harness = { cancel() {}, close: async () => { closed = true; } };
|
||||
daemon.voiceLoop = { stop: async () => { throw new Error('voice cleanup'); } };
|
||||
await assert.rejects(daemon.close(), /voice cleanup/);
|
||||
assert.equal(closed, true);
|
||||
});
|
||||
|
||||
test('cancel suppresses a late reply and revokes portal input', async () => {
|
||||
const daemon = new JarvisDaemon(); let resolve; let revoked = false;
|
||||
daemon.input = { revoke: () => { revoked = true; } };
|
||||
daemon.harness = { ask: () => new Promise(r => { resolve = r; }), cancel() {}, close: async () => {} };
|
||||
const replies = []; daemon.on('Reply', text => replies.push(text));
|
||||
try {
|
||||
const ask = daemon.ask('hello'); await Promise.resolve(); daemon.cancel();
|
||||
resolve({ text: 'late answer' }); assert.equal(await ask, '');
|
||||
assert.deepEqual(replies, []); assert.equal(daemon.state, 'ARMED'); assert.equal(revoked, true);
|
||||
} finally { await daemon.close(); }
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user