summaryrefslogtreecommitdiff
path: root/tests/fileUtils.test.ts
blob: 15bfa3dd80ba00252483fff421714c843495b07a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { assertEquals, assertExists } from "@std/assert";
import {
  getUniqueFilename,
  getMimeType,
  isViewableInBrowser,
  formatFileSize,
  isAllowedFileType,
} from "../fileUtils.ts";

Deno.test("getMimeType - returns correct MIME type for images", () => {
  assertEquals(getMimeType("photo.jpg"), "image/jpeg");
  assertEquals(getMimeType("image.png"), "image/png");
  assertEquals(getMimeType("graphic.gif"), "image/gif");
  assertEquals(getMimeType("pic.webp"), "image/webp");
});

Deno.test("getMimeType - returns correct MIME type for videos", () => {
  assertEquals(getMimeType("video.mp4"), "video/mp4");
  assertEquals(getMimeType("clip.webm"), "video/webm");
  assertEquals(getMimeType("movie.avi"), "video/x-msvideo");
});

Deno.test("getMimeType - returns correct MIME type for documents", () => {
  assertEquals(getMimeType("document.pdf"), "application/pdf");
  assertEquals(getMimeType("readme.txt"), "text/plain");
  assertEquals(getMimeType("archive.zip"), "application/zip");
});

Deno.test("getMimeType - handles uppercase extensions", () => {
  assertEquals(getMimeType("PHOTO.JPG"), "image/jpeg");
  assertEquals(getMimeType("Video.MP4"), "video/mp4");
});

Deno.test("getMimeType - returns octet-stream for unknown types", () => {
  assertEquals(getMimeType("file.xyz"), "application/octet-stream");
  assertEquals(getMimeType("noextension"), "application/octet-stream");
});

Deno.test("isViewableInBrowser - images are viewable", () => {
  assertEquals(isViewableInBrowser("image/jpeg"), true);
  assertEquals(isViewableInBrowser("image/png"), true);
  assertEquals(isViewableInBrowser("image/gif"), true);
});

Deno.test("isViewableInBrowser - videos are viewable", () => {
  assertEquals(isViewableInBrowser("video/mp4"), true);
  assertEquals(isViewableInBrowser("video/webm"), true);
});

Deno.test("isViewableInBrowser - PDFs and text are viewable", () => {
  assertEquals(isViewableInBrowser("application/pdf"), true);
  assertEquals(isViewableInBrowser("text/plain"), true);
});

Deno.test("isViewableInBrowser - archives are not viewable", () => {
  assertEquals(isViewableInBrowser("application/zip"), false);
  assertEquals(isViewableInBrowser("application/octet-stream"), false);
});

Deno.test("formatFileSize - formats bytes correctly", () => {
  assertEquals(formatFileSize(0), "0 Bytes");
  assertEquals(formatFileSize(500), "500 Bytes");
  assertEquals(formatFileSize(1024), "1 KB");
  assertEquals(formatFileSize(1536), "1.5 KB");
  assertEquals(formatFileSize(1048576), "1 MB");
  assertEquals(formatFileSize(1073741824), "1 GB");
});

Deno.test("isAllowedFileType - allows configured types", () => {
  assertEquals(isAllowedFileType("image/jpeg"), true);
  assertEquals(isAllowedFileType("application/pdf"), true);
});

Deno.test("getUniqueFilename - returns same name if file doesn't exist", async () => {
  const testDir = await Deno.makeTempDir();

  try {
    // Save original config
    const { config } = await import("../config.ts");
    const originalUploadDir = config.uploadDir;
    config.uploadDir = testDir;

    const filename = await getUniqueFilename("test.txt");
    assertEquals(filename, "test.txt");

    // Restore
    config.uploadDir = originalUploadDir;
  } finally {
    await Deno.remove(testDir, { recursive: true });
  }
});

Deno.test("getUniqueFilename - appends epoch if file exists", async () => {
  const testDir = await Deno.makeTempDir();

  try {
    // Create a test file
    await Deno.writeTextFile(`${testDir}/existing.txt`, "test");

    const { config } = await import("../config.ts");
    const originalUploadDir = config.uploadDir;
    config.uploadDir = testDir;

    const filename = await getUniqueFilename("existing.txt");
    assertEquals(filename.startsWith("existing_"), true);
    assertEquals(filename.endsWith(".txt"), true);

    config.uploadDir = originalUploadDir;
  } finally {
    await Deno.remove(testDir, { recursive: true });
  }
});