import { nextTestSetup } from 'e2e-utils'
import { retry } from 'next-test-utils'
describe('no-double-tailwind-execution', () => {
const { next, isNextDev, skipped } = nextTestSetup({
files: __dirname,
skipDeployment: true,
dependencies: {
'@tailwindcss/postcss': '^4',
tailwindcss: '^4',
},
env: {
DEBUG: 'tailwindcss',
...process.env,
},
})
if (skipped) {
return
}
it('should run tailwind only once initially and per change', async () => {
const browser = await next.browser('/')
expect(await browser.elementByCss('p').text()).toBe('hello world')
function getTailwindProcessingCount() {
return [
...next.cliOutput.matchAll(
/\[@tailwindcss\/postcss\] app\/globals.css/g
),
].length
}
expect(getTailwindProcessingCount()).toBe(1) // initial
if (isNextDev) {
await next.patchFile(
'app/page.tsx',
(content) => content.replace('hello world', 'hello hmr'),
async () => {
await retry(async () => {
expect(await browser.elementByCss('p').text()).toBe('hello hmr')
expect(getTailwindProcessingCount()).toBe(2) // dev: initial + hmr
})
}
)
// Wait for the patchFile revert to get processed
await retry(async () => {
expect(await browser.elementByCss('p').text()).toBe('hello world')
})
}
if (isNextDev) {
expect(getTailwindProcessingCount()).toBe(3) // dev: initial + hmr + hmr (revert)
} else {
expect(getTailwindProcessingCount()).toBe(1) // build
}
})
})