1.3 KiB · text History b868907
defmodule GitGudWeb.ErrorMessageTest do
  use ExUnit.Case, async: true

  import ExUnit.CaptureLog

  alias GitGudWeb.ErrorMessage

  test "a changeset reads as its field errors" do
    cs =
      {%{}, %{name: :string, size: :integer}}
      |> Ecto.Changeset.cast(%{size: 900}, [:name, :size])
      |> Ecto.Changeset.validate_required([:name])
      |> Ecto.Changeset.validate_number(:size, less_than: 10)

    message = ErrorMessage.describe(cs)
    assert message =~ "name can't be blank"
    assert message =~ "size must be less than 10"
  end

  test "strings pass through and atoms read as words" do
    assert ErrorMessage.describe("branch is protected") == "branch is protected"
    assert ErrorMessage.describe(:not_found) == "not found"
  end

  test "anything else is a ref, with the term only in the log" do
    reason = {:git, "fatal: /var/lib/gitgud/repos/secret.git: bad object"}

    log =
      capture_log(fn ->
        message = ErrorMessage.describe(reason)
        assert message =~ ~r/^something went wrong \(ref [0-9a-f]{8}\)$/
        refute message =~ "/var/lib"
        send(self(), {:ref, message})
      end)

    assert_received {:ref, message}
    [_, ref] = Regex.run(~r/ref ([0-9a-f]{8})/, message)
    assert log =~ "error ref #{ref}"
    assert log =~ "/var/lib/gitgud/repos/secret.git"
  end
end