diff options
Diffstat (limited to 'actionpack/test')
-rw-r--r-- | actionpack/test/javascript/ajax_test.rb | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/actionpack/test/javascript/ajax_test.rb b/actionpack/test/javascript/ajax_test.rb index dc1f7c14fd..49942f6681 100644 --- a/actionpack/test/javascript/ajax_test.rb +++ b/actionpack/test/javascript/ajax_test.rb @@ -2,7 +2,22 @@ require "abstract_unit" class AjaxTestCase < ActiveSupport::TestCase include ActionView::Helpers::AjaxHelper + + # TODO: Ask Katz: Should these be included by the AjaxHelper? - BR include ActionView::Helpers::TagHelper + include ActionView::Helpers::FormTagHelper + + # TODO: Replace with the real url_for method - BR + def url_for(url) + case url + when Hash + "/url/hash" + when String + url + else + raise TypeError.new("Unsupported url type (#{url.class}) for this test helper") + end + end def assert_html(html, matches) matches.each do |match| @@ -10,6 +25,12 @@ class AjaxTestCase < ActiveSupport::TestCase end end + def assert_html_not_present(html, matches) + matches.each do |match| + assert_no_match Regexp.new(Regexp.escape(match)), html + end + end + def extract_json_from_data_element(data_element) root = HTML::Document.new(data_element).root script = root.find(:tag => "script") @@ -98,6 +119,108 @@ class LinkToRemoteTest < AjaxTestCase end end +class FormRemoteTagTest < AjaxTestCase + + def protect_against_forgery? + false + end + + def request_forgery_protection_token + "token_name" + end + + def form_authenticity_token + "t0k3n" + end + + def authenticity_input_attributes + %w(input type="hidden" name="token_name" value="t0k3n") + end + + # TODO: Play with using assert_dom_equal + test "basic" do + assert_html form_remote_tag(:update => "#glass_of_beer", :url => { :action => :fast }), + %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer") + end + + test "when protect_against_forgery? is true" do + def protect_against_forgery? + true + end + + expected_form_attributes = %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer") + expected_patterns = expected_form_attributes + authenticity_input_attributes + + assert_equal true, protect_against_forgery? + assert_html form_remote_tag(:update => "#glass_of_beer", :url => { :action => :fast }), expected_patterns + end + + test ":action is used when it is present" do + html = form_remote_tag(:update => "#glass_of_beer", :action => "foo") + + assert_html html, %w(form action="foo" method="post" data-remote="true" data-update-success="#glass_of_beer") + assert_no_match /url="foo"/, html + end + + test ":url is used when :action is not present" do + html = form_remote_tag(:update => "#glass_of_beer", :url => "bar") + + assert_html html, %w(form action="bar" method="post" data-remote="true" data-update-success="#glass_of_beer") + assert_no_match /url="bar"/, html + end + + test "when protect_against_forgery? is false" do + assert_equal false, protect_against_forgery? + assert_html_not_present form_remote_tag(:update => "#glass_of_beer", :url => { :action => :fast }), + authenticity_input_attributes + end + + test "update callbacks" do + assert_html form_remote_tag(:update => { :success => "#glass_of_beer" }, :url => { :action => :fast }), + %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer") + + assert_html form_remote_tag(:update => { :failure => "#glass_of_water" }, :url => { :action => :fast }), + %w(form action="/url/hash" method="post" data-remote="true" data-update-failure="#glass_of_water") + + assert_html form_remote_tag(:update => { :success => "#glass_of_beer", :failure => "#glass_of_water" }, :url => { :action => :fast }), + %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer" data-update-failure="#glass_of_water") + end + + test "using a :method option" do + expected_form_attributes = %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer") + # TODO: Ask Katz: Why does rails do this? Some web servers don't allow PUT or DELETE from what I remember... - BR + expected_input_attributes = %w(input name="_method" type="hidden" value="put") + + assert_html form_remote_tag(:update => "#glass_of_beer", :url => { :action => :fast }, :html => { :method => :put }), + expected_form_attributes + expected_input_attributes + end + + + # FIXME: This test is janky as hell. We are essentially rewriting capture and concat and they don't really work right + # because output is out of order. This test passes because it's only doing a regex match on the buffer, but this really + # needs to be fixed by using the real helper methods that rails provides. capture, concat, url_for etc. should be + # implemented by their *real* methods or we need to find a better workaround so that our tests aren't written so + # poorly. - BR + test "form_remote_tag with block in erb" do + def capture(*args, &block) + @buffer = [] + block.call(*args) if block_given? + end + def concat(str) + @buffer << str + end + + expected_form_attributes = %w(form action="/url/hash" method="post" data-remote="true" data-update-success="#glass_of_beer" /form) + expected_inner_html = %w(w00t!) + + form_remote_tag(:update => "#glass_of_beer", :url => { :action => :fast }) { concat expected_inner_html } + assert_html @buffer.to_s, + expected_form_attributes + expected_inner_html + end + + +end + class ButtonToRemoteTest < AjaxTestCase def button(options, html = {}) button_to_remote("Remote outpost", options, html) |