diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index bbe3fd32957..5545ce1c215 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -1816,3 +1816,44 @@ 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: '/' })) + 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/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, diff --git a/packages/solid-router/tests/router.test.tsx b/packages/solid-router/tests/router.test.tsx index 5d452085622..5e89292bb34 100644 --- a/packages/solid-router/tests/router.test.tsx +++ b/packages/solid-router/tests/router.test.tsx @@ -1591,3 +1591,44 @@ 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: '/' }) + await waitFor(() => 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)) + }) +})