All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 50s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import "../setup.ts";
|
|
import { PNG } from "../helpers.ts";
|
|
import { assertEquals, assertThrows } from "@std/assert";
|
|
import { detectImageMime, validateImageUpload } from "../../lib/upload.ts";
|
|
import { APIException } from "../../lib/api-exception.ts";
|
|
|
|
Deno.test("detectImageMime: sniffs magic bytes, not names", () => {
|
|
assertEquals(detectImageMime(PNG), "image/png");
|
|
assertEquals(
|
|
detectImageMime(new Uint8Array([0xff, 0xd8, 0xff, 0xe0])),
|
|
"image/jpeg",
|
|
);
|
|
assertEquals(
|
|
detectImageMime(new TextEncoder().encode("GIF89a")),
|
|
"image/gif",
|
|
);
|
|
assertEquals(
|
|
detectImageMime(new TextEncoder().encode("RIFF\0\0\0\0WEBPVP8 ")),
|
|
"image/webp",
|
|
);
|
|
assertEquals(
|
|
detectImageMime(new TextEncoder().encode("RIFF\0\0\0\0WAVEfmt ")),
|
|
null,
|
|
);
|
|
assertEquals(
|
|
detectImageMime(new TextEncoder().encode("<svg xmlns=...>")),
|
|
null,
|
|
);
|
|
assertEquals(detectImageMime(new Uint8Array()), null);
|
|
});
|
|
|
|
Deno.test("validateImageUpload: rejects non-images and anything over 5 MB", () => {
|
|
assertEquals(validateImageUpload(PNG), "image/png");
|
|
assertThrows(
|
|
() => validateImageUpload(new TextEncoder().encode("<html>")),
|
|
APIException,
|
|
"not a recognised image",
|
|
);
|
|
const big = new Uint8Array(5 * 1024 * 1024 + 1);
|
|
big.set(PNG);
|
|
assertThrows(() => validateImageUpload(big), APIException, "too large");
|
|
});
|