mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-28 02:18:50 +00:00
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">
67 lines
2.2 KiB
Elixir
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
|