From 799132fa94466abf9ab137920e5d2382cb6124b9 Mon Sep 17 00:00:00 2001 From: Alejandro Saenz Date: Fri, 17 Jul 2020 13:38:56 -0400 Subject: [PATCH] test(email.service.ts): unit tests for email service Unit tests for email service test #136 --- src/routes/authentication.controller.ts | 3 +- src/routes/user.controller.ts | 5 +-- src/services/email.service.spec.ts | 39 +++++++++++++++++++++ src/services/email.service.ts | 45 +++++++++++-------------- 4 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 src/services/email.service.spec.ts diff --git a/src/routes/authentication.controller.ts b/src/routes/authentication.controller.ts index daf161fa..9a1b129b 100644 --- a/src/routes/authentication.controller.ts +++ b/src/routes/authentication.controller.ts @@ -6,8 +6,7 @@ import { Response } from 'express'; import jwt = require('jsonwebtoken'); import { generateHash, passwordSchema, compare } from '../utilities/password.utility'; import { passwordRequirement } from '../enums/message-enum'; -// tslint:disable-next-line: no-var-requires -const emailService = require('../services/email.service'); +import * as emailService from '../services/email.service'; /** * @description Login to the application diff --git a/src/routes/user.controller.ts b/src/routes/user.controller.ts index a9b1862f..cfa49ac4 100644 --- a/src/routes/user.controller.ts +++ b/src/routes/user.controller.ts @@ -6,10 +6,7 @@ import { v4 as uuidv4 } from 'uuid'; import { validate } from 'class-validator'; import { passwordRequirement } from '../enums/message-enum'; import { generateHash, passwordSchema, updatePassword } from '../utilities/password.utility'; - -// tslint:disable-next-line: no-var-requires -const emailService = require('../services/email.service'); - +import * as emailService from '../services/email.service'; /** * @description Register user * @param {UserRequest} req diff --git a/src/services/email.service.spec.ts b/src/services/email.service.spec.ts new file mode 100644 index 00000000..df9b37b7 --- /dev/null +++ b/src/services/email.service.spec.ts @@ -0,0 +1,39 @@ +import nodemailer = require('nodemailer'); +import * as emailService from './email.service'; + +describe('email service', () => { + test('send email failure missing credentials', async () => { + const mailOptions = { + from: 'pentester3@gmail.com', + subject: 'Bulwark - Please confirm your email address', + text: `Please confirm your email address + \n A Bulwark account was created with the email: pentester@gmail.com. + As an extra security measure, please verify this is the correct email address + linked to Bulwark by clicking the link below. + \n dev/api/user/verify/123`, + to: 'pentester2@gmail.com' + }; + await expect(emailService.sendEmail(mailOptions)).rejects.toContain('Error sending email'); + }); + test('send verification email success', async () => { + const uuid = 'abc'; + const userEmail = 'pentester@gmail.com'; + const spy = jest.spyOn(emailService, 'sendEmail'); + await emailService.sendVerificationEmail(uuid, userEmail); + expect(spy).toHaveBeenCalled(); + }); + test('send forgot password email success', async () => { + const uuid = 'abc'; + const userEmail = 'pentester@gmail.com'; + const spy = jest.spyOn(emailService, 'sendEmail'); + await emailService.sendForgotPasswordEmail(uuid, userEmail); + expect(spy).toHaveBeenCalled(); + }); + test('send invitation email', async () => { + const uuid = 'abc'; + const userEmail = 'pentester@gmail.com'; + const spy = jest.spyOn(emailService, 'sendEmail'); + await emailService.sendInvitationEmail(uuid, userEmail); + expect(spy).toHaveBeenCalled(); + }); +}); diff --git a/src/services/email.service.ts b/src/services/email.service.ts index 08d7d869..3b4f0959 100644 --- a/src/services/email.service.ts +++ b/src/services/email.service.ts @@ -1,26 +1,27 @@ import nodemailer = require('nodemailer'); -const transporter = nodemailer.createTransport({ - auth: { - pass: process.env.FROM_EMAIL_PASSWORD, - user: process.env.FROM_EMAIL - }, - service: 'Gmail' -}); - /** * @description Send email * @param {object} mailOptions * @returns string */ -const sendEmail = (mailOptions) => { - transporter.sendMail(mailOptions, (error, info) => { - if (error) { - console.error(error); - return 'Error sending email'; - } else { - return 'email sent successfully'; - } +export const sendEmail = (mailOptions): Promise => { + return new Promise((resolve, reject) => { + const transporter = nodemailer.createTransport({ + auth: { + pass: process.env.FROM_EMAIL_PASSWORD, + user: process.env.FROM_EMAIL + }, + service: 'Gmail' + }); + transporter.sendMail(mailOptions, (error, info) => { + if (error) { + console.error(error); + reject('Error sending email'); + } else { + resolve('email sent successfully'); + } + }); }); }; @@ -29,7 +30,7 @@ const sendEmail = (mailOptions) => { * @param {string} uuid * @returns string */ -const sendVerificationEmail = (uuid, userEmail) => { +export const sendVerificationEmail = (uuid: string, userEmail: string) => { const mailOptions = { from: process.env.FROM_EMAIL, subject: 'Bulwark - Please confirm your email address', @@ -48,7 +49,7 @@ const sendVerificationEmail = (uuid, userEmail) => { * @param {string} uuid * @returns string */ -const sendForgotPasswordEmail = (uuid, userEmail) => { +export const sendForgotPasswordEmail = (uuid, userEmail) => { const mailOptions = { from: process.env.FROM_EMAIL, subject: 'Bulwark - Forgot Password Request', @@ -66,7 +67,7 @@ const sendForgotPasswordEmail = (uuid, userEmail) => { * @param {string} uuid * @returns string */ -const sendInvitationEmail = (uuid, userEmail) => { +export const sendInvitationEmail = (uuid, userEmail) => { const mailOptions = { from: process.env.FROM_EMAIL, subject: 'Bulwark - Welcome!', @@ -77,9 +78,3 @@ const sendInvitationEmail = (uuid, userEmail) => { }; sendEmail(mailOptions); }; - -module.exports = { - sendForgotPasswordEmail, - sendVerificationEmail, - sendInvitationEmail -};