Skip to content

Commit ec9bacf

Browse files
authored
fix: update thrown/returned Response handling in staticHandler (#9465)
1 parent fac5f52 commit ec9bacf

File tree

4 files changed

+292
-113
lines changed

4 files changed

+292
-113
lines changed

.changeset/metal-drinks-melt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@remix-run/router": patch
3+
---
4+
5+
Clean up response APIs for unstable_createStaticHandler queryRoute

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
},
108108
"filesize": {
109109
"packages/router/dist/router.js": {
110-
"none": "101 kB"
110+
"none": "105 kB"
111111
},
112112
"packages/react-router/dist/react-router.production.min.js": {
113113
"none": "12.5 kB"

packages/router/__tests__/router-test.ts

Lines changed: 111 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10286,6 +10286,20 @@ describe("a router", () => {
1028610286
};
1028710287
}
1028810288

10289+
it("should match routes automatically if no routeId is provided", async () => {
10290+
let { queryRoute } = createStaticHandler(SSR_ROUTES);
10291+
let data;
10292+
10293+
data = await queryRoute(createRequest("/parent"));
10294+
expect(data).toBe("PARENT LOADER");
10295+
10296+
data = await queryRoute(createRequest("/parent?index"));
10297+
expect(data).toBe("PARENT INDEX LOADER");
10298+
10299+
data = await queryRoute(createRequest("/parent/child"), "child");
10300+
expect(data).toBe("CHILD LOADER");
10301+
});
10302+
1028910303
it("should support singular route load navigations (primitives)", async () => {
1029010304
let { queryRoute } = createStaticHandler(SSR_ROUTES);
1029110305
let data;
@@ -10317,6 +10331,7 @@ describe("a router", () => {
1031710331
});
1031810332

1031910333
it("should support singular route load navigations (Responses)", async () => {
10334+
/* eslint-disable jest/no-conditional-expect */
1032010335
let T = setupFlexRouteTest();
1032110336
let data;
1032210337

@@ -10329,9 +10344,13 @@ describe("a router", () => {
1032910344
expect(await data.text()).toBe("Created!");
1033010345

1033110346
// Thrown Success Response
10332-
data = await T.rejectLoader(new Response("Created!", { status: 201 }));
10333-
expect(data.status).toBe(201);
10334-
expect(await data.text()).toBe("Created!");
10347+
try {
10348+
await T.rejectLoader(new Response("Created!", { status: 201 }));
10349+
expect(false).toBe(true);
10350+
} catch (data) {
10351+
expect(data.status).toBe(201);
10352+
expect(await data.text()).toBe("Created!");
10353+
}
1033510354

1033610355
// Returned Redirect Response
1033710356
data = await T.resolveLoader(
@@ -10359,9 +10378,14 @@ describe("a router", () => {
1035910378
expect(await data.text()).toBe("Why?");
1036010379

1036110380
// Thrown Error Response
10362-
data = await T.rejectLoader(new Response("Oh no!", { status: 401 }));
10363-
expect(data.status).toBe(401);
10364-
expect(await data.text()).toBe("Oh no!");
10381+
try {
10382+
await T.rejectLoader(new Response("Oh no!", { status: 401 }));
10383+
expect(false).toBe(true);
10384+
} catch (data) {
10385+
expect(data.status).toBe(401);
10386+
expect(await data.text()).toBe("Oh no!");
10387+
}
10388+
/* eslint-enable jest/no-conditional-expect */
1036510389
});
1036610390

1036710391
it("should support singular route load navigations (Errors)", async () => {
@@ -10445,6 +10469,7 @@ describe("a router", () => {
1044510469
});
1044610470

1044710471
it("should support singular route submit navigations (Responses)", async () => {
10472+
/* eslint-disable jest/no-conditional-expect */
1044810473
let T = setupFlexRouteTest();
1044910474
let data;
1045010475

@@ -10457,9 +10482,13 @@ describe("a router", () => {
1045710482
expect(await data.text()).toBe("Created!");
1045810483

1045910484
// Thrown Success Response
10460-
data = await T.rejectAction(new Response("Created!", { status: 201 }));
10461-
expect(data.status).toBe(201);
10462-
expect(await data.text()).toBe("Created!");
10485+
try {
10486+
await T.rejectAction(new Response("Created!", { status: 201 }));
10487+
expect(false).toBe(true);
10488+
} catch (data) {
10489+
expect(data.status).toBe(201);
10490+
expect(await data.text()).toBe("Created!");
10491+
}
1046310492

1046410493
// Returned Redirect Response
1046510494
data = await T.resolveAction(
@@ -10487,9 +10516,14 @@ describe("a router", () => {
1048710516
expect(await data.text()).toBe("Why?");
1048810517

1048910518
// Thrown Error Response
10490-
data = await T.rejectAction(new Response("Oh no!", { status: 401 }));
10491-
expect(data.status).toBe(401);
10492-
expect(await data.text()).toBe("Oh no!");
10519+
try {
10520+
await T.rejectAction(new Response("Oh no!", { status: 401 }));
10521+
expect(false).toBe(true);
10522+
} catch (data) {
10523+
expect(data.status).toBe(401);
10524+
expect(await data.text()).toBe("Oh no!");
10525+
}
10526+
/* eslint-enable jest/no-conditional-expect */
1049310527
});
1049410528

1049510529
it("should support singular route submit navigations (Errors)", async () => {
@@ -10650,19 +10684,78 @@ describe("a router", () => {
1065010684
);
1065110685
});
1065210686

10687+
it("should handle not found routes with a 404 Response", async () => {
10688+
/* eslint-disable jest/no-conditional-expect */
10689+
let { queryRoute } = createStaticHandler([
10690+
{
10691+
id: "root",
10692+
path: "/",
10693+
},
10694+
]);
10695+
10696+
try {
10697+
await queryRoute(createRequest("/junk"));
10698+
expect(false).toBe(true);
10699+
} catch (data) {
10700+
expect(data instanceof Response).toBe(true);
10701+
expect(data.status).toBe(404);
10702+
expect(data.statusText).toBe("Not Found");
10703+
expect(data.headers.get("X-Remix-Router-Error")).toBe("yes");
10704+
}
10705+
10706+
try {
10707+
await queryRoute(createRequest("/"), "junk");
10708+
expect(false).toBe(true);
10709+
} catch (data) {
10710+
expect(data instanceof Response).toBe(true);
10711+
expect(data.status).toBe(404);
10712+
expect(data.statusText).toBe("Not Found");
10713+
expect(data.headers.get("X-Remix-Router-Error")).toBe("yes");
10714+
}
10715+
10716+
try {
10717+
await queryRoute(createSubmitRequest("/junk"));
10718+
expect(false).toBe(true);
10719+
} catch (data) {
10720+
expect(data instanceof Response).toBe(true);
10721+
expect(data.status).toBe(404);
10722+
expect(data.statusText).toBe("Not Found");
10723+
expect(data.headers.get("X-Remix-Router-Error")).toBe("yes");
10724+
}
10725+
10726+
try {
10727+
await queryRoute(createSubmitRequest("/"), "junk");
10728+
expect(false).toBe(true);
10729+
} catch (data) {
10730+
expect(data instanceof Response).toBe(true);
10731+
expect(data.status).toBe(404);
10732+
expect(data.statusText).toBe("Not Found");
10733+
expect(data.headers.get("X-Remix-Router-Error")).toBe("yes");
10734+
}
10735+
10736+
/* eslint-enable jest/no-conditional-expect */
10737+
});
10738+
1065310739
it("should handle not found action submissions with a 405 Response", async () => {
10740+
/* eslint-disable jest/no-conditional-expect */
1065410741
let { queryRoute } = createStaticHandler([
1065510742
{
1065610743
id: "root",
1065710744
path: "/",
1065810745
},
1065910746
]);
10660-
let request = createSubmitRequest("/");
10661-
let data = await queryRoute(request, "root");
10662-
expect(data instanceof Response).toBe(true);
10663-
expect(data.status).toBe(405);
10664-
expect(data.statusText).toBe("Method Not Allowed");
10665-
expect(await data.text()).toBe("No action found for [/]");
10747+
10748+
try {
10749+
await queryRoute(createSubmitRequest("/"), "root");
10750+
expect(false).toBe(true);
10751+
} catch (data) {
10752+
expect(data instanceof Response).toBe(true);
10753+
expect(data.status).toBe(405);
10754+
expect(data.statusText).toBe("Method Not Allowed");
10755+
expect(data.headers.get("X-Remix-Router-Error")).toBe("yes");
10756+
expect(await data.text()).toBe("No action found for [/]");
10757+
}
10758+
/* eslint-enable jest/no-conditional-expect */
1066610759
});
1066710760
});
1066810761
});

0 commit comments

Comments
 (0)