diff --git a/e2e/define-router.spec.ts b/e2e/define-router.spec.ts index 15a98d070..5aed9d852 100644 --- a/e2e/define-router.spec.ts +++ b/e2e/define-router.spec.ts @@ -26,5 +26,25 @@ for (const mode of ['DEV', 'PRD'] as const) { await page.goto(`http://localhost:${port}/foo`); await expect(page.getByTestId('foo-title')).toHaveText('Foo'); }); + + test('api hi', async ({ page }) => { + await page.goto(`http://localhost:${port}/api/hi`); + await expect(page.getByText('hello world!')).toBeVisible(); + }); + + test('api hi.txt', async ({ page }) => { + await page.goto(`http://localhost:${port}/api/hi.txt`); + await expect(page.getByText('hello from a text file!')).toBeVisible(); + }); + + test('api empty', async ({ page }) => { + await page.goto(`http://localhost:${port}/api/empty`); + await expect(await page.innerHTML('body')).toBe(''); + }); + + test('not found', async ({ page }) => { + await page.goto(`http://localhost:${port}/does-not-exist.txt`); + await expect(page.getByText('Not Found')).toBeVisible(); + }); }); } diff --git a/e2e/fixtures/define-router/private/hi.txt b/e2e/fixtures/define-router/private/hi.txt new file mode 100644 index 000000000..0ecb6f596 --- /dev/null +++ b/e2e/fixtures/define-router/private/hi.txt @@ -0,0 +1 @@ +hello from a text file! \ No newline at end of file diff --git a/e2e/fixtures/define-router/src/entries.tsx b/e2e/fixtures/define-router/src/entries.tsx index 04bb401a0..047aaa2e9 100644 --- a/e2e/fixtures/define-router/src/entries.tsx +++ b/e2e/fixtures/define-router/src/entries.tsx @@ -5,6 +5,7 @@ import { Slot, Children } from 'waku/minimal/client'; import Layout from './routes/layout.js'; import Page from './routes/page.js'; import FooPage from './routes/foo/page.js'; +import { readFile } from 'node:fs/promises'; const STATIC_PATHS = ['/', '/foo']; const PATH_PAGE: Record = { @@ -59,6 +60,61 @@ const router: ReturnType = defineRouter({ }, }; }, + getApiConfig: async () => [ + { + path: [ + { type: 'literal', name: 'api' }, + { type: 'literal', name: 'hi' }, + ], + isStatic: true, + }, + { + path: [ + { type: 'literal', name: 'api' }, + { type: 'literal', name: 'hi.txt' }, + ], + isStatic: false, + }, + { + path: [ + { type: 'literal', name: 'api' }, + { type: 'literal', name: 'empty' }, + ], + isStatic: true, + }, + ], + handleApi: async (path) => { + if (path === '/api/hi.txt') { + const hiTxt = await readFile('./private/hi.txt'); + + return { + status: 200, + body: new ReadableStream({ + start(controller) { + controller.enqueue(hiTxt); + controller.close(); + }, + }), + }; + } else if (path === '/api/hi') { + return { + status: 200, + body: new ReadableStream({ + start(controller) { + controller.enqueue(new TextEncoder().encode('hello world!')); + controller.close(); + }, + }), + }; + } else if (path === '/api/empty') { + return { + status: 200, + }; + } + return { + status: 404, + }; + }, }); export default router;