linagora-rse
Version:
781 lines (705 loc) • 22.2 kB
JavaScript
;
var expect = require('chai').expect;
var mockery = require('mockery');
var q = require('q');
describe('The User controller', function() {
beforeEach(function(done) {
this.testEnv.initCore(done);
});
describe('The logout fn', function() {
it('should call req.logout()', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
logout: done
};
var res = {
redirect: function() {}
};
users.logout(req, res);
});
it('should redirect to "/"', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
logout: function() {}
};
var res = {
redirect: function(path) {
expect(path).to.equal('/');
done();
}
};
users.logout(req, res);
});
});
describe('The logmein fn', function() {
it('should redirect to / if user is set in request', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
emails: ['foo@bar.com']
}
};
var res = {
redirect: function(path) {
expect(path).to.equal('/');
done();
}
};
users.logmein(req, res);
});
it('should return HTTP 500 if user email is not defined', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
}
};
var res = this.helpers.express.response(
function(status) {
expect(status).to.equal(500);
done();
}
);
users.logmein(req, res);
});
it('should return HTTP 500 if user is not set in request', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {};
var res = this.helpers.express.response(
function(status) {
expect(status).to.equal(500);
done();
}
);
users.logmein(req, res);
});
});
describe('The user fn', function() {
it('should return the request user if available', function(done) {
mockery.registerMock('../denormalize/user', {
denormalize: function(user) {
return q(user);
}
});
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
accounts: [{
type: 'email',
emails: ['foo@bar.com']
}]
}
};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(200);
expect(data).to.shallowDeepEqual(req.user);
done();
}
);
users.user(req, res);
});
it('should return HTTP 404 if user is not defined in the request', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
};
var res = this.helpers.express.jsonResponse(
function(status) {
expect(status).to.equal(404);
done();
}
);
users.user(req, res);
});
});
describe('The profile function', function() {
it('should return HTTP 400 if the uuid is missing', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {id: this.helpers.objectIdMock('1')},
params: {}
};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(400);
expect(data.error.code).to.equal(400);
expect(data.error.message).to.equal('Bad parameters');
expect(data.error.details).to.equal('User ID is missing');
done();
}
);
users.profile(req, res);
});
it('should return HTTP 500 if there is an error', function(done) {
var error = {
message: 'error message'
};
var moduleMock = {
user: {
get: function(uuid, callback) {
callback(error);
}
}
};
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {id: this.helpers.objectIdMock('123')},
params: {
uuid: '123'
}
};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(500);
expect(data.error).to.equal(500);
expect(data.message).to.equal('Error while loading user 123');
expect(data.details).to.equal(error.message);
done();
}
);
users.profile(req, res);
});
it('should return HTTP 404 if user does not exist', function(done) {
var moduleMock = {
user: {
get: function(uuid, callback) {
callback();
}
}
};
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {id: this.helpers.objectIdMock('123')},
params: {
uuid: '123'
}
};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(404);
expect(data.error).to.equal(404);
expect(data.message).to.equal('User not found');
expect(data.details).to.equal('User 123 has not been found');
done();
}
);
users.profile(req, res);
});
it('should return HTTP 200 if the user is returned', function(done) {
var user = {
_id: '123',
firstname: 'Dali',
lastname: 'Dali'
};
var moduleMock = {
user: {
get: function(uuid, callback) {
callback(null, user);
}
}
};
mockery.registerMock('../denormalize/user', {
denormalize: function(user) {
return q(user);
}
});
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
_id: '123'
},
params: {
uuid: '123'
}
};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(200);
expect(data).to.shallowDeepEqual(user);
done();
}
);
users.profile(req, res);
});
});
describe('The updateProfile fn', function() {
beforeEach(function() {
var mock = {
user: {
updateProfile: function(user, profile, callback) {
return callback();
}
}
};
mockery.registerMock('../../core', mock);
});
it('should send back 404 if user is not set', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
};
var res = {
json: function() {
done();
},
status: function(code) {
expect(code).to.equal(404);
return this;
}
};
users.updateProfile(req, res);
});
it('should not send back error if profile is not set', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
profile: {},
user: {
emails: ['foo@bar.com']
}
};
var res = {
json: function() {
done();
},
status: function(code) {
expect(code).to.equal(400);
return this;
}
};
users.updateProfile(req, res);
});
it('should be OK if profile is set with valid values', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
body: {
firstname: 'James',
lastname: 'Amaly',
job_title: 'Engineer',
service: 'IT',
building_location: 'Tunis',
office_location: 'France',
main_phone: '123456789',
decription: 'This is my description'
},
user: {
emails: ['foo@bar.com']
}
};
var res = {
json: function() {
done();
},
status: function(code) {
expect(code).to.equal(200);
return this;
}
};
users.updateProfile(req, res);
});
});
describe('postProfileAvatar() function', function() {
it('should call the image.recordAvatar method', function(done) {
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
expect(avatarId).to.have.property('toHexString');
expect(mimetype).to.equal('image/png');
expect(avatarRecordResponse).to.be.a.function;
done();
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: {}, query: {mimetype: 'image/png', size: 42}};
var res = {
};
users.postProfileAvatar(req, res);
});
it('should set the current user as avatar creator', function(done) {
var user = {
_id: 123
};
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts) {
expect(opts).to.exist;
expect(opts.creator).to.exist;
expect(opts.creator.objectType).to.equal('user');
expect(opts.creator.id).to.equal(user._id);
done();
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: user, query: {mimetype: 'image/png', size: 42}};
var res = {
};
users.postProfileAvatar(req, res);
});
it('should return 500 if the recordAvatar response is a datastore failure', function(done) {
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
var err = new Error('yolo');
err.code = 1;
avatarRecordResponse(err);
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: {}, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
(code, data) => {
expect(code).to.equal(500);
expect(data.error).to.shallowDeepEqual({
code: 500,
message: 'Server Error',
details: 'Error while updating user avatar: failed to store avatar'
});
done();
}
);
users.postProfileAvatar(req, res);
});
it('should return 500 if the recordAvatar response is an image manipulation failure', function(done) {
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
var err = new Error('yolo');
err.code = 2;
avatarRecordResponse(err);
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: {}, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
(code, data) => {
expect(code).to.equal(500);
expect(data.error).to.shallowDeepEqual({
code: 500,
message: 'Server Error',
details: 'Error while updating user avatar: failed to process avatar'
});
done();
}
);
users.postProfileAvatar(req, res);
});
it('should return 500 if the recordAvatar response is a generic error', function(done) {
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
var err = new Error('yolo');
avatarRecordResponse(err);
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: {}, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
(code, data) => {
expect(code).to.equal(500);
expect(data.error).to.shallowDeepEqual({
code: 500,
message: 'Server Error',
details: 'Error while updating user avatar'
});
done();
}
);
users.postProfileAvatar(req, res);
});
it('should return 412 if the object recorded size is not the size provided by the user agent', function(done) {
var imageMock = {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
avatarRecordResponse(null, 666);
}
};
mockery.registerMock('./image', imageMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: {}, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
(code, data) => {
expect(code).to.equal(412);
expect(data.error).to.shallowDeepEqual({
code: 412,
message: 'Precondition Failed',
details: 'Avatar size given by user agent is 42 and avatar size returned by storage system is 666'
});
done();
}
);
users.postProfileAvatar(req, res);
});
it('should call the update function of the user module to update user', function(done) {
var usermock = {
avatars: [],
currentAvatar: undefined
};
var moduleMock = {
user: {
update: function() {
expect(usermock.avatars).to.have.length(1);
expect(usermock.currentAvatar).to.equal(usermock.avatars[0]);
done();
}
},
image: {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
avatarRecordResponse(null, 42);
}
}
};
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {user: usermock, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
function() {
}
);
users.postProfileAvatar(req, res);
});
it('should return 500 if the model cannot be saved', function(done) {
var moduleMock = {
user: {
update: function(user, callback) {
var err = new Error('yolo');
callback(err);
}
},
image: {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
avatarRecordResponse(null, 42);
}
},
logger: {
error: () => {}
}
};
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var usermock = {
avatars: [],
currentAvatar: undefined
};
var req = {user: usermock, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
(code, data) => {
expect(code).to.equal(500);
expect(data.error).to.shallowDeepEqual({
code: 500,
message: 'Server Error',
details: 'Error while updating user avatar'
});
done();
}
);
users.postProfileAvatar(req, res);
});
it('should return 200 and the avatar id, if recording is successfull', function(done) {
var moduleMock = {
user: {
update: function(user, callback) {
callback();
}
},
image: {
recordAvatar: function(avatarId, mimetype, opts, req, avatarRecordResponse) {
avatarRecordResponse(null, 42);
}
}
};
mockery.registerMock('../../core', moduleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var usermock = {
avatars: [],
currentAvatar: undefined
};
var req = {user: usermock, query: {mimetype: 'image/png', size: 42}};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(200);
expect(data._id).to.exist;
expect(data._id).to.have.property('toHexString');
done();
}
);
users.postProfileAvatar(req, res);
});
});
describe('the getProfileAvatar function', function() {
it('should return 404 if the user is not logged in', function(done) {
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {};
var res = this.helpers.express.jsonResponse(
function(code, data) {
expect(code).to.equal(404);
expect(data).to.deep.equal({error: 404, message: 'Not found', details: 'User not found'});
done();
}
);
users.getProfileAvatar(req, res);
});
it('should redirect to default avatar the image Module return an error', function(done) {
var imageModuleMock = {
getAvatar: function(defaultAvatar, format, callback) {
return callback(new Error('error !'));
},
getMeta: function(id, callback) {
return callback(null, {});
}
};
mockery.registerMock('./image', imageModuleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
currentAvatar: 'id'
},
query: {}
};
var res = {
redirect: function() {
done();
}
};
users.getProfileAvatar(req, res);
});
it('should redirect to default avatar the image Module does not return the stream', function(done) {
var imageModuleMock = {
getAvatar: function(defaultAvatar, format, callback) {
return callback();
},
getMeta: function(id, callback) {
return callback(null, {});
}
};
mockery.registerMock('./image', imageModuleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
user: {
currentAvatar: 'id'
},
query: {}
};
var res = {
redirect: function() {
done();
}
};
users.getProfileAvatar(req, res);
});
it('should return 200 and the stream even if meta data can not be found', function(done) {
var image = {
stream: 'test',
pipe: function(res) {
expect(res.header['Last-Modified']).to.not.exist;
expect(res.code).to.equal(200);
done();
}
};
var imageModuleMock = {
getAvatar: function(defaultAvatar, format, callback) {
return callback(null, null, image);
}
};
mockery.registerMock('./image', imageModuleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
headers: {
},
user: {
_id: '_id',
currentAvatar: 'id'
},
query: {
}
};
var res = {
status: function(code) {
this.code = code;
return res;
},
header: function(header, value) {
this.header[header] = value;
}
};
users.getProfileAvatar(req, res);
});
it('should return 200, add to the cache, and the stream of the avatar file if all is ok', function(done) {
var image = {
stream: 'test',
pipe: function(res) {
expect(res.header['Last-Modified']).to.exist;
expect(res.code).to.equal(200);
done();
}
};
var imageModuleMock = {
getAvatar: function(defaultAvatar, format, callback) {
return callback(null,
{
meta: 'data',
uploadDate: new Date('Thu Apr 17 2014 11:13:15 GMT+0200 (CEST)')
}, image);
}
};
mockery.registerMock('./image', imageModuleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
headers: {
'if-modified-since': 'Thu Apr 17 2013 11:13:15 GMT+0200 (CEST)'
},
user: {
_id: '_id',
currentAvatar: 'id'
},
query: {
}
};
var res = {
status: function(code) {
this.code = code;
return res;
},
header: function(header, value) {
this.header[header] = value;
}
};
users.getProfileAvatar(req, res);
});
it('should return 304 if the avatar has not changed til the last GET', function(done) {
var image = {
stream: 'test',
pipe: function() {
throw new Error();
}
};
var imageModuleMock = {
getAvatar: function(defaultAvatar, format, callback) {
return callback(null,
{
meta: 'data',
uploadDate: new Date('Thu Apr 17 2014 11:13:15 GMT+0200 (CEST)')
}, image);
}
};
mockery.registerMock('./image', imageModuleMock);
var users = this.helpers.requireBackend('webserver/controllers/users');
var req = {
headers: {
'if-modified-since': 'Thu Apr 17 2014 11:13:15 GMT+0200 (CEST)'
},
user: {
_id: '_id',
currentAvatar: 'id'
},
query: {
}
};
var res = this.helpers.express.response(
function(code) {
expect(code).to.equal(304);
done();
}
);
users.getProfileAvatar(req, res);
});
});
});