ant-design/tests/setup.ts
Jony J dfc20acd0c
feat: add default name generation for RadioGroup component better a11y (#52076)
* feat: add default name generation for RadioGroup component better a11y

* feat(radio): implement useStableId hook for consistent ID generation in RadioGroup

* test: update snapshot

* chore: remove unused demo code snippet from form documentation

* test: enhance demo testing by adding ignoreAttributes option for snapshot matching

* fix(tests): correct logic for skipping tests and enhance snapshot matching for demo tests

* Revert "test: enhance demo testing by adding ignoreAttributes option for snapshot matching"

* test: mock useId for stable ID generation in snapshot tests

* chore: trigger CI build

* docs(radio): update name property description to clarify fallback behavior for RadioGroup

* Update index.zh-CN.md

Signed-off-by: Jony J <1844749591@qq.com>

---------

Signed-off-by: Jony J <1844749591@qq.com>
2024-12-23 10:55:45 +08:00

83 lines
2.7 KiB
TypeScript

import util from 'util';
import React from 'react';
import type { DOMWindow } from 'jsdom';
console.log('Current React Version:', React.version);
const originConsoleErr = console.error;
const ignoreWarns = [
'validateDOMNesting',
'on an unmounted component',
'not wrapped in act',
'You called act',
];
// Hack off React warning to avoid too large log in CI.
console.error = (...args) => {
const str = args.join('').replace(/\n/g, '');
if (ignoreWarns.every((warn) => !str.includes(warn))) {
originConsoleErr(...args);
}
};
type Writeable<T> = { -readonly [P in keyof T]: T[P] };
// This function can not move to external file since jest setup not support
export function fillWindowEnv(window: Window | DOMWindow) {
const win = window as Writeable<Window> & typeof globalThis;
win.resizeTo = (width, height) => {
win.innerWidth = width || win.innerWidth;
win.innerHeight = height || win.innerHeight;
win.dispatchEvent(new Event('resize'));
};
win.scrollTo = () => {};
// ref: https://github.com/ant-design/ant-design/issues/18774
if (!win.matchMedia) {
Object.defineProperty(win, 'matchMedia', {
writable: true,
configurable: true,
value: jest.fn((query) => ({
matches: query.includes('max-width'),
addListener: jest.fn(),
removeListener: jest.fn(),
})),
});
}
// Fix css-animation or rc-motion deps on these
// https://github.com/react-component/motion/blob/9c04ef1a210a4f3246c9becba6e33ea945e00669/src/util/motion.ts#L27-L35
// https://github.com/yiminghe/css-animation/blob/a5986d73fd7dfce75665337f39b91483d63a4c8c/src/Event.js#L44
win.AnimationEvent = win.AnimationEvent || win.Event;
win.TransitionEvent = win.TransitionEvent || win.Event;
// ref: https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
// ref: https://github.com/jsdom/jsdom/issues/2524
Object.defineProperty(win, 'TextEncoder', { writable: true, value: util.TextEncoder });
Object.defineProperty(win, 'TextDecoder', { writable: true, value: util.TextDecoder });
}
if (typeof window !== 'undefined') {
fillWindowEnv(window);
}
global.requestAnimationFrame = global.requestAnimationFrame || global.setTimeout;
global.cancelAnimationFrame = global.cancelAnimationFrame || global.clearTimeout;
if (typeof MessageChannel === 'undefined') {
(global as any).MessageChannel = function MessageChannel() {
const port1: any = {};
const port2: any = {};
port1.postMessage = port2.onmessage = () => {};
port2.postMessage = port1.onmessage = () => {};
return { port1, port2 };
};
}
// Mock useId to return a stable id for snapshot testing
jest.mock('react', () => ({
...jest.requireActual('react'),
useId: () => 'test-id',
}));