components.test.ts
Raw
1import { expect, test } from "bun:test";
2import { humanReadableTime, ShowFile } from "./components";
3
4const UUID = "00000000-0000-0000-0000-000000000000";
5
6test("escapes filename in the file view (no stored XSS)", () => {
7 const evil = "<img src=x onerror=alert(1)>";
8 const html = ShowFile({
9 filename: evil,
10 uuid: UUID,
11 filetype: "none",
12 deleteAt: null,
13 size: 2,
14 preview: { kind: "text", html: "hi" },
15 });
16 expect(html).not.toContain(evil);
17 expect(html).toContain("&lt;img");
18});
19
20test("escapes filename in the encrypted overlay (no stored XSS)", () => {
21 const evil = "<script>alert(1)</script>";
22 const html = ShowFile({
23 filename: evil,
24 uuid: UUID,
25 filetype: "none",
26 deleteAt: null,
27 size: null,
28 preview: { kind: "await" },
29 });
30 expect(html).not.toContain(evil);
31 expect(html).toContain("&lt;script&gt;");
32});
33
34test("humanReadableTime breaks a total down (no spurious 'expired')", () => {
35 expect(humanReadableTime(4320)).toBe("3 days"); // exact multiple of a day
36 expect(humanReadableTime(120)).toBe("2 hours"); // exact multiple of an hour
37 expect(humanReadableTime(1)).toBe("1 minute");
38 expect(humanReadableTime(1501)).toBe("1 day 1 hour 1 minute");
39 expect(humanReadableTime(0)).toBe("expired");
40 expect(humanReadableTime(-5)).toBe("expired");
41});
42