mirror of
https://github.com/fancive/obsidian-parallel-reader.git
synced 2026-07-22 06:53:43 +00:00
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
64 lines
2.3 KiB
JavaScript
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');
|
|
})();
|