2016-05-30 13:36:32 +00:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
require('co-mocha')(require('mocha')); // monkey patch mocha for generators
|
|
|
|
|
|
|
|
const expect = require('chai').expect;
|
|
|
|
const log = require('npmlog');
|
2016-05-31 14:50:28 +00:00
|
|
|
const Email = require('../../src/email/email');
|
2016-05-30 13:36:32 +00:00
|
|
|
const nodemailer = require('nodemailer');
|
|
|
|
const sinon = require('sinon');
|
|
|
|
|
|
|
|
|
2016-05-31 11:52:18 +00:00
|
|
|
describe('Email Unit Tests', () => {
|
2016-05-30 13:36:32 +00:00
|
|
|
let email, sendFnStub;
|
|
|
|
|
2016-05-31 14:50:28 +00:00
|
|
|
let template = {
|
|
|
|
subject: 'foo',
|
|
|
|
text: 'bar',
|
|
|
|
html: '<strong>bar</strong>'
|
|
|
|
};
|
2016-05-30 13:36:32 +00:00
|
|
|
let sender = {
|
|
|
|
name: 'Foo Bar',
|
|
|
|
email: 'foo@bar.com'
|
|
|
|
};
|
|
|
|
let userId1 = {
|
|
|
|
name: 'name1',
|
|
|
|
email: 'email1',
|
|
|
|
keyid: '0123456789ABCDF0',
|
|
|
|
nonce: 'qwertzuioasdfghjkqwertzuio'
|
|
|
|
};
|
|
|
|
let origin = {
|
|
|
|
protocol: 'http',
|
|
|
|
host: 'localhost:8888'
|
|
|
|
};
|
|
|
|
let mailOptions = {
|
|
|
|
from: sender,
|
|
|
|
to: sender,
|
|
|
|
subject: 'Hello ✔', // Subject line
|
|
|
|
text: 'Hello world 🐴', // plaintext body
|
|
|
|
html: '<b>Hello world 🐴</b>' // html body
|
|
|
|
};
|
|
|
|
|
2016-05-31 11:52:18 +00:00
|
|
|
beforeEach(() => {
|
2016-05-30 13:36:32 +00:00
|
|
|
sendFnStub = sinon.stub();
|
|
|
|
sinon.stub(nodemailer, 'createTransport').returns({
|
2016-05-31 11:52:18 +00:00
|
|
|
templateSender: () => { return sendFnStub; }
|
2016-05-30 13:36:32 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
sinon.stub(log, 'warn');
|
|
|
|
sinon.stub(log, 'error');
|
|
|
|
|
|
|
|
email = new Email(nodemailer);
|
|
|
|
email.init({
|
|
|
|
host: 'host',
|
|
|
|
auth: { user:'user', pass:'pass' },
|
|
|
|
sender: sender
|
|
|
|
});
|
|
|
|
expect(email._sender).to.equal(sender);
|
|
|
|
});
|
|
|
|
|
2016-05-31 11:52:18 +00:00
|
|
|
afterEach(() => {
|
2016-05-30 13:36:32 +00:00
|
|
|
nodemailer.createTransport.restore();
|
|
|
|
log.warn.restore();
|
|
|
|
log.error.restore();
|
|
|
|
});
|
|
|
|
|
2016-05-31 14:50:28 +00:00
|
|
|
describe("send", () => {
|
2016-05-31 11:52:18 +00:00
|
|
|
beforeEach(() => {
|
2016-05-31 14:50:28 +00:00
|
|
|
sinon.stub(email, '_sendHelper').returns(Promise.resolve({ response:'250' }));
|
2016-05-30 13:36:32 +00:00
|
|
|
});
|
|
|
|
|
2016-05-31 11:52:18 +00:00
|
|
|
afterEach(() => {
|
2016-05-31 14:50:28 +00:00
|
|
|
email._sendHelper.restore();
|
2016-05-30 13:36:32 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
it('should work', function *() {
|
2016-05-31 14:50:28 +00:00
|
|
|
let info = yield email.send({ template, userId:userId1, origin});
|
2016-05-30 13:36:32 +00:00
|
|
|
|
|
|
|
expect(info.response).to.match(/^250/);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-05-31 14:50:28 +00:00
|
|
|
describe("_sendHelper", () => {
|
2016-05-30 13:36:32 +00:00
|
|
|
it('should work', function *() {
|
|
|
|
sendFnStub.returns(Promise.resolve({ response:'250' }));
|
|
|
|
|
2016-05-31 14:50:28 +00:00
|
|
|
let info = yield email._sendHelper(mailOptions);
|
2016-05-30 13:36:32 +00:00
|
|
|
|
|
|
|
expect(info.response).to.match(/^250/);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should log warning for reponse error', function *() {
|
|
|
|
sendFnStub.returns(Promise.resolve({ response:'554' }));
|
|
|
|
|
2016-05-31 14:50:28 +00:00
|
|
|
let info = yield email._sendHelper(mailOptions);
|
2016-05-30 13:36:32 +00:00
|
|
|
|
|
|
|
expect(info.response).to.match(/^554/);
|
|
|
|
expect(log.warn.calledOnce).to.be.true;
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should fail', function *() {
|
|
|
|
sendFnStub.returns(Promise.reject(new Error('boom')));
|
|
|
|
|
|
|
|
try {
|
2016-05-31 14:50:28 +00:00
|
|
|
yield email._sendHelper(mailOptions);
|
2016-05-30 13:36:32 +00:00
|
|
|
} catch(e) {
|
|
|
|
expect(log.error.calledOnce).to.be.true;
|
|
|
|
expect(e.status).to.equal(500);
|
|
|
|
expect(e.message).to.match(/failed/);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|