-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathutils_test.ts
More file actions
132 lines (110 loc) · 3.58 KB
/
utils_test.ts
File metadata and controls
132 lines (110 loc) · 3.58 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { assertEquals, assertThrows } from "@std/assert"
import { ValidationError } from "@cliffy/command"
import { parseDataUrl, parseMessageSpec, resolveImage } from "./utils.ts"
Deno.test("parseMessageSpec - single number", () => {
assertEquals(parseMessageSpec("3", 5), [2])
})
Deno.test("parseMessageSpec - multiple numbers", () => {
assertEquals(parseMessageSpec("1,3,5", 5), [0, 2, 4])
})
Deno.test("parseMessageSpec - range", () => {
assertEquals(parseMessageSpec("2-4", 5), [1, 2, 3])
})
Deno.test("parseMessageSpec - mixed numbers and ranges", () => {
assertEquals(parseMessageSpec("1,3-4,7", 10), [0, 2, 3, 6])
})
Deno.test("parseMessageSpec - out of order input returns sorted", () => {
assertEquals(parseMessageSpec("7,1,3-4", 10), [0, 2, 3, 6])
})
Deno.test("parseMessageSpec - duplicates are deduplicated", () => {
assertEquals(parseMessageSpec("1,1,2-3,3", 5), [0, 1, 2])
})
Deno.test("parseMessageSpec - whitespace is tolerated", () => {
assertEquals(parseMessageSpec(" 1 , 3 - 4 , 7 ", 10), [0, 2, 3, 6])
})
Deno.test("parseMessageSpec - range start > end throws", () => {
assertThrows(
() => parseMessageSpec("4-2", 5),
ValidationError,
"Invalid range: start > end",
)
})
Deno.test("parseMessageSpec - message number too high throws", () => {
assertThrows(
() => parseMessageSpec("1,10", 5),
ValidationError,
"Message 10 does not exist (chat has 5 messages)",
)
})
Deno.test("parseMessageSpec - message number 0 throws", () => {
assertThrows(
() => parseMessageSpec("0", 5),
ValidationError,
"Message 0 does not exist",
)
})
Deno.test("parseMessageSpec - invalid number throws", () => {
assertThrows(
() => parseMessageSpec("abc", 5),
ValidationError,
"Invalid message number",
)
})
Deno.test("parseMessageSpec - invalid number suffix throws", () => {
assertThrows(
() => parseMessageSpec("1abc", 5),
ValidationError,
'Invalid message number: "1abc"',
)
})
Deno.test("parseMessageSpec - decimal number throws", () => {
assertThrows(
() => parseMessageSpec("1.5", 5),
ValidationError,
'Invalid message number: "1.5"',
)
})
Deno.test("parseMessageSpec - invalid range throws", () => {
assertThrows(
() => parseMessageSpec("a-b", 5),
ValidationError,
"Invalid range",
)
})
Deno.test("parseMessageSpec - invalid range suffix throws", () => {
assertThrows(
() => parseMessageSpec("1-2-3", 5),
ValidationError,
'Invalid range: "1-2-3"',
)
})
Deno.test("parseDataUrl - valid png data URL", () => {
assertEquals(
parseDataUrl("data:image/png;base64,iVBORw0KGgo="),
{ mediaType: "image/png", data: "iVBORw0KGgo=" },
)
})
Deno.test("parseDataUrl - base64 payload with newlines", () => {
// /s flag must be set on the regex so . matches newlines
assertEquals(
parseDataUrl("data:image/jpeg;base64,AAAA\nBBBB\nCCCC"),
{ mediaType: "image/jpeg", data: "AAAA\nBBBB\nCCCC" },
)
})
Deno.test("parseDataUrl - non-data URL returns null", () => {
assertEquals(parseDataUrl("https://example.com/foo.png"), null)
})
Deno.test("parseDataUrl - missing base64 marker returns null", () => {
assertEquals(parseDataUrl("data:image/png,iVBORw0KGgo="), null)
})
Deno.test("parseDataUrl - empty string returns null", () => {
assertEquals(parseDataUrl(""), null)
})
Deno.test("resolveImage - http URL passes through", async () => {
const url = "http://example.com/cat.png"
assertEquals(await resolveImage(url), url)
})
Deno.test("resolveImage - https URL passes through", async () => {
const url = "https://example.com/cat.png"
assertEquals(await resolveImage(url), url)
})