Skip to content

Commit 1f1a9d5

Browse files
committed
test(e2e): fix all e2e tests for generator 5.0.0
1 parent f4c5471 commit 1f1a9d5

15 files changed

+492
-502
lines changed

Diff for: templates/app/_package.json

+2
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
<%# END WEBPACK %>
183183
"through2": "^2.0.1",
184184
"open": "~0.0.4",
185+
"protractor": "^5.3.0",
185186
"istanbul": "1.1.0-alpha.1",
186187
"chai": "^4.1.2",
187188
"sinon": "^3.2.1",
@@ -218,6 +219,7 @@
218219
"lint:server": "eslint ./server/**/*.js -c ./server/.eslintrc --ignore-pattern *.spec.js --ignore-pattern *.integration.js",
219220
"test": "gulp test",
220221
"test:client": "karma start ./karma.conf.js --single-run",
222+
"test:e2e": "gulp webpack:dev && protractor ./protractor.conf.js",
221223
<%_ if(filters.flow) { -%>
222224
"flow": "flow",
223225
<%_ } -%>

Diff for: templates/app/e2e/.eslintrc

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"parser": "babel-eslint",
3+
"env": {
4+
"es6": true,
5+
"node": true,<% if(filters.mocha) { %>
6+
"mocha": true,<% } else { %>
7+
"jasmine": true,<% } %>
8+
"protractor": true
9+
},
10+
"globals": {
11+
"expect": true
12+
}
13+
}

Diff for: templates/app/e2e/account(auth)/login/login.po.js

+19-18
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,27 @@
33
* https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ
44
*/
55

6-
'use strict';
6+
import {OauthButtons} from '../../components/oauth-buttons/oauth-buttons.po';
77

8-
var LoginPage = function() {
9-
var form = this.form = element(by.css('.form'));
10-
form.email = form.element(by.model('vm.user.email'));
11-
form.password = form.element(by.model('vm.user.password'));
12-
form.submit = form.element(by.css('.btn-login'));<% if (filters.oauth) { %>
13-
form.oauthButtons = require('../../components/oauth-buttons/oauth-buttons.po').oauthButtons;<% } %>
8+
export class LoginPage {
9+
constructor() {
10+
this.form = element(by.css('.form'));
11+
const form = this.form;
1412

15-
this.login = function(data) {
16-
for (var prop in data) {
17-
var formElem = form[prop];
18-
if (data.hasOwnProperty(prop) && formElem && typeof formElem.sendKeys === 'function') {
19-
formElem.sendKeys(data[prop]);
20-
}
13+
form.email = form.element(by.name('email'));
14+
form.password = form.element(by.name('password'));
15+
form.submit = form.element(by.css('.btn-login'));
16+
form.oauthButtons = (new OauthButtons()).oauthButtons;
2117
}
2218

23-
return form.submit.click();
24-
};
25-
};
26-
27-
module.exports = new LoginPage();
19+
login(data) {
20+
for(let prop in data) {
21+
let formElem = this.form[prop];
22+
if(data.hasOwnProperty(prop) && formElem && typeof formElem.sendKeys === 'function') {
23+
formElem.sendKeys(data[prop]);
24+
}
25+
}
2826

27+
return this.form.submit.click();
28+
}
29+
}
+56-69
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,73 @@
1-
'use strict';
2-
3-
var config = browser.params;<% if (filters.mongooseModels) { %>
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model').default;<% } %><% if (filters.sequelizeModels) { %>
5-
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
1+
const config = browser.params;<% if (filters.mongooseModels) { %>
2+
import UserModel from '../../../server/api/user/user.model';<% } %><% if (filters.sequelizeModels) { %>
3+
import {User as UserModel} from '../../../server/sqldb';<% } %>
4+
import {LoginPage} from './login.po';
5+
import {NavbarComponent} from '../../components/navbar/navbar.po';
66

77
describe('Login View', function() {
8-
var page;
8+
let page;
9+
10+
const loadPage = () => {
11+
return browser.get(`${config.baseUrl}/login`).then(() => {
12+
page = new LoginPage();
13+
});
14+
};
15+
16+
const testUser = {
17+
name: 'Test User',
18+
19+
password: 'test'
20+
};
921

10-
var loadPage = function() {
11-
browser.get(config.baseUrl + '/login');
12-
page = require('./login.po');
13-
};
22+
beforeEach(async function() {
23+
await UserModel
24+
<% if (filters.mongooseModels) { %>.remove();<% }
25+
if (filters.sequelizeModels) { %>.destroy({ where: {} });<% } %>
1426

15-
var testUser = {
16-
name: 'Test User',
17-
18-
password: 'test'
19-
};
27+
await UserModel.create(testUser);
2028

21-
beforeEach(function(done) {
22-
<% if (filters.mongooseModels) { %>UserModel.remove()<% }
23-
if (filters.sequelizeModels) { %>UserModel.destroy({ where: {} })<% } %>
24-
.then(function() {
25-
return UserModel.create(testUser)
26-
.then(loadPage);
27-
})
28-
// .then(loadPage)
29-
.finally(function() {
30-
browser.wait(function() {
31-
//console.log('waiting for angular...');
32-
return browser.executeScript('return !!window.angular');
29+
await loadPage();
30+
});
3331

34-
}, 5000).then(done);
35-
});
36-
});
32+
it('should include login form with correct inputs and submit button', function() {
33+
expect(page.form.email.getAttribute('type')).toBe('email');
34+
expect(page.form.email.getAttribute('name')).toBe('email');
35+
expect(page.form.password.getAttribute('type')).toBe('password');
36+
expect(page.form.password.getAttribute('name')).toBe('password');
37+
expect(page.form.submit.getAttribute('type')).toBe('submit');
38+
expect(page.form.submit.getText()).toBe('Login');
39+
});<% if (filters.oauth) { %>
3740

38-
it('should include login form with correct inputs and submit button', function() {
39-
expect(page.form.email.getAttribute('type')).toBe('email');
40-
expect(page.form.email.getAttribute('name')).toBe('email');
41-
expect(page.form.password.getAttribute('type')).toBe('password');
42-
expect(page.form.password.getAttribute('name')).toBe('password');
43-
expect(page.form.submit.getAttribute('type')).toBe('submit');
44-
expect(page.form.submit.getText()).toBe('Login');
45-
});<% if (filters.oauth) { %>
41+
it('should include oauth buttons with correct classes applied', function() {<% if (filters.facebookAuth) { %>
42+
expect(page.form.oauthButtons.facebook.getText()).toBe('Connect with Facebook');<% } if (filters.googleAuth) { %>
43+
expect(page.form.oauthButtons.google.getText()).toBe('Connect with Google+');<% } if (filters.twitterAuth) { %>
44+
expect(page.form.oauthButtons.twitter.getText()).toBe('Connect with Twitter');<% } %>
45+
});<% } %>
4646

47-
it('should include oauth buttons with correct classes applied', function() {<% if (filters.facebookAuth) { %>
48-
expect(page.form.oauthButtons.facebook.getText()).toBe('Connect with Facebook');
49-
expect(page.form.oauthButtons.facebook.getAttribute('class')).toMatch('btn-block');<% } if (filters.googleAuth) { %>
50-
expect(page.form.oauthButtons.google.getText()).toBe('Connect with Google+');
51-
expect(page.form.oauthButtons.google.getAttribute('class')).toMatch('btn-block');<% } if (filters.twitterAuth) { %>
52-
expect(page.form.oauthButtons.twitter.getText()).toBe('Connect with Twitter');
53-
expect(page.form.oauthButtons.twitter.getAttribute('class')).toMatch('btn-block');<% } %>
54-
});<% } %>
47+
describe('with local auth', function() {
48+
it('should login a user and redirect to "/home"', async function() {
49+
await page.login(testUser);
5550

56-
describe('with local auth', function() {
51+
let navbar = new NavbarComponent();
5752

58-
it('should login a user and redirecting to "/"', function() {
59-
return page.login(testUser).then(() => {
60-
var navbar = require('../../components/navbar/navbar.po');
53+
browser.ignoreSynchronization = false;
54+
await browser.wait(() => browser.getCurrentUrl(), 5000, 'URL didn\'t change after 5s');
55+
browser.ignoreSynchronization = true;
6156

62-
return browser.wait(
63-
() => element(by.css('.hero-unit')),
64-
5000,
65-
`Didn't find .hero-unit after 5s`
66-
).then(() => {
67-
expect(browser.getCurrentUrl()).toBe(config.baseUrl + '/');
68-
expect(navbar.navbarAccountGreeting.getText()).toBe('Hello ' + testUser.name);
57+
expect(await browser.getCurrentUrl()).toBe(`${config.baseUrl}/home`);
58+
expect(await navbar.navbarAccountGreeting.getText()).toBe(`Hello ${testUser.name}`);
6959
});
70-
});
71-
});
7260

73-
it('should indicate login failures', function() {
74-
page.login({
75-
email: testUser.email,
76-
password: 'badPassword'
77-
});
61+
it('should indicate login failures', async function() {
62+
await page.login({
63+
email: testUser.email,
64+
password: 'badPassword'
65+
});
7866

79-
expect(browser.getCurrentUrl()).toBe(config.baseUrl + '/login');
67+
expect(await browser.getCurrentUrl()).toBe(`${config.baseUrl}/login`);
8068

81-
var helpBlock = page.form.element(by.css('.form-group.has-error .help-block.ng-binding'));
82-
expect(helpBlock.getText()).toBe('This password is not correct.');
69+
let helpBlock = page.form.element(by.css('.form-group.has-error .help-block:not([hidden])'));
70+
expect(await helpBlock.getText()).toBe('This password is not correct.');
71+
});
8372
});
84-
85-
});
8673
});
+75-81
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,87 @@
1-
'use strict';
2-
3-
var config = browser.params;<% if (filters.mongooseModels) { %>
4-
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model').default;<% } %><% if (filters.sequelizeModels) { %>
5-
var UserModel = require(config.serverConfig.root + '/server/sqldb').User;<% } %>
1+
const config = browser.params;<% if (filters.mongooseModels) { %>
2+
import UserModel from '../../../server/api/user/user.model';<% } %><% if (filters.sequelizeModels) { %>
3+
import {User as UserModel} from '../../../server/sqldb';<% } %>
4+
import {LoginPage} from './login.po';
5+
import {NavbarComponent} from '../../components/navbar/navbar.po';
66

77
describe('Login View', function() {
8-
var page;
9-
10-
var loadPage = function() {
11-
let promise = browser.get(config.baseUrl + '/login');
12-
page = require('./login.po');
13-
return promise;
14-
};
15-
16-
var testUser = {
17-
name: 'Test User',
18-
19-
password: 'test'
20-
};
21-
22-
before(function() {
23-
return UserModel
24-
<% if (filters.mongooseModels) { %>.remove()<% }
25-
if (filters.sequelizeModels) { %>.destroy({ where: {} })<% } %>
26-
.then(function() {
27-
<% if (filters.mongooseModels) { %>return UserModel.create(testUser);<% }
28-
if (filters.sequelizeModels) { %>return UserModel.create(testUser);<% } %>
29-
})
30-
.then(loadPage);
31-
});
32-
33-
after(function() {
34-
<% if (filters.mongooseModels) { %>return UserModel.remove();<% }
35-
if (filters.sequelizeModels) { %>return UserModel.destroy({ where: {} });<% } %>
36-
});
37-
38-
it('should include login form with correct inputs and submit button', function() {
39-
<%= expect() %>page.form.email.getAttribute('type')<%= to() %>.eventually.equal('email');
40-
<%= expect() %>page.form.email.getAttribute('name')<%= to() %>.eventually.equal('email');
41-
<%= expect() %>page.form.password.getAttribute('type')<%= to() %>.eventually.equal('password');
42-
<%= expect() %>page.form.password.getAttribute('name')<%= to() %>.eventually.equal('password');
43-
<%= expect() %>page.form.submit.getAttribute('type')<%= to() %>.eventually.equal('submit');
44-
<%= expect() %>page.form.submit.getText()<%= to() %>.eventually.equal('Login');
45-
});<% if (filters.oauth) { %>
46-
47-
it('should include oauth buttons with correct classes applied', function() {<% if (filters.facebookAuth) { %>
48-
<%= expect() %>page.form.oauthButtons.facebook.getText()<%= to() %>.eventually.equal('Connect with Facebook');
49-
<%= expect() %>page.form.oauthButtons.facebook.getAttribute('class')<%= to() %>.eventually.contain('btn-block');<% } if (filters.googleAuth) { %>
50-
<%= expect() %>page.form.oauthButtons.google.getText()<%= to() %>.eventually.equal('Connect with Google+');
51-
<%= expect() %>page.form.oauthButtons.google.getAttribute('class')<%= to() %>.eventually.contain('btn-block');<% } if (filters.twitterAuth) { %>
52-
<%= expect() %>page.form.oauthButtons.twitter.getText()<%= to() %>.eventually.equal('Connect with Twitter');
53-
<%= expect() %>page.form.oauthButtons.twitter.getAttribute('class')<%= to() %>.eventually.contain('btn-block');<% } %>
54-
});<% } %>
55-
56-
describe('with local auth', function() {
57-
58-
it('should login a user and redirecting to "/"', function() {
59-
return page.login(testUser).then(() => {
60-
var navbar = require('../../components/navbar/navbar.po');
61-
62-
return browser.wait(
63-
() => element(by.css('.hero-unit')),
64-
5000,
65-
`Didn't find .hero-unit after 5s`
66-
).then(() => {
67-
<%= expect() %>browser.getCurrentUrl()<%= to() %>.eventually.equal(config.baseUrl + '/');
68-
<%= expect() %>navbar.navbarAccountGreeting.getText()<%= to() %>.eventually.equal('Hello ' + testUser.name);
8+
let page;
9+
10+
const loadPage = () => {
11+
return browser.get(`${config.baseUrl}/login`).then(() => {
12+
page = new LoginPage();
6913
});
70-
});
14+
};
15+
16+
const testUser = {
17+
name: 'Test User',
18+
19+
password: 'test'
20+
};
21+
22+
before(async function() {
23+
await UserModel
24+
<% if (filters.mongooseModels) { %>.remove();<% }
25+
if (filters.sequelizeModels) { %>.destroy({ where: {} });<% } %>
26+
27+
await UserModel.create(testUser);
28+
29+
await loadPage();
7130
});
7231

73-
describe('and invalid credentials', function() {
74-
before(function() {
75-
return loadPage();
76-
})
32+
after(function() {
33+
<% if (filters.mongooseModels) { %>return UserModel.remove();<% }
34+
if (filters.sequelizeModels) { %>return UserModel.destroy({ where: {} });<% } %>
35+
});
7736

78-
it('should indicate login failures', function() {
79-
page.login({
80-
email: testUser.email,
81-
password: 'badPassword'
37+
it('should include login form with correct inputs and submit button', function() {
38+
<%= expect() %>page.form.email.getAttribute('type')<%= to() %>.eventually.equal('email');
39+
<%= expect() %>page.form.email.getAttribute('name')<%= to() %>.eventually.equal('email');
40+
<%= expect() %>page.form.password.getAttribute('type')<%= to() %>.eventually.equal('password');
41+
<%= expect() %>page.form.password.getAttribute('name')<%= to() %>.eventually.equal('password');
42+
<%= expect() %>page.form.submit.getAttribute('type')<%= to() %>.eventually.equal('submit');
43+
<%= expect() %>page.form.submit.getText()<%= to() %>.eventually.equal('Login');
44+
});<% if (filters.oauth) { %>
45+
46+
it('should include oauth buttons with correct classes applied', function() {<% if (filters.facebookAuth) { %>
47+
<%= expect() %>page.form.oauthButtons.facebook.getText()<%= to() %>.eventually.equal('Connect with Facebook');<% } if (filters.googleAuth) { %>
48+
<%= expect() %>page.form.oauthButtons.google.getText()<%= to() %>.eventually.equal('Connect with Google+');<% } if (filters.twitterAuth) { %>
49+
<%= expect() %>page.form.oauthButtons.twitter.getText()<%= to() %>.eventually.equal('Connect with Twitter');<% } %>
50+
});<% } %>
51+
52+
describe('with local auth', function() {
53+
it('should login a user and redirect to "/home"', async function() {
54+
await page.login(testUser);
55+
56+
let navbar = new NavbarComponent();
57+
58+
browser.ignoreSynchronization = false;
59+
await browser.wait(() => browser.getCurrentUrl(), 5000, 'URL didn\'t change after 5s');
60+
browser.ignoreSynchronization = true;
61+
62+
<%= expect() %>(await browser.getCurrentUrl())<%= to() %>.equal(`${config.baseUrl}/home`);
63+
<%= expect() %>(await navbar.navbarAccountGreeting.getText())<%= to() %>.equal(`Hello ${testUser.name}`);
8264
});
8365

84-
<%= expect() %>browser.getCurrentUrl()<%= to() %>.eventually.equal(config.baseUrl + '/login');
66+
describe('and invalid credentials', function() {
67+
before(() => loadPage());
8568

86-
var helpBlock = page.form.element(by.css('.form-group.has-error .help-block.ng-binding'));
87-
<%= expect() %>helpBlock.getText()<%= to() %>.eventually.equal('This password is not correct.');
88-
});
69+
it('should indicate login failures', async function() {
70+
await page.login({
71+
email: testUser.email,
72+
password: 'badPassword'
73+
});
8974

90-
});
75+
<%= expect() %>(await browser.getCurrentUrl())<%= to() %>.equal(`${config.baseUrl}/login`);
76+
77+
let helpBlock = page.form.element(by.css('.form-group.has-error .help-block:not([hidden])'));
9178

92-
});
79+
browser.ignoreSynchronization = false;
80+
await browser.wait(() => helpBlock.getText(), 5000, 'Couldn\'t find help text after 5s');
81+
browser.ignoreSynchronization = true;
82+
83+
<%= expect() %>(await helpBlock.getText())<%= to() %>.equal('This password is not correct.');
84+
});
85+
});
86+
});
9387
});

0 commit comments

Comments
 (0)