mirror of
https://github.com/nuxt/nuxt.git
synced 2025-03-20 00:11:18 +00:00
75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
import { fileURLToPath } from 'node:url'
|
|
import { isWindows } from 'std-env'
|
|
import { join } from 'pathe'
|
|
import { expect, test } from './test-utils'
|
|
|
|
/**
|
|
* This test suite verifies that Nuxt's suspense integration works correctly,
|
|
* testing navigation between pages with suspense boundaries.
|
|
*/
|
|
|
|
const isWebpack = process.env.TEST_BUILDER === 'webpack' || process.env.TEST_BUILDER === 'rspack'
|
|
const isDev = process.env.TEST_ENV === 'dev'
|
|
|
|
const fixtureDir = fileURLToPath(new URL('../fixtures/suspense', import.meta.url))
|
|
|
|
// Run tests in parallel in production mode, but serially in dev mode
|
|
test.describe.configure({ mode: isDev ? 'serial' : 'parallel' })
|
|
|
|
test.use({
|
|
nuxt: {
|
|
rootDir: fixtureDir,
|
|
dev: isDev,
|
|
server: true,
|
|
browser: true,
|
|
setupTimeout: (isWindows ? 360 : 120) * 1000,
|
|
nuxtConfig: {
|
|
builder: isWebpack ? 'webpack' : 'vite',
|
|
buildDir: isDev ? join(fixtureDir, '.nuxt', 'test', Math.random().toString(36).slice(2, 8)) : undefined,
|
|
},
|
|
},
|
|
})
|
|
|
|
test.describe('Suspense multiple navigation', () => {
|
|
test('should not throw error during multiple rapid navigation', async ({ page, goto }) => {
|
|
// Navigate to the index page
|
|
await goto('/')
|
|
|
|
// Verify initial state
|
|
await expect(page.getByTestId('btn-a')).toHaveText(' Target A ')
|
|
|
|
// Navigate to target page using button A
|
|
await page.getByTestId('btn-a').click()
|
|
await page.waitForFunction(() => window.useNuxtApp?.()._route.path === '/target')
|
|
|
|
// Verify content after navigation
|
|
await expect(page.getByTestId('content')).toContainText('Hello a')
|
|
|
|
// Go back to index page
|
|
await page.goBack()
|
|
await page.waitForFunction(() => window.useNuxtApp?.()._route.path === '/')
|
|
|
|
// Verify back at index page
|
|
await expect(page.getByTestId('index-title')).toBeVisible()
|
|
|
|
// Test multiple rapid navigation (clicking both buttons before first navigation completes)
|
|
await Promise.all([
|
|
page.getByTestId('btn-a').click(),
|
|
page.getByTestId('btn-b').click(),
|
|
page.getByTestId('btn-a').click(),
|
|
page.getByTestId('btn-b').click(),
|
|
page.getByTestId('btn-a').click(),
|
|
page.getByTestId('btn-b').click(),
|
|
page.getByTestId('btn-a').click(),
|
|
page.getByTestId('btn-b').click(),
|
|
])
|
|
|
|
// Verify we reached the target page with the correct content (from the second navigation)
|
|
await page.waitForFunction(() => window.useNuxtApp?.()._route.path === '/target')
|
|
await expect(page.getByTestId('content')).toContainText('Hello b')
|
|
|
|
// Verify no errors or warnings occurred
|
|
expect(page).toHaveNoErrorsOrWarnings()
|
|
})
|
|
})
|