next.js/packages/next/src/server/route-modules/app-page/normalize-request-url.test.ts
normalize-request-url.test.ts124 lines4.0 KB
import {
  NEXT_ROUTER_PREFETCH_HEADER,
  NEXT_ROUTER_SEGMENT_PREFETCH_HEADER,
  RSC_HEADER,
} from '../../../client/components/app-router-headers'
import { parseReqUrl } from '../../../lib/url'
import { getRequestMeta } from '../../request-meta'
import { RSCPathnameNormalizer } from '../../normalizers/request/rsc'
import { SegmentPrefixRSCPathnameNormalizer } from '../../normalizers/request/segment-prefix-rsc'
import {
  applyAppPageRscRequestMetaFromHeaders,
  normalizeAppPageRequestUrl,
} from './normalize-request-url'

type TestRequest = {
  headers: Record<string, string | string[]>
  url: string
}

describe('normalizeAppPageRequestUrl', () => {
  it('rewrites req.url for regular RSC requests', () => {
    const req: TestRequest = {
      headers: {},
      url: '/docs/frameworks/frontend.rsc?foo=bar',
    }
    const parsedUrl = parseReqUrl(req.url)!

    parsedUrl.pathname = new RSCPathnameNormalizer().normalize(
      parsedUrl.pathname!
    )
    req.headers[RSC_HEADER] = '1'

    normalizeAppPageRequestUrl(req, parsedUrl.pathname!)

    expect(parsedUrl.pathname).toBe('/docs/frameworks/frontend')
    expect(req.url).toBe('/docs/frameworks/frontend?foo=bar')
    expect(req.headers[RSC_HEADER]).toBe('1')
  })

  it('rewrites req.url for segment prefetch RSC requests', () => {
    const req: TestRequest = {
      headers: {},
      url: '/docs/frameworks/frontend.segments/_tree.segment.rsc?foo=bar',
    }
    const parsedUrl = parseReqUrl(req.url)!
    const result = new SegmentPrefixRSCPathnameNormalizer().extract(
      parsedUrl.pathname!
    )!

    parsedUrl.pathname = result.originalPathname
    req.headers[RSC_HEADER] = '1'
    req.headers[NEXT_ROUTER_PREFETCH_HEADER] = '1'
    req.headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER] = result.segmentPath

    normalizeAppPageRequestUrl(req, parsedUrl.pathname)

    expect(parsedUrl.pathname).toBe('/docs/frameworks/frontend')
    expect(req.url).toBe('/docs/frameworks/frontend?foo=bar')
    expect(req.headers[RSC_HEADER]).toBe('1')
    expect(req.headers[NEXT_ROUTER_PREFETCH_HEADER]).toBe('1')
    expect(req.headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]).toBe('/_tree')
  })

  it('rewrites req.url for leaf page segment prefetch requests', () => {
    const req: TestRequest = {
      headers: {},
      url: '/docs/frameworks/frontend.segments/docs/frameworks/frontend/__PAGE__.segment.rsc?foo=bar',
    }
    const parsedUrl = parseReqUrl(req.url)!
    const result = new SegmentPrefixRSCPathnameNormalizer().extract(
      parsedUrl.pathname!
    )!

    parsedUrl.pathname = result.originalPathname
    req.headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER] = result.segmentPath

    normalizeAppPageRequestUrl(req, parsedUrl.pathname)

    expect(parsedUrl.pathname).toBe('/docs/frameworks/frontend')
    expect(req.url).toBe('/docs/frameworks/frontend?foo=bar')
    expect(req.headers[NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]).toBe(
      '/docs/frameworks/frontend/__PAGE__'
    )
  })
})

describe('applyAppPageRscRequestMetaFromHeaders', () => {
  it('sets RSC and prefetch request meta from headers', () => {
    const req: TestRequest = {
      headers: {
        [RSC_HEADER]: '1',
        [NEXT_ROUTER_PREFETCH_HEADER]: '1',
        [NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]: '/_tree',
      },
      url: '/docs/frameworks/frontend?foo=bar',
    }

    applyAppPageRscRequestMetaFromHeaders(req)

    expect(getRequestMeta(req as any, 'isRSCRequest')).toBe(true)
    expect(getRequestMeta(req as any, 'isPrefetchRSCRequest')).toBe(true)
    expect(getRequestMeta(req as any, 'segmentPrefetchRSCRequest')).toBe(
      '/_tree'
    )
  })

  it('uses the first segment prefetch header value when provided as an array', () => {
    const req: TestRequest = {
      headers: {
        [RSC_HEADER]: '1',
        [NEXT_ROUTER_PREFETCH_HEADER]: '1',
        [NEXT_ROUTER_SEGMENT_PREFETCH_HEADER]: ['/_tree', '/ignored'],
      },
      url: '/docs/frameworks/frontend?foo=bar',
    }

    applyAppPageRscRequestMetaFromHeaders(req)

    expect(getRequestMeta(req as any, 'segmentPrefetchRSCRequest')).toBe(
      '/_tree'
    )
  })
})
Quest for Codev2.0.0
/
SIGN IN