Merge branch 'master' of git://github.com/lukemelia/webrat into lukemelia/master

This commit is contained in:
Bryan Helmkamp 2008-04-04 14:35:40 +01:00
commit e42bc666ec
4 changed files with 118 additions and 26 deletions

View File

@ -24,16 +24,15 @@ module ActionController
# Example: # Example:
# clicks_link "Sign up" # clicks_link "Sign up"
def clicks_link(link_text) def clicks_link(link_text)
link = links.detect { |el| el.innerHTML =~ /#{link_text}/i } clicks_one_link_of(all_links, link_text)
return flunk("No link with text #{link_text.inspect} was found") if link.nil? end
onclick = link.attributes["onclick"] # Works like clicks_link, but only looks for the link text within a given selector
href = link.attributes["href"] #
# Example:
http_method = http_method_from_js(onclick) # clicks_link_within "#user_12", "Vote"
authenticity_token = authenticity_token_value(onclick) def clicks_link_within(selector, link_text)
clicks_one_link_of(links_within(selector), link_text)
request_page(http_method, href, authenticity_token.blank? ? {} : {"authenticity_token" => authenticity_token})
end end
# Works like clicks_link, but forces a GET request # Works like clicks_link, but forces a GET request
@ -221,11 +220,30 @@ module ActionController
end end
def clicks_link_with_method(link_text, http_method) # :nodoc: def clicks_link_with_method(link_text, http_method) # :nodoc:
link = links.detect { |el| el.innerHTML =~ /#{link_text}/i } link = all_links.detect { |el| el.innerHTML =~ /#{link_text}/i }
return flunk("No link with text #{link_text.inspect} was found") if link.nil? return flunk("No link with text #{link_text.inspect} was found") if link.nil?
request_page(http_method, link.attributes["href"]) request_page(http_method, link.attributes["href"])
end end
def find_shortest_matching_link(links, link_text)
candidates = links.select { |el| el.innerHTML =~ /#{link_text}/i }
candidates.sort_by { |el| el.innerText.strip.size }.first
end
def clicks_one_link_of(links, link_text)
link = find_shortest_matching_link(links, link_text)
return flunk("No link with text #{link_text.inspect} was found") if link.nil?
onclick = link.attributes["onclick"]
href = link.attributes["href"]
http_method = http_method_from_js(onclick)
authenticity_token = authenticity_token_value(onclick)
request_page(http_method, href, authenticity_token.blank? ? {} : {"authenticity_token" => authenticity_token})
end
def find_field_by_name_or_label(name_or_label) # :nodoc: def find_field_by_name_or_label(name_or_label) # :nodoc:
input = find_field_by_name(name_or_label) input = find_field_by_name(name_or_label)
return input if input return input if input
@ -377,30 +395,25 @@ module ActionController
add_default_params_from_checkboxes_for(form) add_default_params_from_checkboxes_for(form)
add_default_params_from_radio_buttons_for(form) add_default_params_from_radio_buttons_for(form)
add_default_params_from_textareas_for(form) add_default_params_from_textareas_for(form)
add_default_params_from_selects_for(form)
end end
def add_default_params_from_inputs_for(form) # :nodoc: def add_default_params_from_inputs_for(form) # :nodoc:
(form / "input").each do |input| ((form / "input[@type='text']") + (form / "input[@type='hidden']")).each do |input|
next if input.attributes["value"].blank? || !%w[text hidden].include?(input.attributes["type"]) next if input.attributes["value"].blank?
add_form_data(input, input.attributes["value"]) add_form_data(input, input.attributes["value"])
end end
end end
def add_default_params_from_checkboxes_for(form) # :nodoc: def add_default_params_from_checkboxes_for(form) # :nodoc:
(form / "input").each do |input| (form / "input[@type='checkbox][@checked='checked']").each do |input|
next if input.attributes["type"] != "checkbox" add_form_data(input, input.attributes["value"] || "on")
if input.attributes["checked"] == "checked"
add_form_data(input, input.attributes["value"] || "on")
end
end end
end end
def add_default_params_from_radio_buttons_for(form) # :nodoc: def add_default_params_from_radio_buttons_for(form) # :nodoc:
(form / "input").each do |input| (form / "input[@type='radio][@checked='checked']").each do |input|
next if input.attributes["type"] != "radio" add_form_data(input, input.attributes["value"])
if input.attributes["checked"] == "checked"
add_form_data(input, input.attributes["value"])
end
end end
end end
@ -410,6 +423,16 @@ module ActionController
end end
end end
def add_default_params_from_selects_for(form) # :nodoc:
(form / "select").each do |select|
selected_options = select / "option[@selected='selected']"
selected_options = select / "option:first" if selected_options.empty?
selected_options.each do |option|
add_form_data(select, option.attributes["value"] || option.innerHTML)
end
end
end
def form_for_node(node) # :nodoc: def form_for_node(node) # :nodoc:
return node if node.name == "form" return node if node.name == "form"
node = node.parent until node.name == "form" node = node.parent until node.name == "form"
@ -425,10 +448,14 @@ module ActionController
@form_data ||= [] @form_data ||= []
end end
def links # :nodoc: def all_links # :nodoc:
(dom / "a[@href]") (dom / "a[@href]")
end end
def links_within(selector) # :nodoc:
(dom / selector / "a[@href]")
end
def form_number(form) # :nodoc: def form_number(form) # :nodoc:
(dom / "form").index(form) (dom / "form").index(form)
end end

View File

@ -219,6 +219,48 @@ class ClicksButtonTest < Test::Unit::TestCase
@session.clicks_button @session.clicks_button
end end
def test_should_send_default_selected_option_value_from_select
@response.stubs(:body).returns(<<-EOS)
<form method="get" action="/login">
<select name="month">
<option value="1">January</option>
<option value="2" selected="selected">February</option>
</select>
<input type="submit" />
</form>
EOS
@session.expects(:get_via_redirect).with("/login", "month" => "2")
@session.clicks_button
end
def test_should_send_default_selected_option_inner_html_from_select_when_no_value_attribute
@response.stubs(:body).returns(<<-EOS)
<form method="get" action="/login">
<select name="month">
<option>January</option>
<option selected="selected">February</option>
</select>
<input type="submit" />
</form>
EOS
@session.expects(:get_via_redirect).with("/login", "month" => "February")
@session.clicks_button
end
def test_should_send_first_select_option_value_when_no_option_selected
@response.stubs(:body).returns(<<-EOS)
<form method="get" action="/login">
<select name="month">
<option value="1">January</option>
<option value="2">February</option>
</select>
<input type="submit" />
</form>
EOS
@session.expects(:get_via_redirect).with("/login", "month" => "1")
@session.clicks_button
end
def test_should_handle_nested_properties def test_should_handle_nested_properties
@response.stubs(:body).returns(<<-EOS) @response.stubs(:body).returns(<<-EOS)
<form method="post" action="/login"> <form method="post" action="/login">

View File

@ -159,4 +159,27 @@ class ClicksLinkTest < Test::Unit::TestCase
@session.expects(:get_via_redirect).with("/page1", {}) @session.expects(:get_via_redirect).with("/page1", {})
@session.clicks_link "Link text" @session.clicks_link "Link text"
end end
def test_should_choose_the_shortest_link_text_match
@response.stubs(:body).returns(<<-EOS)
<a href="/page1">Linkerama</a>
<a href="/page2">Link</a>
EOS
@session.expects(:get_via_redirect).with("/page2", {})
@session.clicks_link "Link"
end
def test_should_click_link_within_a_selector
@response.stubs(:body).returns(<<-EOS)
<a href="/page1">Link</a>
<div id="container">
<a href="/page2">Link</a>
</div>
EOS
@session.expects(:get_via_redirect).with("/page2", {})
@session.clicks_link_within "#container", "Link"
end
end end

View File

@ -59,7 +59,7 @@ class SelectsTest < Test::Unit::TestCase
<input type="submit" /> <input type="submit" />
</form> </form>
EOS EOS
@session.expects(:post_via_redirect).with("/login", "end_month" => "e1") @session.expects(:post_via_redirect).with("/login", "start_month" => "s1", "end_month" => "e1")
@session.selects "January", :from => "end_month" @session.selects "January", :from => "end_month"
@session.clicks_button @session.clicks_button
end end
@ -74,7 +74,7 @@ class SelectsTest < Test::Unit::TestCase
<input type="submit" /> <input type="submit" />
</form> </form>
EOS EOS
@session.expects(:post_via_redirect).with("/login", "end_month" => "e1") @session.expects(:post_via_redirect).with("/login", "start_month" => "s1", "end_month" => "e1")
@session.selects "January", :from => "End Month" @session.selects "January", :from => "End Month"
@session.clicks_button @session.clicks_button
end end