lib/twilio_test_helper.ex

defmodule TwilioSignaturePlug.TwilioTestHelper do
  @doc """
  Set the rquired twilio signature header in a Conn object
  This is designed for testing requests to twilio-signature-plug protected routes.
  """
  def sign_conn(%{} = conn) do
    signature = TwilioSignaturePlug.expected_signature(conn)

    case conn do
      %{:req_headers => headers} ->
        # update the headers
        %{conn | req_headers: set_twilio_signature_header(headers, signature)}

      _ ->
        # if no headers were set, we create them
        %{conn | req_headers: [{"x-twilio-signature", signature}]}
    end
  end

  defp set_twilio_signature_header(headers, signature) do
    [
      {"x-twilio-signature", signature}
      | headers
        |> Enum.filter(fn x ->
          case x do
            {"x-twilio-signature", _} -> false
            {_, _} -> true
          end
        end)
    ]
  end
end