Files
Tim NeutkensandGitHub 8040cf8728 Turbopack build: Fix urlencoding test (#77622)
### What?
- Added additional debug logging for `customRoutes`,
`publicFolderItems`, and `nextStaticFolderItems` in the filesystem
router utils
- Improved the dynamic route interpolation test to check all script
sources instead of just the first matching one
- Fixed the Turbopack build test manifest to correctly mark the dynamic
route interpolation test as passing
- Updated the `to_string()` implementation in `ServerFileSystem` to use
a hyphenated format so that it behaves the same between urlencoded and
urldecoded.

### Why?

This PR improves debugging capabilities for the filesystem router and
fixes the dynamic route interpolation test to be more robust by checking
all script sources rather than just the first one that matches certain
criteria. The test now properly verifies that both encoded and decoded
paths work correctly.

### How?
- Added debug statements for additional route-related variables
- Refactored the test to collect all script sources and verify each one
works with both encoded and decoded paths
- Updated the Turbopack test manifest to reflect the fixed test
- Changed the server filesystem string representation to use hyphens
instead of spaces
2025-03-31 10:40:14 +02:00

86 lines
2.8 KiB
TypeScript

import { nextTestSetup } from 'e2e-utils'
describe('Dynamic Route Interpolation', () => {
const { next, isNextStart } = nextTestSetup({
files: __dirname,
})
it('should work', async () => {
const $ = await next.render$('/blog/a')
expect($('#slug').text()).toBe('a')
})
it('should work with parameter itself', async () => {
const $ = await next.render$('/blog/[slug]')
expect($('#slug').text()).toBe('[slug]')
})
it('should work with brackets', async () => {
const $ = await next.render$('/blog/[abc]')
expect($('#slug').text()).toBe('[abc]')
})
it('should work with parameter itself in API routes', async () => {
const text = await next.render('/api/dynamic/[slug]')
expect(text).toBe('slug: [slug]')
})
it('should work with brackets in API routes', async () => {
const text = await next.render('/api/dynamic/[abc]')
expect(text).toBe('slug: [abc]')
})
it('should bust data cache', async () => {
const browser = await next.browser('/blog/login')
await browser.elementById('now').click() // fetch data once
const text = await browser.elementById('now').text()
await browser.elementById('now').click() // fetch data again
await browser.waitForElementByCss(`#now:not(:text("${text}"))`)
await browser.close()
})
it('should bust data cache with symbol', async () => {
const browser = await next.browser('/blog/@login')
await browser.elementById('now').click() // fetch data once
const text = await browser.elementById('now').text()
await browser.elementById('now').click() // fetch data again
await browser.waitForElementByCss(`#now:not(:text("${text}"))`)
await browser.close()
})
if (isNextStart) {
it('should support both encoded and decoded nextjs reserved path convention characters in path', async () => {
const $ = await next.render$('/blog/123')
const scripts: string[] = []
for (const script of $('script').toArray()) {
if (script.attribs.src) {
scripts.push(script.attribs.src)
}
}
expect(scripts).not.toBeEmpty()
for (const encodedPath of scripts) {
// e.g. /_next/static/chunks/pages/blog/%5Bslug%5D-3d2fedc300f04305.js
const { status: encodedPathReqStatus } = await next.fetch(encodedPath)
// e.g. /_next/static/chunks/pages/blog/[slug]-3d2fedc300f04305.js
const decodedPath = decodeURI(encodedPath)
const { status: decodedPathReqStatus } = await next.fetch(decodedPath)
expect({
encodedPath,
encodedStatus: encodedPathReqStatus,
decodedPath,
decodedStatus: decodedPathReqStatus,
}).toMatchObject({
encodedPath,
decodedPath,
encodedStatus: 200,
decodedStatus: 200,
})
}
})
}
})