Asymmetrik/node-rest-starter

View on GitHub
src/app/core/user/inactive/inactive-user.job.spec.ts

Summary

Maintainability
D
2 days
Test Coverage
import { DateTime } from 'luxon';
import { assert, createSandbox } from 'sinon';

import InactiveUsersJobService from './inactive-user.job';
import { config, emailService } from '../../../../dependencies';
import { logger } from '../../../../lib/logger';

/**
 * Unit tests
 */
describe('User Email Service:', () => {
    const inactiveUsersJobService = new InactiveUsersJobService();
    const daysAgo = 90;

    const user = {
        name: 'test',
        username: 'test',
        email: 'test@test.test',
        lastLogin: DateTime.now().toUTC().minus({ days: daysAgo }).toMillis()
    };

    let sandbox;

    beforeEach(() => {
        sandbox = createSandbox();
        sandbox.stub(logger, 'error').returns();
    });

    afterEach(() => {
        sandbox.restore();
    });

    describe('sendEmail', () => {
        it('should create mailOptions properly for deactivate template', async () => {
            const expectedEmailContent = `HEADER
<p>Hello ${user.name},</p>
<br>
<p>It seems you haven't logged into your ${config.get(
                'app.title'
            )} account in ${daysAgo} days.</p>
<p>Therefore, your account has been deactivated.</p>
<p>Please contact us at ${config.get(
                'app.contactEmail'
            )} if you have any questions.</p>
<br>
<br>
<p>Thanks,</p>
<p>The ${config.get('app.title')} Support Team</p>
FOOTER`;

            sandbox.stub(emailService, 'sendMail').resolves();

            await inactiveUsersJobService.sendEmail(
                user,
                config.get('coreEmails.userDeactivate')
            );

            assert.calledWithMatch(emailService.sendMail, {
                to: user.email,
                from: config.get('coreEmails.default.from'),
                replyTo: config.get('coreEmails.default.replyTo'),
                subject: `${config.get('app.title')}: Account Deactivation`,
                html: expectedEmailContent
            });

            assert.notCalled(logger.error);
        });

        it('should create mailOptions properly for inactivity template', async () => {
            const expectedEmailContent = `HEADER
<p>Hello ${user.name},</p>
<br>
<p>It seems you haven't logged into your ${config.get(
                'app.title'
            )} account in ${daysAgo} days. Why not check in and see what's new!</p>
<p>Have a question or just want to know what's new? Take a look at our Message of the Day page:</p>
<p>${config.get('app.clientUrl')}</p>
<br>
<p>Keep in mind that all accounts that have been inactive for a period of at least 90 days are deactivated.</p>
<br>
<br>
<p>Thanks,</p>
<p>The ${config.get('app.title')} Support Team</p>
FOOTER`;

            sandbox.stub(emailService, 'sendMail').resolves();

            await inactiveUsersJobService.sendEmail(
                user,
                config.get('coreEmails.userInactivity')
            );

            assert.calledWithMatch(emailService.sendMail, {
                to: user.email,
                from: config.get('coreEmails.default.from'),
                replyTo: config.get('coreEmails.default.replyTo'),
                subject: `${config.get('app.title')}: Inactivity Notice`,
                html: expectedEmailContent
            });

            assert.notCalled(logger.error);
        });
    });
});