From 53ddfd056be5f0e679329d5be2cc1c810bd19202 Mon Sep 17 00:00:00 2001 From: xiaosansiji Date: Tue, 12 Apr 2022 19:06:35 +0800 Subject: [PATCH 1/3] feat: add generate demo test script --- test/script/generate-demo-test.js | 114 ++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 test/script/generate-demo-test.js diff --git a/test/script/generate-demo-test.js b/test/script/generate-demo-test.js new file mode 100644 index 0000000000..28e218c66d --- /dev/null +++ b/test/script/generate-demo-test.js @@ -0,0 +1,114 @@ +const fs = require('fs'); +const path = require('path'); +const camelCase = require('lodash/camelCase'); +const upperFirst = require('lodash/upperFirst'); + +function resolveCwd(...args) { + args.unshift(process.cwd()); + return path.join(...args); +} + +const pkg = require(resolveCwd('package.json')); + +const framework = pkg.name; + +const fixedDateComponentList = ['config-provider', 'time-picker', 'date-picker', 'table', 'form', 'calendar']; // 需要在测试阶段固定日期的组件,table中因为有filter例子 渲染datepicker需要固定 + +// TODO 过滤掉一些导致挂掉的demo +const filterCom = ['table']; +const filterDemo = { + table: ['virtual-scroll'], +}; + +const CONFIG = { + 'tdesign-vue': { + sourcePath: path.resolve(__dirname, resolveCwd('examples')), + targetPath: path.resolve(__dirname, resolveCwd('test/unit')), + defaultTemplate: 'import { mount } from \'@vue/test-utils\';', + }, + 'Vue(PC)': { + sourcePath: path.resolve(__dirname, resolveCwd('examples')), + targetPath: path.resolve(__dirname, resolveCwd('test/unit')), + defaultTemplate: 'import { mount } from \'@vue/test-utils\';', + }, +}; + +const { sourcePath, targetPath, defaultTemplate } = CONFIG[framework]; + +function main() { + fs.readdir(sourcePath, (err, files) => { + if (err) { + console.log('Error', err); + } else { + files.forEach((componentFolder) => { + const demoPath = `${sourcePath}/${componentFolder}/demos`; + fs.readdir(demoPath, (err1, demoFiles) => { + if (err1) { + console.log('Error', err1); + } else { + if (['icon', 'local-provider'].includes(componentFolder)) return; + outputOneComponentTestFile(componentFolder, demoFiles); + } + }); + }); + } + }); +} + +main(); + +const data = `/** + * 该文件为由脚本 \`npm run test:demo\` 自动生成,如需修改,执行脚本命令即可。请勿手写直接修改,否则会被覆盖 + */ + +${defaultTemplate} +{{ HERE IS DEMO LIST }} +`; + +function getKeyFunction(component) { + const newComponent = upperFirst(camelCase(component)); + + return ` +describe('${newComponent}', () => { + Object.keys(mapper).forEach((demoName) => { + it(\`${newComponent} \${demoName} demo works fine\`, () => { + const wrapper = mount(mapper[demoName]); + expect(wrapper.element).toMatchSnapshot(); + }); + }); +});`; +} + +function outputOneComponentTestFile(component, demoFiles) { + const outputPath = `${targetPath}/${component}`; + const imports = []; + const demos = ['\nconst mapper = {']; + + demoFiles.forEach((demo) => { + if (filterCom.includes(component) && filterDemo[component].includes(demo.replace('.vue', ''))) return; + + const name = camelCase(demo); + imports.push(`import ${name} from '@/examples/${component}/demos/${demo}';`); + demos.push(` ${name},`); + }); + if (fixedDateComponentList.includes(component)) { + imports.unshift('import MockDate from \'mockdate\';\n'); + imports.push('\nMockDate.set(\'2020-12-28\');'); + } + + demos.push('};'); + const keyData = [imports.join('\n'), demos.join('\n'), getKeyFunction(component)].join('\n'); + const testFileData = data.replace('{{ HERE IS DEMO LIST }}', keyData); + fs.mkdir(outputPath, { recursive: true }, (err) => { + if (err) { + console.error(err); + return; + } + fs.writeFile(`${outputPath}/demo.test.js`, testFileData, (err) => { + if (err) { + return console.error(err); + } + console.log(`test file: ${outputPath} has been created.`); + }); + }); +} From a326606dc8dcb5f1d6f14a43fde4b7801684ba1e Mon Sep 17 00:00:00 2001 From: xiaosansiji Date: Wed, 13 Apr 2022 10:18:35 +0800 Subject: [PATCH 2/3] feat: generate vue-next demo test --- test/script/generate-demo-test.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/script/generate-demo-test.js b/test/script/generate-demo-test.js index 28e218c66d..1c12976144 100644 --- a/test/script/generate-demo-test.js +++ b/test/script/generate-demo-test.js @@ -26,11 +26,16 @@ const CONFIG = { targetPath: path.resolve(__dirname, resolveCwd('test/unit')), defaultTemplate: 'import { mount } from \'@vue/test-utils\';', }, - 'Vue(PC)': { + 'tdesign-vue-next': { sourcePath: path.resolve(__dirname, resolveCwd('examples')), targetPath: path.resolve(__dirname, resolveCwd('test/unit')), defaultTemplate: 'import { mount } from \'@vue/test-utils\';', }, + 'tdesign-react': { + sourcePath: path.resolve(__dirname, resolveCwd('src/examples')), + targetPath: path.resolve(__dirname, resolveCwd('test/unit')), + defaultTemplate: 'import { mount } from \'@vue/test-utils\';', + }, }; const { sourcePath, targetPath, defaultTemplate } = CONFIG[framework]; From 5f8b269a14eececaa1ecec4bef5b2e5278e4de07 Mon Sep 17 00:00:00 2001 From: xiaosansiji Date: Wed, 13 Apr 2022 14:26:57 +0800 Subject: [PATCH 3/3] fix: eslint error --- .eslintrc.js | 3 +- test/script/generate-demo-test.js | 52 +++++++++++++++---------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index cdd5f3689f..5f7825b0b7 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -36,8 +36,9 @@ module.exports = { }, overrides: [ { - files: ['*.config.js'], + files: ['*.config.js', 'test/script/*'], rules: { + 'no-console': 0, // node 环境下支持 require '@typescript-eslint/no-require-imports': 'off', 'import/no-dynamic-require': 0, diff --git a/test/script/generate-demo-test.js b/test/script/generate-demo-test.js index 1c12976144..bd7ab2b8b3 100644 --- a/test/script/generate-demo-test.js +++ b/test/script/generate-demo-test.js @@ -40,28 +40,6 @@ const CONFIG = { const { sourcePath, targetPath, defaultTemplate } = CONFIG[framework]; -function main() { - fs.readdir(sourcePath, (err, files) => { - if (err) { - console.log('Error', err); - } else { - files.forEach((componentFolder) => { - const demoPath = `${sourcePath}/${componentFolder}/demos`; - fs.readdir(demoPath, (err1, demoFiles) => { - if (err1) { - console.log('Error', err1); - } else { - if (['icon', 'local-provider'].includes(componentFolder)) return; - outputOneComponentTestFile(componentFolder, demoFiles); - } - }); - }); - } - }); -} - -main(); - const data = `/** * 该文件为由脚本 \`npm run test:demo\` 自动生成,如需修改,执行脚本命令即可。请勿手写直接修改,否则会被覆盖 */ @@ -109,11 +87,33 @@ function outputOneComponentTestFile(component, demoFiles) { console.error(err); return; } - fs.writeFile(`${outputPath}/demo.test.js`, testFileData, (err) => { - if (err) { - return console.error(err); + fs.writeFile(`${outputPath}/demo.test.js`, testFileData, (writeErr) => { + if (writeErr) { + return console.error(writeErr); } - console.log(`test file: ${outputPath} has been created.`); + return console.log(`test file: ${outputPath} has been created.`); }); }); } + +function main() { + fs.readdir(sourcePath, (err, files) => { + if (err) { + console.log('Error', err); + } else { + files.forEach((componentFolder) => { + const demoPath = `${sourcePath}/${componentFolder}/demos`; + fs.readdir(demoPath, (err1, demoFiles) => { + if (err1) { + console.log('Error', err1); + } else { + if (['icon', 'local-provider'].includes(componentFolder)) return; + outputOneComponentTestFile(componentFolder, demoFiles); + } + }); + }); + } + }); +} + +main();