1import { assert, describe, it } from "@effect/vitest"
2import * as Mime from "effect/http/Mime"
3import * as Option from "effect/Option"
4
5describe("Mime", () => {
6 it("looks up common static file types", () => {
7 assert.deepStrictEqual(Mime.getType("index.html"), Option.some("text/html"))
8 assert.deepStrictEqual(Mime.getType("styles.css"), Option.some("text/css"))
9 assert.deepStrictEqual(Mime.getType("app.js"), Option.some("text/javascript"))
10 assert.deepStrictEqual(Mime.getType("image.png"), Option.some("image/png"))
11 assert.deepStrictEqual(Mime.getType("document.pdf"), Option.some("application/pdf"))
12 assert.deepStrictEqual(Mime.getType("font.woff2"), Option.some("font/woff2"))
13 })
14
15 it("looks up standard MIME types", () => {
16 assert.deepStrictEqual(Mime.getType("feed.atom"), Option.some("application/atom+xml"))
17 assert.deepStrictEqual(Mime.getType("archive.jar"), Option.some("application/java-archive"))
18 assert.deepStrictEqual(Mime.getType("calendar.ics"), Option.some("text/calendar"))
19 assert.deepStrictEqual(Mime.getType("model.glb"), Option.some("model/gltf-binary"))
20 })
21
22 it("returns none for unknown and missing extensions", () => {
23 assert.deepStrictEqual(Mime.getType("file.unknown"), Option.none())
24 assert.deepStrictEqual(Mime.getType("/directory/file"), Option.none())
25 })
26
27 it("handles extensions case-insensitively", () => {
28 assert.deepStrictEqual(Mime.getType("/directory/INDEX.HTML"), Option.some("text/html"))
29 assert.deepStrictEqual(Mime.getType("PHOTO.JpEg"), Option.some("image/jpeg"))
30 })
31
32 it("exposes reverse lookups at the module level", () => {
33 assert.deepStrictEqual(Mime.getExtension("text/html; charset=utf-8"), Option.some("html"))
34 assert.deepStrictEqual(Mime.getAllExtensions("text/html"), Option.some(new Set(["html", "htm", "shtml"])))
35 assert.deepStrictEqual(
36 Mime.getAllExtensions("text/html; charset=utf-8"),
37 Option.some(new Set(["html", "htm", "shtml"]))
38 )
39 })
40})