@@ -545,6 +545,11 @@ implementations.forEach((implementation) => {
545545 path: "/render-redirect/:id?",
546546 lazy: () => import("./routes/render-redirect/home"),
547547 },
548+ {
549+ id: "render-route-error-response",
550+ path: "render-route-error-response/:id?",
551+ lazy: () => import("./routes/render-route-error-response/home"),
552+ }
548553 ],
549554 },
550555 ] satisfies RSCRouteConfig;
@@ -1524,6 +1529,30 @@ implementations.forEach((implementation) => {
15241529 );
15251530 }
15261531 ` ,
1532+
1533+ "src/routes/render-route-error-response/home.tsx" : js `
1534+ import { data } from "react-router";
1535+
1536+ export { ErrorBoundary } from "./home.client";
1537+
1538+ export default function RenderRouteErrorResponse({ params: { id } }) {
1539+ if (!id) throw new Response(null, { status: 400, statusText: "Oh no!" });
1540+
1541+ throw data({ message: id }, { status: 400, statusText: "Oh no!" });
1542+ }
1543+ ` ,
1544+ "src/routes/render-route-error-response/home.client.tsx" : js `
1545+ "use client";
1546+ import { useRouteError, isRouteErrorResponse } from "react-router";
1547+
1548+ export function ErrorBoundary() {
1549+ const error = useRouteError();
1550+ if (isRouteErrorResponse(error)) {
1551+ return <p>{error.status} {error.statusText} {error.data?.message || "no"}</p>;
1552+ }
1553+ return <p>Oh no D:</p>;
1554+ }
1555+ ` ,
15271556 } ,
15281557 } ) ;
15291558 } ) ;
@@ -1816,8 +1845,13 @@ implementations.forEach((implementation) => {
18161845 } ) ;
18171846
18181847 test ( "Suppport throwing external redirect Response from render" , async ( {
1848+ browserName,
18191849 page,
18201850 } ) => {
1851+ test . skip (
1852+ browserName === "firefox" ,
1853+ "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates." ,
1854+ ) ;
18211855 await page . goto ( `http://localhost:${ port } /render-redirect` ) ;
18221856 await expect ( page . getByText ( "home" ) ) . toBeAttached ( ) ;
18231857 await page . getByText ( "External" ) . click ( ) ;
@@ -1838,14 +1872,35 @@ implementations.forEach((implementation) => {
18381872 } ) ;
18391873
18401874 test ( "Suppport throwing external redirect Response from suspended render" , async ( {
1875+ browserName,
18411876 page,
18421877 } ) => {
1878+ test . skip (
1879+ browserName === "firefox" ,
1880+ "Playwright doesn't like external redirects for tests. It times out waiting for the URL even though it navigates." ,
1881+ ) ;
18431882 await page . goto ( `http://localhost:${ port } /render-redirect/lazy` ) ;
18441883 await expect ( page . getByText ( "home" ) ) . toBeAttached ( ) ;
18451884 await page . getByText ( "External" ) . click ( ) ;
18461885 await page . waitForURL ( `https://example.com/` ) ;
18471886 await expect ( page . getByText ( "Example Domain" ) ) . toBeAttached ( ) ;
18481887 } ) ;
1888+
1889+ test ( "Support throwing Responses" , async ( { page } ) => {
1890+ await page . goto (
1891+ `http://localhost:${ port } /render-route-error-response` ,
1892+ ) ;
1893+ await expect ( page . getByText ( "400 Oh no! no" ) ) . toBeAttached ( ) ;
1894+ } ) ;
1895+
1896+ test ( "Support throwing data() responses with data" , async ( {
1897+ page,
1898+ } ) => {
1899+ await page . goto (
1900+ `http://localhost:${ port } /render-route-error-response/Test` ,
1901+ ) ;
1902+ await expect ( page . getByText ( "400 Oh no! Test" ) ) . toBeAttached ( ) ;
1903+ } ) ;
18491904 } ) ;
18501905
18511906 test . describe ( "Server Actions" , ( ) => {
@@ -1945,9 +2000,6 @@ implementations.forEach((implementation) => {
19452000 test ( "Supports React Server Functions thrown external redirects" , async ( {
19462001 page,
19472002 } ) => {
1948- // Test is expected to fail currently — skip running it
1949- // test.skip(true, "Known failing test for external redirect behavior");
1950-
19512003 await page . goto (
19522004 `http://localhost:${ port } /throw-external-redirect-server-action/` ,
19532005 ) ;
0 commit comments