Files
SnapOtter/tests/unit/image-engine/mime.test.ts
T
SnapOtter 0309e0f680 chore: deploy to Cloudflare Pages and update branding
- Add Cloudflare Pages deployment for landing page (snapotter.com) and
  docs (docs.snapotter.com)
- Create deploy-landing.yml and update deploy-docs.yml workflows
- Update CI to ignore apps/landing/** paths
- Fix logo transparency (remove white background) across all apps
- Recreate social-preview.png with SnapOtter branding
- Update all docs URLs from GitHub Pages to docs.snapotter.com
- Update VitePress config: light theme default, fix llms.txt paths
- Add .vitepress/cache/ and .env.* to gitignore
2026-04-24 18:06:29 +08:00

175 lines
5.3 KiB
TypeScript

import { extToMime, formatToExt, formatToMime, mimeToExt } from "@snapotter/image-engine";
import { describe, expect, it } from "vitest";
// ---------------------------------------------------------------------------
// extToMime — file extension to MIME type
// ---------------------------------------------------------------------------
describe("extToMime", () => {
const cases: Array<[string, string]> = [
["jpg", "image/jpeg"],
["jpeg", "image/jpeg"],
["png", "image/png"],
["webp", "image/webp"],
["avif", "image/avif"],
["tiff", "image/tiff"],
["tif", "image/tiff"],
["gif", "image/gif"],
["bmp", "image/bmp"],
["svg", "image/svg+xml"],
["ico", "image/x-icon"],
["heif", "image/heif"],
["heic", "image/heic"],
["jxl", "image/jxl"],
["dng", "image/x-adobe-dng"],
["cr2", "image/x-canon-cr2"],
["nef", "image/x-nikon-nef"],
["arw", "image/x-sony-arw"],
["orf", "image/x-olympus-orf"],
["rw2", "image/x-panasonic-rw2"],
["tga", "image/x-tga"],
["psd", "image/vnd.adobe.photoshop"],
["exr", "image/x-exr"],
["hdr", "image/vnd.radiance"],
];
for (const [ext, mime] of cases) {
it(`maps "${ext}" to "${mime}"`, () => {
expect(extToMime(ext)).toBe(mime);
});
}
it("normalizes uppercase extensions", () => {
expect(extToMime("PNG")).toBe("image/png");
expect(extToMime("JPG")).toBe("image/jpeg");
});
it("strips leading dot from extension", () => {
expect(extToMime(".png")).toBe("image/png");
expect(extToMime(".jpg")).toBe("image/jpeg");
});
it("returns application/octet-stream for unknown extension", () => {
expect(extToMime("xyz")).toBe("application/octet-stream");
expect(extToMime("")).toBe("application/octet-stream");
});
});
// ---------------------------------------------------------------------------
// mimeToExt — MIME type to file extension
// ---------------------------------------------------------------------------
describe("mimeToExt", () => {
const cases: Array<[string, string]> = [
["image/jpeg", "jpg"],
["image/png", "png"],
["image/webp", "webp"],
["image/avif", "avif"],
["image/tiff", "tiff"],
["image/gif", "gif"],
["image/bmp", "bmp"],
["image/svg+xml", "svg"],
["image/x-icon", "ico"],
["image/heif", "heif"],
["image/heic", "heic"],
["image/jxl", "jxl"],
["image/x-adobe-dng", "dng"],
["image/x-canon-cr2", "cr2"],
["image/x-nikon-nef", "nef"],
["image/x-sony-arw", "arw"],
["image/x-olympus-orf", "orf"],
["image/x-panasonic-rw2", "rw2"],
["image/x-tga", "tga"],
["image/vnd.adobe.photoshop", "psd"],
["image/x-exr", "exr"],
["image/vnd.radiance", "hdr"],
];
for (const [mime, ext] of cases) {
it(`maps "${mime}" to "${ext}"`, () => {
expect(mimeToExt(mime)).toBe(ext);
});
}
it("normalizes uppercase MIME types", () => {
expect(mimeToExt("IMAGE/JPEG")).toBe("jpg");
expect(mimeToExt("Image/PNG")).toBe("png");
});
it("returns 'bin' for unknown MIME type", () => {
expect(mimeToExt("application/pdf")).toBe("bin");
expect(mimeToExt("text/plain")).toBe("bin");
expect(mimeToExt("")).toBe("bin");
});
});
// ---------------------------------------------------------------------------
// formatToMime — Sharp format string to MIME type
// ---------------------------------------------------------------------------
describe("formatToMime", () => {
it("maps 'jpeg' (Sharp format) to 'image/jpeg'", () => {
expect(formatToMime("jpeg")).toBe("image/jpeg");
});
it("maps 'png' to 'image/png'", () => {
expect(formatToMime("png")).toBe("image/png");
});
it("maps 'webp' to 'image/webp'", () => {
expect(formatToMime("webp")).toBe("image/webp");
});
it("maps 'gif' to 'image/gif'", () => {
expect(formatToMime("gif")).toBe("image/gif");
});
it("maps 'tiff' to 'image/tiff'", () => {
expect(formatToMime("tiff")).toBe("image/tiff");
});
it("maps 'avif' to 'image/avif'", () => {
expect(formatToMime("avif")).toBe("image/avif");
});
it("maps 'svg' to 'image/svg+xml'", () => {
expect(formatToMime("svg")).toBe("image/svg+xml");
});
it("returns application/octet-stream for unknown format", () => {
expect(formatToMime("unknown")).toBe("application/octet-stream");
});
});
// ---------------------------------------------------------------------------
// formatToExt — Sharp format string to file extension
// ---------------------------------------------------------------------------
describe("formatToExt", () => {
it("maps 'jpeg' to 'jpg'", () => {
expect(formatToExt("jpeg")).toBe("jpg");
});
it("maps 'png' to 'png' (identity)", () => {
expect(formatToExt("png")).toBe("png");
});
it("maps 'webp' to 'webp' (identity)", () => {
expect(formatToExt("webp")).toBe("webp");
});
it("maps 'gif' to 'gif' (identity)", () => {
expect(formatToExt("gif")).toBe("gif");
});
it("maps 'tiff' to 'tiff' (identity)", () => {
expect(formatToExt("tiff")).toBe("tiff");
});
it("normalizes case", () => {
expect(formatToExt("JPEG")).toBe("jpg");
expect(formatToExt("PNG")).toBe("png");
});
it("returns the format itself for unknown formats", () => {
expect(formatToExt("bmp")).toBe("bmp");
expect(formatToExt("xyz")).toBe("xyz");
});
});