2014-10-07 14:32:23 -04:00
|
|
|
'use strict';
|
|
|
|
|
2014-11-21 09:06:29 -05:00
|
|
|
var OutboxBO = require('../../../src/js/email/outbox'),
|
|
|
|
KeychainDAO = require('../../../src/js/service/keychain'),
|
|
|
|
EmailDAO = require('../../../src/js/email/email'),
|
|
|
|
DeviceStorageDAO = require('../../../src/js/service/devicestorage');
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
describe('Outbox unit test', function() {
|
2014-10-07 14:32:23 -04:00
|
|
|
var outbox, emailDaoStub, devicestorageStub, keychainStub,
|
|
|
|
dummyUser = 'spiderpig@springfield.com';
|
|
|
|
|
2014-11-05 08:27:34 -05:00
|
|
|
chai.config.includeStack = true;
|
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
beforeEach(function() {
|
|
|
|
emailDaoStub = sinon.createStubInstance(EmailDAO);
|
|
|
|
emailDaoStub._account = {
|
|
|
|
emailAddress: dummyUser,
|
|
|
|
folders: [{
|
|
|
|
type: 'Outbox'
|
|
|
|
}],
|
|
|
|
online: true
|
|
|
|
};
|
|
|
|
devicestorageStub = sinon.createStubInstance(DeviceStorageDAO);
|
|
|
|
keychainStub = sinon.createStubInstance(KeychainDAO);
|
|
|
|
outbox = new OutboxBO(emailDaoStub, keychainStub, devicestorageStub);
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function() {});
|
|
|
|
|
|
|
|
describe('start/stop checking', function() {
|
|
|
|
it('should work', function() {
|
|
|
|
function onOutboxUpdate(err) {
|
|
|
|
expect(err).to.not.exist;
|
|
|
|
}
|
|
|
|
|
|
|
|
outbox.startChecking(onOutboxUpdate);
|
|
|
|
expect(outbox._intervalId).to.exist;
|
|
|
|
|
|
|
|
outbox.stopChecking();
|
|
|
|
expect(outbox._intervalId).to.not.exist;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('put', function() {
|
2014-12-15 11:37:21 -05:00
|
|
|
beforeEach(function() {
|
|
|
|
sinon.stub(outbox, '_processOutbox');
|
|
|
|
});
|
|
|
|
afterEach(function() {
|
|
|
|
outbox._processOutbox.restore();
|
|
|
|
});
|
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
it('should not encrypt and store a mail', function(done) {
|
|
|
|
var mail, senderKey, receiverKey;
|
|
|
|
|
|
|
|
senderKey = {
|
|
|
|
publicKey: 'SENDER PUBLIC KEY'
|
|
|
|
};
|
|
|
|
receiverKey = {
|
|
|
|
publicKey: 'RECEIVER PUBLIC KEY'
|
|
|
|
};
|
|
|
|
mail = {
|
|
|
|
from: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
2014-01-20 05:03:01 -05:00
|
|
|
}],
|
2014-10-07 14:32:23 -04:00
|
|
|
to: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member'
|
|
|
|
}, {
|
|
|
|
name: 'notamember',
|
|
|
|
address: 'notamember'
|
|
|
|
}],
|
|
|
|
cc: [],
|
|
|
|
bcc: []
|
2013-11-20 13:13:39 -05:00
|
|
|
};
|
2013-11-19 10:14:48 -05:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.from[0].address).returns(resolves(senderKey));
|
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.to[0].address).returns(resolves(receiverKey));
|
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.to[1].address).returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.storeList.withArgs([mail]).returns(resolves());
|
2013-11-19 10:14:48 -05:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
outbox.put(mail).then(function() {
|
2014-10-07 14:32:23 -04:00
|
|
|
expect(mail.publicKeysArmored.length).to.equal(2);
|
|
|
|
expect(emailDaoStub.encrypt.called).to.be.false;
|
|
|
|
expect(devicestorageStub.storeList.calledOnce).to.be.true;
|
2013-11-19 10:14:48 -05:00
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
done();
|
2013-11-19 10:14:48 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
it('should not encrypt a mail with bcc and store a mail', function(done) {
|
|
|
|
var mail;
|
2014-05-16 07:09:55 -04:00
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
mail = {
|
|
|
|
from: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
|
|
|
}],
|
|
|
|
to: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
|
|
|
}],
|
|
|
|
cc: [],
|
|
|
|
bcc: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.storeList.withArgs([mail]).returns(resolves());
|
2014-02-27 12:14:38 -05:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
outbox.put(mail).then(function() {
|
2014-10-07 14:32:23 -04:00
|
|
|
expect(mail.publicKeysArmored.length).to.equal(0);
|
|
|
|
expect(keychainStub.getReceiverPublicKey.called).to.be.false;
|
|
|
|
expect(emailDaoStub.encrypt.called).to.be.false;
|
|
|
|
expect(devicestorageStub.storeList.calledOnce).to.be.true;
|
|
|
|
|
|
|
|
done();
|
2014-02-24 04:14:07 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
it('should encrypt and store a mail', function(done) {
|
|
|
|
var mail, senderKey, receiverKey;
|
2013-11-21 11:37:07 -05:00
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
senderKey = {
|
|
|
|
publicKey: 'SENDER PUBLIC KEY'
|
|
|
|
};
|
|
|
|
receiverKey = {
|
|
|
|
publicKey: 'RECEIVER PUBLIC KEY'
|
|
|
|
};
|
|
|
|
mail = {
|
|
|
|
from: [{
|
2014-02-24 04:14:07 -05:00
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
2014-10-07 14:32:23 -04:00
|
|
|
}],
|
|
|
|
to: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member'
|
|
|
|
}, {
|
|
|
|
name: 'notamember',
|
|
|
|
address: 'notamember'
|
|
|
|
}],
|
|
|
|
cc: [],
|
|
|
|
bcc: []
|
|
|
|
};
|
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.from[0].address).returns(resolves(senderKey));
|
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.to[0].address).returns(resolves(receiverKey));
|
|
|
|
keychainStub.getReceiverPublicKey.withArgs(mail.to[1].address).returns(resolves(receiverKey));
|
2014-10-07 14:32:23 -04:00
|
|
|
|
|
|
|
emailDaoStub.encrypt.withArgs({
|
|
|
|
mail: mail,
|
|
|
|
publicKeysArmored: [senderKey.publicKey, receiverKey.publicKey, receiverKey.publicKey]
|
2014-12-15 11:37:21 -05:00
|
|
|
}).returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.storeList.withArgs([mail]).returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
outbox.put(mail).then(function() {
|
2014-10-07 14:32:23 -04:00
|
|
|
expect(mail.publicKeysArmored.length).to.equal(3);
|
|
|
|
expect(emailDaoStub.encrypt.calledOnce).to.be.true;
|
|
|
|
expect(devicestorageStub.storeList.calledOnce).to.be.true;
|
|
|
|
|
|
|
|
done();
|
2013-11-19 10:14:48 -05:00
|
|
|
});
|
2014-10-07 14:32:23 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('process outbox', function() {
|
|
|
|
it('should send to registered users and update pending mails', function(done) {
|
|
|
|
var from, member, invited, notinvited, newlyjoined, dummyMails, newlyjoinedKey;
|
|
|
|
|
|
|
|
from = [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member@whiteout.io'
|
|
|
|
}];
|
|
|
|
member = {
|
|
|
|
id: '12',
|
|
|
|
from: from,
|
|
|
|
to: [{
|
|
|
|
name: 'member',
|
|
|
|
address: 'member'
|
|
|
|
}],
|
|
|
|
encrypted: true,
|
|
|
|
publicKeysArmored: ['ARMORED KEY OF MEMBER'],
|
|
|
|
unregisteredUsers: []
|
|
|
|
};
|
|
|
|
invited = {
|
|
|
|
id: '34',
|
|
|
|
from: from,
|
|
|
|
to: [{
|
|
|
|
name: 'invited',
|
|
|
|
address: 'invited'
|
|
|
|
}],
|
|
|
|
publicKeysArmored: [],
|
|
|
|
unregisteredUsers: [{
|
|
|
|
name: 'invited',
|
|
|
|
address: 'invited'
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
notinvited = {
|
|
|
|
id: '56',
|
|
|
|
from: from,
|
|
|
|
to: [{
|
|
|
|
name: 'notinvited',
|
|
|
|
address: 'notinvited'
|
|
|
|
}],
|
|
|
|
publicKeysArmored: [],
|
|
|
|
unregisteredUsers: [{
|
|
|
|
name: 'notinvited',
|
|
|
|
address: 'notinvited'
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
newlyjoined = {
|
|
|
|
id: '78',
|
|
|
|
from: from,
|
|
|
|
to: [{
|
|
|
|
name: 'newlyjoined',
|
|
|
|
address: 'newlyjoined'
|
|
|
|
}],
|
|
|
|
encrypted: true,
|
|
|
|
publicKeysArmored: [],
|
|
|
|
unregisteredUsers: [{
|
|
|
|
name: 'newlyjoined',
|
|
|
|
address: 'newlyjoined'
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
newlyjoinedKey = {
|
|
|
|
publicKey: 'THIS IS THE NEWLY JOINED PUBLIC KEY!'
|
|
|
|
};
|
|
|
|
|
|
|
|
dummyMails = [member, invited, notinvited, newlyjoined];
|
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.listItems.returns(resolves(dummyMails));
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
emailDaoStub.sendPlaintext.returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
|
|
|
emailDaoStub.sendEncrypted.withArgs({
|
|
|
|
email: newlyjoined
|
2014-12-15 11:37:21 -05:00
|
|
|
}).returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
|
|
|
emailDaoStub.sendEncrypted.withArgs({
|
|
|
|
email: member
|
2014-12-15 11:37:21 -05:00
|
|
|
}).returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.removeList.returns(resolves());
|
2014-10-07 14:32:23 -04:00
|
|
|
|
|
|
|
function onOutboxUpdate(err, count) {
|
|
|
|
expect(err).to.not.exist;
|
|
|
|
expect(count).to.equal(0);
|
|
|
|
|
|
|
|
expect(outbox._outboxBusy).to.be.false;
|
|
|
|
expect(emailDaoStub.sendEncrypted.callCount).to.equal(2);
|
|
|
|
expect(emailDaoStub.sendPlaintext.callCount).to.equal(2);
|
|
|
|
expect(devicestorageStub.listItems.callCount).to.equal(1);
|
|
|
|
expect(devicestorageStub.removeList.callCount).to.equal(4);
|
|
|
|
expect(keychainStub.getReceiverPublicKey.callCount).to.equal(0);
|
|
|
|
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
|
|
|
|
outbox._processOutbox(onOutboxUpdate);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not process outbox in offline mode', function(done) {
|
|
|
|
emailDaoStub._account.online = false;
|
2014-12-15 11:37:21 -05:00
|
|
|
devicestorageStub.listItems.returns(resolves([{}]));
|
2013-12-05 09:22:44 -05:00
|
|
|
|
2014-10-07 14:32:23 -04:00
|
|
|
outbox._processOutbox(function(err, count) {
|
|
|
|
expect(err).to.not.exist;
|
|
|
|
expect(count).to.equal(1);
|
|
|
|
expect(devicestorageStub.listItems.callCount).to.equal(1);
|
|
|
|
expect(outbox._outboxBusy).to.be.false;
|
|
|
|
done();
|
2014-01-20 05:03:01 -05:00
|
|
|
});
|
2013-11-19 10:14:48 -05:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|