-
-
Notifications
You must be signed in to change notification settings - Fork 146
Expand file tree
/
Copy pathevent-stream.test.ts
More file actions
115 lines (92 loc) · 3.22 KB
/
event-stream.test.ts
File metadata and controls
115 lines (92 loc) · 3.22 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
/* eslint-disable @typescript-eslint/no-empty-function */
import { vi, describe, test, expect } from "vitest";
import { eventStream } from "../../src/server/event-stream";
describe(eventStream, () => {
test("returns a response", () => {
let controller = new AbortController();
let response = eventStream(controller.signal, (_, __) => {
return () => {};
});
controller.abort();
expect(response).toBeInstanceOf(Response);
});
test("response is a readable stream", async () => {
let controller = new AbortController();
let response = eventStream(controller.signal, (_, __) => {
return () => {};
});
controller.abort();
if (!response.body) throw new Error("Response body is undefined");
let reader = response.body.getReader();
let { done } = await reader.read();
expect(done).toBe(true);
});
test("can send data to the client with the send function", async () => {
let controller = new AbortController();
let response = eventStream(controller.signal, (send, _) => {
send({ data: "hello" });
send({ event: "multi-line", data: "hello\nworld" });
return () => {};
});
controller.abort();
if (!response.body) throw new Error("Response body is undefined");
let reader = response.body.getReader();
let decoder = new TextDecoder();
let { value: event } = await reader.read();
expect(decoder.decode(event)).toEqual("event: message\n");
let { value: data } = await reader.read();
expect(decoder.decode(data)).toEqual("data: hello\n\n");
let { value: multiLineEvent } = await reader.read();
expect(decoder.decode(multiLineEvent)).toEqual("event: multi-line\n");
let { value: multiLineData } = await reader.read();
expect(decoder.decode(multiLineData)).toEqual(
"data: hello\ndata: world\n\n",
);
let { done } = await reader.read();
expect(done).toBe(true);
});
describe("Headers Overrides", () => {
test("overrrides Content-Type header", () => {
let spy = vi.spyOn(console, "warn").mockImplementation(() => {});
let response = eventStream(
new AbortController().signal,
(_, abort) => {
return () => abort();
},
{ headers: { "Content-Type": "text/html" } },
);
expect(spy).toHaveBeenCalledWith(
"Overriding Content-Type header to `text/event-stream`",
);
expect(response.headers.get("Content-Type")).toBe("text/event-stream");
});
test("overrides Cache-Control", () => {
let spy = vi.spyOn(console, "warn").mockImplementation(() => {});
let response = eventStream(
new AbortController().signal,
(_, abort) => {
return () => abort();
},
{ headers: { "Cache-Control": "max-age=60" } },
);
expect(spy).toHaveBeenCalledWith(
"Overriding Cache-Control header to `no-cache`",
);
expect(response.headers.get("Content-Type")).toBe("text/event-stream");
});
test("overrides Connection", () => {
let spy = vi.spyOn(console, "warn").mockImplementation(() => {});
let response = eventStream(
new AbortController().signal,
(_, abort) => {
return () => abort();
},
{ headers: { Connection: "close" } },
);
expect(spy).toHaveBeenCalledWith(
"Overriding Connection header to `keep-alive`",
);
expect(response.headers.get("Content-Type")).toBe("text/event-stream");
});
});
});