Current section

Files

Jump to
phoenix_test lib phoenix_test data_attribute_form.ex
Raw

lib/phoenix_test/data_attribute_form.ex

defmodule PhoenixTest.DataAttributeForm do
@moduledoc false
alias PhoenixTest.Html
def build({_, _, _} = element) do
method = Html.attribute(element, "data-method")
action = Html.attribute(element, "data-to")
csrf_token = Html.attribute(element, "data-csrf")
%{}
|> Map.put(:method, method)
|> Map.put(:action, action)
|> Map.put(:csrf_token, csrf_token)
|> Map.put(:element, element)
|> Map.put(:data, %{"_csrf_token" => csrf_token, "_method" => method})
end
def validate!(form, selector, text) do
method = form.method
action = form.action
csrf_token = form.csrf_token
missing =
Enum.filter(["data-method": method, "data-to": action, "data-csrf": csrf_token], fn {_, value} -> empty?(value) end)
unless method && action && csrf_token do
raise ArgumentError, """
Tried submitting form via `data-method` but some data attributes are
missing.
I expected #{inspect(selector)} with text #{inspect(text)} to include
data-method, data-to, and data-csrf.
I found:
#{Html.raw(form.element)}
It seems these are missing: #{Enum.map_join(missing, ", ", fn {key, _} -> key end)}.
NOTE: `data-method` form submissions happen through JavaScript. Tests
emulate that, but be sure to verify you're including Phoenix.HTML.js!
See: https://hexdocs.pm/phoenix_html/Phoenix.HTML.html#module-javascript-library
"""
end
form
end
defp empty?(value) do
value == "" || value == nil
end
end