From 64a4be74268c9a57fb0d0e88ef174ae1c752d078 Mon Sep 17 00:00:00 2001
From: Alex Speller <1217+alexspeller@users.noreply.github.com>
Date: Tue, 28 Oct 2025 13:55:47 -0100
Subject: [PATCH 1/2] fix: preserve query parameters in test server responses
Found this issue whilst looking at the other recent deferred props
issue, this one is nice and small though!
The test server was using req.path instead of req.originalUrl, which
stripped query parameters from the URL in Inertia responses.
Just a test server issue in this case
---
.../Pages/DeferredProps/WithQueryParams.tsx | 21 ++++++++++++++
.../DeferredProps/WithQueryParams.svelte | 15 ++++++++++
.../Pages/DeferredProps/WithQueryParams.vue | 19 +++++++++++++
tests/app/helpers.js | 15 ++++------
tests/app/server.js | 28 +++++++++++++++++++
tests/deferred-props.spec.ts | 23 +++++++++++++++
6 files changed, 111 insertions(+), 10 deletions(-)
create mode 100644 packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx
create mode 100644 packages/svelte/test-app/Pages/DeferredProps/WithQueryParams.svelte
create mode 100644 packages/vue3/test-app/Pages/DeferredProps/WithQueryParams.vue
diff --git a/packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx b/packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx
new file mode 100644
index 000000000..c736eab17
--- /dev/null
+++ b/packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx
@@ -0,0 +1,21 @@
+import { Deferred, usePage } from '@inertiajs/react'
+
+const Users = () => {
+ const { users } = usePage<{ users?: { text: string } }>().props
+
+ return
{users?.text}
+}
+
+export default () => {
+ const { filter } = usePage<{ filter: string }>().props
+
+ return (
+ <>
+ Filter: {filter}
+
+ Loading users...}>
+
+
+ >
+ )
+}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/WithQueryParams.svelte b/packages/svelte/test-app/Pages/DeferredProps/WithQueryParams.svelte
new file mode 100644
index 000000000..742864c1f
--- /dev/null
+++ b/packages/svelte/test-app/Pages/DeferredProps/WithQueryParams.svelte
@@ -0,0 +1,15 @@
+
+
+Filter: {filter}
+
+
+
+ Loading users...
+
+ {users?.text}
+
diff --git a/packages/vue3/test-app/Pages/DeferredProps/WithQueryParams.vue b/packages/vue3/test-app/Pages/DeferredProps/WithQueryParams.vue
new file mode 100644
index 000000000..2696b5ccf
--- /dev/null
+++ b/packages/vue3/test-app/Pages/DeferredProps/WithQueryParams.vue
@@ -0,0 +1,19 @@
+
+
+
+ Filter: {{ filter }}
+
+
+
+ Loading users...
+
+ {{ users?.text }}
+
+
diff --git a/tests/app/helpers.js b/tests/app/helpers.js
index d71d3b7a6..f2a67bb1b 100644
--- a/tests/app/helpers.js
+++ b/tests/app/helpers.js
@@ -16,21 +16,16 @@ module.exports = {
.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
.join(''),
props: {},
- // TODO: url should be req.originalUrl as that includes the query string
- url: req.path,
+ url: req.originalUrl,
version: null,
...data,
}
- if (data.component.startsWith('InfiniteScroll')) {
+ if (data.component.startsWith('InfiniteScroll') && req.query.absolutePageUrl) {
// Support absolute URL format for testing URL preservation
- if (req.query.absolutePageUrl) {
- const protocol = req.protocol
- const host = req.get('host')
- data.url = `${protocol}://${host}${req.originalUrl}`
- } else {
- data.url = req.originalUrl
- }
+ const protocol = req.protocol
+ const host = req.get('host')
+ data.url = `${protocol}://${host}${req.originalUrl}`
}
const partialDataHeader = req.headers['x-inertia-partial-data'] || ''
diff --git a/tests/app/server.js b/tests/app/server.js
index da1d0c1c5..1234d5461 100644
--- a/tests/app/server.js
+++ b/tests/app/server.js
@@ -758,6 +758,34 @@ app.get('/deferred-props/instant-reload', (req, res) => {
)
})
+app.get('/deferred-props/with-query-params', (req, res) => {
+ const filter = req.query.filter || 'none'
+ const requestedProps = req.headers['x-inertia-partial-data']
+
+ if (!requestedProps) {
+ return inertia.render(req, res, {
+ component: 'DeferredProps/WithQueryParams',
+ deferredProps: {
+ default: ['users'],
+ },
+ props: {
+ filter,
+ },
+ })
+ }
+
+ setTimeout(
+ () =>
+ inertia.render(req, res, {
+ component: 'DeferredProps/WithQueryParams',
+ props: {
+ users: requestedProps.includes('users') ? { text: `users data for ${filter}` } : undefined,
+ },
+ }),
+ 500,
+ )
+})
+
app.get('/svelte/props-and-page-store', (req, res) =>
inertia.render(req, res, { component: 'Svelte/PropsAndPageStore', props: { foo: req.query.foo || 'default' } }),
)
diff --git a/tests/deferred-props.spec.ts b/tests/deferred-props.spec.ts
index c6c7c6a56..76b2dec8a 100644
--- a/tests/deferred-props.spec.ts
+++ b/tests/deferred-props.spec.ts
@@ -197,3 +197,26 @@ test('load deferred props with partial reload on mount', async ({ page }) => {
await expect(page.getByText('foo value')).toBeVisible()
await expect(page.getByText('bar value')).toBeVisible()
})
+
+test('deferred props preserve query parameters from original URL', async ({ page }) => {
+ await page.goto('/deferred-props/with-query-params?filter=a')
+
+ // Verify the initial page load has the correct filter
+ await expect(page.getByText('Filter: a')).toBeVisible()
+ await expect(page.getByText('Loading users...')).toBeVisible()
+
+ // Wait for and capture the deferred props request
+ const deferredRequest = await page.waitForResponse((response) => {
+ const url = response.url()
+ const headers = response.request().headers()
+ return headers['x-inertia-partial-data'] === 'users' && url.includes('/deferred-props/with-query-params')
+ })
+
+ // Assert that the deferred props request includes the query parameter
+ const requestUrl = deferredRequest.url()
+ expect(requestUrl).toContain('filter=a')
+
+ // Verify the deferred data uses the correct filter
+ await expect(page.getByText('Loading users...')).not.toBeVisible()
+ await expect(page.getByText('users data for a')).toBeVisible()
+})
From 4b1a7f782f990378e14f64c20cec69d5975ac6ca Mon Sep 17 00:00:00 2001
From: Alex Speller <1217+alexspeller@users.noreply.github.com>
Date: Wed, 29 Oct 2025 11:33:09 -0100
Subject: [PATCH 2/2] Fix tests that had incorrect query param assumptions
---
.../react/test-app/Pages/DeepMergeProps.tsx | 2 +-
.../react/test-app/Pages/MatchPropsOnKey.tsx | 4 +-
.../test-app/Pages/DeepMergeProps.svelte | 2 +-
.../test-app/Pages/MatchPropsOnKey.svelte | 4 +-
.../vue3/test-app/Pages/DeepMergeProps.vue | 2 +-
.../vue3/test-app/Pages/MatchPropsOnKey.vue | 4 +-
tests/deep-merge-props.spec.ts | 2 +-
tests/form-component.spec.ts | 2 +-
tests/links.spec.ts | 40 +++++++--------
tests/manual-visits.spec.ts | 50 +++++++++----------
tests/merge-props.spec.ts | 8 +--
tests/support.ts | 2 +-
tests/svelte.spec.ts | 2 +-
tests/when-visible.spec.ts | 4 +-
14 files changed, 64 insertions(+), 64 deletions(-)
diff --git a/packages/react/test-app/Pages/DeepMergeProps.tsx b/packages/react/test-app/Pages/DeepMergeProps.tsx
index e6dad4f79..bd01cbed3 100644
--- a/packages/react/test-app/Pages/DeepMergeProps.tsx
+++ b/packages/react/test-app/Pages/DeepMergeProps.tsx
@@ -24,7 +24,7 @@ export default ({ bar, foo, baz }: PageProps) => {
const getFresh = () => {
setPage(0)
- router.reload({
+ router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
diff --git a/packages/react/test-app/Pages/MatchPropsOnKey.tsx b/packages/react/test-app/Pages/MatchPropsOnKey.tsx
index 86d5f8a5c..a04e6cb9a 100644
--- a/packages/react/test-app/Pages/MatchPropsOnKey.tsx
+++ b/packages/react/test-app/Pages/MatchPropsOnKey.tsx
@@ -26,7 +26,7 @@ export default ({ bar, foo, baz }: PageProps) => {
const [page, setPage] = useState(foo.page)
const reloadIt = () => {
- router.reload({
+ router.visit('/match-props-on-key', {
data: {
page,
},
@@ -39,7 +39,7 @@ export default ({ bar, foo, baz }: PageProps) => {
const getFresh = () => {
setPage(0)
- router.reload({
+ router.visit('/match-props-on-key', {
reset: ['foo', 'baz'],
})
}
diff --git a/packages/svelte/test-app/Pages/DeepMergeProps.svelte b/packages/svelte/test-app/Pages/DeepMergeProps.svelte
index 465d99902..ff728b3d8 100644
--- a/packages/svelte/test-app/Pages/DeepMergeProps.svelte
+++ b/packages/svelte/test-app/Pages/DeepMergeProps.svelte
@@ -21,7 +21,7 @@
const getFresh = () => {
page = 0
- router.reload({
+ router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
diff --git a/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte b/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte
index 9b0998943..c33e9693a 100644
--- a/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte
+++ b/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte
@@ -21,7 +21,7 @@
let page = foo.page
const reloadIt = () => {
- router.reload({
+ router.visit('/match-props-on-key', {
data: {
page,
},
@@ -35,7 +35,7 @@
const getFresh = () => {
page = 0
- router.reload({
+ router.visit('/match-props-on-key', {
reset: ['foo', 'baz'],
})
}
diff --git a/packages/vue3/test-app/Pages/DeepMergeProps.vue b/packages/vue3/test-app/Pages/DeepMergeProps.vue
index de0bb3784..8b1f0e7c4 100644
--- a/packages/vue3/test-app/Pages/DeepMergeProps.vue
+++ b/packages/vue3/test-app/Pages/DeepMergeProps.vue
@@ -34,7 +34,7 @@ const reloadIt = () => {
const getFresh = () => {
page.value = 0
- router.reload({
+ router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
diff --git a/packages/vue3/test-app/Pages/MatchPropsOnKey.vue b/packages/vue3/test-app/Pages/MatchPropsOnKey.vue
index f4742c676..268df3735 100644
--- a/packages/vue3/test-app/Pages/MatchPropsOnKey.vue
+++ b/packages/vue3/test-app/Pages/MatchPropsOnKey.vue
@@ -21,7 +21,7 @@ const props = defineProps()
const page = ref(props.foo.page)
const reloadIt = () => {
- router.reload({
+ router.visit('/match-props-on-key', {
data: {
page: page.value,
},
@@ -36,7 +36,7 @@ const reloadIt = () => {
const getFresh = () => {
page.value = 0
- router.reload({
+ router.visit('/match-props-on-key', {
reset: ['foo', 'baz'],
})
}
diff --git a/tests/deep-merge-props.spec.ts b/tests/deep-merge-props.spec.ts
index e83b37d0d..b91b457e4 100644
--- a/tests/deep-merge-props.spec.ts
+++ b/tests/deep-merge-props.spec.ts
@@ -29,7 +29,7 @@ test('can deep merge props', async ({ page }) => {
await expect(page.getByText('foo.per_page is 5')).toBeVisible()
await expect(page.getByText('foo.meta.label is third')).toBeVisible()
- await clickAndWaitForResponse(page, 'Get Fresh', null, 'button')
+ await clickAndWaitForResponse(page, 'Get Fresh', '/deep-merge-props', 'button')
await expect(page.getByText('bar count is 5')).toBeVisible()
await expect(page.getByText('baz count is 5')).toBeVisible()
diff --git a/tests/form-component.spec.ts b/tests/form-component.spec.ts
index a1aecddb8..2e197664c 100644
--- a/tests/form-component.spec.ts
+++ b/tests/form-component.spec.ts
@@ -441,7 +441,7 @@ test.describe('Form Component', () => {
expect(scrollBefore).toBeGreaterThan(0)
await page.getByRole('button', { name: 'Submit' }).click()
- await page.waitForURL('/article')
+ await page.waitForURL(/\/article/)
const scrollAfter = await page.evaluate(() => window.scrollY)
// TODO: why is this not exactly 100?
diff --git a/tests/links.spec.ts b/tests/links.spec.ts
index 408e52951..eca91fd67 100644
--- a/tests/links.spec.ts
+++ b/tests/links.spec.ts
@@ -331,7 +331,7 @@ test.describe('preserve state', () => {
await expect(componentKey).not.toBeUndefined()
await page.getByRole('link', { name: label }).click()
- await expect(page).toHaveURL('/links/preserve-state-page-two')
+ await expect(page).toHaveURL(`/links/preserve-state-page-two?foo=${expected}`)
const newComponentKey = await page.evaluate(() => (window as any)._inertia_page_key)
await expect(newComponentKey).not.toBeUndefined()
@@ -365,7 +365,7 @@ test.describe('preserve state', () => {
await expect(componentKey).not.toBeUndefined()
await page.getByRole('link', { name: label }).click()
- await expect(page).toHaveURL('/links/preserve-state-page-two')
+ await expect(page).toHaveURL(`/links/preserve-state-page-two?foo=${expected}`)
// @ts-ignore
const newComponentKey = await page.evaluate(() => window._inertia_page_key)
@@ -398,7 +398,7 @@ test.describe('preserve url', () => {
const initialUrl = page.url()
await page.getByRole('link', { name: '[URL] Preserve: false' }).click()
- await expect(page).toHaveURL('/links/preserve-url-page-two')
+ await expect(page).toHaveURL('/links/preserve-url-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await expect(page.url()).not.toBe(initialUrl) // URL should have changed
})
@@ -447,7 +447,7 @@ test.describe('preserve scroll', () => {
test('does not reset untracked scroll regions in persistent layouts', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll' }).click()
- await expect(page).toHaveURL('/links/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-false-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -460,7 +460,7 @@ test.describe('preserve scroll', () => {
consoleMessages.listen(page)
await page.getByRole('link', { exact: true, name: 'Reset Scroll (Callback)' }).click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/links/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-false-page-two?foo=foo')
await expect(page.getByText('Foo is now foo')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -479,7 +479,7 @@ test.describe('preserve scroll', () => {
test('does not restore untracked scroll regions when pressing the back button', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll' }).click()
- await expect(page).toHaveURL('/links/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-false-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await scrollElementTo(
@@ -505,7 +505,7 @@ test.describe('preserve scroll', () => {
.getByRole('link', { exact: true, name: 'Preserve Scroll (Callback)' })
.click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/links/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-false-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await scrollElementTo(
@@ -567,7 +567,7 @@ test.describe('enabled', () => {
test('resets scroll regions to the top when doing a regular visit', async ({ page }) => {
await page.getByText('Reset Scroll', { exact: true }).click()
- await expect(page).toHaveURL('/links/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -578,7 +578,7 @@ test.describe('enabled', () => {
consoleMessages.listen(page)
await page.getByText('Reset Scroll (Callback)', { exact: true }).click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/links/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-page-two?foo=foo')
await expect(page.getByText('Foo is now foo')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -596,7 +596,7 @@ test.describe('enabled', () => {
test('preserves scroll regions when using the "preserve-scroll" feature', async ({ page }) => {
await page.getByText('Preserve Scroll', { exact: true }).click()
- await expect(page).toHaveURL('/links/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible()
@@ -607,7 +607,7 @@ test.describe('enabled', () => {
consoleMessages.listen(page)
await page.getByText('Preserve Scroll (Callback)', { exact: true }).click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/links/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible()
@@ -623,7 +623,7 @@ test.describe('enabled', () => {
test('restores all tracked scroll regions when pressing the back button', async ({ page }) => {
await page.getByTestId('preserve').click()
- await expect(page).toHaveURL('/links/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/links/preserve-scroll-page-two?foo=baz')
await page.waitForTimeout(100)
await scrollElementTo(
@@ -844,7 +844,7 @@ test.describe('partial reloads', () => {
requests.listen(page)
await page.getByRole('link', { name: 'Update All' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(requests.requests).toHaveLength(1)
@@ -858,7 +858,7 @@ test.describe('partial reloads', () => {
requests.listen(page)
await page.getByRole('link', { name: 'Only foo + bar' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(requests.requests).toHaveLength(1)
@@ -873,7 +873,7 @@ test.describe('partial reloads', () => {
test('it updates all props when the feature is not being used', async ({ page }) => {
await page.getByRole('link', { name: 'Update All' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
@@ -882,21 +882,21 @@ test.describe('partial reloads', () => {
test('it only updates props that are passed through "only"', async ({ page }) => {
await page.getByRole('link', { name: 'Only foo + bar' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
await expect(page.getByText('Baz is now 3')).toBeVisible()
await page.getByRole('link', { name: 'Only baz' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=2')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
await expect(page.getByText('Baz is now 5')).toBeVisible()
await page.getByRole('link', { name: 'Update All' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=2')
await expect(page.getByText('Foo is now 3')).toBeVisible()
await expect(page.getByText('Bar is now 4')).toBeVisible()
@@ -905,14 +905,14 @@ test.describe('partial reloads', () => {
test('it only updates props that are not passed through "except"', async ({ page }) => {
await page.getByRole('link', { name: 'Except foo + bar' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 1')).toBeVisible()
await expect(page.getByText('Bar is now 2')).toBeVisible()
await expect(page.getByText('Baz is now 4')).toBeVisible()
await page.getByRole('link', { name: 'Except baz' }).click()
- await expect(page).toHaveURL('/links/partial-reloads')
+ await expect(page).toHaveURL('/links/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
diff --git a/tests/manual-visits.spec.ts b/tests/manual-visits.spec.ts
index b63e00e1f..c0b4548f0 100644
--- a/tests/manual-visits.spec.ts
+++ b/tests/manual-visits.spec.ts
@@ -381,7 +381,7 @@ test.describe('Preserve state', () => {
await expect(componentKey).not.toBeUndefined()
await page.getByRole('link', { name: label }).click()
- await expect(page).toHaveURL('/visits/preserve-state-page-two')
+ await expect(page).toHaveURL(`/visits/preserve-state-page-two?foo=${expected}`)
const newComponentKey = await page.evaluate(() => (window as any)._inertia_page_key)
await expect(newComponentKey).not.toBeUndefined()
@@ -419,7 +419,7 @@ test.describe('Preserve state', () => {
await expect(componentKey).not.toBeUndefined()
await page.getByRole('link', { name: label }).click()
- await expect(page).toHaveURL('/visits/preserve-state-page-two')
+ await expect(page).toHaveURL(`/visits/preserve-state-page-two?foo=${expected}`)
const newComponentKey = await page.evaluate(() => (window as any)._inertia_page_key)
await expect(newComponentKey).not.toBeUndefined()
@@ -452,7 +452,7 @@ test.describe('Preserve scroll', () => {
test('does not reset untracked scroll regions in persistent layouts (visit method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -461,7 +461,7 @@ test.describe('Preserve scroll', () => {
test('does not reset untracked scroll regions in persistent layouts (GET method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll (GET)' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -476,7 +476,7 @@ test.describe('Preserve scroll', () => {
await page
.getByRole('link', { exact: true, name: 'Reset Scroll (Callback)' })
.click({ position: { x: 20, y: 0 } })
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=foo')
await expect(page.getByText('Foo is now foo')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -495,7 +495,7 @@ test.describe('Preserve scroll', () => {
test('does not restore untracked scroll regions when pressing the back button (visit method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await scrollElementTo(
@@ -518,7 +518,7 @@ test.describe('Preserve scroll', () => {
test('does not restore untracked scroll regions when pressing the back button (GET method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll (GET)' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await scrollElementTo(
@@ -545,7 +545,7 @@ test.describe('Preserve scroll', () => {
await page.getByRole('link', { name: 'Preserve Scroll (Callback)' }).click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await scrollElementTo(
@@ -611,7 +611,7 @@ test.describe('Preserve scroll', () => {
test('resets scroll regions to the top when doing a regular visit (visit method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -620,7 +620,7 @@ test.describe('Preserve scroll', () => {
test('resets scroll regions to the top when doing a regular visit (GET method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Reset Scroll (GET)' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -633,7 +633,7 @@ test.describe('Preserve scroll', () => {
.getByRole('link', { exact: true, name: 'Reset Scroll (Callback)' })
.click({ position: { x: 20, y: 0 } })
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=foo')
await expect(page.getByText('Foo is now foo')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 0 & 0')).toBeVisible()
@@ -651,7 +651,7 @@ test.describe('Preserve scroll', () => {
test('preserves scroll regions when using the "preserve-scroll" feature (visit method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Preserve Scroll' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=foo')
await expect(page.getByText('Foo is now foo')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible()
@@ -661,7 +661,7 @@ test.describe('Preserve scroll', () => {
test('preserves scroll regions when using the "preserve-scroll" feature (GET method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Preserve Scroll (GET)' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=bar')
await expect(page.getByText('Foo is now bar')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible()
@@ -674,7 +674,7 @@ test.describe('Preserve scroll', () => {
.getByRole('link', { exact: true, name: 'Preserve Scroll (Callback)' })
.click({ position: { x: 0, y: 0 } })
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=baz')
await expect(page.getByText('Foo is now baz')).toBeVisible()
await page.getByRole('button', { exact: true, name: 'Update scroll positions' }).click()
await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible()
@@ -690,7 +690,7 @@ test.describe('Preserve scroll', () => {
test('restores all tracked scroll regions when pressing the back button (visit method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Preserve Scroll' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=foo')
await page.waitForTimeout(100)
await scrollElementTo(
@@ -711,7 +711,7 @@ test.describe('Preserve scroll', () => {
test('restores all tracked scroll regions when pressing the back button (GET method)', async ({ page }) => {
await page.getByRole('link', { exact: true, name: 'Preserve Scroll (GET)' }).click()
- await expect(page).toHaveURL('/visits/preserve-scroll-page-two')
+ await expect(page).toHaveURL('/visits/preserve-scroll-page-two?foo=bar')
await page.waitForTimeout(100)
await scrollElementTo(
@@ -801,7 +801,7 @@ test.describe('Partial Reloads', () => {
requests.listen(page)
await page.getByRole('link', { name: `Update All (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(requests.requests).toHaveLength(1)
@@ -815,7 +815,7 @@ test.describe('Partial Reloads', () => {
requests.listen(page)
await page.getByRole('link', { name: `'Only' foo + bar (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(requests.requests).toHaveLength(1)
@@ -832,7 +832,7 @@ test.describe('Partial Reloads', () => {
requests.listen(page)
await page.getByRole('link', { name: `'Except' foo + bar (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(requests.requests).toHaveLength(1)
@@ -847,7 +847,7 @@ test.describe('Partial Reloads', () => {
test(`it updates all props when the feature is not being used (${label})`, async ({ page }) => {
await page.getByRole('link', { name: `Update All (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
@@ -857,21 +857,21 @@ test.describe('Partial Reloads', () => {
test(`it only updates props that are passed through "only" (${label})`, async ({ page }) => {
await page.getByRole('link', { name: `'Only' foo + bar (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
await expect(page.getByText('Baz is now 3')).toBeVisible()
await page.getByRole('link', { name: `'Only' baz (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=2')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
await expect(page.getByText('Baz is now 5')).toBeVisible()
await page.getByRole('link', { name: `Update All (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=2')
await expect(page.getByText('Foo is now 3')).toBeVisible()
await expect(page.getByText('Bar is now 4')).toBeVisible()
@@ -880,14 +880,14 @@ test.describe('Partial Reloads', () => {
test(`it only updates props that are not passed through "except" (${label})`, async ({ page }) => {
await page.getByRole('link', { name: `'Except' foo + bar (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 1')).toBeVisible()
await expect(page.getByText('Bar is now 2')).toBeVisible()
await expect(page.getByText('Baz is now 4')).toBeVisible()
await page.getByRole('link', { name: `'Except' baz (${label})` }).click()
- await expect(page).toHaveURL('/visits/partial-reloads')
+ await expect(page).toHaveURL('/visits/partial-reloads?foo=1')
await expect(page.getByText('Foo is now 2')).toBeVisible()
await expect(page.getByText('Bar is now 3')).toBeVisible()
diff --git a/tests/merge-props.spec.ts b/tests/merge-props.spec.ts
index 6617c3f8a..c91db615c 100644
--- a/tests/merge-props.spec.ts
+++ b/tests/merge-props.spec.ts
@@ -34,12 +34,12 @@ test('can append to nested props', async ({ page }) => {
await expect(page.getByText('User 1, User 2, User 3')).toBeVisible()
await expect(page.getByText('Page: 1, Per Page: 3')).toBeVisible()
- await clickAndWaitForResponse(page, 'Load More', page.url() + '?page=2', 'button')
+ await clickAndWaitForResponse(page, 'Load More', '/merge-nested-props/append?page=2', 'button')
await expect(page.getByText('User 1, User 2, User 3, User 4, User 5, User 6')).toBeVisible()
await expect(page.getByText('Page: 2, Per Page: 3')).toBeVisible()
- await clickAndWaitForResponse(page, 'Load More', page.url() + '?page=3', 'button')
+ await clickAndWaitForResponse(page, 'Load More', '/merge-nested-props/append?page=3', 'button')
await expect(page.getByText('User 1, User 2, User 3, User 4, User 5, User 6, User 7, User 8, User 9')).toBeVisible()
await expect(page.getByText('Page: 3, Per Page: 3')).toBeVisible()
@@ -51,12 +51,12 @@ test('can prepend to nested props', async ({ page }) => {
await expect(page.getByText('User 3, User 2, User 1')).toBeVisible()
await expect(page.getByText('Page: 1, Per Page: 3')).toBeVisible()
- await clickAndWaitForResponse(page, 'Load More', page.url() + '?page=2', 'button')
+ await clickAndWaitForResponse(page, 'Load More', '/merge-nested-props/prepend?page=2', 'button')
await expect(page.getByText('User 6, User 5, User 4, User 3, User 2, User 1')).toBeVisible()
await expect(page.getByText('Page: 2, Per Page: 3')).toBeVisible()
- await clickAndWaitForResponse(page, 'Load More', page.url() + '?page=3', 'button')
+ await clickAndWaitForResponse(page, 'Load More', '/merge-nested-props/prepend?page=3', 'button')
await expect(page.getByText('User 9, User 8, User 7, User 6, User 5, User 4, User 3, User 2, User 1')).toBeVisible()
await expect(page.getByText('Page: 3, Per Page: 3')).toBeVisible()
diff --git a/tests/support.ts b/tests/support.ts
index bae7d4abb..29b7c6498 100644
--- a/tests/support.ts
+++ b/tests/support.ts
@@ -56,7 +56,7 @@ export const requests = {
}
export const shouldBeDumpPage = async (page: Page, method: 'get' | 'post' | 'patch' | 'put' | 'delete') => {
- await expect(page).toHaveURL(`dump/${method}`)
+ await expect(page).toHaveURL(new RegExp(`dump/${method}`))
// @ts-ignore
const dump = await page.evaluate(() => window._inertia_request_dump)
await expect(dump).not.toBeNull()
diff --git a/tests/svelte.spec.ts b/tests/svelte.spec.ts
index fba22eab0..1c51c16b1 100644
--- a/tests/svelte.spec.ts
+++ b/tests/svelte.spec.ts
@@ -74,7 +74,7 @@ test('props and page store are in sync', async ({ page }) => {
await page.waitForURL('/')
await page.goBack()
- await page.waitForURL('/svelte/props-and-page-store')
+ await page.waitForURL('/svelte/props-and-page-store?foo=baz')
consoleMessages.messages = []
await expect(page.getByText('foo prop is baz')).toBeVisible()
diff --git a/tests/when-visible.spec.ts b/tests/when-visible.spec.ts
index 5fb504392..e78de9fe6 100644
--- a/tests/when-visible.spec.ts
+++ b/tests/when-visible.spec.ts
@@ -72,7 +72,7 @@ test('it will wait to fire the reload until element is visible', async ({ page }
await page.evaluate(() => (window as any).scrollTo(0, 26_000))
await expect(page.getByText('Loading fifth one...')).toBeVisible()
- await page.waitForResponse(page.url() + '?count=0')
+ await page.waitForResponse('/when-visible?count=0')
await expect(page.getByText('Loading fifth one...')).not.toBeVisible()
await expect(page.getByText('Count is now 1')).toBeVisible()
@@ -82,6 +82,6 @@ test('it will wait to fire the reload until element is visible', async ({ page }
await page.evaluate(() => (window as any).scrollTo(0, 26_000))
await expect(page.getByText('Count is now 1')).toBeVisible()
- await page.waitForResponse(page.url() + '?count=1')
+ await page.waitForResponse('/when-visible?count=1')
await expect(page.getByText('Count is now 2')).toBeVisible()
})