M8-R20: enforce warning-free frontend tests
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
import { describe, expect, it, vi } from 'vitest'
|
||||
import {
|
||||
assertNoReactTestWarnings,
|
||||
createReactWarningGuard,
|
||||
formatReactTestWarnings,
|
||||
isReactTestWarning,
|
||||
} from './test-warning-guard'
|
||||
|
||||
describe('React test warning guard', () => {
|
||||
it('recognizes React act and duplicate-key warnings only', () => {
|
||||
expect(isReactTestWarning(['Warning: An update to Example inside a test was not wrapped in act(...).'])).toBe(true)
|
||||
expect(isReactTestWarning(['Warning: Each child in a list should have a unique "key" prop.'])).toBe(true)
|
||||
expect(isReactTestWarning(['Warning: Encountered two children with the same key, `duplicate`.'])).toBe(true)
|
||||
expect(isReactTestWarning(['network request failed'])).toBe(false)
|
||||
})
|
||||
|
||||
it('collects target warnings for one compact diagnostic and forwards unrelated errors', () => {
|
||||
const originalConsoleError = vi.fn()
|
||||
const warnings: unknown[][] = []
|
||||
const guardedConsoleError = createReactWarningGuard(originalConsoleError, warnings)
|
||||
|
||||
guardedConsoleError('Warning: An update to Example inside a test was not wrapped in act(...)')
|
||||
guardedConsoleError('Warning: An update to Other inside a test was not wrapped in act(...)')
|
||||
guardedConsoleError('Warning: Encountered two children with the same key, `duplicate`.')
|
||||
guardedConsoleError('network request failed', { status: 500 })
|
||||
|
||||
expect(originalConsoleError).toHaveBeenCalledTimes(1)
|
||||
expect(originalConsoleError).toHaveBeenCalledWith('network request failed', { status: 500 })
|
||||
expect(formatReactTestWarnings(warnings)).toBe(
|
||||
'React act warning: 2, React duplicate-key warning: 1 (Example, Other)',
|
||||
)
|
||||
expect(() => assertNoReactTestWarnings(warnings)).toThrow(
|
||||
'React test warning guard: React act warning: 2, React duplicate-key warning: 1 (Example, Other).',
|
||||
)
|
||||
})
|
||||
|
||||
it('passes only when no target warnings were captured', () => {
|
||||
expect(() => assertNoReactTestWarnings([])).not.toThrow()
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user