fancive_obsidian-parallel-r.../tests/plugin-batch.test.js
fancivez 76d2e8050a fix: address 10 P2 behavioral and concurrency findings
Findings from the original review (P2):
- streaming: flush unterminated final SSE event at EOF (some providers
  close the stream without a trailing blank line, dropping the last delta)
- cache-manager: validate entry shape on load — drop entries where
  cards is not an array, anchor is not a string, or bullets is not an
  array. Tolerates missing optional fields (treated as cache miss).
- view: card edit/delete now check cacheReplaceCards return and surface
  failures via a localized Notice instead of pretending success
- main: clear-current / clear-all / file-menu-clear refresh open view
  via renderEmpty so stale UI does not display deleted data
- prompt + settings-tab: card count is normalized via a single helper
  used by buildPrompts and onChange. Prompt and fingerprint stay in sync.
  UI value is written back to the textbox after clamping.
- generation-job-manager: global concurrency limit (default 3) with a
  cancellable wait queue. Race-safe slot accounting via a reserved
  counter so resolved-but-not-yet-set waiters are visible to fast-path
  start() callers.
- runForFile: now returns RunForFileResult; accepts preloadedContent +
  silentView + skipEditConfirm options used by batch (and reflected on
  the PluginHost interface).
- batch: avoid double file read, do not steal UI focus, classify
  results correctly (generated / cached / already-running / empty / ...)

Follow-up from the 1.0.11 review:
- generationFingerprint: codex backend excludes settings.model from the
  hash. Codex ignores --model; previously editing model spuriously
  invalidated all codex cache.

Codex review pass:
- generation-job-manager: race fix — releaseSlot's resolve microtask
  and a synchronous start() fast-path could briefly overshoot
  maxConcurrent. Reserve the slot synchronously inside the wrapped
  resolve to close the window.
- cache-manager: anchor type validation in addition to bullets.

NOTE: Codex backend users will see a one-time "stale cache" banner on
existing notes due to the fingerprint change; regenerate to refresh.

Change-Id: I7721c7dfe51dea3f51b0215764f721523c2f6806
2026-05-02 13:52:49 +08:00

36 lines
935 B
JavaScript

const { assert, t } = require('./test-setup');
const plugin = new t.ParallelReaderPlugin();
const failedFile = { path: 'failed.md' };
const originalConsoleError = console.error;
plugin.cacheManager = { get: () => null };
plugin.jobs = {
isRunning: () => false,
isPending: () => false,
start: async () => {
throw new Error('backend down');
},
cancelAllWaiters: () => 0,
};
plugin.t = (key) => key;
(async () => {
console.error = () => {};
try {
await assert.doesNotReject(
() => plugin.runForFile(failedFile, false),
'single-file UI path should keep handling errors internally',
);
await assert.rejects(
() => plugin.runForFile(failedFile, false, { rethrowErrors: true }),
/backend down/,
'batch path should be able to count failed generation attempts',
);
} finally {
console.error = originalConsoleError;
}
console.log('plugin batch tests passed');
})();