70bf21e064
Deploy (to testing) and Test Playground Preview Worker / Deploy Playground Preview Worker (testing) (push) Has been skipped
Deploy Workers Shared Staging / Deploy Workers Shared Staging (push) Failing after 0s
Prerelease / build (push) Has been skipped
Handle Changesets / Handle Changesets (push) Has been cancelled
Semgrep OSS scan / semgrep-oss (push) Has been cancelled
105 lines
2.9 KiB
TypeScript
105 lines
2.9 KiB
TypeScript
import events from "node:events";
|
|
import { exports } from "cloudflare:workers";
|
|
import { afterEach, assert, it, vi } from "vitest";
|
|
|
|
afterEach(() => {
|
|
vi.restoreAllMocks();
|
|
});
|
|
|
|
it("mocks GET requests", async ({ expect }) => {
|
|
vi.spyOn(globalThis, "fetch").mockImplementation(async (input, init) => {
|
|
const request = new Request(input, init);
|
|
const url = new URL(request.url);
|
|
|
|
if (
|
|
request.method === "GET" &&
|
|
url.origin === "https://cloudflare.com" &&
|
|
url.pathname === "/path"
|
|
) {
|
|
return new Response("✅");
|
|
}
|
|
|
|
throw new Error("No mock found");
|
|
});
|
|
|
|
// Host `example.com` will be rewritten to `cloudflare.com` by the Worker
|
|
let response = await exports.default.fetch("https://example.com/path");
|
|
expect(response.status).toBe(200);
|
|
expect(await response.text()).toBe("✅");
|
|
|
|
// Invalid paths shouldn't match
|
|
response = await exports.default.fetch("https://example.com/bad");
|
|
expect(response.status).toBe(500);
|
|
expect(await response.text()).toMatch("No mock found");
|
|
});
|
|
|
|
it("mocks POST requests", async ({ expect }) => {
|
|
vi.spyOn(globalThis, "fetch").mockImplementation(async (input, init) => {
|
|
const request = new Request(input, init);
|
|
const url = new URL(request.url);
|
|
const body = await request.text();
|
|
|
|
if (
|
|
request.method === "POST" &&
|
|
url.origin === "https://cloudflare.com" &&
|
|
url.pathname === "/path" &&
|
|
body === "✨"
|
|
) {
|
|
return new Response("✅");
|
|
}
|
|
|
|
throw new Error("No mock found");
|
|
});
|
|
|
|
const response = await exports.default.fetch("https://example.com/path", {
|
|
method: "POST",
|
|
body: "✨",
|
|
});
|
|
expect(response.status).toBe(200);
|
|
expect(await response.text()).toBe("✅");
|
|
});
|
|
|
|
it("mocks WebSocket requests", async ({ expect }) => {
|
|
vi.spyOn(globalThis, "fetch").mockImplementation(async (input, init) => {
|
|
const request = new Request(input, init);
|
|
const url = new URL(request.url);
|
|
|
|
if (
|
|
request.method === "GET" &&
|
|
url.origin === "https://cloudflare.com" &&
|
|
url.pathname === "/ws" &&
|
|
request.headers.get("Upgrade") === "websocket"
|
|
) {
|
|
const { 0: socket, 1: responseSocket } = new WebSocketPair();
|
|
socket.addEventListener("message", (event) => {
|
|
assert(typeof event.data === "string");
|
|
socket.send(event.data.toUpperCase());
|
|
});
|
|
socket.accept();
|
|
return new Response(null, {
|
|
status: 101,
|
|
webSocket: responseSocket,
|
|
});
|
|
}
|
|
|
|
throw new Error("No mock found");
|
|
});
|
|
|
|
// Send WebSocket request and assert WebSocket response received...
|
|
const response = await exports.default.fetch("https://example.com/ws", {
|
|
headers: { Upgrade: "websocket" },
|
|
});
|
|
expect(response.status).toBe(101);
|
|
const webSocket = response.webSocket;
|
|
assert(webSocket !== null); // Using `assert()` for type narrowing
|
|
|
|
// ...then accept WebSocket and send/receive message
|
|
const eventPromise = events.once(webSocket, "message") as Promise<
|
|
[MessageEvent] /* args */
|
|
>;
|
|
webSocket.accept();
|
|
webSocket.send("hello");
|
|
const args = await eventPromise;
|
|
expect(args[0].data).toBe("HELLO");
|
|
});
|