generated from slack-samples/deno-starter-template
-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathtest_utils.ts
More file actions
82 lines (67 loc) · 2.18 KB
/
test_utils.ts
File metadata and controls
82 lines (67 loc) · 2.18 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
import { type Stub, stub } from "@std/testing/mock";
interface StubRequestHandler {
assertion: (req: Request) => void | Promise<void>;
response: Response;
}
export class UnmatchedRequestError extends Error {
request: Request;
constructor(request: Request) {
const method = request.method;
const url = request.url;
const headers = JSON.stringify(Object.fromEntries([...request.headers]));
super(`No stub found for ${method} ${url}\nHeaders: ${headers}`);
this.name = "UnmatchedRequestError";
this.request = request;
}
}
export class StubFetch {
private stubs: Map<string, StubRequestHandler> = new Map();
private stubFetchInstance: Stub | null = null;
constructor() {
this.install();
}
stub(stubRequestHandler: StubRequestHandler): StubRequestHandler {
this.stubs.set(stubRequestHandler.assertion.toString(), stubRequestHandler);
return stubRequestHandler;
}
removeStub(stubRequestHandler: StubRequestHandler): boolean {
const assertionKey = stubRequestHandler.assertion.toString();
if (assertionKey in this.stubs) {
return this.stubs.delete(assertionKey);
}
return true;
}
install(): Stub {
this.stubFetchInstance = stub(
globalThis,
"fetch",
async (url: string | URL | Request, options?: RequestInit) => {
const request = url instanceof Request
? url
: new Request(url, options);
for (const stubRequestHandler of this.stubs.values()) {
try {
// Clone the request for each assertion attempt to ensures the body can be read multiple times
const assertionResult = stubRequestHandler.assertion(
request.clone(),
);
if (assertionResult instanceof Promise) {
await assertionResult;
}
return Promise.resolve(stubRequestHandler.response.clone());
} catch (_error) {
// do nothing
}
}
throw new UnmatchedRequestError(request);
},
);
return this.stubFetchInstance;
}
restore(): void {
if (this.stubFetchInstance) {
this.stubFetchInstance.restore();
this.stubFetchInstance = null;
}
}
}