Skip to content
Source
Sign inSign up

imageMime.test.ts

59 lines2.2 KB

1import { describe, expect, it } from "vite-plus/test";
2​
3import { inferImageExtension, parseBase64DataUrl } from "./imageMime.ts";
4​
5describe("imageMime", () => {
6 it("parses base64 data URL with mime parameters", () => {
7 expect(parseBase64DataUrl("data:image/png;charset=utf-8;base64,SGVsbG8=")).toEqual({
8 mimeType: "image/png",
9 base64: "SGVsbG8=",
10 });
11 });
12​
13 it("parses base64 data URL with spaces in payload", () => {
14 expect(parseBase64DataUrl("data:image/png;base64,SGVs bG8=\n")).toEqual({
15 mimeType: "image/png",
16 base64: "SGVsbG8=",
17 });
18 });
19​
20 it("rejects payload with characters outside the base64 alphabet", () => {
21 expect(parseBase64DataUrl("data:image/png;base64,SGVs!bG8=")).toBeNull();
22 expect(parseBase64DataUrl("data:image/png;base64,SGVs,bG8=")).toBeNull();
23 });
24​
25 // regression: #3952 image upload crashed dispatchCommand with a stack overflow
26 it("rejects structurally malformed base64", () => {
27 expect(parseBase64DataUrl("data:image/png;base64,AB=CD===")).toBeNull();
28 expect(parseBase64DataUrl("data:image/png;base64,SGV=bG8=")).toBeNull();
29 expect(parseBase64DataUrl("data:image/png;base64,SGVsbG8=====AAA")).toBeNull();
30 expect(parseBase64DataUrl("data:image/png;base64,SGVsbG8")).toBeNull();
31 });
32​
33 it("accepts base64 with one or two trailing padding characters", () => {
34 expect(parseBase64DataUrl("data:image/png;base64,SGVsbA==")).toEqual({
35 mimeType: "image/png",
36 base64: "SGVsbA==",
37 });
38 expect(parseBase64DataUrl("data:image/png;base64,SGVsbG8h")).toEqual({
39 mimeType: "image/png",
40 base64: "SGVsbG8h",
41 });
42 });
43​
44 it("rejects empty and whitespace-only payloads", () => {
45 expect(parseBase64DataUrl("data:image/png;base64,")).toBeNull();
46 expect(parseBase64DataUrl("data:image/png;base64, \r\n")).toBeNull();
47 });
48​
49 it("parses a case-insensitive scheme and mime type", () => {
50 expect(parseBase64DataUrl("DATA:IMAGE/PNG;BASE64,SGVsbG8=")).toEqual({
51 mimeType: "image/png",
52 base64: "SGVsbG8=",
53 });
54 });
55​
56 it("does not read inherited keys from mime extension map", () => {
57 expect(inferImageExtension({ mimeType: "constructor" })).toBe(".bin");
58 });
59});