Skip to content

Commit 7f5ad65

Browse files
author
Carson Bruce
committed
feat(openapi-fetch): Align tests and vars with feedback
1 parent bd35e6b commit 7f5ad65

File tree

2 files changed

+34
-125
lines changed

2 files changed

+34
-125
lines changed

packages/openapi-fetch/src/index.js

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export default function createClient(clientOptions) {
3434
} = { ...clientOptions };
3535
requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;
3636
baseUrl = removeTrailingSlash(baseUrl);
37-
const middlewares = [];
37+
const globalMiddlewares = [];
3838

3939
/**
4040
* Per-request fetch (keeps settings created in createClient()
@@ -52,7 +52,7 @@ export default function createClient(clientOptions) {
5252
querySerializer: requestQuerySerializer,
5353
bodySerializer = globalBodySerializer ?? defaultBodySerializer,
5454
body,
55-
middleware: fetchMiddlewares = [],
55+
middleware: requestMiddlewares = [],
5656
...init
5757
} = fetchOptions || {};
5858
let finalBaseUrl = baseUrl;
@@ -100,11 +100,8 @@ export default function createClient(clientOptions) {
100100
params.header,
101101
);
102102

103-
const finalMiddlewares = [
104-
// Client level middleware take priority over request-level middleware
105-
...(Array.isArray(middlewares) && middlewares),
106-
...(Array.isArray(fetchMiddlewares) && fetchMiddlewares),
107-
];
103+
// Client level middleware take priority over request-level middleware
104+
const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
108105

109106
const requestInit = {
110107
redirect: "follow",
@@ -302,15 +299,15 @@ export default function createClient(clientOptions) {
302299
if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) {
303300
throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
304301
}
305-
middlewares.push(m);
302+
globalMiddlewares.push(m);
306303
}
307304
},
308305
/** Unregister middleware */
309306
eject(...middleware) {
310307
for (const m of middleware) {
311-
const i = middlewares.indexOf(m);
308+
const i = globalMiddlewares.indexOf(m);
312309
if (i !== -1) {
313-
middlewares.splice(i, 1);
310+
globalMiddlewares.splice(i, 1);
314311
}
315312
}
316313
},
@@ -670,13 +667,3 @@ export function removeTrailingSlash(url) {
670667
}
671668
return url;
672669
}
673-
674-
/**
675-
* Validate middleware object
676-
* @type {import("./index.js").validateMiddleware}
677-
*/
678-
export function validateMiddleware(middleware) {
679-
if (typeof middleware !== "object" || !("onRequest" in middleware || "onResponse" in v || "onError" in middleware)) {
680-
throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
681-
}
682-
}

packages/openapi-fetch/test/middleware/middleware.test.ts

Lines changed: 27 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -194,16 +194,33 @@ test("executes in expected order", async () => {
194194
return request;
195195
},
196196
onResponse({ response }) {
197-
response.headers.set("step", "C");
198-
return response;
197+
const headers = new Headers(response.headers);
198+
headers.set("step", "C");
199+
if (response.headers.get("step") === "D") {
200+
return new Response(response.body, { ...response, headers });
201+
}
199202
},
200203
},
201204
);
202205

203-
const { response } = await client.GET("/posts/{id}", { params: { path: { id: 123 } } });
206+
const { response } = await client.GET("/posts/{id}", {
207+
params: { path: { id: 123 } },
208+
middleware: [
209+
{
210+
onRequest({ request }) {
211+
request.headers.set("step", "D");
212+
return request;
213+
},
214+
onResponse({ response }) {
215+
response.headers.set("step", "D");
216+
return response;
217+
},
218+
},
219+
],
220+
});
204221

205222
// assert requests ended up on step C (array order)
206-
expect(actualRequest.headers.get("step")).toBe("C");
223+
expect(actualRequest.headers.get("step")).toBe("D");
207224

208225
// assert responses ended up on step A (reverse order)
209226
expect(response.headers.get("step")).toBe("A");
@@ -506,117 +523,22 @@ test("skips onResponse handlers when response is returned from onRequest", async
506523
expect(onResponseCalled).toBe(false);
507524
});
508525

509-
test('it should enable a middleware to be added via the "middleware" request option', async () => {
510-
let actualRequest = new Request("https://nottherealurl.fake");
511-
const client = createObservedClient<paths>({}, async (req) => {
512-
actualRequest = new Request(req);
513-
return Response.json({});
514-
});
515-
516-
await client.GET("/posts/{id}", {
517-
params: { path: { id: 123 } },
518-
middleware: [
519-
{
520-
async onRequest({ request }) {
521-
return new Request("https://foo.bar/api/v1", {
522-
...request,
523-
method: "OPTIONS",
524-
headers: { foo: "bar" },
525-
});
526-
},
527-
},
528-
],
529-
});
530-
531-
expect(actualRequest.url).toBe("https://foo.bar/api/v1");
532-
expect(actualRequest.method).toBe("OPTIONS");
533-
expect(actualRequest.headers.get("foo")).toBe("bar");
534-
});
535-
536526
test("add middleware at the request level", async () => {
537-
let actualRequest = new Request("https://nottherealurl.fake");
538-
const client = createObservedClient<paths>({}, async (req) => {
539-
actualRequest = new Request(req);
540-
return Response.json({});
541-
});
542-
543-
await client.GET("/posts/{id}", {
544-
params: { path: { id: 123 } },
545-
middleware: [
546-
{
547-
async onRequest({ request }) {
548-
return new Request("https://foo.bar/api/v1", {
549-
...request,
550-
method: "OPTIONS",
551-
headers: { foo: "bar" },
552-
});
553-
},
554-
},
555-
],
556-
});
557-
558-
expect(actualRequest.url).toBe("https://foo.bar/api/v1");
559-
expect(actualRequest.method).toBe("OPTIONS");
560-
expect(actualRequest.headers.get("foo")).toBe("bar");
561-
});
562-
563-
test("executes a middleware at the client and request request level in the correct orders", async () => {
564-
let actualRequest = new Request("https://nottherealurl.fake");
565-
const client = createObservedClient<paths>({}, async (req) => {
566-
actualRequest = new Request(req);
567-
return Response.json({});
527+
const customResponse = Response.json({});
528+
const client = createObservedClient<paths>({}, async () => {
529+
throw new Error("unexpected call to fetch");
568530
});
569-
// this middleware passes along the “step” header
570-
// for both requests and responses, but first checks if
571-
// it received the end result of the previous middleware step
572-
client.use(
573-
{
574-
async onRequest({ request }) {
575-
request.headers.set("step", "A");
576-
return request;
577-
},
578-
async onResponse({ response }) {
579-
if (response.headers.get("step") === "B") {
580-
const headers = new Headers(response.headers);
581-
headers.set("step", "A");
582-
return new Response(response.body, { ...response, headers });
583-
}
584-
},
585-
},
586-
{
587-
async onRequest({ request }) {
588-
request.headers.set("step", "B");
589-
return request;
590-
},
591-
async onResponse({ response }) {
592-
const headers = new Headers(response.headers);
593-
headers.set("step", "B");
594-
if (response.headers.get("step") === "C") {
595-
return new Response(response.body, { ...response, headers });
596-
}
597-
},
598-
},
599-
);
600531

601532
const { response } = await client.GET("/posts/{id}", {
602533
params: { path: { id: 123 } },
603534
middleware: [
604535
{
605-
onRequest({ request }) {
606-
request.headers.set("step", "C");
607-
return request;
608-
},
609-
onResponse({ response }) {
610-
response.headers.set("step", "C");
611-
return response;
536+
async onRequest() {
537+
return customResponse;
612538
},
613539
},
614540
],
615541
});
616542

617-
// assert requests ended up on step C (array order)
618-
expect(actualRequest.headers.get("step")).toBe("C");
619-
620-
// assert responses ended up on step A (reverse order)
621-
expect(response.headers.get("step")).toBe("A");
543+
expect(response).toBe(customResponse);
622544
});

0 commit comments

Comments
 (0)