import { describe, expect, it } from "vitest"; import { Schema } from "effect"; import { decodeRequestJsonOrThrow, decodeUnknownOrThrow, } from "$lib/Effect/requestBody"; describe("request body effect decoders", () => { it("decodes unknown payload with a schema", () => { const decoded = decodeUnknownOrThrow(Schema.Array(Schema.String), [ "a", "b", "c", ]); expect(decoded).toEqual(["a", "b", "c"]); }); it("throws when payload does not match schema", () => { expect(() => decodeUnknownOrThrow(Schema.Array(Schema.String), ["a", 2]), ).toThrowError(); }); it("decodes request.json body with schema", async () => { const request = new Request("https://due.moe/api/preferences", { method: "PUT", headers: { "content-type": "application/json", }, body: JSON.stringify(["seasonal", "ongoing"]), }); const decoded = await decodeRequestJsonOrThrow( request, Schema.Array(Schema.String), ); expect(decoded).toEqual(["seasonal", "ongoing"]); }); it("decodes request.json object body with record schema", async () => { const request = new Request("https://due.moe/api/configuration", { method: "PUT", headers: { "content-type": "application/json", }, body: JSON.stringify({ theme: "dark", notifications: true }), }); const decoded = await decodeRequestJsonOrThrow( request, Schema.Record(Schema.String, Schema.Unknown), ); expect(decoded).toEqual({ theme: "dark", notifications: true }); }); });