45 lines
2.7 KiB
JavaScript
45 lines
2.7 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { runInNewContext } from 'node:vm';
|
|
import { clientHelpers, patchClient } from './patch-chat-manager.mjs';
|
|
|
|
test('chat paths preserve instance prefix and POST options', async () => {
|
|
for (const pathname of ['/dsh/demo/', '/dsh/demo', '/dsh/demo/session/123', '/', '/other/']) {
|
|
let received;
|
|
const context = { window: { location: { pathname } }, fetch: (...args) => { received = args; } };
|
|
runInNewContext(clientHelpers, context);
|
|
for (const action of ['delete', 'restore', 'archive-search']) {
|
|
const path = '/plugins/dsh-session-delete/' + action;
|
|
const options = { method: 'POST', body: '{}', headers: { 'x-dsh-session-delete-confirmation': 'delete-session' } };
|
|
await context.dshChatFetch(path, options);
|
|
assert.equal(received[0], (pathname.startsWith('/dsh/demo') ? '/dsh/demo' : '') + path);
|
|
assert.equal(received[1], options);
|
|
}
|
|
}
|
|
});
|
|
test('non-JSON errors report HTTP status without exposing response content', async () => {
|
|
const context = {};
|
|
runInNewContext(clientHelpers, context);
|
|
await assert.rejects(context.dshChatJson(new Response('method not allowed', { status: 405 })), /HTTP 405.*non-JSON/);
|
|
const body = await context.dshChatJson(Response.json({ ok: false, error: { code: 'forbidden' } }, { status: 403 }));
|
|
assert.equal(body.error.code, 'forbidden');
|
|
});
|
|
test('patch rejects unsupported or changed clients and double patching', () => {
|
|
const source = [
|
|
"await fetch('/plugins/dsh-session-delete/delete', options); await response.json()",
|
|
'await fetch(`/plugins/dsh-session-delete/${action}`, options); await response.json()',
|
|
"await fetch('/plugins/dsh-session-delete/archive-search', options); await response.json()",
|
|
].join(';');
|
|
const patched = patchClient(source, '1.5.20');
|
|
assert.equal(patched.split('await dshChatFetch(').length, 4);
|
|
assert.equal(patched.slice(clientHelpers.length).replaceAll('await dshChatFetch(', 'await fetch(')
|
|
.replaceAll('await dshChatJson(response)', 'await response.json()'), source);
|
|
assert.throws(() => patchClient(source, '1.5.16'), /unsupported/);
|
|
assert.throws(() => patchClient(source, '1.5.13'), /unsupported/);
|
|
assert.throws(() => patchClient('', '1.5.20'), /unexpected/);
|
|
assert.throws(() => patchClient(source.replace('await fetch(', 'fetch('), '1.5.20'), /unexpected/);
|
|
assert.throws(() => patchClient(source.replace('await response.json()', 'response.json()'), '1.5.20'), /unexpected/);
|
|
assert.throws(() => patchClient(source.replace('/plugins/dsh-session-delete/', '/plugins/changed/'), '1.5.20'), /unexpected/);
|
|
assert.throws(() => patchClient(patched, '1.5.20'), /unexpected/);
|
|
});
|