import { createHmac } from "node:crypto"; import { describe, expect, it } from "vitest"; import { signAvatarSrcs, signedAvatarUrl } from "#lib/server/avatar.ts"; const SERVICE = "https://avatar.test"; const sig = (did: string) => createHmac("sha256", "s3cret").update(did).digest("hex"); describe("signedAvatarUrl", () => { it("signs the did and keeps only size, format and v", () => { const search = new URLSearchParams("size=42&v=3&evil=1"); expect(signedAvatarUrl(SERVICE, "s3cret", "did:plc:alice", search)).toBe( `${SERVICE}/${sig("did:plc:alice")}/did:plc:alice?size=42&v=3` ); }); }); describe("signAvatarSrcs", () => { it("points server rendered avatars at the service", () => { const html = ''; expect(signAvatarSrcs(html, SERVICE, "s3cret")).toBe( `` ); }); it("handles a src without a query", () => { expect(signAvatarSrcs('', SERVICE, "s3cret")).toBe( `` ); }); it.each([ '', '', '', '{"avatar":"/avatar/did%3Aplc%3Aalice"}', '' ])("leaves %s alone", (html) => { expect(signAvatarSrcs(html, SERVICE, "s3cret")).toBe(html); }); });