Skip to content

Commit 5d0384b

Browse files
committed
Some functional tests.
1 parent cbafac0 commit 5d0384b

File tree

7 files changed

+147
-8
lines changed

7 files changed

+147
-8
lines changed

Gruntfile.js

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ module.exports = grunt => {
66
grunt.loadNpmTasks('grunt-contrib-watch');
77
grunt.loadNpmTasks('grunt-contrib-clean');
88
grunt.loadNpmTasks('grunt-mocha-test');
9+
grunt.loadNpmTasks('grunt-contrib-connect');
10+
grunt.loadNpmTasks('grunt-exec');
911

1012
grunt.initConfig({
1113
clean: {
@@ -100,7 +102,7 @@ module.exports = grunt => {
100102
websiteDev: require('./webpack.website-dev.js'),
101103
extensionProd: require('./webpack.extension-prod.js'),
102104
extensionDev: require('./webpack.extension-dev.js'),
103-
test: require('./webpack.website-tests.js')
105+
unitTests: require('./webpack.website-unit-tests.js')
104106
},
105107

106108
watch: {
@@ -155,11 +157,27 @@ module.exports = grunt => {
155157
},
156158

157159
mochaTest: {
158-
all: {
160+
unit: {
159161
options: {},
160-
src: ['dist/test/*.js']
162+
src: ['dist/test/unit-tests.js']
163+
},
164+
functional: {
165+
options: {
166+
// Higher default timeout to account for some animations
167+
timeout: 10000
168+
},
169+
src: ['test/functional/**.js']
170+
}
171+
},
172+
173+
connect: {
174+
functionalTests: {
175+
options: {
176+
hostname: '127.0.0.1',
177+
base: 'dist/website',
178+
}
161179
}
162-
}
180+
},
163181
});
164182

165183
grunt.registerTask('build-website-views', [
@@ -207,7 +225,15 @@ module.exports = grunt => {
207225
'build-extension-dev'
208226
]);
209227

210-
grunt.registerTask('test', ['webpack:test', 'mochaTest']);
228+
grunt.registerTask('unit-tests', ['webpack:unitTests', 'mochaTest:unit']);
229+
230+
grunt.registerTask('functional-tests', [
231+
'build-website-dev',
232+
'connect:functionalTests',
233+
'mochaTest:functional'
234+
]);
235+
236+
grunt.registerTask('test', ['unit-tests', 'functional-tests']);
211237

212238
grunt.registerTask('default', ['build-dev', 'watch']);
213239
};

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@
1313
"babel-loader": "^8.0.0-beta.0",
1414
"bootstrap": "^3.3.7",
1515
"chai": "^4.1.2",
16+
"chai-arrays": "^2.0.0",
1617
"chai-as-promised": "^7.1.1",
1718
"codemirror": "^5.33.0",
1819
"flipclock": "^0.7.8",
1920
"grunt": "^1.0.1",
2021
"grunt-cli": "^1.2.0",
2122
"grunt-contrib-clean": "^1.1.0",
23+
"grunt-contrib-connect": "^1.0.2",
2224
"grunt-contrib-copy": "^1.0.0",
2325
"grunt-contrib-pug": "^1.0.0",
2426
"grunt-contrib-stylus": "^1.2.0",
2527
"grunt-contrib-watch": "^1.0.0",
28+
"grunt-exec": "^3.0.0",
2629
"grunt-mocha-test": "^0.13.3",
2730
"grunt-webpack": "^3.0.2",
2831
"highlight.js": "^9.12.0",
@@ -35,6 +38,7 @@
3538
"loglevel": "^1.6.1",
3639
"mocha": "^5.0.0",
3740
"pug": "^2.0.0-rc.4",
41+
"puppeteer": "^1.0.0",
3842
"sinon": "^4.2.2",
3943
"sinon-chai": "^2.14.0",
4044
"source-map-support": "^0.5.3",

test/functional/editor.js

Whitespace-only changes.

test/functional/index.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/functional/libraries.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
const chai = require('chai');
2+
const chaiAsPromised = require('chai-as-promised');
3+
const chaiArrays = require('chai-arrays');
4+
5+
const utils = require('./utils.js');
6+
7+
const isVisible = utils.isVisible;
8+
9+
chai.use(chaiAsPromised);
10+
chai.use(chaiArrays);
11+
const expect = chai.expect;
12+
13+
describe('Libraries', function() {
14+
before(utils.launchBrowser);
15+
16+
after(utils.closeBrowser);
17+
18+
it('Displays libraries when clicking on navbar', async function() {
19+
await this.page.click('a[href="#libraries-io"]');
20+
// Wait for scroll
21+
await this.page.waitFor(3000);
22+
expect(await this.page.$eval('#libraries-io', isVisible)).to.be.true;
23+
});
24+
25+
it('Displays a sorted library filter', async function() {
26+
const libraries = await this.page.$eval('#libraries-select', select => {
27+
const result = [];
28+
29+
Array.prototype.forEach.call(select.children, element => {
30+
result.push(element.value);
31+
});
32+
33+
return result;
34+
});
35+
36+
expect(libraries).to.be.sorted;
37+
});
38+
39+
it('Hides and displays libraries using filters', async function() {
40+
await this.page.select('#libraries-select', '.php');
41+
// Wait for animation
42+
await this.page.waitFor(2000);
43+
44+
expect(await this.page.$eval('.php', isVisible)).to.be.true;
45+
expect(await this.page.$eval('.net', isVisible)).to.be.false;
46+
expect(await this.page.$eval('.python', isVisible)).to.be.false;
47+
48+
await this.page.waitForSelector('.net', {
49+
hidden: true
50+
});
51+
await this.page.waitForSelector('.python', {
52+
hidden: true
53+
});
54+
55+
await this.page.select('#libraries-select', '*');
56+
// Wait for animation
57+
await this.page.waitFor(2000);
58+
59+
await this.page.waitForSelector('.net', {
60+
visible: true
61+
});
62+
await this.page.waitForSelector('.php', {
63+
visible: true
64+
});
65+
await this.page.waitForSelector('.python', {
66+
visible: true
67+
});
68+
});
69+
});

test/functional/utils.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const puppeteer = require('puppeteer');
2+
3+
// https://stackoverflow.com/questions/5353934/check-if-element-is-visible-on-screen
4+
function isVisible(elm) {
5+
try {
6+
const rect = elm.getBoundingClientRect();
7+
const viewHeight = Math.max(document.documentElement.clientHeight,
8+
window.innerHeight);
9+
return !(rect.bottom < 0 || rect.top - viewHeight >= 0) &&
10+
rect.width > 0 &&
11+
rect.height > 0;
12+
} catch(e) {
13+
return false;
14+
}
15+
}
16+
17+
async function launchBrowser() {
18+
// Initial navigation may take long due to outside requests.
19+
this.timeout(30000);
20+
21+
this.browser = await puppeteer.launch({
22+
//args: ['--no-sandbox'],
23+
headless: false,
24+
executablePath: '/usr/bin/chromium'
25+
});
26+
this.page = await this.browser.newPage();
27+
await this.page.setViewport({
28+
width: 1920,
29+
height: 1080
30+
});
31+
await this.page.goto('http://localhost:8000');
32+
}
33+
34+
async function closeBrowser() {
35+
await this.browser.close();
36+
}
37+
38+
module.exports = {
39+
isVisible: isVisible,
40+
launchBrowser: launchBrowser,
41+
closeBrowser: closeBrowser
42+
};

webpack.website-tests.js renamed to webpack.website-unit-tests.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ const common = require('./webpack.common.js');
44

55
module.exports = merge(common, {
66
entry: {
7-
'unit-tests': './test/unit/index.js',
8-
'functional-tests': './test/functional/index.js'
7+
'unit-tests': './test/unit/index.js'
98
},
109
output: {
1110
filename: '[name].js',

0 commit comments

Comments
 (0)