Skip to content

Commit 64a4be7

Browse files
committed
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
1 parent 4f1af42 commit 64a4be7

File tree

6 files changed

+111
-10
lines changed

6 files changed

+111
-10
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Deferred, usePage } from '@inertiajs/react'
2+
3+
const Users = () => {
4+
const { users } = usePage<{ users?: { text: string } }>().props
5+
6+
return <div>{users?.text}</div>
7+
}
8+
9+
export default () => {
10+
const { filter } = usePage<{ filter: string }>().props
11+
12+
return (
13+
<>
14+
<div>Filter: {filter}</div>
15+
16+
<Deferred data="users" fallback={<div>Loading users...</div>}>
17+
<Users />
18+
</Deferred>
19+
</>
20+
)
21+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script lang="ts">
2+
import { Deferred } from '@inertiajs/svelte'
3+
4+
export let filter: string
5+
export let users: { text: string } | undefined
6+
</script>
7+
8+
<div>Filter: {filter}</div>
9+
10+
<Deferred data="users">
11+
<svelte:fragment slot="fallback">
12+
<div>Loading users...</div>
13+
</svelte:fragment>
14+
<div>{users?.text}</div>
15+
</Deferred>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script setup lang="ts">
2+
import { Deferred } from '@inertiajs/vue3'
3+
4+
defineProps<{
5+
filter: string
6+
users?: { text: string }
7+
}>()
8+
</script>
9+
10+
<template>
11+
<div>Filter: {{ filter }}</div>
12+
13+
<Deferred data="users">
14+
<template #fallback>
15+
<div>Loading users...</div>
16+
</template>
17+
<div>{{ users?.text }}</div>
18+
</Deferred>
19+
</template>

tests/app/helpers.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,16 @@ module.exports = {
1616
.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
1717
.join(''),
1818
props: {},
19-
// TODO: url should be req.originalUrl as that includes the query string
20-
url: req.path,
19+
url: req.originalUrl,
2120
version: null,
2221
...data,
2322
}
2423

25-
if (data.component.startsWith('InfiniteScroll')) {
24+
if (data.component.startsWith('InfiniteScroll') && req.query.absolutePageUrl) {
2625
// Support absolute URL format for testing URL preservation
27-
if (req.query.absolutePageUrl) {
28-
const protocol = req.protocol
29-
const host = req.get('host')
30-
data.url = `${protocol}://${host}${req.originalUrl}`
31-
} else {
32-
data.url = req.originalUrl
33-
}
26+
const protocol = req.protocol
27+
const host = req.get('host')
28+
data.url = `${protocol}://${host}${req.originalUrl}`
3429
}
3530

3631
const partialDataHeader = req.headers['x-inertia-partial-data'] || ''

tests/app/server.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,34 @@ app.get('/deferred-props/instant-reload', (req, res) => {
758758
)
759759
})
760760

761+
app.get('/deferred-props/with-query-params', (req, res) => {
762+
const filter = req.query.filter || 'none'
763+
const requestedProps = req.headers['x-inertia-partial-data']
764+
765+
if (!requestedProps) {
766+
return inertia.render(req, res, {
767+
component: 'DeferredProps/WithQueryParams',
768+
deferredProps: {
769+
default: ['users'],
770+
},
771+
props: {
772+
filter,
773+
},
774+
})
775+
}
776+
777+
setTimeout(
778+
() =>
779+
inertia.render(req, res, {
780+
component: 'DeferredProps/WithQueryParams',
781+
props: {
782+
users: requestedProps.includes('users') ? { text: `users data for ${filter}` } : undefined,
783+
},
784+
}),
785+
500,
786+
)
787+
})
788+
761789
app.get('/svelte/props-and-page-store', (req, res) =>
762790
inertia.render(req, res, { component: 'Svelte/PropsAndPageStore', props: { foo: req.query.foo || 'default' } }),
763791
)

tests/deferred-props.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,26 @@ test('load deferred props with partial reload on mount', async ({ page }) => {
197197
await expect(page.getByText('foo value')).toBeVisible()
198198
await expect(page.getByText('bar value')).toBeVisible()
199199
})
200+
201+
test('deferred props preserve query parameters from original URL', async ({ page }) => {
202+
await page.goto('/deferred-props/with-query-params?filter=a')
203+
204+
// Verify the initial page load has the correct filter
205+
await expect(page.getByText('Filter: a')).toBeVisible()
206+
await expect(page.getByText('Loading users...')).toBeVisible()
207+
208+
// Wait for and capture the deferred props request
209+
const deferredRequest = await page.waitForResponse((response) => {
210+
const url = response.url()
211+
const headers = response.request().headers()
212+
return headers['x-inertia-partial-data'] === 'users' && url.includes('/deferred-props/with-query-params')
213+
})
214+
215+
// Assert that the deferred props request includes the query parameter
216+
const requestUrl = deferredRequest.url()
217+
expect(requestUrl).toContain('filter=a')
218+
219+
// Verify the deferred data uses the correct filter
220+
await expect(page.getByText('Loading users...')).not.toBeVisible()
221+
await expect(page.getByText('users data for a')).toBeVisible()
222+
})

0 commit comments

Comments
 (0)