maik 0.2.0

A mock SMTP server library
Documentation
use crate::helpers::{
    TestInfoBuilder, DEFAULT_BODY, DEFAULT_MESSAGE, DEFAULT_RECIPIENT, DEFAULT_RECIPIENTS_SET,
    DEFAULT_SENDER, DNE_USER, EMPTY_MESSAGE, EMPTY_MESSAGES,
};
use lettre::{transport::smtp::client::Tls, Transport};
use maik::MailAssertion;
use regex::bytes::Regex;
use std::iter;

#[test]
fn sender_is() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let ma = MailAssertion::new().sender_is(DEFAULT_SENDER);
    assert!(test_info.server.assert(ma));
}

#[test]
fn sender_is_not() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let ma = MailAssertion::new().sender_is(DNE_USER);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_are_with_one_recipient() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let ma = MailAssertion::new().recipients_are([DEFAULT_RECIPIENT]);
    assert!(test_info.server.assert(ma));
}

#[test]
fn recipients_are_not_with_one_recipient() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let ma = MailAssertion::new().recipients_are([DNE_USER]);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_are_subset_with_one_recipient() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let empty: [&str; 0] = [];
    let ma = MailAssertion::new().recipients_are(empty);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_are_superset_with_one_recipient() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGE).is_ok());

    let ma = MailAssertion::new().recipients_are([DEFAULT_RECIPIENT, DNE_USER]);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_are_with_multiple_recipients() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let ma = MailAssertion::new().recipients_are(DEFAULT_RECIPIENTS_SET.iter());
    assert!(test_info.server.assert(ma));
}

#[test]
fn recipients_are_not_with_multiple_recipients() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let recipients = DEFAULT_RECIPIENTS_SET
        .iter()
        .copied()
        .skip(1)
        .chain(iter::once(DNE_USER));
    let ma = MailAssertion::new().recipients_are(recipients);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_contain_subset() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let recipients = DEFAULT_RECIPIENTS_SET.iter().copied().skip(1);
    let ma = MailAssertion::new().recipients_contain(recipients);
    assert!(test_info.server.assert(ma));
}

#[test]
fn recipients_contain_equal() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let recipients = DEFAULT_RECIPIENTS_SET.iter().copied();
    let ma = MailAssertion::new().recipients_contain(recipients);
    assert!(test_info.server.assert(ma));
}

#[test]
fn recipients_contain_no_contain() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let ma = MailAssertion::new().recipients_contain([DNE_USER]);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn recipients_contain_supserset() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&EMPTY_MESSAGES).is_ok());

    let recipients = DEFAULT_RECIPIENTS_SET
        .iter()
        .copied()
        .chain(iter::once(DNE_USER));
    let ma = MailAssertion::new().recipients_contain(recipients);
    assert!(!test_info.server.assert(ma));
}

#[test]
fn body_is() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&DEFAULT_MESSAGE).is_ok());

    let ma = MailAssertion::new().body_is(DEFAULT_BODY);
    assert!(test_info.server.assert(ma));
}

#[test]
fn body_is_not() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&DEFAULT_MESSAGE).is_ok());

    let ma = MailAssertion::new().body_is("not body");
    assert!(!test_info.server.assert(ma));
}

#[test]
fn body_matches_partial() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&DEFAULT_MESSAGE).is_ok());

    let regex = Regex::new(r"code: \d{6}$").unwrap();
    let ma = MailAssertion::new().body_matches(regex);
    assert!(test_info.server.assert(ma));
}

#[test]
fn body_matches_whole() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&DEFAULT_MESSAGE).is_ok());

    let regex = Regex::new(r"^.* code: \d{6}$").unwrap();
    let ma = MailAssertion::new().body_matches(regex);
    assert!(test_info.server.assert(ma));
}

#[test]
fn body_matches_no_matches() {
    let test_info = TestInfoBuilder::new().default_auth_user().build();
    let mailer = test_info.mailer_builder.tls(Tls::None).build();
    assert!(mailer.send(&DEFAULT_MESSAGE).is_ok());

    let regex = Regex::new(r"code: \d{8}").unwrap();
    let ma = MailAssertion::new().body_matches(regex);
    assert!(!test_info.server.assert(ma));
}