text: /* eslint-env jest */
  
  import webdriver from 'next-webdriver'
  import { join } from 'path'
  import fs from 'fs-extra'
  import {
    renderViaHTTP,
    findPort,
    launchApp,
    killApp,
    nextBuild,
    nextStart,
  } from 'next-test-utils'
  
  let app
  let appPort
  const appDir = join(__dirname, '../')
  
  function runTests() {
    it('should render normal route', async () => {
      const html = await renderViaHTTP(appPort, '/')
      expect(html).toMatch(/my blog/i)
    })
  
    it('should render another normal route', async () => {
      const html = await renderViaHTTP(appPort, '/another')
      expect(html).toMatch(/hello from another/)
    })
  
    it('should render dynamic page', async () => {
      const html = await renderViaHTTP(appPort, '/post-1')
      expect(html).toMatch(/this is.*?post-1/i)
    })
  
    it('should prioritize a non-dynamic page', async () => {
      const html = await renderViaHTTP(appPort, '/post-1/comments')
      expect(html).toMatch(/show comments for.*post-1.*here/i)
    })
  
    it('should render nested dynamic page', async () => {
      const html = await renderViaHTTP(appPort, '/post-1/comment-1')
      expect(html).toMatch(/i am.*comment-1.*on.*post-1/i)
    })
  
    it('should navigate to a dynamic page successfully', async () => {
      let browser
      try {
        browser = await webdriver(appPort, '/')
        await browser.elementByCss('#view-post-1').click()
        await browser.waitForElementByCss('p#post-1')
  
        const text = await browser.elementByCss('p#post-1').text()
        expect(text).toMatch(/this is.*?post-1/i)
      } finally {
        if (browser) await browser.close()
      }
    })
  
    it('should navigate to a nested dynamic page successfully', async () => {
      let browser
      try {
        browser = await webdriver(appPort, '/')
        await browser.elementByCss('#view-post-1-comment-1').click()
        await browser.waitForElementByCss('p#comment-1')
  
        const text = await browser.elementByCss('p#comment-1').text()
        expect(text).toMatch(/i am.*comment-1.*on.*post-1/i)
      } finally {
        if (browser) await browser.close()
      }
    })
  
    it('should pass params in getInitialProps during SSR', async () => {
      const html = await renderViaHTTP(appPort, '/post-1/cmnt-1')
      expect(html).toMatch(/gip.*post-1/i)
    })
  }
  
  const nextConfig = join(appDir, 'next.config.js')
  
  describe('Dynamic Routing', () => {
    describe('dev mode', () => {
      beforeAll(async () => {
        appPort = await findPort()
        app = await launchApp(appDir, appPort)
      })
      afterAll(() => killApp(app))
  
      runTests(true)
    })
  
    describe('production mode', () => {
      beforeAll(async () => {
        await fs.remove(nextConfig)
        await nextBuild(appDir)
        appPort = await findPort()
        app = await nextStart(appDir, appPort)
      })
      afterAll(() => killApp(app))
  
      runTests()
    })
  
    describe('SSR production mode', () => {
      beforeAll(async () => {
        await fs.writeFile(
          nextConfig,
          `
          module.exports = {
            target: 'serverless'
          }
        `
        )
  
        await nextBuild(appDir)
        appPort = await findPort()
        app = await nextStart(appDir, appPort)
      })
      afterAll(() => killApp(app))
      runTests()
    })
  })
  