who_need_help/test/who_need_help/push_test.exs

76 lines
2.2 KiB
Elixir

defmodule WhoNeedHelp.PushTest do
use ExUnit.Case, async: false
alias WhoNeedHelp.Push
alias WhoNeedHelp.Push.HTTPAdapter
defmodule RecordingAdapter do
@behaviour Push
@impl true
def deliver(notification, opts) do
send(Keyword.fetch!(opts, :test_pid), {:delivered, notification, opts})
{:ok, %{id: "recorded", duplicate: false}}
end
end
setup do
previous = Application.get_env(:who_need_help, :push_adapter)
Application.delete_env(:who_need_help, :push_adapter)
on_exit(fn ->
case previous do
nil -> Application.delete_env(:who_need_help, :push_adapter)
adapter -> Application.put_env(:who_need_help, :push_adapter, adapter)
end
end)
end
test "the unconfigured product boundary is disabled" do
assert Push.deliver(notification()) == {:error, :disabled}
end
test "invalid notifications fail before invoking an adapter" do
assert Push.deliver(
Map.delete(notification(), :idempotency_key),
adapter: RecordingAdapter,
test_pid: self()
) == {:error, {:invalid_notification, :idempotency_key}}
refute_received {:delivered, _notification, _opts}
end
test "a configured adapter receives validated data without the adapter option" do
assert Push.deliver(
notification(),
adapter: RecordingAdapter,
test_pid: self(),
boundary: :local
) == {:ok, %{id: "recorded", duplicate: false}}
assert_received {:delivered, delivered, opts}
assert delivered == notification()
assert opts[:boundary] == :local
refute Keyword.has_key?(opts, :adapter)
end
test "the HTTP adapter rejects incomplete transport configuration without network access" do
assert Push.deliver(
notification(),
adapter: HTTPAdapter,
endpoint: "http://127.0.0.1:1/push",
bearer_token: "local-token"
) == {:error, {:invalid_option, :receive_timeout}}
end
defp notification do
%{
idempotency_key: "event-1",
recipient: "future-device-token",
title: "Help update",
body: "A neighbor replied",
data: %{"kind" => "message"}
}
end
end