npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

jest-smtp

v0.0.4

Published

Jest utilities for testing email sends

Downloads

47

Readme

📩 jest-smtp

This jest extension module provides an ad-hoc SMTP server, as well as custom jest matchers, in order to test email sendings. This is meant to use in end-to-end webserver tests.

It leverages Nodemailer's smtp-server and mailparser modules.

Installation

Add to your project

npm i -D jest-smtp

Add to jest config

In the jest section of your package.json file:

"jest": {
    ...,
    "setupFilesAfterEnv": [
      "jest-smtp",
      "<rootDir>/tests/jest-setup.ts"
      ...
    ],
}

Using it

Globally

You can add jest-smtp globally to your jest-setup file.

import { createJestSMTPServer } from 'jest-smtp';


beforeAll(() => {
    global.smtpServer = createJestSMTPServer();
});

afterAll(() => {
    global.smtpServer.close();
});

beforeEach(() => {
    global.smtpServer.resetMails();
});

If you use typescript you should add this declaration in your jest.d.ts file:


declare namespace NodeJS {
  export interface Global {
    smtpServer: import('jest-smtp').JestSMTPServer;
  }
}

In a test

import { createJestSMTPServer } from 'jest-smtp';

describe('test my server', () => {
    const smtpServer = createJestSMTPServer();

    afterAll(() => {
        smtpServer.close();
    });

    beforeEach(() => {
        smtpServer.resetMails();
    });
})

Documentation

Jest matchers

jest-smtp provides custom matchers

toHaveReceivedEmails

This tests the number of mails received by the server.

expect(smtpServer).toHaveReceivedEmails(1);

toHaveReceivedEmailMatching

This tests if an email matching the provided fields was sent. This is useful so you don't have to provide an exact match but only test the relevant fields.

The fields are structured by mailparser, you can find the reference here: https://nodemailer.com/extras/mailparser/#mail-object

Be especially aware that the to, from, cc etc... fields are structured as objects, not strings.

expect(smtpServer).toHaveReceivedEmailMatching({
    subject: 'My e-mail subject',
    from: {
        name: 'Don\'t reply',
        address: '[email protected]'
    }
});

createJestSMTPServer

jest-smtp only exports one function :

const { emails, server, close, resetMails } = createJestSMTPServer({
    port: 465,
    host: undefined,
    options: ()
})

Parameters

port: the port the server will be listening on. Default is 465.

host: the host the server will be listening on (pretty unuseful is you ask me)

options: these options will be passed to the smtp-server instance constructor. See here for reference: https://nodemailer.com/extras/smtp-server/#usage

The default options provided are :

{
  authMethods: ["PLAIN", "LOGIN"],
  authOptional: true,
  onData: ... // if you override this function it will break the main features of the plugin
};

returned objects

  • resetEmails

convenience method to reset the list of received emails between the tests.

  • close

shortcut to server.close method. This must be called after all tests or jest will timeout.

  • emails

The list of ParsedMail objects received. You can access it to do extra tests on the content of the emails.

  • server

The smtp-server instance.