defmodule MyApp.ScrubErrorTest do use ExUnit.Case alias MyApp.ScrubError describe "call/1" do test "filters out password at the top level" do error = %{ kind: :error, reason: %{changeset: %{params: %{"password" => "top secret password"}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error.reason.changeset.params["password"] == "[FILTERED]" end test "filters out nested password" do error = %{ kind: :error, reason: %{changeset: %{params: %{"secrets" => %{"password" => "top secret password"}}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error.reason.changeset.params["secrets"]["password"] == "[FILTERED]" end test "filters out nested password as an atom" do error = %{ kind: :error, reason: %{changeset: %{params: %{"secrets" => %{password: "top secret password"}}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error.reason.changeset.params["secrets"].password == "[FILTERED]" end test "filters out nested password underneath a list" do error = %{ kind: :error, reason: %{changeset: %{params: %{"secrets" => [%{password: "top secret password"}]}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error.reason.changeset.params["secrets"] == [%{password: "[FILTERED]"}] end test "leaves bad changeset alone" do error = %{kind: :error, reason: %{changeset: "bad"}, stack: [], more: "stuff"} scrubbed_error = ScrubError.call(error) assert scrubbed_error == error end test "leaves bad params alone" do error = %{kind: :error, reason: %{changeset: %{params: "bad"}}, stack: [], more: "stuff"} scrubbed_error = ScrubError.call(error) assert scrubbed_error == error end test "leaves top-level map params alone when no filtered items exist" do error = %{ kind: :error, reason: %{changeset: %{params: %{"user_id" => 1}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error == error end test "leaves top-level list params alone when no filtered items exist" do error = %{ kind: :error, reason: %{changeset: %{params: %{"user_ids" => [1]}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error == error end test "leaves nested structs alone when no filtered items exist" do error = %{ kind: :error, reason: %{changeset: %{params: %{"users" => [%MyApp.User{}]}}}, stack: [], more: "stuff" } scrubbed_error = ScrubError.call(error) assert scrubbed_error == error end end end