Nuxt/test/e2e/suspense.test.ts
Daniel Roe 7fd75f54ad
test: migrate runtime compiler test to playwright (+ add test cases) (#31405)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-03-17 21:21:54 +00:00

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()
})
})