Skip to content

Commit 331b587

Browse files
authoredDec 29, 2024
test: Add native HTML form test (#829)
1 parent 3fa04c6 commit 331b587

File tree

22 files changed

+198
-1
lines changed

22 files changed

+198
-1
lines changed
 

Diff for: ‎packages/e2e/next/cypress/e2e/shared/form.cy.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { testForm } from 'e2e-shared/specs/form.cy'
2+
3+
testForm({
4+
path: '/app/form/useQueryState',
5+
hook: 'useQueryState',
6+
nextJsRouter: 'app'
7+
})
8+
9+
testForm({
10+
path: '/app/form/useQueryStates',
11+
hook: 'useQueryStates',
12+
nextJsRouter: 'app'
13+
})
14+
15+
testForm({
16+
path: '/pages/form/useQueryState',
17+
hook: 'useQueryState',
18+
nextJsRouter: 'pages'
19+
})
20+
21+
testForm({
22+
path: '/pages/form/useQueryStates',
23+
hook: 'useQueryStates',
24+
nextJsRouter: 'pages'
25+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
import { Suspense } from 'react'
3+
4+
export default function Page() {
5+
return (
6+
<Suspense>
7+
<TestFormUseQueryState />
8+
</Suspense>
9+
)
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
import { Suspense } from 'react'
3+
4+
export default function Page() {
5+
return (
6+
<Suspense>
7+
<TestFormUseQueryStates />
8+
</Suspense>
9+
)
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryState
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryStates
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { testForm } from 'e2e-shared/specs/form.cy'
2+
3+
testForm({
4+
path: '/form/useQueryState',
5+
hook: 'useQueryState'
6+
})
7+
8+
testForm({
9+
path: '/form/useQueryStates',
10+
hook: 'useQueryStates'
11+
})

Diff for: ‎packages/e2e/react-router/v6/src/react-router.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ const router = createBrowserRouter(
3838
<Route path='shallow/useQueryState' lazy={load(import('./routes/shallow.useQueryState'))} />
3939
<Route path='shallow/useQueryStates' lazy={load(import('./routes/shallow.useQueryStates'))} />
4040
<Route path='loader' lazy={load(import('./routes/loader'))} />
41+
<Route path="form/useQueryState" lazy={load(import('./routes/form.useQueryState'))} />
42+
<Route path="form/useQueryStates" lazy={load(import('./routes/form.useQueryStates'))} />
4143
</Route>
4244
))
4345

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryState
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryStates

Diff for: ‎packages/e2e/react-router/v7/app/routes.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ 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')
21+
route('/loader', './routes/loader.tsx'),
22+
route('/form/useQueryState', './routes/form.useQueryState.tsx'),
23+
route('/form/useQueryStates', './routes/form.useQueryStates.tsx'),
2224
])
2325
] satisfies RouteConfig
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryState
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryStates
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { testForm } from 'e2e-shared/specs/form.cy'
2+
3+
testForm({
4+
path: '/form/useQueryState',
5+
hook: 'useQueryState'
6+
})
7+
8+
testForm({
9+
path: '/form/useQueryStates',
10+
hook: 'useQueryStates'
11+
})

Diff for: ‎packages/e2e/react/cypress/e2e/shared/form.cy.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { testForm } from 'e2e-shared/specs/form.cy'
2+
3+
testForm({
4+
path: '/form/useQueryState',
5+
hook: 'useQueryState'
6+
})
7+
8+
testForm({
9+
path: '/form/useQueryStates',
10+
hook: 'useQueryStates'
11+
})

Diff for: ‎packages/e2e/react/src/routes.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ const routes: Record<string, React.LazyExoticComponent<() => JSX.Element>> = {
1717
'/routing/useQueryStates/other': lazy(() => import('./routes/routing.useQueryStates.other')),
1818
'/shallow/useQueryState': lazy(() => import('./routes/shallow.useQueryState')),
1919
'/shallow/useQueryStates': lazy(() => import('./routes/shallow.useQueryStates')),
20+
'/form/useQueryState': lazy(() => import('./routes/form.useQueryState')),
21+
'/form/useQueryStates': lazy(() => import('./routes/form.useQueryStates')),
2022
}
2123

2224
export function Router() {

Diff for: ‎packages/e2e/react/src/routes/form.useQueryState.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryState
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryStates

Diff for: ‎packages/e2e/remix/app/routes/form.useQueryState.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryState } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryState
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { TestFormUseQueryStates } from 'e2e-shared/specs/form'
2+
3+
export default TestFormUseQueryStates

Diff for: ‎packages/e2e/remix/cypress/e2e/shared/form.cy.ts

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { testForm } from 'e2e-shared/specs/form.cy'
2+
3+
testForm({
4+
path: '/form/useQueryState',
5+
hook: 'useQueryState'
6+
})
7+
8+
testForm({
9+
path: '/form/useQueryStates',
10+
hook: 'useQueryStates'
11+
})

Diff for: ‎packages/e2e/shared/specs/form.cy.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { createTest } from '../create-test'
2+
3+
export const testForm = createTest('Form', ({ path }) => {
4+
it('supports native HTML forms to update search params', () => {
5+
cy.visit(path)
6+
cy.contains('#hydration-marker', 'hydrated').should('be.hidden')
7+
cy.get('input').type('pass')
8+
cy.get('form').submit()
9+
cy.get('#state').should('have.text', 'pass')
10+
cy.go('back')
11+
cy.get('#state').should('have.text', '')
12+
})
13+
14+
it('supports loading initial form state from the URL', () => {
15+
cy.visit(path + '?test=init')
16+
cy.contains('#hydration-marker', 'hydrated').should('be.hidden')
17+
cy.get('input').should('have.value', 'init')
18+
cy.get('#state').should('have.text', 'init')
19+
cy.get('input').clear().type('pass')
20+
cy.get('form').submit()
21+
cy.get('#state').should('have.text', 'pass')
22+
cy.go('back')
23+
cy.get('#state').should('have.text', 'init')
24+
})
25+
})

Diff for: ‎packages/e2e/shared/specs/form.tsx

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
'use client'
2+
3+
import { parseAsString, useQueryState, useQueryStates } from 'nuqs'
4+
5+
type FormProps = {
6+
defaultValue: string
7+
}
8+
9+
const testParser = parseAsString.withDefault('')
10+
11+
function Form({ defaultValue }: FormProps) {
12+
return (
13+
<form>
14+
<input type="text" id="test" name="test" defaultValue={defaultValue} />
15+
<button type="submit">Submit</button>
16+
</form>
17+
)
18+
}
19+
20+
export function TestFormUseQueryState() {
21+
const [state] = useQueryState('test', testParser)
22+
return (
23+
<>
24+
<pre id="state">{state}</pre>
25+
<Form defaultValue={state} />
26+
</>
27+
)
28+
}
29+
30+
export function TestFormUseQueryStates() {
31+
const [{ state }] = useQueryStates(
32+
{
33+
state: testParser
34+
},
35+
{
36+
urlKeys: {
37+
state: 'test'
38+
}
39+
}
40+
)
41+
return (
42+
<>
43+
<pre id="state">{state}</pre>
44+
<Form defaultValue={state} />
45+
</>
46+
)
47+
}

0 commit comments

Comments
 (0)