linagora-rse
Version:
344 lines (283 loc) • 11.8 kB
JavaScript
;
var expect = require('chai').expect;
describe('The User model', function() {
var User, email, email2, email_ci, helpers, userFixtures;
beforeEach(function(done) {
this.mongoose = require('mongoose');
helpers = this.helpers;
helpers.requireBackend('core/db/mongo/models/user');
helpers.requireBackend('core/db/mongo/models/domain');
User = this.mongoose.model('User');
userFixtures = helpers.requireFixture('models/users.js')(User);
email = 'foo@linagora.com';
email_ci = 'FOO@LiNaGoRa.com ';
email2 = 'bar@linagora.com';
this.connectMongoose(this.mongoose, done);
});
afterEach(function(done) {
this.helpers.mongo.dropDatabase(done);
});
it('should save the user email trimmed and in lowercase', function(done) {
userFixtures.newDummyUser([email_ci]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.emails).to.deep.equal([email]);
done();
}));
}));
});
it('should fail when user does not have email in accounts', function(done) {
userFixtures.newDummyUser([]).save(helpers.callbacks.errorWithMessage(done, 'User must have at least one email'));
});
it('should fail when user has empty accounts', function(done) {
var user = userFixtures.newDummyUser();
user.accounts = [];
user.save(helpers.callbacks.errorWithMessage(done, 'User validation failed'));
});
it('should fail when user has undefined accounts', function(done) {
var user = userFixtures.newDummyUser();
user.accounts = null;
user.save(helpers.callbacks.errorWithMessage(done, 'User validation failed'));
});
it('should load the user from email', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function() {
User.loadFromEmail(email, helpers.callbacks.noErrorAndData(done));
}));
});
it('should load the user from email, case insensitive', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function() {
User.loadFromEmail(email_ci, helpers.callbacks.noErrorAndData(done));
}));
});
it('should load user from any valid email', function(done) {
userFixtures.newDummyUser([email, email2]).save(helpers.callbacks.noErrorAnd(function() {
User.loadFromEmail(email, helpers.callbacks.noErrorAndData(done));
}));
});
it('should load user from any valid email, even with multiple accounts', function(done) {
var user = userFixtures.newDummyUser([email, email2]);
user.accounts.push({
type: 'email',
emails: ['foo@bar.com']
});
user.save(helpers.callbacks.noErrorAnd(function() {
User.loadFromEmail('foo@bar.com', helpers.callbacks.noErrorAndData(done));
}));
});
it('should not found any user with not registered email', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function() {
User.loadFromEmail('bar@linagora.com', helpers.callbacks.noErrorAndNoData(done));
}));
});
it('should save the user with crypted password', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.password).to.not.equal(null);
expect(user.password).to.not.equal(userFixtures.password);
done();
}));
}));
});
it('should return true when calling comparePassword with valid password', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.comparePassword(userFixtures.password, helpers.callbacks.noErrorAnd(function(isMatch) {
expect(isMatch).to.equal(true);
done();
}));
}));
}));
});
it('should return error when calling comparePassword with null password', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.comparePassword(null, helpers.callbacks.error(done));
}));
}));
});
it('should return false when calling comparePassword with wrong password', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.comparePassword('badpassword', helpers.callbacks.noErrorAnd(function(isMatch) {
expect(isMatch).to.equal(false);
done();
}));
}));
}));
});
it('should return false when calling comparePassword with empty password (length === 0)', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.comparePassword('', helpers.callbacks.error(done));
}));
}));
});
it('should add a login failure when calling loginFailure fn', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.loginFailure(helpers.callbacks.noErrorAnd(function(data) {
expect(data.login.failures.length).to.equal(1);
done();
}));
}));
}));
});
it('should reset the login failure counter when calling resetLoginFailure fn', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.resetLoginFailure(helpers.callbacks.noErrorAnd(function(data) {
expect(data.login.failures.length).to.equal(0);
done();
}));
}));
}));
});
it('should set the login success date when calling loginSuccess fn', function(done) {
userFixtures.newDummyUser([email]).save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
user.loginSuccess(helpers.callbacks.noErrorAnd(function(data) {
expect(data.login.success).to.be.an.instanceOf(Date);
done();
}));
}));
}));
});
it('should register the emails property on User model, computing the list of all emails', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'email',
emails: ['foo@bar.com']
});
u.save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.emails).to.deep.equal([email, email2, 'foo@bar.com']);
done();
}));
}));
});
it('should validate that preferredEmailIndex is >= 0', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'email',
emails: ['foo@bar.com'],
preferredEmailIndex: -1
});
u.save(helpers.callbacks.error(done));
});
it('should not fail when emails array is empty', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'email',
emails: [],
preferredEmailIndex: 3
});
u.save(helpers.callbacks.noError(done));
});
it('should not fail when emails array is undefined', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'email',
preferredEmailIndex: 1
});
u.save(helpers.callbacks.noError(done));
});
it('should be able to add oauth account data', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'oauth',
data: {
provider: 'twitter'
}
});
u.save(helpers.callbacks.noError(done));
});
it('should validate that preferredEmailIndex is < emails.length', function(done) {
var u = userFixtures.newDummyUser([email, email2]);
u.accounts.push({
type: 'email',
emails: ['foo@bar.com'],
preferredEmailIndex: 2
});
u.save(helpers.callbacks.error(done));
});
it('should set preferredEmail to the preferred email of the first hosted email account', function(done) {
var user = userFixtures.newDummyUser([email, email2], 'secret', 1);
user.save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.preferredEmail).to.equal(email2);
done();
}));
}));
});
it('should set preferredEmail to the preferred email of the first hosted email account when there is multiple hosted accounts', function(done) {
var user = userFixtures.newDummyUser();
user.accounts.unshift({
type: 'email',
hosted: true,
emails: ['another@email.com']
});
user.accounts.push({
type: 'email',
hosted: true,
emails: ['another-one@email.com']
});
user.save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.preferredEmail).to.equal('another@email.com');
done();
}));
}));
});
it('should set preferredEmail to the preferred email of the first hosted email account when there is other accounts', function(done) {
var user = userFixtures.newDummyUser();
user.accounts.unshift({
type: 'email',
hosted: false,
emails: ['external@email.com']
});
user.accounts.push({
type: 'email',
hosted: false,
emails: ['another-external@email.com']
});
user.save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.preferredEmail).to.equal(email);
done();
}));
}));
});
it('should set preferredEmail to the preferred email of the first email account when there is no hosted account', function(done) {
var user = userFixtures.newDummyUser();
user.accounts = [{
type: 'email',
hosted: false,
emails: ['another-external@email.com', 'yet-another-one@mail.com'],
preferredEmailIndex: 1
}, {
type: 'email',
hosted: false,
emails: ['external@email.com']
}];
user.save(helpers.callbacks.noErrorAnd(function(savedUser) {
User.findOne({ _id: savedUser._id }, helpers.callbacks.noErrorAnd(function(user) {
expect(user.preferredEmail).to.equal('yet-another-one@mail.com');
done();
}));
}));
});
it('should validate that the states is well-formed', function(done) {
var user = userFixtures.newDummyUser();
user.states = [{ name: 'login', value: 'disabled' }];
user.save(helpers.callbacks.noError(done));
});
it('should fail to save the user if the states name is not valid', function(done) {
var user = userFixtures.newDummyUser();
user.states = [{ name: 'rtyui', value: 'disabled' }];
user.save(helpers.callbacks.error(done));
});
it('should fail to save the user if the states value is not valid', function(done) {
var user = userFixtures.newDummyUser();
user.states = [{ name: 'login', value: 'ccvdxjch' }];
user.save(helpers.callbacks.error(done));
});
});