-
Notifications
You must be signed in to change notification settings - Fork 1
Marcel/submit with button #94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -9,15 +9,43 @@ defmodule TestDispatch.Form do | |||||
| def find_inputs(form, {:entity, _} = entity_tuple), | ||||||
| do: find_input_fields(form, entity_tuple) | ||||||
|
|
||||||
| def find_inputs(form, {:button_text, button_text}) do | ||||||
| button = find_buttons(form, button_text) | ||||||
fatboypunk marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
|
||||||
| if button, | ||||||
| do: [button | find_default_inputs(form)], | ||||||
| else: find_default_inputs(form) | ||||||
| end | ||||||
|
|
||||||
| def find_inputs(form, _) do | ||||||
| find_default_inputs(form) | ||||||
| end | ||||||
|
|
||||||
| defp find_default_inputs(form) do | ||||||
| fields = find_input_fields(form, "") | ||||||
| selects = find_selects(form, "") | ||||||
| textareas = find_textareas(form, "") | ||||||
| radio_buttons = find_radio_buttons(form, "") | ||||||
|
|
||||||
| Enum.uniq(fields ++ selects ++ textareas ++ radio_buttons) | ||||||
| end | ||||||
|
|
||||||
| def find_buttons(form, button_text), | ||||||
fatboypunk marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| do: | ||||||
| find_submit_input(form, button_text) || | ||||||
| find_submit_button(form, button_text) | ||||||
|
|
||||||
| defp find_submit_button(form, button_text) do | ||||||
| form | ||||||
| |> Floki.find("button[type=submit]") | ||||||
| |> Enum.find(&contains_button_text?(&1, button_text)) | ||||||
| end | ||||||
|
|
||||||
| defp find_submit_input(form, button_text) do | ||||||
| form | ||||||
| |> Floki.find("input[type=submit]") | ||||||
| |> Enum.find(&contains_button_text?(&1, button_text)) | ||||||
| end | ||||||
|
|
||||||
| def find_radio_buttons(form, "") do | ||||||
| radios = Floki.find(form, "input[type=radio]") | ||||||
|
|
||||||
|
|
@@ -28,7 +56,7 @@ defmodule TestDispatch.Form do | |||||
| other_radios = | ||||||
| radios | ||||||
| |> Enum.uniq_by(fn {_, list, _} -> | ||||||
| list |> Enum.find(fn {key, _} -> "name" == key end) |> elem(1) | ||||||
| Enum.find(list, fn {key, _} -> "name" == key end) |> elem(1) | ||||||
| end) | ||||||
| |> Enum.reject(fn radio -> floki_attribute(radio, "name") in checked_names end) | ||||||
|
|
||||||
|
|
@@ -72,6 +100,9 @@ defmodule TestDispatch.Form do | |||||
| new_nested_list = update_nested_input_values(acc_nested_list, tuple, nested_attr) | ||||||
|
|
||||||
| Map.put(acc, key, new_nested_list) | ||||||
|
|
||||||
| {} -> | ||||||
| acc | ||||||
| end | ||||||
| end) | ||||||
| end | ||||||
|
|
@@ -80,11 +111,13 @@ defmodule TestDispatch.Form do | |||||
| value = input |> elem(0) |> _input_to_tuple([input]) | ||||||
|
|
||||||
| case input |> key_for_input(entity_tuple) |> resolve_nested() do | ||||||
| nil -> {} | ||||||
| {key, index, nested_key} -> {key, index, {nested_key, value}} | ||||||
| key -> {key, value} | ||||||
| end | ||||||
| end | ||||||
|
|
||||||
| defp _input_to_tuple("button", input), do: Floki.text(input) | ||||||
| defp _input_to_tuple("textarea", input), do: Floki.text(input) | ||||||
| defp _input_to_tuple("input", input), do: floki_attribute(input, "value") | ||||||
|
|
||||||
|
|
@@ -102,14 +135,19 @@ defmodule TestDispatch.Form do | |||||
| String.replace_prefix(key, "#{entity}_", "") | ||||||
| end | ||||||
|
|
||||||
| defp key_for_input({"button", _, _} = input, _), do: floki_attribute(input, "name") | ||||||
|
|
||||||
| defp key_for_input(input, _) do | ||||||
| name = floki_attribute(input, "name") | ||||||
| id = floki_attribute(input, "id") | ||||||
|
|
||||||
| if floki_attribute(input, "type") == "radio", | ||||||
| do: String.replace_suffix(id, "_#{floki_attribute(input, "value")}", ""), | ||||||
| do: name, | ||||||
| else: id | ||||||
| end | ||||||
|
|
||||||
| defp resolve_nested(nil), do: nil | ||||||
|
|
||||||
| defp resolve_nested(key) do | ||||||
| case Regex.split(~r{_\d*_}, key, include_captures: true) do | ||||||
| [key, capture, nested_key] -> | ||||||
|
|
@@ -171,13 +209,27 @@ defmodule TestDispatch.Form do | |||||
| "The provided conn had the status #{status} that doesn't fall into the 2xx range" | ||||||
| ) | ||||||
|
|
||||||
| def find_form_by(form, nil), do: {List.last(form), nil} | ||||||
| def find_form_by(forms, nil), do: {List.last(forms), nil} | ||||||
|
|
||||||
| def find_form_by(form, entity_or_test_selector) do | ||||||
| test_selector_result = Enum.find(form, &find_test_selector(&1, entity_or_test_selector)) | ||||||
| def find_form_by(forms, button_text: button_text) do | ||||||
| form = Enum.find(forms, &contains_button_text?(&1, button_text)) | ||||||
|
|
||||||
| if form, | ||||||
| do: {form, :button_text}, | ||||||
| else: | ||||||
| raise(""" | ||||||
| No form found for the given button text: #{button_text} | ||||||
| Found the button texts: | ||||||
|
|
||||||
| #{all_buttons(forms)} | ||||||
| """) | ||||||
| end | ||||||
|
|
||||||
| def find_form_by(forms, entity_or_test_selector) do | ||||||
| test_selector_result = Enum.find(forms, &find_test_selector(&1, entity_or_test_selector)) | ||||||
|
|
||||||
| entity_result = | ||||||
| Enum.find(form, &(&1 |> Floki.find("*[id^=#{entity_or_test_selector}_]") |> Enum.any?())) | ||||||
| Enum.find(forms, &(&1 |> Floki.find("*[id^=#{entity_or_test_selector}_]") |> Enum.any?())) | ||||||
|
|
||||||
| cond do | ||||||
| is_tuple(test_selector_result) -> | ||||||
|
|
@@ -204,4 +256,29 @@ defmodule TestDispatch.Form do | |||||
| |> html_response(status) | ||||||
| |> Floki.parse_document!() | ||||||
| end | ||||||
|
|
||||||
| defp contains_button_text?(form, button_text) do | ||||||
| input_submit = | ||||||
| form | ||||||
| |> Floki.find("input[type=submit]") | ||||||
| |> Enum.any?(&(text(&1) == button_text)) | ||||||
|
|
||||||
| button_submit = | ||||||
| form | ||||||
| |> Floki.find("button[type=submit]") | ||||||
| |> Enum.any?(&(text(&1) == button_text)) | ||||||
|
|
||||||
| input_submit || button_submit | ||||||
| end | ||||||
|
|
||||||
| def text(html_tree), | ||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm yeah i'm moving this later in #97. |
||||||
| do: html_tree |> Floki.text() |> String.replace(~r/\s+/, " ") |> String.trim() | ||||||
|
|
||||||
| defp all_buttons(html_tree) do | ||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
or something like it? :p
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah nice i'll update this in #97 |
||||||
| all_submit_buttons = html_tree |> Floki.find("button[type=submit]") | ||||||
| all_submit_inputs = html_tree |> Floki.find("input[type=submit]") | ||||||
|
|
||||||
| (all_submit_inputs ++ all_submit_buttons) | ||||||
| |> Enum.map(&(text([&1]) <> "\n ")) | ||||||
| end | ||||||
| end | ||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!