ant-design/tests/shared/imageTest.tsx

71 lines
2.3 KiB
TypeScript
Raw Normal View History

import React from 'react';
// Reference: https://github.com/ant-design/ant-design/pull/24003#discussion_r427267386
// eslint-disable-next-line import/no-unresolved
import { configureToMatchImageSnapshot } from 'jest-image-snapshot';
import ReactDOMServer from 'react-dom/server';
import glob from 'glob';
2020-10-28 16:16:31 +08:00
import MockDate from 'mockdate';
import moment from 'moment';
const toMatchImageSnapshot = configureToMatchImageSnapshot({
customSnapshotsDir: `${process.cwd()}/imageSnapshots`,
customDiffDir: `${process.cwd()}/imageDiffSnapshots`,
});
expect.extend({ toMatchImageSnapshot });
// eslint-disable-next-line jest/no-export
export default function imageTest(component: React.ReactElement) {
2020-11-14 12:34:45 +08:00
it('component image screenshot should correct', async () => {
2020-11-15 22:14:17 +08:00
await jestPuppeteer.resetPage();
await page.setRequestInterception(true);
const onRequestHandle = (request: any) => {
if (['image'].includes(request.resourceType())) {
2020-11-15 22:14:17 +08:00
request.abort();
} else {
request.continue();
}
};
2020-11-14 12:34:45 +08:00
MockDate.set(moment('2016-11-22').valueOf());
2020-11-15 22:14:17 +08:00
page.on('request', onRequestHandle);
2020-11-14 12:34:45 +08:00
await page.goto(`file://${process.cwd()}/tests/index.html`);
await page.addStyleTag({ path: `${process.cwd()}/dist/antd.css` });
const html = ReactDOMServer.renderToString(component);
await page.evaluate(innerHTML => {
document.querySelector('#root')!.innerHTML = innerHTML;
}, html);
2020-11-14 12:34:45 +08:00
const image = await page.screenshot();
2020-11-14 12:34:45 +08:00
expect(image).toMatchImageSnapshot();
2020-11-13 19:35:46 +08:00
2020-11-14 12:34:45 +08:00
MockDate.reset();
2020-11-15 22:14:17 +08:00
page.removeListener('request', onRequestHandle);
});
}
type Options = {
skip?: boolean | string[];
};
// eslint-disable-next-line jest/no-export
export function imageDemoTest(component: string, options: Options = {}) {
let testMethod = options.skip === true ? describe.skip : describe;
const files = glob.sync(`./components/${component}/demo/*.md`);
files.forEach(file => {
if (Array.isArray(options.skip) && options.skip.some(c => file.includes(c))) {
testMethod = test.skip;
}
testMethod(`Test ${file} image`, () => {
// eslint-disable-next-line global-require,import/no-dynamic-require
let Demo = require(`../.${file}`).default;
if (typeof Demo === 'function') {
Demo = <Demo />;
}
imageTest(Demo);
});
});
}