Skip to content

Commit 69056d9

Browse files
committed
test: Add loader e2e test showcasing usage
1 parent 4c80b6e commit 69056d9

File tree

13 files changed

+122
-0
lines changed

13 files changed

+122
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { testLoader } from 'e2e-shared/specs/loader.cy'
2+
3+
testLoader({ path: '/app/loader', nextJsRouter: 'app' })
4+
5+
testLoader({ path: '/pages/loader', nextJsRouter: 'pages' })
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { LoaderRenderer, loadSearchParams } from 'e2e-shared/specs/loader'
2+
import type { SearchParams } from 'nuqs/server'
3+
4+
type PageProps = {
5+
searchParams: Promise<SearchParams>
6+
}
7+
8+
export default async function Page({ searchParams }: PageProps) {
9+
const serverValues = await loadSearchParams(searchParams)
10+
return <LoaderRenderer serverValues={serverValues} />
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import {
2+
type SearchParams,
3+
LoaderRenderer,
4+
loadSearchParams
5+
} from 'e2e-shared/specs/loader'
6+
import { GetServerSidePropsContext } from 'next'
7+
8+
type PageProps = {
9+
serverValues: SearchParams
10+
}
11+
12+
export default function Page({ serverValues }: PageProps) {
13+
return <LoaderRenderer serverValues={serverValues} />
14+
}
15+
16+
export async function getServerSideProps({ query }: GetServerSidePropsContext) {
17+
return {
18+
props: {
19+
serverValues: loadSearchParams(query)
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { testLoader } from 'e2e-shared/specs/loader.cy'
2+
3+
testLoader({ path: '/loader' })

packages/e2e/react-router/v6/src/react-router.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const router = createBrowserRouter(
3737
<Route path="routing/useQueryStates/other" lazy={load(import('./routes/routing.useQueryStates.other'))} />
3838
<Route path='shallow/useQueryState' lazy={load(import('./routes/shallow.useQueryState'))} />
3939
<Route path='shallow/useQueryStates' lazy={load(import('./routes/shallow.useQueryStates'))} />
40+
<Route path='loader' lazy={load(import('./routes/loader'))} />
4041
</Route>
4142
))
4243

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { LoaderRenderer, loadSearchParams } from 'e2e-shared/specs/loader'
2+
import { useLoaderData, type LoaderFunctionArgs } from 'react-router-dom'
3+
4+
export function loader({ request }: LoaderFunctionArgs) {
5+
return loadSearchParams(request)
6+
}
7+
8+
export default function Page() {
9+
const serverValues = useLoaderData() as Awaited<ReturnType<typeof loader>>
10+
return <LoaderRenderer serverValues={serverValues} />
11+
}

packages/e2e/react-router/v7/app/routes.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ export default [
1818
route('/routing/useQueryStates/other', './routes/routing.useQueryStates.other.tsx'),
1919
route('/shallow/useQueryState', './routes/shallow.useQueryState.tsx'),
2020
route('/shallow/useQueryStates', './routes/shallow.useQueryStates.tsx'),
21+
route('/loader', './routes/loader.tsx')
2122
])
2223
] satisfies RouteConfig
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { LoaderRenderer, loadSearchParams } from 'e2e-shared/specs/loader'
2+
import type { LoaderFunctionArgs } from 'react-router'
3+
import type { Route } from './+types/loader'
4+
5+
export function loader({ request }: LoaderFunctionArgs) {
6+
return loadSearchParams(request)
7+
}
8+
9+
export default function Page({
10+
loaderData: serverValues
11+
}: Route.ComponentProps) {
12+
return <LoaderRenderer serverValues={serverValues} />
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { testLoader } from 'e2e-shared/specs/loader.cy'
2+
3+
testLoader({ path: '/loader' })
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { LoaderFunctionArgs } from '@remix-run/node'
2+
import { useLoaderData } from '@remix-run/react'
3+
import { LoaderRenderer, loadSearchParams } from 'e2e-shared/specs/loader'
4+
5+
export function loader({ request }: LoaderFunctionArgs) {
6+
return loadSearchParams(request)
7+
}
8+
9+
export default function Page() {
10+
const serverValues = useLoaderData<typeof loader>()
11+
return <LoaderRenderer serverValues={serverValues} />
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { testLoader } from 'e2e-shared/specs/loader.cy'
2+
3+
testLoader({ path: '/loader' })
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { createTest } from '../create-test'
2+
3+
export const testLoader = createTest('Loader', ({ path }) => {
4+
it('loads state from the URL', () => {
5+
cy.visit(path + '?test=pass&int=42')
6+
cy.contains('#hydration-marker', 'hydrated').should('be.hidden')
7+
cy.get('#test').should('have.text', 'pass')
8+
cy.get('#int').should('have.text', '42')
9+
})
10+
})

packages/e2e/shared/specs/loader.tsx

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {
2+
createLoader,
3+
type inferParserType,
4+
parseAsInteger,
5+
parseAsString
6+
} from 'nuqs/server'
7+
8+
const searchParams = {
9+
test: parseAsString,
10+
int: parseAsInteger
11+
}
12+
13+
export type SearchParams = inferParserType<typeof searchParams>
14+
export const loadSearchParams = createLoader(searchParams)
15+
16+
type LoaderRendererProps = {
17+
serverValues: inferParserType<typeof searchParams>
18+
}
19+
20+
export function LoaderRenderer({ serverValues }: LoaderRendererProps) {
21+
return (
22+
<>
23+
<pre id="test">{serverValues.test}</pre>
24+
<pre id="int">{serverValues.int}</pre>
25+
</>
26+
)
27+
}

0 commit comments

Comments
 (0)