View Source Swoosh.X.TestAssertions (Swoosh v1.17.2)

Experimental New TestAssertions Module that may replace the old new in v2.

This module contains a set of assertions functions that you can import in your test cases.

It is meant to be used with the Swoosh.Adapters.Test module.

Note: Swoosh.X.TestAssertions works for unit tests and basic integration tests. Unfortunately it's not going to work for feature/E2E tests. The mechanism of assert_email_sent is based on messaging sending between processes, and is expecting the calling process (the one that calls assert_email_sent) to be the calling process of Mailer.deliver, or be the parent process of the whatever does the Mailer.deliver call.

For feature/E2E tests, you should use Swoosh.Adapters.Local adapter. In your test, instead of calling assert_email_sent, you should navigate to the preview url with your E2E tool (e.g. wallaby) and test that the email is in the inbox.

Summary

Functions

Asserts any email was sent.

Asserts email was sent.

Removes and returns from mailbox all sent emails.

Asserts no emails were sent.

Asserts email with attributes was not sent.

Sets Swoosh test adapter to global mode.

Functions

@spec assert_email_sent() :: boolean() | no_return()

Asserts any email was sent.

Link to this function

assert_email_sent(email)

View Source
@spec assert_email_sent(
  Swoosh.Email.t()
  | Keyword.t()
  | (Swoosh.Email.t() -> boolean())
) ::
  boolean() | no_return()

Asserts email was sent.

You can pass a keyword list to match on specific params or an anonymous function that returns a boolean.

Examples

iex> alias Swoosh.Email
iex> import Swoosh.X.TestAssertions

iex> email = Email.new(subject: "Hello, Avengers!")
iex> Swoosh.Adapters.Test.deliver(email, [])

# assert a specific email was sent
iex> assert_email_sent(email)

# assert an email with specific field(s) was sent
iex> assert_email_sent(subject: "Hello, Avengers!")

# assert an email that satisfies a condition
iex> assert_email_sent(fn email ->
...>   assert length(email.to) == 2
...> end)
@spec flush_emails() :: [Swoosh.Email.t()]

Removes and returns from mailbox all sent emails.

@spec refute_email_sent() :: boolean() | no_return()

Asserts no emails were sent.

Link to this function

refute_email_sent(email)

View Source
@spec refute_email_sent(Swoosh.Email.t() | list() | (Swoosh.Email.t() -> boolean())) ::
  boolean() | no_return()

Asserts email with attributes was not sent.

You can pass a keyword list to match on specific params or an anonymous function that returns a boolean.

Link to this function

set_swoosh_global(context \\ %{})

View Source

Sets Swoosh test adapter to global mode.

In global mode, emails are consumed by the current test process, doesn't matter which process sent it.

An ExUnit case where tests use Swoosh in global mode cannot be async: true.

Examples

defmodule MyTest do
  use ExUnit.Case, async: false

  import Swoosh.Email
  import Swoosh.X.TestAssertions

  setup :set_swoosh_global

  test "it sends email" do
    # ...
    assert_email_sent(subject: "Hi Avengers!")
  end
end