陈帅
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with
73 additions and
33 deletions
-
.circleci/config.yml
-
.eslintrc.js
-
Dockerfile
-
config/plugin.config.js
-
jest.config.js
-
package.json
-
src/e2e/baseLayout.e2e.js
-
src/e2e/home.e2e.js
-
src/e2e/login.e2e.js
-
src/e2e/userLayout.e2e.js
-
tests/run-tests.js
|
|
|
@ -2,14 +2,14 @@ version: 2 |
|
|
|
jobs: |
|
|
|
build: |
|
|
|
docker: |
|
|
|
- image: circleci/node:8.11.4 |
|
|
|
- image: circleci/node:latest |
|
|
|
steps: |
|
|
|
- checkout |
|
|
|
- run: npm install |
|
|
|
- run: npm run build |
|
|
|
test: |
|
|
|
docker: |
|
|
|
- image: circleci/node:8.11.4 |
|
|
|
- image: circleci/node:latest |
|
|
|
steps: |
|
|
|
- checkout |
|
|
|
- run: sh ./tests/fix_puppeteer.sh |
|
|
|
|
|
|
|
@ -11,6 +11,7 @@ module.exports = { |
|
|
|
}, |
|
|
|
globals: { |
|
|
|
APP_TYPE: true, |
|
|
|
page: true, |
|
|
|
}, |
|
|
|
rules: { |
|
|
|
'react/jsx-filename-extension': [1, { extensions: ['.js'] }], |
|
|
|
|
|
|
|
@ -1,9 +1,9 @@ |
|
|
|
FROM node:latest |
|
|
|
FROM circleci/node:latest |
|
|
|
|
|
|
|
WORKDIR /usr/src/app/ |
|
|
|
|
|
|
|
USER root |
|
|
|
COPY package.json ./ |
|
|
|
RUN npm install --silent --no-cache |
|
|
|
RUN yarn |
|
|
|
|
|
|
|
COPY ./ ./ |
|
|
|
|
|
|
|
|
|
|
|
@ -23,6 +23,8 @@ export default config => { |
|
|
|
varFile: path.join(__dirname, '../node_modules/antd/lib/style/themes/default.less'), |
|
|
|
mainLessFile: outFile, // themeVariables: ['@primary-color'],
|
|
|
|
indexFileName: 'index.html', |
|
|
|
generateOne: true, |
|
|
|
lessUrl: 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js', |
|
|
|
}, |
|
|
|
]); |
|
|
|
}; |
|
|
|
|
|
|
|
@ -1,3 +1,4 @@ |
|
|
|
module.exports = { |
|
|
|
testURL: 'http://localhost:8000', |
|
|
|
preset: 'jest-puppeteer', |
|
|
|
}; |
|
|
|
|
|
|
|
@ -36,6 +36,7 @@ |
|
|
|
"dva": "^2.4.0", |
|
|
|
"enquire-js": "^0.2.1", |
|
|
|
"hash.js": "^1.1.5", |
|
|
|
"jest-puppeteer": "^3.5.1", |
|
|
|
"lodash": "^4.17.10", |
|
|
|
"lodash-decorators": "^6.0.0", |
|
|
|
"memoize-one": "^4.0.0", |
|
|
|
|
|
|
|
@ -0,0 +1,46 @@ |
|
|
|
import RouterConfig from '../../config/router.config'; |
|
|
|
|
|
|
|
const BASE_URL = `http://localhost:${process.env.PORT || 8000}`; |
|
|
|
|
|
|
|
function formatter(data) { |
|
|
|
return data |
|
|
|
.reduce((pre, item) => { |
|
|
|
pre.push(item.path); |
|
|
|
return pre; |
|
|
|
}, []) |
|
|
|
.filter(item => item); |
|
|
|
} |
|
|
|
|
|
|
|
describe('Homepage', async () => { |
|
|
|
const testPage = path => |
|
|
|
new Promise(async reslove => { |
|
|
|
console.log(`test ${path}`); |
|
|
|
await page.goto(`${BASE_URL}${path}`, { |
|
|
|
timeout: 600000, |
|
|
|
}); |
|
|
|
await page.waitForSelector('footer', { |
|
|
|
timeout: 600000, |
|
|
|
}); |
|
|
|
reslove(); |
|
|
|
}); |
|
|
|
|
|
|
|
beforeAll(async () => { |
|
|
|
jest.setTimeout(1000000); |
|
|
|
await page.setCacheEnabled(false); |
|
|
|
}); |
|
|
|
|
|
|
|
it(`test pages`, async () => { |
|
|
|
const routers = formatter(RouterConfig[1].routes); |
|
|
|
const testAll = index => |
|
|
|
new Promise(async reslove => { |
|
|
|
await testPage(routers[index]); |
|
|
|
if (index < routers.length - 1) { |
|
|
|
const newIndex = index + 1; |
|
|
|
await testAll(newIndex); |
|
|
|
reslove(); |
|
|
|
} |
|
|
|
reslove(); |
|
|
|
}); |
|
|
|
await testAll(0); |
|
|
|
}); |
|
|
|
}); |
|
|
|
@ -1,5 +1,3 @@ |
|
|
|
import puppeteer from 'puppeteer'; |
|
|
|
|
|
|
|
const BASE_URL = `http://localhost:${process.env.PORT || 8000}`; |
|
|
|
|
|
|
|
describe('Homepage', () => { |
|
|
|
@ -7,13 +5,11 @@ describe('Homepage', () => { |
|
|
|
jest.setTimeout(1000000); |
|
|
|
}); |
|
|
|
it('it should have logo text', async () => { |
|
|
|
const browser = await puppeteer.launch({ args: ['--no-sandbox'] }); |
|
|
|
const page = await browser.newPage(); |
|
|
|
await page.goto(BASE_URL, { waitUntil: 'networkidle2' }); |
|
|
|
await page.goto(BASE_URL); |
|
|
|
await page.waitForSelector('h1', { |
|
|
|
timeout: 2000, |
|
|
|
}); |
|
|
|
const text = await page.evaluate(() => document.getElementsByTagName('h1')[0].innerText); |
|
|
|
expect(text).toContain('Ant Design Pro'); |
|
|
|
|
|
|
|
await page.close(); |
|
|
|
browser.close(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
@ -1,24 +1,15 @@ |
|
|
|
import puppeteer from 'puppeteer'; |
|
|
|
|
|
|
|
const BASE_URL = `http://localhost:${process.env.PORT || 8000}`; |
|
|
|
|
|
|
|
describe('Login', () => { |
|
|
|
let browser; |
|
|
|
let page; |
|
|
|
|
|
|
|
beforeAll(async () => { |
|
|
|
jest.setTimeout(1000000); |
|
|
|
browser = await puppeteer.launch({ args: ['--no-sandbox'] }); |
|
|
|
}); |
|
|
|
|
|
|
|
beforeEach(async () => { |
|
|
|
page = await browser.newPage(); |
|
|
|
await page.goto(`${BASE_URL}/user/login`, { waitUntil: 'networkidle2' }); |
|
|
|
await page.evaluate(() => window.localStorage.setItem('antd-pro-authority', 'guest')); |
|
|
|
}); |
|
|
|
|
|
|
|
afterEach(() => page.close()); |
|
|
|
|
|
|
|
it('should login with failure', async () => { |
|
|
|
await page.waitForSelector('#userName', { |
|
|
|
timeout: 2000, |
|
|
|
@ -40,6 +31,4 @@ describe('Login', () => { |
|
|
|
const text = await page.evaluate(() => document.body.innerHTML); |
|
|
|
expect(text).toContain('<h1>Ant Design Pro</h1>'); |
|
|
|
}); |
|
|
|
|
|
|
|
afterAll(() => browser.close()); |
|
|
|
}); |
|
|
|
|
|
|
|
@ -17,7 +17,10 @@ describe('Homepage', () => { |
|
|
|
let page; |
|
|
|
|
|
|
|
const testPage = path => async () => { |
|
|
|
await page.goto(`${BASE_URL}${path}`, { waitUntil: 'networkidle2' }); |
|
|
|
await page.goto(`${BASE_URL}${path}`); |
|
|
|
await page.waitForSelector('footer', { |
|
|
|
timeout: 2000, |
|
|
|
}); |
|
|
|
const haveFooter = await page.evaluate( |
|
|
|
() => document.getElementsByTagName('footer').length > 0 |
|
|
|
); |
|
|
|
@ -29,11 +32,8 @@ describe('Homepage', () => { |
|
|
|
browser = await puppeteer.launch({ args: ['--no-sandbox'] }); |
|
|
|
page = await browser.newPage(); |
|
|
|
}); |
|
|
|
|
|
|
|
RouterConfig.forEach(({ routes = [] }) => { |
|
|
|
formatter(routes).forEach(route => { |
|
|
|
it(`test pages ${route}`, testPage(route)); |
|
|
|
}); |
|
|
|
formatter(RouterConfig[0].routes).forEach(route => { |
|
|
|
fit(`test pages ${route}`, testPage(route)); |
|
|
|
}); |
|
|
|
|
|
|
|
afterAll(() => browser.close()); |
|
|
|
@ -29,9 +29,13 @@ startServer.stdout.on('data', data => { |
|
|
|
// eslint-disable-next-line
|
|
|
|
once = true; |
|
|
|
console.log('Development server is started, ready to run tests.'); |
|
|
|
const testCmd = spawn(/^win/.test(process.platform) ? 'npm.cmd' : 'npm', ['test'], { |
|
|
|
const testCmd = spawn( |
|
|
|
/^win/.test(process.platform) ? 'npm.cmd' : 'npm', |
|
|
|
['test', '--', '--maxWorkers=1'], |
|
|
|
{ |
|
|
|
stdio: 'inherit', |
|
|
|
}); |
|
|
|
} |
|
|
|
); |
|
|
|
testCmd.on('exit', code => { |
|
|
|
startServer.kill(); |
|
|
|
process.exit(code); |
|
|
|
|