
import { MailSenderBuilder } from "../../src/lib/notifiers/MailSenderBuilder";
import Nodemailer = require("nodemailer");
import Sinon = require("sinon");
import Assert = require("assert");

describe("test MailSenderBuilder", function() {
  let createTransportStub: Sinon.SinonStub;
  beforeEach(function() {
    createTransportStub = Sinon.stub(Nodemailer, "createTransport");
  });

  afterEach(function() {
    createTransportStub.restore();
  });

  it("should create a email mail sender", function() {
    const mailSenderBuilder = new MailSenderBuilder(Nodemailer);
    mailSenderBuilder.buildEmail({
      username: "user_gmail",
      password: "pass_gmail",
      sender: "admin@example.com",
      service: "gmail"
    });
    Assert.equal(createTransportStub.getCall(0).args[0].auth.user, "user_gmail");
    Assert.equal(createTransportStub.getCall(0).args[0].auth.pass, "pass_gmail");
    Assert.equal(createTransportStub.getCall(0).args[0].service, "gmail");
  });

  describe("build smtp mail sender", function() {
    it("should create a smtp mail sender with authenticated user", function() {
      const mailSenderBuilder = new MailSenderBuilder(Nodemailer);
      mailSenderBuilder.buildSmtp({
        host: "mail.example.com",
        password: "password",
        port: 25,
        secure: true,
        username: "user",
        sender: "admin@example.com"
      });
      Assert.deepStrictEqual(createTransportStub.getCall(0).args[0], {
        host: "mail.example.com",
        auth: {
          pass: "password",
          user: "user"
        },
        port: 25,
        secure: true,
      });
    });

    it("should create a smtp mail sender with anonymous user", function() {
      const mailSenderBuilder = new MailSenderBuilder(Nodemailer);
      mailSenderBuilder.buildSmtp({
        host: "mail.example.com",
        port: 25,
        secure: true,
        sender: "admin@example.com"
      });
      Assert.deepStrictEqual(createTransportStub.getCall(0).args[0], {
        host: "mail.example.com",
        port: 25,
        secure: true,
      });
    });
  });
});