Files
buzz-sheet/lib/guides/export-image.test.ts
T
gunshiz fbc4d9d4b2
CI / Verify (push) Successful in 1m2s
CI / Build immutable images and deploy (push) Successful in 1m48s
feat(constellations) : add infographic image export
2026-09-03 15:07:22 +07:00

50 lines
1.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
constellationChartRows,
imageContentDisposition,
} from "@/lib/guides/export-image";
describe("guide image downloads", () => {
it("provides a safe ASCII fallback and a UTF-8 filename", () => {
expect(imageContentDisposition("ไกด์อาวุธ", "weapons")).toBe(
"attachment; filename=\"weapons.png\"; filename*=UTF-8''%E0%B9%84%E0%B8%81%E0%B8%94%E0%B9%8C%E0%B8%AD%E0%B8%B2%E0%B8%A7%E0%B8%B8%E0%B8%98.png",
);
});
it("sanitizes punctuation in the fallback filename", () => {
expect(imageContentDisposition("Arlecchino / R5", "weapons")).toContain(
'filename="Arlecchino-R5.png"',
);
});
it("orders constellation levels, adds C0, and scales against the maximum", () => {
const rows = constellationChartRows([
{ level: 1, cumulativePercent: "117", isGreat: false },
{ level: 6, cumulativePercent: "234", isGreat: true },
]);
expect(rows.slice(0, 2)).toEqual([
{ level: 6, percent: 234, isGreat: true, widthPercent: 100 },
{ level: 1, percent: 117, isGreat: false, widthPercent: 50 },
]);
expect(rows[2]).toMatchObject({
level: 0,
percent: 100,
isGreat: false,
});
expect(rows[2].widthPercent).toBeCloseTo(100 / 2.34);
});
it("uses 100% as the minimum constellation chart scale", () => {
expect(
constellationChartRows([
{ level: 2, cumulativePercent: "80", isGreat: false },
]),
).toEqual([
{ level: 2, percent: 80, isGreat: false, widthPercent: 80 },
{ level: 0, percent: 100, isGreat: false, widthPercent: 100 },
]);
});
});