Files
firezone/elixir/apps/domain/test/support/data_case.ex
Brian Manifold 716623a993 feat(portal): Add IDP sync error email notifications (#6483)
This adds a feature that will email all admins in a Firezone Account
when sync errors occur with their Identity Provider.

In order to avoid spamming admins with sync error emails, the error
emails are only sent once every 24 hours. One exception to that is when
there is a successful sync the `sync_error_emailed_at` field is reset,
which means in theory if an identity provider was flip flopping between
successful and unsuccessful syncs the admins would be emailed more than
once in a 24 hours period.

### Sample Email Message
<img width="589" alt="idp-sync-error-message"
src="https://github.com/user-attachments/assets/d7128c7c-c10d-4d02-8283-059e2f1f5db5">
2024-09-18 15:29:50 +00:00

67 lines
2.2 KiB
Elixir

defmodule Domain.DataCase do
@moduledoc """
This module defines the setup for tests requiring
access to the application's data layer.
You may define functions here to be used as helpers in
your tests.
Finally, if the test case interacts with the database,
we enable the SQL sandbox, so changes done to the database
are reverted at the end of every test. If you are using
PostgreSQL, you can even run database tests asynchronously
by setting `use Domain.DataCase, async: true`, although
this option is not recommended for other databases.
"""
use ExUnit.CaseTemplate
use Domain.CaseTemplate
using do
quote do
import Ecto
import Ecto.Changeset
import Swoosh.TestAssertions
import Domain.DataCase
alias Domain.Repo
alias Domain.Fixtures
alias Domain.Mocks
end
end
def assert_datetime_diff(%DateTime{} = datetime1, %DateTime{} = datetime2, is, leeway \\ 5) do
assert DateTime.diff(datetime1, datetime2, :second) in (is - leeway)..(is + leeway)
end
@doc """
A helper that transforms changeset errors into a map of messages.
assert {:error, changeset} = Accounts.create_user(%{password: "short"})
assert "password is too short" in errors_on(changeset).password
assert %{password: ["password is too short"]} = errors_on(changeset)
"""
def errors_on(changeset) do
Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
Regex.replace(~r"%{(\w+)}", message, fn _, key ->
opts |> Keyword.get(String.to_existing_atom(key), key) |> to_string()
end)
end)
end
@doc """
When code makes async requests to the Bypass server, there is a chance that we will hit
a race condition: either a test process or task can be terminated before the Bypass server
sent a response, which will lead to a exit signal to the test process.
We work around it by cancelling the expectations check (because we don't really care about
them to be met in the case of `stub/3` calls).
See https://github.com/PSPDFKit-labs/bypass/issues/120
"""
def cancel_bypass_expectations_check(bypass) do
Bypass.down(bypass)
on_exit({Bypass, bypass.pid}, fn -> :ok end)
end
end