From d92fe3a52c7df528f9fbcc08138d903f6fc8835f Mon Sep 17 00:00:00 2001 From: wookhyung Date: Wed, 16 Jul 2025 16:18:23 +0900 Subject: [PATCH 1/5] fix: reset statusCode to 200 on navigation start --- e2e/react-router/basic/src/main.tsx | 3 +++ e2e/react-router/basic/tests/app.spec.ts | 11 +++++++++++ e2e/solid-router/basic/src/main.tsx | 3 +++ e2e/solid-router/basic/tests/app.spec.ts | 11 +++++++++++ packages/router-core/src/router.ts | 1 + 5 files changed, 29 insertions(+) diff --git a/e2e/react-router/basic/src/main.tsx b/e2e/react-router/basic/src/main.tsx index 8bd8d5afcff..e4660264263 100644 --- a/e2e/react-router/basic/src/main.tsx +++ b/e2e/react-router/basic/src/main.tsx @@ -8,6 +8,7 @@ import { createRoute, createRouter, redirect, + useRouterState, } from '@tanstack/react-router' import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' import { NotFoundError, fetchPost, fetchPosts } from './posts' @@ -27,6 +28,7 @@ const rootRoute = createRootRoute({ }) function RootComponent() { + const routerState = useRouterState() return ( <>
@@ -71,6 +73,7 @@ function RootComponent() { This Route Does Not Exist
+
{routerState.statusCode}
diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts index 5ccdafa513b..843719ffba1 100644 --- a/e2e/react-router/basic/tests/app.spec.ts +++ b/e2e/react-router/basic/tests/app.spec.ts @@ -45,3 +45,14 @@ test('Navigating to a post page with viewTransition types', async ({ await page.getByRole('link', { name: 'sunt aut facere repe' }).click() await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) + +test('StatusCode should reset after visiting 404 route', async ({ page }) => { + await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() + expect(page.getByTestId('status-code')).toContainText('404') + + await page.getByRole('link', { name: 'Start Over' }).click() + expect(page.getByTestId('status-code')).toContainText('200') + + await page.getByRole('link', { name: 'Posts', exact: true }).click() + expect(page.getByTestId('status-code')).toContainText('200') +}) diff --git a/e2e/solid-router/basic/src/main.tsx b/e2e/solid-router/basic/src/main.tsx index 9bb8b6f8e4a..6cee1b66e78 100644 --- a/e2e/solid-router/basic/src/main.tsx +++ b/e2e/solid-router/basic/src/main.tsx @@ -8,6 +8,7 @@ import { createRootRoute, createRoute, createRouter, + useRouterState, } from '@tanstack/solid-router' import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools' import { NotFoundError, fetchPost, fetchPosts } from './posts' @@ -27,6 +28,7 @@ const rootRoute = createRootRoute({ }) function RootComponent() { + const routerState = useRouterState() return ( <> @@ -72,6 +74,7 @@ function RootComponent() { This Route Does Not Exist +
{routerState().statusCode}
diff --git a/e2e/solid-router/basic/tests/app.spec.ts b/e2e/solid-router/basic/tests/app.spec.ts index 5ccdafa513b..843719ffba1 100644 --- a/e2e/solid-router/basic/tests/app.spec.ts +++ b/e2e/solid-router/basic/tests/app.spec.ts @@ -45,3 +45,14 @@ test('Navigating to a post page with viewTransition types', async ({ await page.getByRole('link', { name: 'sunt aut facere repe' }).click() await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) + +test('StatusCode should reset after visiting 404 route', async ({ page }) => { + await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() + expect(page.getByTestId('status-code')).toContainText('404') + + await page.getByRole('link', { name: 'Start Over' }).click() + expect(page.getByTestId('status-code')).toContainText('200') + + await page.getByRole('link', { name: 'Posts', exact: true }).click() + expect(page.getByTestId('status-code')).toContainText('200') +}) diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts index fd056efcd97..410f7cbe2b8 100644 --- a/packages/router-core/src/router.ts +++ b/packages/router-core/src/router.ts @@ -1796,6 +1796,7 @@ export class RouterCore< this.__store.setState((s) => ({ ...s, status: 'pending', + statusCode: 200, isLoading: true, location: this.latestLocation, pendingMatches, From a3003cc8137abcae4f3f3f0ec58b58c8ae9d3c01 Mon Sep 17 00:00:00 2001 From: wookhyung Date: Wed, 16 Jul 2025 21:22:22 +0900 Subject: [PATCH 2/5] chore: trigger github action From 6a368a8c74ac5af114cd666acdbce1e558527181 Mon Sep 17 00:00:00 2001 From: wookhyung Date: Thu, 17 Jul 2025 09:37:05 +0900 Subject: [PATCH 3/5] test: add unit tests for statusCode reset on navigation --- e2e/react-router/basic/src/main.tsx | 3 -- e2e/react-router/basic/tests/app.spec.ts | 10 ------ e2e/solid-router/basic/src/main.tsx | 3 -- e2e/solid-router/basic/tests/app.spec.ts | 10 ------ packages/react-router/tests/router.test.tsx | 38 +++++++++++++++++++++ packages/solid-router/tests/router.test.tsx | 38 +++++++++++++++++++++ 6 files changed, 76 insertions(+), 26 deletions(-) diff --git a/e2e/react-router/basic/src/main.tsx b/e2e/react-router/basic/src/main.tsx index e4660264263..8bd8d5afcff 100644 --- a/e2e/react-router/basic/src/main.tsx +++ b/e2e/react-router/basic/src/main.tsx @@ -8,7 +8,6 @@ import { createRoute, createRouter, redirect, - useRouterState, } from '@tanstack/react-router' import { TanStackRouterDevtools } from '@tanstack/react-router-devtools' import { NotFoundError, fetchPost, fetchPosts } from './posts' @@ -28,7 +27,6 @@ const rootRoute = createRootRoute({ }) function RootComponent() { - const routerState = useRouterState() return ( <>
@@ -73,7 +71,6 @@ function RootComponent() { This Route Does Not Exist
-
{routerState.statusCode}
diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts index 843719ffba1..cadf546e271 100644 --- a/e2e/react-router/basic/tests/app.spec.ts +++ b/e2e/react-router/basic/tests/app.spec.ts @@ -46,13 +46,3 @@ test('Navigating to a post page with viewTransition types', async ({ await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) -test('StatusCode should reset after visiting 404 route', async ({ page }) => { - await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() - expect(page.getByTestId('status-code')).toContainText('404') - - await page.getByRole('link', { name: 'Start Over' }).click() - expect(page.getByTestId('status-code')).toContainText('200') - - await page.getByRole('link', { name: 'Posts', exact: true }).click() - expect(page.getByTestId('status-code')).toContainText('200') -}) diff --git a/e2e/solid-router/basic/src/main.tsx b/e2e/solid-router/basic/src/main.tsx index 6cee1b66e78..9bb8b6f8e4a 100644 --- a/e2e/solid-router/basic/src/main.tsx +++ b/e2e/solid-router/basic/src/main.tsx @@ -8,7 +8,6 @@ import { createRootRoute, createRoute, createRouter, - useRouterState, } from '@tanstack/solid-router' import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools' import { NotFoundError, fetchPost, fetchPosts } from './posts' @@ -28,7 +27,6 @@ const rootRoute = createRootRoute({ }) function RootComponent() { - const routerState = useRouterState() return ( <> @@ -74,7 +72,6 @@ function RootComponent() { This Route Does Not Exist -
{routerState().statusCode}
diff --git a/e2e/solid-router/basic/tests/app.spec.ts b/e2e/solid-router/basic/tests/app.spec.ts index 843719ffba1..cadf546e271 100644 --- a/e2e/solid-router/basic/tests/app.spec.ts +++ b/e2e/solid-router/basic/tests/app.spec.ts @@ -46,13 +46,3 @@ test('Navigating to a post page with viewTransition types', async ({ await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) -test('StatusCode should reset after visiting 404 route', async ({ page }) => { - await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() - expect(page.getByTestId('status-code')).toContainText('404') - - await page.getByRole('link', { name: 'Start Over' }).click() - expect(page.getByTestId('status-code')).toContainText('200') - - await page.getByRole('link', { name: 'Posts', exact: true }).click() - expect(page.getByTestId('status-code')).toContainText('200') -}) diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index bbe3fd32957..63930389ccf 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -1816,3 +1816,41 @@ describe('does not strip search params if search validation fails', () => { expect(window.location.search).toBe('?root=hello') }) }) + +describe('statusCode reset on navigation', () => { + it('should reset statusCode to 200 when navigating from 404 to valid route', async () => { + const history = createMemoryHistory({ initialEntries: ['/'] }) + + const rootRoute = createRootRoute({ + component: () => , + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () =>
Home
, + }) + + const validRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/valid', + component: () =>
Valid Route
, + }) + + const routeTree = rootRoute.addChildren([indexRoute, validRoute]) + const router = createRouter({ routeTree, history }) + + render() + + expect(router.state.statusCode).toBe(200) + + await act(() => router.navigate({ to: '/non-existing' })) + expect(router.state.statusCode).toBe(404) + + await act(() => router.navigate({ to: '/valid' })) + expect(router.state.statusCode).toBe(200) + + await act(() => router.navigate({ to: '/another-non-existing' })) + expect(router.state.statusCode).toBe(404) + }) +}) diff --git a/packages/solid-router/tests/router.test.tsx b/packages/solid-router/tests/router.test.tsx index 5d452085622..43540438abd 100644 --- a/packages/solid-router/tests/router.test.tsx +++ b/packages/solid-router/tests/router.test.tsx @@ -1591,3 +1591,41 @@ describe('does not strip search params if search validation fails', () => { expect(window.location.search).toBe('?root=hello') }) }) + +describe('statusCode reset on navigation', () => { + it('should reset statusCode to 200 when navigating from 404 to valid route', async () => { + const history = createMemoryHistory({ initialEntries: ['/'] }) + + const rootRoute = createRootRoute({ + component: () => , + }) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () =>
Home
, + }) + + const validRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/valid', + component: () =>
Valid Route
, + }) + + const routeTree = rootRoute.addChildren([indexRoute, validRoute]) + const router = createRouter({ routeTree, history }) + + render(() => ) + + expect(router.state.statusCode).toBe(200) + + await router.navigate({ to: '/non-existing' }) + await waitFor(() => expect(router.state.statusCode).toBe(404)) + + await router.navigate({ to: '/valid' }) + await waitFor(() => expect(router.state.statusCode).toBe(200)) + + await router.navigate({ to: '/another-non-existing' }) + await waitFor(() => expect(router.state.statusCode).toBe(404)) + }) +}) From 20c5d81a9f04b4f06d5d43683961e4118c44c976 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 00:38:08 +0000 Subject: [PATCH 4/5] ci: apply automated fixes --- e2e/react-router/basic/tests/app.spec.ts | 1 - e2e/solid-router/basic/tests/app.spec.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts index cadf546e271..5ccdafa513b 100644 --- a/e2e/react-router/basic/tests/app.spec.ts +++ b/e2e/react-router/basic/tests/app.spec.ts @@ -45,4 +45,3 @@ test('Navigating to a post page with viewTransition types', async ({ await page.getByRole('link', { name: 'sunt aut facere repe' }).click() await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) - diff --git a/e2e/solid-router/basic/tests/app.spec.ts b/e2e/solid-router/basic/tests/app.spec.ts index cadf546e271..5ccdafa513b 100644 --- a/e2e/solid-router/basic/tests/app.spec.ts +++ b/e2e/solid-router/basic/tests/app.spec.ts @@ -45,4 +45,3 @@ test('Navigating to a post page with viewTransition types', async ({ await page.getByRole('link', { name: 'sunt aut facere repe' }).click() await expect(page.getByRole('heading')).toContainText('sunt aut facere') }) - From 03785b5cf3a72fc54e5a1b59272efb6ea08baec5 Mon Sep 17 00:00:00 2001 From: wookhyung Date: Thu, 17 Jul 2025 09:43:40 +0900 Subject: [PATCH 5/5] test: add home route navigation to statusCode reset tests --- packages/react-router/tests/router.test.tsx | 3 +++ packages/solid-router/tests/router.test.tsx | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index 63930389ccf..5545ce1c215 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -1844,6 +1844,9 @@ describe('statusCode reset on navigation', () => { expect(router.state.statusCode).toBe(200) + await act(() => router.navigate({ to: '/' })) + expect(router.state.statusCode).toBe(200) + await act(() => router.navigate({ to: '/non-existing' })) expect(router.state.statusCode).toBe(404) diff --git a/packages/solid-router/tests/router.test.tsx b/packages/solid-router/tests/router.test.tsx index 43540438abd..5e89292bb34 100644 --- a/packages/solid-router/tests/router.test.tsx +++ b/packages/solid-router/tests/router.test.tsx @@ -1619,6 +1619,9 @@ describe('statusCode reset on navigation', () => { expect(router.state.statusCode).toBe(200) + await router.navigate({ to: '/' }) + await waitFor(() => expect(router.state.statusCode).toBe(200)) + await router.navigate({ to: '/non-existing' }) await waitFor(() => expect(router.state.statusCode).toBe(404))