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("")), 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("")), APIException, "not a recognised image", ); const big = new Uint8Array(5 * 1024 * 1024 + 1); big.set(PNG); assertThrows(() => validateImageUpload(big), APIException, "too large"); });