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.18'); 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.18'), /unexpected/); assert.throws(() => patchClient(source.replace('await fetch(', 'fetch('), '1.5.18'), /unexpected/); assert.throws(() => patchClient(source.replace('await response.json()', 'response.json()'), '1.5.18'), /unexpected/); assert.throws(() => patchClient(source.replace('/plugins/dsh-session-delete/', '/plugins/changed/'), '1.5.18'), /unexpected/); assert.throws(() => patchClient(patched, '1.5.18'), /unexpected/); });