All files / server/src/features/notifications email.ts

92.85% Statements 13/14
66.66% Branches 4/6
100% Functions 3/3
92.85% Lines 13/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57                              89x         56x 41x   53x           15x 15x                 15x       10x       56x 56x 56x 54x   54x        
import {
  createTestAccount,
  createTransport,
  getTestMessageUrl,
  Transporter,
} from "nodemailer";
import SMTPTransport from "nodemailer/lib/smtp-transport";
import { config } from "shared/config";
import { EmailMessage } from "server/features/notifications/senderCommon";
 
export class EmailSender {
  private transport:
    | Transporter<SMTPTransport.SentMessageInfo, SMTPTransport.Options>
    | undefined;
  // Used for testing
  private sentMessages: EmailMessage[] = [];
 
  async getTransport(): Promise<
    Transporter<SMTPTransport.SentMessageInfo, SMTPTransport.Options>
  > {
    if (this.transport) {
      return this.transport;
    }
    Iif (process.env.SETTINGS === "production") {
      this.transport = createTransport({
        host: config.server().emailSMTPHost,
        port: config.server().emailSMTPPort,
      });
    } else {
      const account = await createTestAccount();
      this.transport = createTransport({
        host: config.server().emailSMTPHost,
        port: config.server().emailSMTPPort,
        auth: {
          user: account.user,
          pass: account.pass,
        },
      });
    }
    return this.transport;
  }
 
  getSentEmails(): EmailMessage[] {
    return this.sentMessages;
  }
 
  async sendEmail(message: EmailMessage): Promise<void> {
    const transporter = await this.getTransport();
    const info = await transporter.sendMail(message);
    Eif (process.env.SETTINGS !== "production") {
      this.sentMessages.push(message);
      // eslint-disable-next-line no-console
      console.log(getTestMessageUrl(info));
    }
  }
}