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);
});
});