Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/react/test-app/Pages/DeepMergeProps.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default ({ bar, foo, baz }: PageProps) => {

const getFresh = () => {
setPage(0)
router.reload({
router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
Expand Down
21 changes: 21 additions & 0 deletions packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { Deferred, usePage } from '@inertiajs/react'

const Users = () => {
const { users } = usePage<{ users?: { text: string } }>().props

return <div>{users?.text}</div>
}

export default () => {
const { filter } = usePage<{ filter: string }>().props

return (
<>
<div>Filter: {filter}</div>

<Deferred data="users" fallback={<div>Loading users...</div>}>
<Users />
</Deferred>
</>
)
}
4 changes: 2 additions & 2 deletions packages/react/test-app/Pages/MatchPropsOnKey.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
Expand All @@ -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'],
})
}
Expand Down
2 changes: 1 addition & 1 deletion packages/svelte/test-app/Pages/DeepMergeProps.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

const getFresh = () => {
page = 0
router.reload({
router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<script lang="ts">
import { Deferred } from '@inertiajs/svelte'

export let filter: string
export let users: { text: string } | undefined
</script>

<div>Filter: {filter}</div>

<Deferred data="users">
<svelte:fragment slot="fallback">
<div>Loading users...</div>
</svelte:fragment>
<div>{users?.text}</div>
</Deferred>
4 changes: 2 additions & 2 deletions packages/svelte/test-app/Pages/MatchPropsOnKey.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
let page = foo.page

const reloadIt = () => {
router.reload({
router.visit('/match-props-on-key', {
data: {
page,
},
Expand All @@ -35,7 +35,7 @@

const getFresh = () => {
page = 0
router.reload({
router.visit('/match-props-on-key', {
reset: ['foo', 'baz'],
})
}
Expand Down
2 changes: 1 addition & 1 deletion packages/vue3/test-app/Pages/DeepMergeProps.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ const reloadIt = () => {

const getFresh = () => {
page.value = 0
router.reload({
router.visit('/deep-merge-props', {
reset: ['foo', 'baz'],
})
}
Expand Down
19 changes: 19 additions & 0 deletions packages/vue3/test-app/Pages/DeferredProps/WithQueryParams.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<script setup lang="ts">
import { Deferred } from '@inertiajs/vue3'

defineProps<{
filter: string
users?: { text: string }
}>()
</script>

<template>
<div>Filter: {{ filter }}</div>

<Deferred data="users">
<template #fallback>
<div>Loading users...</div>
</template>
<div>{{ users?.text }}</div>
</Deferred>
</template>
4 changes: 2 additions & 2 deletions packages/vue3/test-app/Pages/MatchPropsOnKey.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const props = defineProps<ComponentProps>()
const page = ref(props.foo.page)

const reloadIt = () => {
router.reload({
router.visit('/match-props-on-key', {
data: {
page: page.value,
},
Expand All @@ -36,7 +36,7 @@ const reloadIt = () => {

const getFresh = () => {
page.value = 0
router.reload({
router.visit('/match-props-on-key', {
reset: ['foo', 'baz'],
})
}
Expand Down
15 changes: 5 additions & 10 deletions tests/app/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'] || ''
Expand Down
28 changes: 28 additions & 0 deletions tests/app/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' } }),
)
Expand Down
2 changes: 1 addition & 1 deletion tests/deep-merge-props.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
23 changes: 23 additions & 0 deletions tests/deferred-props.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
})
2 changes: 1 addition & 1 deletion tests/form-component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
Loading