Skip to content

Commit 9f8e465

Browse files
authored
feat(e2e-test): setup puppeteer (#237)
1 parent 6968a15 commit 9f8e465

File tree

5 files changed

+3521
-0
lines changed

5 files changed

+3521
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ cache
1111

1212
# jest
1313
coverage/
14+
15+
# e2e
16+
e2e-test/node_modules
17+
e2e-test/.env

e2e-test/.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
PASSWORD=PASSWORD
3+
ADMIN_DOMAIN=http://localhost:3002
4+
CONSOLE_DOMAIN=http://127.0.0.1:8081

e2e-test/package.json

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
{
2+
"private": true,
3+
"name": "e2e-test",
4+
"version": "1.0.0",
5+
"description": "E2E test for mcs-lite.",
6+
"author": "Michael Hsu (徐承志) <[email protected]>",
7+
"license": "MIT",
8+
"repository": "https://github.com/MCS-Lite/mcs-lite-app.git",
9+
"scripts": {
10+
"test": "NODE_ENV='test' TZ='UTC' jest",
11+
"test:watch": "npm run test -- --watch",
12+
"eslint": "eslint ./",
13+
"format": "prettier --write 'src/**/*.{js,json}'"
14+
},
15+
"jest": {
16+
"bail": true
17+
},
18+
"dependencies": {
19+
"delay": "^2.0.0",
20+
"dotenv": "^4.0.0",
21+
"jest": "^21.2.1",
22+
"puppeteer": "^0.12.0"
23+
},
24+
"devDependencies": {
25+
"babel-eslint": "^8.0.2",
26+
"eslint": "^4.11.0",
27+
"eslint-config-airbnb": "^15.1.0",
28+
"eslint-config-prettier": "^2.7.0",
29+
"eslint-config-react-app": "^2.0.1",
30+
"eslint-plugin-flowtype": "^2.39.1",
31+
"eslint-plugin-import": "^2.8.0",
32+
"eslint-plugin-jest": "^21.3.2",
33+
"eslint-plugin-jsx-a11y": "^5.1.1",
34+
"eslint-plugin-prettier": "^2.3.1",
35+
"eslint-plugin-react": "^7.4.0",
36+
"prettier": "^1.8.2"
37+
},
38+
"engines": {
39+
"node": ">=9.0.0"
40+
},
41+
"prettier": {
42+
"trailingComma": "all",
43+
"singleQuote": true
44+
},
45+
"eslintConfig": {
46+
"parser": "babel-eslint",
47+
"extends": [
48+
"react-app",
49+
"airbnb",
50+
"prettier",
51+
"prettier/flowtype",
52+
"prettier/react",
53+
"plugin:jest/recommended"
54+
],
55+
"plugins": [
56+
"prettier",
57+
"jest"
58+
],
59+
"env": {
60+
"jest/globals": true
61+
},
62+
"rules": {
63+
"react/jsx-filename-extension": [
64+
1,
65+
{
66+
"extensions": [
67+
".js"
68+
]
69+
}
70+
],
71+
"import/no-extraneous-dependencies": 0,
72+
"jsx-a11y/no-static-element-interactions": 0,
73+
"react/forbid-prop-types": 0,
74+
"react/require-default-props": 0,
75+
"prettier/prettier": "error"
76+
}
77+
}
78+
}

e2e-test/src/index.test.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
require('dotenv').config();
2+
const puppeteer = require('puppeteer');
3+
const delay = require('delay');
4+
5+
const { ACCOUNT, PASSWORD, ADMIN_DOMAIN, CONSOLE_DOMAIN } = process.env;
6+
if (!ADMIN_DOMAIN || !CONSOLE_DOMAIN) {
7+
throw Error('❌ Please create a .env file.');
8+
}
9+
10+
let browser;
11+
let page;
12+
13+
beforeAll(async () => {
14+
browser = await puppeteer.launch({
15+
// headless: false,
16+
// slowMo: 20,
17+
});
18+
page = await browser.newPage();
19+
// await page.setViewport({ width: 1400, height: 1000 });
20+
});
21+
22+
afterAll(() => {
23+
browser.close();
24+
});
25+
26+
describe(
27+
'Admin',
28+
() => {
29+
it('[Admin] Login', async () => {
30+
await page.goto(`${ADMIN_DOMAIN}/admin/login?locale=en`);
31+
await page.type('input[name=email]', ACCOUNT);
32+
await page.type('input[name=password]', PASSWORD);
33+
await page.click('input[type=submit]');
34+
await page.waitForNavigation();
35+
expect(page.url()).toContain('/admin');
36+
});
37+
38+
it('[Admin] Start service', async () => {
39+
const getStatus = p =>
40+
p.$eval(
41+
'#root > div > div > div > header > div > div > p',
42+
el => el.innerHTML,
43+
);
44+
const status = await getStatus(page);
45+
await delay(500);
46+
if (['Start', '啟動'].includes(status)) {
47+
await page.click('#root > div > div > div > header > div');
48+
}
49+
const newStatus = await getStatus(page);
50+
await delay(500);
51+
expect(['Start', '啟動'].includes(newStatus)).toBeFalsy();
52+
});
53+
54+
it(
55+
'[Console] Login',
56+
async () => {
57+
await page.goto(`${CONSOLE_DOMAIN}/login?locale=en`);
58+
await page.type('input[name=email]', ACCOUNT);
59+
await page.type('input[name=password]', PASSWORD);
60+
await page.click('button[type=submit]');
61+
await page.waitForNavigation();
62+
await delay(500);
63+
expect(page.url()).toContain('/dashboard');
64+
},
65+
5000,
66+
);
67+
68+
it('[Prototype] Open create dialog', async () => {
69+
await page.goto(`${CONSOLE_DOMAIN}/prototypes?locale=en`);
70+
await page.waitForSelector('button[type=submit]');
71+
await page.click('button[type=submit]');
72+
await page.waitForSelector('div[role=dialog]');
73+
});
74+
75+
it('[Prototype] Create', async () => {
76+
await page.type(
77+
'input[id=prototype_name]',
78+
`Puppeteer Title ${new Date()}`,
79+
);
80+
await page.click(
81+
'div[role=dialog] div > div:nth-child(3) button:nth-child(2)',
82+
);
83+
});
84+
},
85+
999999999,
86+
);

0 commit comments

Comments
 (0)