diff --git a/src/cli/index.ts b/src/cli/index.ts index 4ffc950b..3039341f 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -42,6 +42,7 @@ export async function renderToStream( url: url_, waitUntil: request.waitUntil, evaluates: request.evaluates, + timeout: request.timeout, }) await writeToStream(writable, result.body) }) diff --git a/src/cli/timeout.spec.ts b/src/cli/timeout.spec.ts new file mode 100644 index 00000000..8b5b870b --- /dev/null +++ b/src/cli/timeout.spec.ts @@ -0,0 +1,66 @@ +import { Writable } from 'node:stream' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const { close, getBrowser, getRenderedContent } = vi.hoisted(() => { + const close = vi.fn(async () => {}) + const getBrowser = vi.fn(async () => ({ close })) + const getRenderedContent = vi.fn(async () => ({ + status: 200, + headers: {}, + body: Buffer.from('rendered body'), + evaluateResults: [], + })) + return { close, getBrowser, getRenderedContent } +}) + +vi.mock('../browser', () => ({ + getBrowser, +})) + +vi.mock('../render', () => ({ + getRenderedContent, +})) + +import { renderToStream } from './index' + +describe('renderToStream timeout propagation', () => { + beforeEach(() => { + close.mockClear() + getBrowser.mockClear() + getRenderedContent.mockClear() + }) + + it('passes timeout to the renderer request', async () => { + const chunks: string[] = [] + const writable = new Writable({ + write(chunk, _encoding, callback) { + chunks.push(chunk.toString()) + callback(null) + }, + }) + + await renderToStream( + { + name: 'chromium', + url: 'example.com', + waitUntil: 'networkidle', + evaluates: ['document.title'], + timeout: 1234, + }, + writable, + ) + + expect(getBrowser).toHaveBeenCalledWith({ name: 'chromium' }) + expect(getRenderedContent).toHaveBeenCalledWith( + { close }, + { + url: 'https://example.com', + waitUntil: 'networkidle', + evaluates: ['document.title'], + timeout: 1234, + }, + ) + expect(chunks).toStrictEqual(['rendered body']) + expect(close).toHaveBeenCalledTimes(1) + }) +})