diff --git a/packages/miniflare/test/plugins/kv/index.spec.ts b/packages/miniflare/test/plugins/kv/index.spec.ts index b540974570..bb16aed11c 100644 --- a/packages/miniflare/test/plugins/kv/index.spec.ts +++ b/packages/miniflare/test/plugins/kv/index.spec.ts @@ -117,6 +117,27 @@ test("get: returns value", async ({ expect }) => { expect(result).toBe("value"); }); +test("get: returns ArrayBuffer values", async ({ expect }) => { + const { kv } = ctx; + const bytes = Uint8Array.from([0, 1, 2, 127, 128, 254, 255]); + await kv.put("array-buffer-key", bytes.buffer); + + const result = await kv.get("array-buffer-key", "arrayBuffer"); + expect(result).not.toBeNull(); + expect(new Uint8Array(result as NonNullable)).toEqual(bytes); +}); + +test("get: returns stream values", async ({ expect }) => { + const { kv } = ctx; + const bytes = Uint8Array.from([255, 0, 10, 20, 30, 200]); + await kv.put("stream-key", new Blob([bytes]).stream()); + + const result = await kv.get("stream-key", "stream"); + expect(new Uint8Array(await new Response(result).arrayBuffer())).toEqual( + bytes + ); +}); + test("bulk get: returns value", async ({ expect }) => { const { kv } = ctx; await kv.put("key1", "value1"); diff --git a/packages/miniflare/test/plugins/local-explorer/kv.spec.ts b/packages/miniflare/test/plugins/local-explorer/kv.spec.ts index 1b72a00928..a53b694515 100644 --- a/packages/miniflare/test/plugins/local-explorer/kv.spec.ts +++ b/packages/miniflare/test/plugins/local-explorer/kv.spec.ts @@ -260,6 +260,19 @@ describe("KV API", () => { expect(response.status).toBe(200); expect(await response.text()).toBe("special-value"); }); + + test("returns raw bytes for ArrayBuffer values", async ({ expect }) => { + const kv = await mf.getKVNamespace("TEST_KV"); + const bytes = Uint8Array.from([0, 1, 2, 127, 128, 254, 255]); + await kv.put("binary-get-key", bytes.buffer); + + const response = await mf.dispatchFetch( + `${BASE_URL}/storage/kv/namespaces/test-kv-id/values/binary-get-key` + ); + + expect(response.status).toBe(200); + expect(new Uint8Array(await response.arrayBuffer())).toEqual(bytes); + }); }); describe("PUT /storage/kv/namespaces/:namespaceId/values/:keyName", () => { @@ -316,6 +329,33 @@ describe("KV API", () => { errors: [expect.objectContaining({ code: 10013 })], }); }); + + test("writes streamed binary values", async ({ expect }) => { + const bytes = Uint8Array.from([255, 0, 10, 20, 30, 200]); + const response = await mf.dispatchFetch( + `${BASE_URL}/storage/kv/namespaces/test-kv-id/values/put-stream-key`, + { + body: new Blob([bytes]).stream(), + duplex: "half", + headers: { + "Content-Type": "application/octet-stream", + }, + method: "PUT", + } + ); + + expect(response.status).toBe(200); + expect(await response.json()).toMatchObject({ success: true }); + + const kv = await mf.getKVNamespace("TEST_KV"); + const stored = await kv.get("put-stream-key", { type: "arrayBuffer" }); + + expect(stored).not.toBeNull(); + if (stored === null) { + throw new Error("Expected put-stream-key to be stored in KV"); + } + expect(new Uint8Array(stored)).toEqual(bytes); + }); }); describe("DELETE /storage/kv/namespaces/:namespaceId/values/:keyName", () => {