@@ -3,8 +3,6 @@ import getPort from "get-port";
33
44import { implementations , js , setupRscTest , validateRSCHtml } from "./utils" ;
55
6- test . use ( { javaScriptEnabled : false } ) ;
7-
86implementations . forEach ( ( implementation ) => {
97 test . describe ( `RSC nojs (${ implementation . name } )` , ( ) => {
108 let port : number ;
@@ -20,6 +18,34 @@ implementations.forEach((implementation) => {
2018 implementation,
2119 port,
2220 files : {
21+ "src/routes.ts" : js `
22+ import type { unstable_RSCRouteConfig as RSCRouteConfig } from "react-router";
23+
24+ export const routes = [
25+ {
26+ id: "root",
27+ path: "",
28+ lazy: () => import("./routes/root"),
29+ children: [
30+ {
31+ id: "home",
32+ index: true,
33+ lazy: () => import("./routes/home"),
34+ },
35+ {
36+ id: "render-redirect-lazy",
37+ path: "/render-redirect/lazy/:id?",
38+ lazy: () => import("./routes/render-redirect/lazy"),
39+ },
40+ {
41+ id: "render-redirect",
42+ path: "/render-redirect/:id?",
43+ lazy: () => import("./routes/render-redirect/home"),
44+ },
45+ ],
46+ },
47+ ] satisfies RSCRouteConfig;
48+ ` ,
2349 "src/routes/home.actions.ts" : js `
2450 "use server";
2551 import { redirect } from "react-router";
@@ -76,6 +102,60 @@ implementations.forEach((implementation) => {
76102 );
77103 }
78104 ` ,
105+
106+ "src/routes/render-redirect/home.tsx" : js `
107+ import { Link, redirect } from "react-router";
108+
109+ export default function RenderRedirect({ params: { id } }) {
110+ if (id === "redirect") {
111+ throw redirect("/render-redirect/redirected");
112+ }
113+
114+ if (id === "external") {
115+ throw redirect("https://example.com/");
116+ }
117+
118+ return (
119+ <>
120+ <h1>{id || "home"}</h1>
121+ <Link to="/render-redirect/redirect">Redirect</Link>
122+ <Link to="/render-redirect/external">External</Link>
123+ </>
124+ )
125+ }
126+ ` ,
127+ "src/routes/render-redirect/lazy.tsx" : js `
128+ import { Suspense } from "react";
129+ import { Link, redirect } from "react-router";
130+
131+ export default function RenderRedirect({ params: { id } }) {
132+ return (
133+ <Suspense fallback={<p>Loading...</p>}>
134+ <Lazy id={id} />
135+ </Suspense>
136+ );
137+ }
138+
139+ async function Lazy({ id }) {
140+ await new Promise((r) => setTimeout(r, 0));
141+
142+ if (id === "redirect") {
143+ throw redirect("/render-redirect/lazy/redirected");
144+ }
145+
146+ if (id === "external") {
147+ throw redirect("https://example.com/");
148+ }
149+
150+ return (
151+ <>
152+ <h1>{id || "home"}</h1>
153+ <Link to="/render-redirect/lazy/redirect">Redirect</Link>
154+ <Link to="/render-redirect/external">External</Link>
155+ </>
156+ );
157+ }
158+ ` ,
79159 } ,
80160 } ) ;
81161 } ) ;
@@ -129,5 +209,50 @@ implementations.forEach((implementation) => {
129209 // Ensure this is using RSC
130210 validateRSCHtml ( await page . content ( ) ) ;
131211 } ) ;
212+
213+ test ( "Suppport throwing redirect Response from render" , async ( {
214+ page,
215+ } ) => {
216+ await page . goto ( `http://localhost:${ port } /render-redirect` ) ;
217+ await expect ( page . getByText ( "home" ) ) . toBeAttached ( ) ;
218+ await page . getByText ( "Redirect" ) . click ( ) ;
219+ await page . waitForURL (
220+ `http://localhost:${ port } /render-redirect/redirected` ,
221+ ) ;
222+ await expect ( page . getByText ( "redirected" ) ) . toBeAttached ( ) ;
223+ } ) ;
224+
225+ test ( "Suppport throwing external redirect Response from render" , async ( {
226+ page,
227+ } ) => {
228+ await page . goto ( `http://localhost:${ port } /render-redirect` ) ;
229+ await expect ( page . getByText ( "home" ) ) . toBeAttached ( ) ;
230+ await page . getByText ( "External" ) . click ( ) ;
231+ await page . waitForURL ( `https://example.com/` ) ;
232+ await expect ( page . getByText ( "Example Domain" ) ) . toBeAttached ( ) ;
233+ } ) ;
234+
235+ test ( "Suppport throwing redirect Response from suspended render" , async ( {
236+ page,
237+ } ) => {
238+ await page . goto ( `http://localhost:${ port } /render-redirect/lazy/redirect` ) ;
239+ await page . waitForURL (
240+ `http://localhost:${ port } /render-redirect/lazy/redirected` ,
241+ ) ;
242+ await expect ( page . getByText ( "redirected" ) ) . toBeAttached ( ) ;
243+ } ) ;
244+
245+ test ( "Suppport throwing external redirect Response from suspended render" , async ( {
246+ page,
247+ browserName,
248+ } ) => {
249+ test . skip (
250+ browserName === "firefox" ,
251+ "Playwright doesn't like external meta redirects for tests. It times out waiting for the URL even though it navigates." ,
252+ ) ;
253+ await page . goto ( `http://localhost:${ port } /render-redirect/lazy/external` ) ;
254+ await page . waitForURL ( `https://example.com/` ) ;
255+ await expect ( page . getByText ( "Example Domain" ) ) . toBeAttached ( ) ;
256+ } ) ;
132257 } ) ;
133258} ) ;
0 commit comments