next.js/test/integration/create-next-app/templates/app-api.test.ts
app-api.test.ts158 lines3.4 KB
import {
  projectShouldHaveNoGitChanges,
  tryNextDev,
  run,
  useTempDir,
  projectFilesShouldExist,
} from '../utils'
import { mapSrcFiles, projectSpecification } from '../lib/specification'
import { projectDepsShouldBe } from '../lib/utils'

function shouldBeApiTemplateProject({
  cwd,
  projectName,
  mode,
  srcDir,
}: {
  cwd: string
  projectName: string
  mode: 'js' | 'ts'
  srcDir?: boolean
}) {
  const template = 'app-api'

  projectFilesShouldExist({
    cwd,
    projectName,
    files: mapSrcFiles(projectSpecification[template][mode].files, srcDir),
  })

  projectDepsShouldBe({
    type: 'dependencies',
    cwd,
    projectName,
    deps: mapSrcFiles(projectSpecification[template][mode].deps, srcDir),
  })

  projectDepsShouldBe({
    type: 'devDependencies',
    cwd,
    projectName,
    deps: mapSrcFiles(projectSpecification[template][mode].devDeps, srcDir),
  })
}

describe('create-next-app --api (Headless App)', () => {
  let nextTgzFilename: string

  beforeAll(() => {
    if (!process.env.NEXT_TEST_PKG_PATHS) {
      throw new Error('This test needs to be run with `node run-tests.js`.')
    }

    const pkgPaths = new Map<string, string>(
      JSON.parse(process.env.NEXT_TEST_PKG_PATHS)
    )

    nextTgzFilename = pkgPaths.get('next')!
  })

  it('should create JavaScript project with --js flag', async () => {
    await useTempDir(async (cwd) => {
      const projectName = 'app-js'
      const { exitCode } = await run(
        [
          projectName,
          '--js',
          '--api',
          '--no-src-dir',
          '--no-import-alias',
          '--no-agents-md',
          ...(process.env.NEXT_RSPACK ? ['--rspack'] : []),
        ],
        nextTgzFilename,
        {
          cwd,
        }
      )

      expect(exitCode).toBe(0)
      shouldBeApiTemplateProject({
        cwd,
        projectName,
        mode: 'js',
      })
      await tryNextDev({
        cwd,
        isApi: true,
        projectName,
      })
    })
  })

  it('should create TypeScript project with --ts flag', async () => {
    await useTempDir(async (cwd) => {
      const projectName = 'app-ts'
      const { exitCode } = await run(
        [
          projectName,
          '--ts',
          '--api',
          '--no-src-dir',
          '--no-import-alias',
          '--no-agents-md',
          ...(process.env.NEXT_RSPACK ? ['--rspack'] : []),
        ],
        nextTgzFilename,
        {
          cwd,
        }
      )

      expect(exitCode).toBe(0)
      shouldBeApiTemplateProject({
        cwd,
        projectName,
        mode: 'ts',
      })
      await tryNextDev({ cwd, isApi: true, projectName })
      projectShouldHaveNoGitChanges({ cwd, projectName })
    })
  })

  it('should create project inside "src" directory with --src-dir flag', async () => {
    await useTempDir(async (cwd) => {
      const projectName = 'app-src-dir'
      const { exitCode } = await run(
        [
          projectName,
          '--ts',
          '--api',
          '--src-dir',
          '--no-import-alias',
          '--no-agents-md',
          ...(process.env.NEXT_RSPACK ? ['--rspack'] : []),
        ],
        nextTgzFilename,
        {
          cwd,
          stdio: 'inherit',
        }
      )

      expect(exitCode).toBe(0)
      shouldBeApiTemplateProject({
        cwd,
        projectName,
        mode: 'ts',
        srcDir: true,
      })
      await tryNextDev({
        cwd,
        isApi: true,
        projectName,
      })
    })
  })
})
Quest for Codev2.0.0
/
SIGN IN