Skip to content

Commit 910bc87

Browse files
authored
fix: Ensure Response#mode is 'cors' when Request#type is 'cors' (#60)
1 parent 1c9d844 commit 910bc87

6 files changed

+83
-10
lines changed

src/custom-request.js

+16
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ export function createCustomRequest(RequestClass) {
3434
// ensure id is not writable
3535
Object.defineProperty(this, "id", { writable: false });
3636

37+
/*
38+
* Default setting for `mode` is "cors" in the fetch API.
39+
* Not all runtimes follow the spec, so we need to ensure
40+
* that the `mode` property is set correctly.
41+
*/
42+
const expectedMode = init?.mode ?? "cors";
43+
44+
if (expectedMode !== this.mode) {
45+
Object.defineProperty(this, "mode", {
46+
configurable: true,
47+
enumerable: true,
48+
value: expectedMode,
49+
writable: false,
50+
});
51+
}
52+
3753
/*
3854
* Not all runtimes properly support the `credentials` property.
3955
* Bun's fetch implementation sets credentials to "include" by default

src/fetch-mocker.js

+5
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ export class FetchMocker {
324324
);
325325

326326
if (response) {
327+
// Set response.url and type
328+
Object.defineProperties(response, {
329+
url: { value: request.url },
330+
type: { value: request.mode === "cors" ? "cors" : "default" }
331+
});
327332
return response;
328333
}
329334

src/mock-server.js

-1
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,6 @@ export class MockServer {
512512
* need to set it after creating the response.
513513
*/
514514
const response = await route.createResponse(clonedRequest, PreferredResponse);
515-
Object.defineProperty(response, "url", { value: request.url });
516515

517516
return { response, traces };
518517
}

tests/custom-request.test.js

+6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ describe("createCustomRequest()", () => {
5252
assert.ok(request instanceof Request);
5353
});
5454

55+
it("should have a default mode of 'cors'", () => {
56+
const request = new CustomRequest(TEST_URL);
57+
58+
assert.strictEqual(request.mode, "cors");
59+
});
60+
5561
describe("clone()", () => {
5662

5763
it("should have the same class as the original request", () => {

tests/fetch-mocker.test.js

+49
Original file line numberDiff line numberDiff line change
@@ -2342,4 +2342,53 @@ describe("FetchMocker", () => {
23422342
);
23432343
});
23442344
});
2345+
2346+
describe("Response types", () => {
2347+
it("should set response type to 'cors' when request mode is 'cors'", async () => {
2348+
const server = new MockServer(API_URL);
2349+
const fetchMocker = new FetchMocker({
2350+
servers: [server],
2351+
baseUrl: ALT_BASE_URL
2352+
});
2353+
2354+
server.get("/hello", {
2355+
status: 200,
2356+
headers: {
2357+
"Access-Control-Allow-Origin": ALT_BASE_URL
2358+
}
2359+
});
2360+
2361+
const response = await fetchMocker.fetch(API_URL + "/hello", {
2362+
mode: "cors"
2363+
});
2364+
2365+
assert.strictEqual(response.type, "cors");
2366+
});
2367+
2368+
it("should set response type to 'cors' when request mode is undefined", async () => {
2369+
const server = new MockServer(API_URL);
2370+
const fetchMocker = new FetchMocker({
2371+
servers: [server]
2372+
});
2373+
2374+
server.get("/hello", 200);
2375+
2376+
const response = await fetchMocker.fetch(API_URL + "/hello");
2377+
assert.strictEqual(response.type, "cors");
2378+
});
2379+
2380+
it("should set response type to 'default' when request mode is 'no-cors'", async () => {
2381+
const server = new MockServer(API_URL);
2382+
const fetchMocker = new FetchMocker({
2383+
servers: [server]
2384+
});
2385+
2386+
server.get("/hello", 200);
2387+
2388+
const response = await fetchMocker.fetch(API_URL + "/hello", {
2389+
mode: "no-cors"
2390+
});
2391+
assert.strictEqual(response.type, "default");
2392+
});
2393+
});
23452394
});

tests/mock-server.test.js

+7-9
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,9 @@ describe("MockServer", () => {
246246
});
247247

248248
const response = await server.receive(request);
249-
assert.strictEqual(response.url, `${BASE_URL}/test?foo=bar`);
249+
assert.strictEqual(response.status, 200);
250+
assert.strictEqual(response.statusText, "OK");
251+
assert.strictEqual(await getResponseBody(response), "OK");
250252
});
251253

252254
it("should delay the response by at least 500ms", async () => {
@@ -258,15 +260,14 @@ describe("MockServer", () => {
258260
});
259261

260262
const startTime = Date.now();
261-
const response = await server.receive(request);
263+
await server.receive(request);
262264
const elapsed = Date.now() - startTime;
263265

264266
// Note: Bun's clock runs fast so could be a bit under 500ms
265267
assert.ok(
266268
elapsed >= 475,
267269
`Response was delayed ${elapsed}ms, expected at least 500ms.`,
268-
);
269-
assert.strictEqual(response.url, `${BASE_URL}/test?foo=bar`);
270+
);
270271
});
271272

272273
describe("ResponseCreator Functions", () => {
@@ -286,7 +287,6 @@ describe("MockServer", () => {
286287
const response = await server.receive(request);
287288
assert.strictEqual(response.status, 200);
288289
assert.strictEqual(response.statusText, "OK");
289-
assert.strictEqual(response.url, `${BASE_URL}/test?foo=bar`);
290290
assert.strictEqual(response.headers.get("custom"), "header");
291291
assert.strictEqual(await getResponseBody(response), "Hi");
292292
});
@@ -300,15 +300,14 @@ describe("MockServer", () => {
300300
});
301301

302302
const startTime = Date.now();
303-
const response = await server.receive(request);
303+
await server.receive(request);
304304
const elapsed = Date.now() - startTime;
305305

306306
// Note: Bun's clock runs fast so could be a bit under 500ms
307307
assert.ok(
308308
elapsed >= 475,
309309
`Response was delayed ${elapsed}ms, expected at least 500ms.`,
310310
);
311-
assert.strictEqual(response.url, `${BASE_URL}/test?foo=bar`);
312311
});
313312

314313
it("should pass a Request object to the function", async () => {
@@ -328,8 +327,7 @@ describe("MockServer", () => {
328327
url: `${BASE_URL}/test?foo=bar`,
329328
});
330329

331-
const response = await server.receive(request);
332-
assert.strictEqual(response.url, `${BASE_URL}/test?foo=bar`);
330+
await server.receive(request);
333331
});
334332

335333
});

0 commit comments

Comments
 (0)