Skip to content

Commit eb6acb6

Browse files
committed
Add end2end
1 parent 14120c3 commit eb6acb6

File tree

14 files changed

+447
-15
lines changed

14 files changed

+447
-15
lines changed

Diff for: .gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@
2121
npm-debug.log*
2222
yarn-debug.log*
2323
yarn-error.log*
24+
25+
# env
26+
.env.*
27+
.env

Diff for: babel.config.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
presets: ['@babel/preset-env', '@babel/preset-react'],
3+
};

Diff for: e2e/__tests__/trivia.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'babel-polyfill';
2+
3+
import driver from '../driver';
4+
import config from '../config';
5+
6+
import waitForElement from '../waitForElement';
7+
8+
// eslint-disable-next-line no-undef
9+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 120000;
10+
11+
describe('HomeScreen', () => {
12+
beforeAll(async () => {
13+
await driver.init({ browserName: config.E2E_DEVICE });
14+
});
15+
16+
afterAll(async () => {
17+
await driver.quit();
18+
});
19+
20+
it('load the app', async () => {
21+
await driver.get('http://localhost:3000/');
22+
const homeScreen = await waitForElement('home-screen');
23+
expect(homeScreen).toBeDefined();
24+
});
25+
26+
it('start the trivia', async () => {
27+
const startPlayingButton = await waitForElement('start-playing-button');
28+
expect(startPlayingButton).toBeDefined();
29+
30+
await driver.moveTo(startPlayingButton);
31+
await driver.click();
32+
33+
const triviaScreen = await waitForElement('trivia-screen');
34+
expect(triviaScreen).toBeDefined();
35+
});
36+
37+
it('answer the 5 questions', async () => {
38+
for (let i = 0; i < 5; i++) {
39+
const answerOptionButton = await waitForElement('answer-option');
40+
expect(answerOptionButton).toBeDefined();
41+
42+
await driver.moveTo(answerOptionButton);
43+
await driver.click();
44+
await driver.sleep(1000);
45+
}
46+
47+
const triviaResultScreen = await waitForElement('trivia-result-screen');
48+
expect(triviaResultScreen).toBeDefined();
49+
});
50+
51+
it('restarts trivia', async () => {
52+
const restartTriviaButton = await waitForElement('restart-trivia-button');
53+
expect(restartTriviaButton).toBeDefined();
54+
55+
await driver.moveTo(restartTriviaButton);
56+
await driver.click();
57+
58+
const homeScreen = await waitForElement('home-screen');
59+
expect(homeScreen).toBeDefined();
60+
});
61+
});

Diff for: e2e/config.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
require('custom-env').env('e2e');
2+
3+
const {
4+
E2E_DEVICE,
5+
E2E_SERVER,
6+
BROWSERSTACK_USERNAME,
7+
BROWSERSTACK_ACCESS_KEY,
8+
BROWSERSTACK_APP_URL,
9+
BROWSERSTACK_DEVICE,
10+
} = process.env;
11+
12+
const defaults = {
13+
E2E_DEVICE: null,
14+
E2E_SERVER: null,
15+
};
16+
17+
// Alert to fill the necessary environment variables
18+
Object.keys(defaults).forEach(key => {
19+
if (!process.env[key]) {
20+
throw new Error(
21+
`Please enter a custom ${key} in .env on the root directory`
22+
);
23+
}
24+
});
25+
26+
export default {
27+
E2E_DEVICE,
28+
E2E_SERVER,
29+
BROWSERSTACK_USERNAME,
30+
BROWSERSTACK_ACCESS_KEY,
31+
BROWSERSTACK_APP_URL,
32+
BROWSERSTACK_DEVICE,
33+
};

Diff for: e2e/driver.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import wd from 'wd';
2+
3+
import server from './server';
4+
5+
const driver = wd.promiseChainRemote(server.url, server.port);
6+
7+
export default driver;

Diff for: e2e/server.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import config from './config';
2+
3+
const URL = {
4+
local: 'localhost',
5+
remote: 'http://hub-cloud.browserstack.com/wd/hub',
6+
};
7+
8+
const PORT = {
9+
local: 4444,
10+
remote: 80,
11+
};
12+
13+
export default {
14+
url: URL[config.E2E_SERVER],
15+
port: PORT[config.E2E_SERVER],
16+
};

Diff for: e2e/waitForElement.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { asserters } from 'wd';
2+
3+
import driver from './driver';
4+
5+
export default async function waitForElement(key, tag, timeout = 5000) {
6+
function waitFor() {
7+
if (tag) {
8+
return driver.waitForElement(
9+
tag,
10+
key,
11+
asserters.isDisplayed,
12+
timeout,
13+
100
14+
);
15+
}
16+
17+
return driver.waitForElementById(key, asserters.isDisplayed, timeout, 100);
18+
}
19+
20+
try {
21+
const existingElement = await waitFor();
22+
return existingElement;
23+
} catch {
24+
return undefined;
25+
}
26+
}

Diff for: jest.e2e.json

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"testPathIgnorePatterns": ["/node_modules/", "src/"]
3+
}

Diff for: package.json

+8-2
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,22 @@
1414
},
1515
"devDependencies": {
1616
"@testing-library/react": "^8.0.4",
17+
"babel-polyfill": "^6.26.0",
18+
"custom-env": "^1.0.2",
1719
"husky": ">=1",
1820
"lint-staged": ">=8",
1921
"prettier": "1.17.1",
20-
"react-test-renderer": "^16.8.6"
22+
"react-test-renderer": "^16.8.6",
23+
"selenium-standalone": "^6.16.0",
24+
"wd": "^1.11.2"
2125
},
2226
"scripts": {
2327
"start": "react-scripts start",
2428
"build": "react-scripts build",
2529
"test": "react-scripts test",
26-
"coverage": "npm test -- --coverage --watchAll"
30+
"coverage": "npm test -- --coverage --watchAll",
31+
"e2e": "jest --config jest.e2e.json",
32+
"selenium": "selenium-standalone install && selenium-standalone start"
2733
},
2834
"eslintConfig": {
2935
"extends": "react-app"

Diff for: src/components/HomeScreen/HomeScreen.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import Styles from './HomeScreen.module.css';
88

99
export default function HomeScreen() {
1010
return (
11-
<Page>
11+
<Page id="home-screen">
1212
<div className={Styles.wrapper}>
1313
<TitleLogo />
1414

1515
<Link to="/trivia">
16-
<Button color="primary" variant="outlined">
16+
<Button id="start-playing-button" color="primary" variant="outlined">
1717
START PLAYING
1818
</Button>
1919
</Link>

Diff for: src/components/TriviaResultScreen/TriviaResultScreen.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,20 @@ export default function TriviaResultScreen({ history, location }) {
1111
};
1212

1313
return (
14-
<Page>
14+
<Page id="trivia-result-screen">
1515
<div className={Styles.Content}>
1616
<Typography align="center" variant="h4">
1717
{location.state.isWinner
1818
? 'Soy intelectual muy inteligente!'
1919
: 'Eres tonto como una piedra y feo como una blasfemia'}
2020
</Typography>
2121

22-
<Button variant="outlined" color="primary" onClick={handleResetTrivia}>
22+
<Button
23+
id="restart-trivia-button"
24+
variant="outlined"
25+
color="primary"
26+
onClick={handleResetTrivia}
27+
>
2328
VOLVER A COMENZAR
2429
</Button>
2530
</div>

Diff for: src/components/TriviaScreen/TriviaScreen.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export default function TriviaScreen({ history }) {
4343
};
4444

4545
return (
46-
<Page>
46+
<Page id="trivia-screen">
4747
<Typography className={Styles.Title} variant="h4">
4848
{currentQuestion.text}
4949
</Typography>

Diff for: src/components/TriviaScreen/components/AnswerOptionList/AnswerOptionsList.js

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default function AnswerOptionList({ options, onOptionPress }) {
88

99
return options.map(option => (
1010
<Button
11+
id="answer-option"
1112
variant="contained"
1213
color="secondary"
1314
onClick={handleOptionPress(option)}

0 commit comments

Comments
 (0)