Skip to content

Commit 11e6545

Browse files
test(e2e): add failing e2e test for server function middleware retries
1 parent 24ba0b7 commit 11e6545

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

e2e/react-start/server-functions/src/routeTree.gen.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { Route as IndexRouteImport } from './routes/index'
2525
import { Route as MiddlewareIndexRouteImport } from './routes/middleware/index'
2626
import { Route as FormdataRedirectIndexRouteImport } from './routes/formdata-redirect/index'
2727
import { Route as CookiesIndexRouteImport } from './routes/cookies/index'
28+
import { Route as MiddlewareRetryNextRouteImport } from './routes/middleware/retry-next'
2829
import { Route as MiddlewareClientMiddlewareRouterRouteImport } from './routes/middleware/client-middleware-router'
2930
import { Route as CookiesSetRouteImport } from './routes/cookies/set'
3031
import { Route as FormdataRedirectTargetNameRouteImport } from './routes/formdata-redirect/target.$name'
@@ -109,6 +110,11 @@ const CookiesIndexRoute = CookiesIndexRouteImport.update({
109110
path: '/cookies/',
110111
getParentRoute: () => rootRouteImport,
111112
} as any)
113+
const MiddlewareRetryNextRoute = MiddlewareRetryNextRouteImport.update({
114+
id: '/middleware/retry-next',
115+
path: '/middleware/retry-next',
116+
getParentRoute: () => rootRouteImport,
117+
} as any)
112118
const MiddlewareClientMiddlewareRouterRoute =
113119
MiddlewareClientMiddlewareRouterRouteImport.update({
114120
id: '/middleware/client-middleware-router',
@@ -143,6 +149,7 @@ export interface FileRoutesByFullPath {
143149
'/submit-post-formdata': typeof SubmitPostFormdataRoute
144150
'/cookies/set': typeof CookiesSetRoute
145151
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
152+
'/middleware/retry-next': typeof MiddlewareRetryNextRoute
146153
'/cookies': typeof CookiesIndexRoute
147154
'/formdata-redirect': typeof FormdataRedirectIndexRoute
148155
'/middleware': typeof MiddlewareIndexRoute
@@ -164,6 +171,7 @@ export interface FileRoutesByTo {
164171
'/submit-post-formdata': typeof SubmitPostFormdataRoute
165172
'/cookies/set': typeof CookiesSetRoute
166173
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
174+
'/middleware/retry-next': typeof MiddlewareRetryNextRoute
167175
'/cookies': typeof CookiesIndexRoute
168176
'/formdata-redirect': typeof FormdataRedirectIndexRoute
169177
'/middleware': typeof MiddlewareIndexRoute
@@ -186,6 +194,7 @@ export interface FileRoutesById {
186194
'/submit-post-formdata': typeof SubmitPostFormdataRoute
187195
'/cookies/set': typeof CookiesSetRoute
188196
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
197+
'/middleware/retry-next': typeof MiddlewareRetryNextRoute
189198
'/cookies/': typeof CookiesIndexRoute
190199
'/formdata-redirect/': typeof FormdataRedirectIndexRoute
191200
'/middleware/': typeof MiddlewareIndexRoute
@@ -209,6 +218,7 @@ export interface FileRouteTypes {
209218
| '/submit-post-formdata'
210219
| '/cookies/set'
211220
| '/middleware/client-middleware-router'
221+
| '/middleware/retry-next'
212222
| '/cookies'
213223
| '/formdata-redirect'
214224
| '/middleware'
@@ -230,6 +240,7 @@ export interface FileRouteTypes {
230240
| '/submit-post-formdata'
231241
| '/cookies/set'
232242
| '/middleware/client-middleware-router'
243+
| '/middleware/retry-next'
233244
| '/cookies'
234245
| '/formdata-redirect'
235246
| '/middleware'
@@ -251,6 +262,7 @@ export interface FileRouteTypes {
251262
| '/submit-post-formdata'
252263
| '/cookies/set'
253264
| '/middleware/client-middleware-router'
265+
| '/middleware/retry-next'
254266
| '/cookies/'
255267
| '/formdata-redirect/'
256268
| '/middleware/'
@@ -273,6 +285,7 @@ export interface RootRouteChildren {
273285
SubmitPostFormdataRoute: typeof SubmitPostFormdataRoute
274286
CookiesSetRoute: typeof CookiesSetRoute
275287
MiddlewareClientMiddlewareRouterRoute: typeof MiddlewareClientMiddlewareRouterRoute
288+
MiddlewareRetryNextRoute: typeof MiddlewareRetryNextRoute
276289
CookiesIndexRoute: typeof CookiesIndexRoute
277290
FormdataRedirectIndexRoute: typeof FormdataRedirectIndexRoute
278291
MiddlewareIndexRoute: typeof MiddlewareIndexRoute
@@ -393,6 +406,13 @@ declare module '@tanstack/react-router' {
393406
preLoaderRoute: typeof CookiesIndexRouteImport
394407
parentRoute: typeof rootRouteImport
395408
}
409+
'/middleware/retry-next': {
410+
id: '/middleware/retry-next'
411+
path: '/middleware/retry-next'
412+
fullPath: '/middleware/retry-next'
413+
preLoaderRoute: typeof MiddlewareRetryNextRouteImport
414+
parentRoute: typeof rootRouteImport
415+
}
396416
'/middleware/client-middleware-router': {
397417
id: '/middleware/client-middleware-router'
398418
path: '/middleware/client-middleware-router'
@@ -433,6 +453,7 @@ const rootRouteChildren: RootRouteChildren = {
433453
SubmitPostFormdataRoute: SubmitPostFormdataRoute,
434454
CookiesSetRoute: CookiesSetRoute,
435455
MiddlewareClientMiddlewareRouterRoute: MiddlewareClientMiddlewareRouterRoute,
456+
MiddlewareRetryNextRoute: MiddlewareRetryNextRoute,
436457
CookiesIndexRoute: CookiesIndexRoute,
437458
FormdataRedirectIndexRoute: FormdataRedirectIndexRoute,
438459
MiddlewareIndexRoute: MiddlewareIndexRoute,

e2e/react-start/server-functions/src/routes/middleware/index.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ function RouteComponent() {
1919
Client Middleware has access to router instance
2020
</Route.Link>
2121
</li>
22+
<li>
23+
<Route.Link to="./retry-next" data-testid="retry-next-link">
24+
Middleware can call next() multiple times
25+
</Route.Link>
26+
</li>
2227
</ul>
2328
</div>
2429
)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { createFileRoute } from '@tanstack/react-router'
2+
import { createMiddleware, createServerFn } from '@tanstack/react-start'
3+
4+
const retryMiddleware = createMiddleware({ type: 'function' })
5+
.client(async ({ next }) => {
6+
await next()
7+
return await next()
8+
})
9+
.server(async ({ next }) => {
10+
await next()
11+
return await next()
12+
})
13+
14+
const serverFn = createServerFn()
15+
.middleware([retryMiddleware])
16+
.handler(() => {
17+
return 'success'
18+
})
19+
20+
export const Route = createFileRoute('/middleware/retry-next')({
21+
component: RouteComponent,
22+
loader: async () => ({ serverFnLoaderResult: await serverFn() }),
23+
})
24+
25+
function RouteComponent() {
26+
const { serverFnLoaderResult } = Route.useLoaderData()
27+
return (
28+
<div className="p-2 m-2 grid gap-2" data-testid="retry-next-component">
29+
<h3>Server Function Middleware Retry Test</h3>
30+
<p>
31+
This component tests that server function middleware can call next()
32+
multiple times for retry logic.
33+
</p>
34+
<div data-testid="retry-success-result">
35+
<pre>{serverFnLoaderResult}</pre>
36+
</div>
37+
</div>
38+
)
39+
}

e2e/react-start/server-functions/tests/server-functions.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,24 @@ test.describe('middleware', () => {
371371
await runTest(page)
372372
})
373373
})
374+
375+
test.describe('middleware can call next() multiple times', () => {
376+
async function runRetryTest(page: Page) {
377+
await page.waitForLoadState('networkidle')
378+
await expect(page.getByTestId('retry-success-result')).toContainText(
379+
'success',
380+
)
381+
}
382+
383+
test('direct visit', async ({ page }) => {
384+
await page.goto('/middleware/retry-next')
385+
await runRetryTest(page)
386+
})
387+
388+
test('client navigation', async ({ page }) => {
389+
await page.goto('/middleware')
390+
await page.getByTestId('retry-next-link').click()
391+
await runRetryTest(page)
392+
})
393+
})
374394
})

0 commit comments

Comments
 (0)