Files

58 lines
2.2 KiB
TypeScript

import { describe, test } from 'node:test';
import assert from 'node:assert/strict';
describe('VS Code webview bridge requests', () => {
test('rejects immediately when signal is already aborted', async () => {
const originalWindow = globalThis.window;
const originalAcquire = (globalThis as typeof globalThis & { acquireVsCodeApi?: unknown }).acquireVsCodeApi;
const messages: unknown[] = [];
try {
Object.defineProperty(globalThis, 'window', {
configurable: true,
value: new EventTarget(),
});
Object.defineProperty(globalThis, 'acquireVsCodeApi', {
configurable: true,
value: () => ({
postMessage: (message: unknown) => messages.push(message),
getState: () => undefined,
setState: () => undefined,
}),
});
const { sendBridgeMessageWithOptions, startSseProxy } = await import('./bridge');
const controller = new AbortController();
controller.abort();
const result = await Promise.race([
sendBridgeMessageWithOptions('api:proxy', undefined, { signal: controller.signal }).then(
() => 'resolved',
(error: unknown) => error,
),
new Promise((resolve) => setTimeout(() => resolve('timeout'), 20)),
]);
assert.ok(result instanceof DOMException);
assert.equal(result.name, 'AbortError');
assert.equal(messages.length, 0);
const startPromise = startSseProxy({ path: '/global/event', streamId: 'sse_webview_1_1' });
const request = messages[0] as { id: string; payload?: { streamId?: string } };
assert.equal(request.payload?.streamId, 'sse_webview_1_1');
globalThis.window.dispatchEvent(new MessageEvent('message', {
data: {
id: request.id,
type: 'api:sse:start',
success: true,
data: { status: 200, headers: {}, streamId: 'sse_webview_1_1' },
},
}));
assert.equal((await startPromise).streamId, 'sse_webview_1_1');
} finally {
Object.defineProperty(globalThis, 'window', { configurable: true, value: originalWindow });
Object.defineProperty(globalThis, 'acquireVsCodeApi', { configurable: true, value: originalAcquire });
}
});
});