diff --git a/src/server/middleware/nonce-stream-transform.test.ts b/src/server/middleware/nonce-stream-transform.test.ts new file mode 100644 index 00000000..37a3cc23 --- /dev/null +++ b/src/server/middleware/nonce-stream-transform.test.ts @@ -0,0 +1,77 @@ +import { describe, expect, it } from "vitest"; +import { Readable } from "node:stream"; +import { wrapSsrStreamWithNonce } from "./nonce-stream-transform.js"; + +function streamToString(stream: NodeJS.ReadableStream): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + stream.on("data", (chunk: Buffer) => chunks.push(Buffer.from(chunk))); + stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8"))); + stream.on("error", reject); + }); +} + +function createStream(chunks: string[]): NodeJS.ReadableStream { + return new Readable({ + read() { + for (const chunk of chunks) { + this.push(chunk); + } + this.push(null); + }, + }); +} + +const NONCE = "test-nonce-abc123"; + +describe("wrapSsrStreamWithNonce", () => { + it("injects nonce on bare "]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toContain(``]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toContain(``]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toContain(``]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toBe(``); + expect(result).not.toContain(NONCE); + }); + + it("handles multiple script tags in one chunk", async () => { + const input = createStream([ + ``, + ]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toContain(``); + expect(result).toContain(``); + expect(result).toContain(``, + ]); + const output = wrapSsrStreamWithNonce(input, NONCE); + const result = await streamToString(output); + expect(result).toContain(`