Skip to content

Commit 0fbea07

Browse files
committed
test(app): add protractor tests for account pages
Changes: - add protractor tests for auth related pages - add `onPrepare` and `params` to `protractor.conf.js`
1 parent a817ec9 commit 0fbea07

File tree

7 files changed

+257
-1
lines changed

7 files changed

+257
-1
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* This file uses the Page Object pattern to define the main page for tests
3+
* https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ
4+
*/
5+
6+
'use strict';
7+
8+
var LoginPage = function() {
9+
this.form = element(by.css('.form'));
10+
this.form.email = this.form.element(by.model('user.email'));
11+
this.form.password = this.form.element(by.model('user.password'));
12+
this.form.submit = this.form.element(by.css('.btn-login'));
13+
14+
this.login = function(data) {
15+
for (var prop in data) {
16+
var formElem = this.form[prop];
17+
if (data.hasOwnProperty(prop) && formElem && typeof formElem.sendKeys === 'function') {
18+
formElem.sendKeys(data[prop]);
19+
}
20+
}
21+
22+
this.form.submit.click();
23+
};
24+
};
25+
26+
module.exports = new LoginPage();
27+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use strict';
2+
3+
var config = protractor.getInstance().params;
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
5+
6+
describe('Login View', function() {
7+
var page;
8+
9+
var loadPage = function() {
10+
browser.get('/login');
11+
page = require('./login.po');
12+
};
13+
14+
var testUser = {
15+
name: 'Test User',
16+
email: 'test@test.com',
17+
password: 'test'
18+
};
19+
20+
beforeEach(function(done) {
21+
UserModel.removeAsync()
22+
.then(function() {
23+
return UserModel.createAsync(testUser);
24+
})
25+
.then(loadPage)
26+
.finally(done);
27+
});
28+
29+
it('should include login form with correct inputs and submit button', function() {
30+
expect(page.form.email.getAttribute('type')).toBe('email');
31+
expect(page.form.email.getAttribute('name')).toBe('email');
32+
expect(page.form.password.getAttribute('type')).toBe('password');
33+
expect(page.form.password.getAttribute('name')).toBe('password');
34+
expect(page.form.submit.getAttribute('type')).toBe('submit');
35+
expect(page.form.submit.getText()).toBe('Login');
36+
});
37+
38+
describe('with local auth', function() {
39+
40+
it('should login a user and redirecting to "/"', function() {
41+
page.login(testUser);
42+
43+
var navbar = require('../../components/navbar/navbar.po');
44+
45+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/');
46+
expect(navbar.navbarAccountGreeting.getText()).toBe('Hello ' + testUser.name);
47+
});
48+
49+
it('should indicate login failures', function() {
50+
page.login({
51+
email: testUser.email,
52+
password: 'badPassword'
53+
});
54+
55+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/login');
56+
57+
var helpBlock = page.form.element(by.css('.form-group.has-error .help-block.ng-binding'));
58+
expect(helpBlock.getText()).toBe('This password is not correct.');
59+
});
60+
61+
});
62+
});
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
'use strict';
2+
3+
var config = protractor.getInstance().params;
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
5+
6+
describe('Logout View', function() {
7+
var login = function(user) {
8+
browser.get('/login');
9+
require('../login/login.po').login(user);
10+
};
11+
12+
var testUser = {
13+
name: 'Test User',
14+
email: 'test@test.com',
15+
password: 'test'
16+
};
17+
18+
beforeEach(function(done) {
19+
UserModel.removeAsync()
20+
.then(function() {
21+
return UserModel.createAsync(testUser);
22+
})
23+
.then(function() {
24+
return login(testUser);
25+
})
26+
.finally(done);
27+
});
28+
29+
describe('with local auth', function() {
30+
31+
it('should logout a user and redirecting to "/"', function() {
32+
var navbar = require('../../components/navbar/navbar.po');
33+
34+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/');
35+
expect(navbar.navbarAccountGreeting.getText()).toBe('Hello ' + testUser.name);
36+
37+
browser.get('/logout');
38+
39+
navbar = require('../../components/navbar/navbar.po');
40+
41+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/');
42+
expect(navbar.navbarAccountGreeting.isDisplayed()).toBe(false);
43+
});
44+
45+
});
46+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* This file uses the Page Object pattern to define the main page for tests
3+
* https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ
4+
*/
5+
6+
'use strict';
7+
8+
var SignupPage = function() {
9+
this.form = element(by.css('.form'));
10+
this.form.name = this.form.element(by.model('user.name'));
11+
this.form.email = this.form.element(by.model('user.email'));
12+
this.form.password = this.form.element(by.model('user.password'));
13+
this.form.submit = this.form.element(by.css('.btn-register'));
14+
15+
this.signup = function(data) {
16+
for (var prop in data) {
17+
var formElem = this.form[prop];
18+
if (data.hasOwnProperty(prop) && formElem && typeof formElem.sendKeys === 'function') {
19+
formElem.sendKeys(data[prop]);
20+
}
21+
}
22+
23+
this.form.submit.click();
24+
};
25+
};
26+
27+
module.exports = new SignupPage();
28+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
var config = protractor.getInstance().params;
4+
var UserModel = require(config.serverConfig.root + '/server/api/user/user.model');
5+
6+
describe('Signup View', function() {
7+
var page;
8+
9+
var loadPage = function() {
10+
browser.get('/signup');
11+
page = require('./signup.po');
12+
};
13+
14+
var testUser = {
15+
name: 'Test User',
16+
email: 'test@test.com',
17+
password: 'test'
18+
};
19+
20+
beforeEach(function() {
21+
loadPage();
22+
});
23+
24+
it('should include signup form with correct inputs and submit button', function() {
25+
expect(page.form.name.getAttribute('type')).toBe('text');
26+
expect(page.form.name.getAttribute('name')).toBe('name');
27+
expect(page.form.email.getAttribute('type')).toBe('email');
28+
expect(page.form.email.getAttribute('name')).toBe('email');
29+
expect(page.form.password.getAttribute('type')).toBe('password');
30+
expect(page.form.password.getAttribute('name')).toBe('password');
31+
expect(page.form.submit.getAttribute('type')).toBe('submit');
32+
expect(page.form.submit.getText()).toBe('Sign up');
33+
});
34+
35+
describe('with local auth', function() {
36+
37+
it('should signup a new user, log them in, and redirecting to "/"', function(done) {
38+
UserModel.remove(function() {
39+
page.signup(testUser);
40+
41+
var navbar = require('../../components/navbar/navbar.po');
42+
43+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/');
44+
expect(navbar.navbarAccountGreeting.getText()).toBe('Hello ' + testUser.name);
45+
46+
done();
47+
});
48+
});
49+
50+
it('should indicate signup failures', function() {
51+
page.signup(testUser);
52+
53+
expect(browser.getLocationAbsUrl()).toBe(config.baseUrl + '/signup');
54+
expect(page.form.email.getAttribute('class')).toContain('ng-invalid-mongoose');
55+
56+
var helpBlock = page.form.element(by.css('.form-group.has-error .help-block.ng-binding'));
57+
expect(helpBlock.getText()).toBe('The specified email address is already in use.');
58+
});
59+
60+
});
61+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* This file uses the Page Object pattern to define the main page for tests
3+
* https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ
4+
*/
5+
6+
'use strict';
7+
8+
var NavbarComponent = function() {
9+
this.navbar = element(by.css('.navbar'));
10+
this.navbarHeader = this.navbar.element(by.css('.navbar-header'));
11+
this.navbarNav = this.navbar.element(by.css('#navbar-main .nav.navbar-nav:not(.navbar-right)'));<% if(filters.auth) { %>
12+
this.navbarAccount = this.navbar.element(by.css('#navbar-main .nav.navbar-nav.navbar-right'));
13+
this.navbarAccountGreeting = this.navbarAccount.element(by.binding('Hello {{ getCurrentUser().name }}'));<% } %>
14+
};
15+
16+
module.exports = new NavbarComponent();

app/templates/protractor.conf.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
'use strict';
55

6-
exports.config = {
6+
var config = {
77
// The timeout for each script run on the browser. This should be longer
88
// than the maximum time your application needs to stabilize between tasks.
99
allScriptsTimeout: 110000,
@@ -46,5 +46,21 @@ exports.config = {
4646
// See the full list at https://github.com/juliemr/minijasminenode
4747
jasmineNodeOpts: {
4848
defaultTimeoutInterval: 30000
49+
},
50+
51+
// Prepare environment for tests
52+
params: {
53+
serverConfig: require('./server/config/environment')
54+
},
55+
56+
onPrepare: function() {
57+
var serverConfig = config.params.serverConfig;
58+
59+
// Setup mongo tests
60+
var mongoose = require('mongoose-bird')();
61+
mongoose.connect(serverConfig.mongo.uri, serverConfig.mongo.options); // Connect to database
4962
}
5063
};
64+
65+
config.params.baseUrl = config.baseUrl;
66+
exports.config = config;

0 commit comments

Comments
 (0)