fancive_obsidian-parallel-r.../tests/generation-job-manager.test.js
wujunchen f5f974fd74 build: remove __test barrel from production bundle
Tests now load src/test-exports.ts via esbuild buildSync instead of
importing __test from the production main.js. This removes ~60 internal
symbols and all test-only module code from the shipped plugin bundle.

Change-Id: I2caf5232f6894c7514215e1751f2e268b74d7dc4
2026-04-27 19:57:28 +08:00

64 lines
2.3 KiB
JavaScript

const { assert, t } = require('./test-setup');
const { GenerationJobAlreadyRunningError, GenerationJobCancelledError, GenerationJobManager, classifyGenerationError } =
t;
async function testSingleFlightAndCleanup() {
const manager = new GenerationJobManager();
let release;
const blocker = new Promise((resolve) => {
release = resolve;
});
const first = manager.start('note.md', async (job) => {
job.setPhase('reading');
await blocker;
job.setPhase('done');
return 'ok';
});
assert.strictEqual(manager.isRunning('note.md'), true);
assert.strictEqual(manager.get('note.md').phase, 'reading');
await assert.rejects(() => manager.start('note.md', async () => 'duplicate'), GenerationJobAlreadyRunningError);
release();
assert.strictEqual(await first, 'ok');
assert.strictEqual(manager.isRunning('note.md'), false);
assert.strictEqual(manager.get('note.md'), null);
}
async function testCancelSignalsRunnerAndCleansUp() {
const manager = new GenerationJobManager();
let cancelHookCalled = false;
const running = manager.start('cancel.md', async (job) => {
job.onCancel(() => {
cancelHookCalled = true;
});
await Promise.resolve();
job.throwIfCancelled();
return 'should-not-complete';
});
assert.strictEqual(manager.cancel('cancel.md'), true);
await assert.rejects(running, GenerationJobCancelledError);
assert.strictEqual(cancelHookCalled, true);
assert.strictEqual(manager.isRunning('cancel.md'), false);
assert.strictEqual(manager.cancel('cancel.md'), false);
}
function testErrorClassification() {
assert.strictEqual(classifyGenerationError(new Error('API key 未设置')), 'auth');
assert.strictEqual(classifyGenerationError(new Error('CLI 超时 (120000ms)')), 'timeout');
assert.strictEqual(classifyGenerationError(new Error('OpenAI API 429: rate limit')), 'rate-limit');
assert.strictEqual(classifyGenerationError(new Error('LLM 返回非 JSON')), 'schema');
assert.strictEqual(classifyGenerationError(new Error('Model 未设置')), 'config');
assert.strictEqual(classifyGenerationError(new Error('something else')), 'unknown');
}
(async () => {
await testSingleFlightAndCleanup();
await testCancelSignalsRunnerAndCleansUp();
testErrorClassification();
console.log('generation job manager tests passed');
})();