Skip to content

Commit

Permalink
test: move HMR Full Reload test to a separate file (#73591)
Browse files Browse the repository at this point in the history
> [!NOTE]
> The "Test new tests for flakes" may fail due to the number of tests in
a single `hmr.test.ts` file.
> The follow-up stacks are to resolve the issue.

### Why?

Moved to a separate file to run the test in parallel.
  • Loading branch information
devjiwonchoi authored Dec 9, 2024
1 parent 74b09dd commit 8f6dd89
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 84 deletions.
84 changes: 0 additions & 84 deletions test/development/basic/hmr.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1147,90 +1147,6 @@ describe.each([
})
})

describe('Full reload', () => {
it('should warn about full reload in cli output - anonymous page function', async () => {
const start = next.cliOutput.length
const browser = await webdriver(
next.url,
basePath + '/hmr/anonymous-page-function'
)
const cliWarning =
'Fast Refresh had to perform a full reload when ./pages/hmr/anonymous-page-function.js changed. Read more: https://nextjs.org/docs/messages/fast-refresh-reload'

expect(await browser.elementByCss('p').text()).toBe('hello world')
expect(next.cliOutput.slice(start)).not.toContain(cliWarning)

const currentFileContent = await next.readFile(
'./pages/hmr/anonymous-page-function.js'
)
const newFileContent = currentFileContent.replace(
'<p>hello world</p>',
'<p id="updated">hello world!!!</p>'
)
await next.patchFile(
'./pages/hmr/anonymous-page-function.js',
newFileContent
)

expect(await browser.waitForElementByCss('#updated').text()).toBe(
'hello world!!!'
)

// CLI warning
expect(next.cliOutput.slice(start)).toContain(cliWarning)

// Browser warning
const browserLogs = await browser.log()
expect(
browserLogs.some(({ message }) =>
message.includes(
"Fast Refresh will perform a full reload when you edit a file that's imported by modules outside of the React rendering tree."
)
)
).toBeTruthy()
})

it('should warn about full reload in cli output - runtime-error', async () => {
const start = next.cliOutput.length
const browser = await webdriver(next.url, basePath + '/hmr/runtime-error')
const cliWarning =
'Fast Refresh had to perform a full reload due to a runtime error.'

await retry(async () => {
expect(await getRedboxHeader(browser)).toMatch(
/ReferenceError: whoops is not defined/
)
})
expect(next.cliOutput.slice(start)).not.toContain(cliWarning)

const currentFileContent = await next.readFile(
'./pages/hmr/runtime-error.js'
)
const newFileContent = currentFileContent.replace(
'whoops',
'<p id="updated">whoops</p>'
)
await next.patchFile('./pages/hmr/runtime-error.js', newFileContent)

expect(await browser.waitForElementByCss('#updated').text()).toBe(
'whoops'
)

// CLI warning
expect(next.cliOutput.slice(start)).toContain(cliWarning)

// Browser warning
const browserLogs = await browser.log()
expect(
browserLogs.some(({ message }) =>
message.includes(
'[Fast Refresh] performing full reload because your application had an unrecoverable error'
)
)
).toBeTruthy()
})
})

if (!process.env.TURBOPACK) {
it('should have client HMR events in trace file', async () => {
const traceData = await next.readFile('.next/trace')
Expand Down
96 changes: 96 additions & 0 deletions test/development/basic/hmr/full-reload.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import type { NextConfig } from 'next'
import { getRedboxHeader, retry } from 'next-test-utils'
import { nextTestSetup } from 'e2e-utils'

describe.each([
{ basePath: '', assetPrefix: '' },
{ basePath: '', assetPrefix: '/asset-prefix' },
{ basePath: '/docs', assetPrefix: '' },
{ basePath: '/docs', assetPrefix: '/asset-prefix' },
])('HMR - Full Reload, nextConfig: %o', (nextConfig: Partial<NextConfig>) => {
const { next } = nextTestSetup({
files: __dirname,
nextConfig,
patchFileDelay: 500,
})
const { basePath } = nextConfig

it('should warn about full reload in cli output - anonymous page function', async () => {
const start = next.cliOutput.length
const browser = await next.browser(
basePath + '/hmr/anonymous-page-function'
)
const cliWarning =
'Fast Refresh had to perform a full reload when ./pages/hmr/anonymous-page-function.js changed. Read more: https://nextjs.org/docs/messages/fast-refresh-reload'

expect(await browser.elementByCss('p').text()).toBe('hello world')
expect(next.cliOutput.slice(start)).not.toContain(cliWarning)

const currentFileContent = await next.readFile(
'./pages/hmr/anonymous-page-function.js'
)
const newFileContent = currentFileContent.replace(
'<p>hello world</p>',
'<p id="updated">hello world!!!</p>'
)
await next.patchFile(
'./pages/hmr/anonymous-page-function.js',
newFileContent
)

expect(await browser.waitForElementByCss('#updated').text()).toBe(
'hello world!!!'
)

// CLI warning
expect(next.cliOutput.slice(start)).toContain(cliWarning)

// Browser warning
const browserLogs = await browser.log()
expect(
browserLogs.some(({ message }) =>
message.includes(
"Fast Refresh will perform a full reload when you edit a file that's imported by modules outside of the React rendering tree."
)
)
).toBeTruthy()
})

it('should warn about full reload in cli output - runtime-error', async () => {
const start = next.cliOutput.length
const browser = await next.browser(basePath + '/hmr/runtime-error')
const cliWarning =
'Fast Refresh had to perform a full reload due to a runtime error.'

await retry(async () => {
expect(await getRedboxHeader(browser)).toMatch(
/ReferenceError: whoops is not defined/
)
})
expect(next.cliOutput.slice(start)).not.toContain(cliWarning)

const currentFileContent = await next.readFile(
'./pages/hmr/runtime-error.js'
)
const newFileContent = currentFileContent.replace(
'whoops',
'<p id="updated">whoops</p>'
)
await next.patchFile('./pages/hmr/runtime-error.js', newFileContent)

expect(await browser.waitForElementByCss('#updated').text()).toBe('whoops')

// CLI warning
expect(next.cliOutput.slice(start)).toContain(cliWarning)

// Browser warning
const browserLogs = await browser.log()
expect(
browserLogs.some(({ message }) =>
message.includes(
'[Fast Refresh] performing full reload because your application had an unrecoverable error'
)
)
).toBeTruthy()
})
})

0 comments on commit 8f6dd89

Please sign in to comment.