diff options
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/RUNNING_UNIT_TESTS | 2 | ||||
-rw-r--r-- | actionpack/lib/abstract_controller/callbacks.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_controller/metal/responder.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/form_tag_helper.rb | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/text_helper.rb | 33 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/translation_helper.rb | 23 | ||||
-rw-r--r-- | actionpack/lib/action_view/test_case.rb | 164 | ||||
-rw-r--r-- | actionpack/test/controller/mime_responds_test.rb | 13 | ||||
-rw-r--r-- | actionpack/test/fixtures/test/array_translation.erb | 1 | ||||
-rw-r--r-- | actionpack/test/fixtures/test/scoped_array_translation.erb | 1 | ||||
-rw-r--r-- | actionpack/test/fixtures/test/scoped_translation.erb | 1 | ||||
-rw-r--r-- | actionpack/test/template/form_tag_helper_test.rb | 6 | ||||
-rw-r--r-- | actionpack/test/template/test_case_test.rb | 279 | ||||
-rw-r--r-- | actionpack/test/template/text_helper_test.rb | 58 | ||||
-rw-r--r-- | actionpack/test/template/translation_helper_test.rb | 22 |
15 files changed, 354 insertions, 255 deletions
diff --git a/actionpack/RUNNING_UNIT_TESTS b/actionpack/RUNNING_UNIT_TESTS index 16b119878a..95a8bc7497 100644 --- a/actionpack/RUNNING_UNIT_TESTS +++ b/actionpack/RUNNING_UNIT_TESTS @@ -11,7 +11,7 @@ Rake can be found at http://rake.rubyforge.org If you only want to run a single test suite, or don't want to bother with Rake, you can do so with something like: - ruby controller/base_tests.rb + ruby -Itest test/controller/base_tests.rb == Dependency on ActiveRecord and database setup diff --git a/actionpack/lib/abstract_controller/callbacks.rb b/actionpack/lib/abstract_controller/callbacks.rb index ee496dadc5..67efeb7063 100644 --- a/actionpack/lib/abstract_controller/callbacks.rb +++ b/actionpack/lib/abstract_controller/callbacks.rb @@ -20,7 +20,7 @@ module AbstractController end module ClassMethods - # If :only or :accept are used, convert the options into the + # If :only or :except are used, convert the options into the # primitive form (:per_key) used by ActiveSupport::Callbacks. # The basic idea is that :only => :index gets converted to # :if => proc {|c| c.action_name == "index" }, but that the diff --git a/actionpack/lib/action_controller/metal/responder.rb b/actionpack/lib/action_controller/metal/responder.rb index 6ad9a23542..22bdcd0f3c 100644 --- a/actionpack/lib/action_controller/metal/responder.rb +++ b/actionpack/lib/action_controller/metal/responder.rb @@ -217,7 +217,7 @@ module ActionController #:nodoc: # the verb is POST. # def default_action - @action ||= ACTIONS_FOR_VERBS[request.method_symbol] + @action ||= ACTIONS_FOR_VERBS[request.request_method_symbol] end end end diff --git a/actionpack/lib/action_view/helpers/form_tag_helper.rb b/actionpack/lib/action_view/helpers/form_tag_helper.rb index 2a3f826c15..796268628a 100644 --- a/actionpack/lib/action_view/helpers/form_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/form_tag_helper.rb @@ -293,7 +293,7 @@ module ActionView escape = options.key?("escape") ? options.delete("escape") : true content = html_escape(content) if escape - content_tag :textarea, content.html_safe, { "name" => name, "id" => sanitize_to_id(name) }.update(options) + content_tag :textarea, content.to_s.html_safe, { "name" => name, "id" => sanitize_to_id(name) }.update(options) end # Creates a check box form input tag. diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index 0e1bc139ff..41423d4e2e 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -537,9 +537,14 @@ module ActionView end AUTO_LINK_RE = %r{ - ( https?:// | www\. ) + (?: ([\w+.:-]+:)// | www\. ) [^\s<]+ - }x unless const_defined?(:AUTO_LINK_RE) + }x + + # regexps for determining context, used high-volume + AUTO_LINK_CRE = [/<[^>]+$/, /^[^>]*>/, /<a\b.*?>/i, /<\/a>/i] + + AUTO_EMAIL_RE = /[\w.!#\$%+-]+@[\w-]+(?:\.[\w-]+)+/ BRACKETS = { ']' => '[', ')' => '(', '}' => '{' } @@ -548,11 +553,10 @@ module ActionView def auto_link_urls(text, html_options = {}) link_attributes = html_options.stringify_keys text.gsub(AUTO_LINK_RE) do - href = $& + scheme, href = $1, $& punctuation = [] - left, right = $`, $' - # detect already linked URLs and URLs in the middle of a tag - if left =~ /<[^>]+$/ && right =~ /^[^>]*>/ + + if auto_linked?($`, $') # do not change string; URL is already linked href else @@ -566,9 +570,9 @@ module ActionView end link_text = block_given?? yield(href) : href - href = 'http://' + href unless href =~ %r{^[a-z]+://}i + href = 'http://' + href unless scheme - content_tag(:a, h(link_text), link_attributes.merge('href' => href)) + punctuation.reverse.join('') + content_tag(:a, link_text, link_attributes.merge('href' => href)) + punctuation.reverse.join('') end end end @@ -576,11 +580,10 @@ module ActionView # Turns all email addresses into clickable links. If a block is given, # each email is yielded and the result is used as the link text. def auto_link_email_addresses(text, html_options = {}) - body = text.dup - text.gsub(/([\w\.!#\$%\-+]+@[A-Za-z0-9\-]+(\.[A-Za-z0-9\-]+)+)/) do - text = $1 + text.gsub(AUTO_EMAIL_RE) do + text = $& - if body.match(/<a\b[^>]*>(.*)(#{Regexp.escape(text)})(.*)<\/a>/) + if auto_linked?($`, $') text else display_text = (block_given?) ? yield(text) : text @@ -588,6 +591,12 @@ module ActionView end end end + + # Detects already linked context or position in the middle of a tag + def auto_linked?(left, right) + (left =~ AUTO_LINK_CRE[0] and right =~ AUTO_LINK_CRE[1]) or + (left.rindex(AUTO_LINK_CRE[2]) and $' !~ AUTO_LINK_CRE[3]) + end end end end diff --git a/actionpack/lib/action_view/helpers/translation_helper.rb b/actionpack/lib/action_view/helpers/translation_helper.rb index 086ad261c8..0d2b2aa7b1 100644 --- a/actionpack/lib/action_view/helpers/translation_helper.rb +++ b/actionpack/lib/action_view/helpers/translation_helper.rb @@ -3,7 +3,7 @@ require 'action_view/helpers/tag_helper' module ActionView module Helpers module TranslationHelper - # Delegates to I18n#translate but also performs three additional functions. First, it'll catch MissingTranslationData exceptions + # Delegates to I18n#translate but also performs three additional functions. First, it'll catch MissingTranslationData exceptions # and turn them into inline spans that contains the missing key, such that you can see in a view what is missing where. # # Second, it'll scope the key by the current partial if the key starts with a period. So if you call translate(".foo") from the @@ -11,16 +11,14 @@ module ActionView # to translate many keys within the same partials and gives you a simple framework for scoping them consistently. If you don't # prepend the key with a period, nothing is converted. # - # Third, it’ll mark the translation as safe HTML if the key has the suffix "_html" or the last element of the key is the word - # "html". For example, calling translate("footer_html") or translate("footer.html") will return a safe HTML string that won’t - # be escaped by other HTML helper methods. This naming convention helps to identify translations that include HTML tags so that + # Third, it’ll mark the translation as safe HTML if the key has the suffix "_html" or the last element of the key is the word + # "html". For example, calling translate("footer_html") or translate("footer.html") will return a safe HTML string that won’t + # be escaped by other HTML helper methods. This naming convention helps to identify translations that include HTML tags so that # you know what kind of output to expect when you call translate in a template. def translate(key, options = {}) - options[:raise] = true - translation = I18n.translate(scope_key_by_partial(key), options) - translation = (translation.respond_to?(:join) ? translation.join : translation) - if html_safe_translation_key?(key) + translation = I18n.translate(scope_key_by_partial(key), options.merge!(:raise => true)) + if html_safe_translation_key?(key) && translation.respond_to?(:html_safe) translation.html_safe else translation @@ -38,12 +36,10 @@ module ActionView alias :l :localize private - def scope_key_by_partial(key) - strkey = key.respond_to?(:join) ? key.join : key.to_s - if strkey.first == "." + if key.to_s.first == "." if @_virtual_path - @_virtual_path.gsub(%r{/_?}, ".") + strkey + @_virtual_path.gsub(%r{/_?}, ".") + key.to_s else raise "Cannot use t(#{key.inspect}) shortcut because path is not available" end @@ -53,8 +49,7 @@ module ActionView end def html_safe_translation_key?(key) - key = key.is_a?(Array) ? key.last : key.to_s - key =~ /(\b|_|\.)html$/ + key.to_s =~ /(\b|_|\.)html$/ end end end diff --git a/actionpack/lib/action_view/test_case.rb b/actionpack/lib/action_view/test_case.rb index 5517a56fb9..4dbbd2eb6a 100644 --- a/actionpack/lib/action_view/test_case.rb +++ b/actionpack/lib/action_view/test_case.rb @@ -10,11 +10,16 @@ module ActionView attr_accessor :request, :response, :params - def self.controller_path - '' + class << self + attr_writer :controller_path + end + + def controller_path=(path) + self.class.controller_path=(path) end def initialize + self.class.controller_path = "" @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @@ -24,80 +29,99 @@ module ActionView end end - include ActionDispatch::Assertions, ActionDispatch::TestProcess - include ActionController::TemplateAssertions - include ActionView::Context + module Behavior + extend ActiveSupport::Concern - include ActionController::PolymorphicRoutes - include ActionController::RecordIdentifier + include ActionDispatch::Assertions, ActionDispatch::TestProcess + include ActionController::TemplateAssertions + include ActionView::Context - include AbstractController::Helpers - include ActionView::Helpers + include ActionController::PolymorphicRoutes + include ActionController::RecordIdentifier - class_inheritable_accessor :helper_class - attr_accessor :controller, :output_buffer, :rendered + include AbstractController::Helpers + include ActionView::Helpers - setup :setup_with_controller - def setup_with_controller - @controller = TestController.new - @output_buffer = ActiveSupport::SafeBuffer.new - @rendered = '' + attr_accessor :controller, :output_buffer, :rendered + + module ClassMethods + def tests(helper_class) + self.helper_class = helper_class + end - self.class.send(:include_helper_modules!) - make_test_case_available_to_view! - end + def determine_default_helper_class(name) + mod = name.sub(/Test$/, '').constantize + mod.is_a?(Class) ? nil : mod + rescue NameError + nil + end - def config - @controller.config if @controller.respond_to?(:config) - end + def helper_method(*methods) + # Almost a duplicate from ActionController::Helpers + methods.flatten.each do |method| + _helpers.module_eval <<-end_eval + def #{method}(*args, &block) # def current_user(*args, &block) + _test_case.send(%(#{method}), *args, &block) # test_case.send(%(current_user), *args, &block) + end # end + end_eval + end + end - def render(options = {}, local_assigns = {}, &block) - @rendered << output = _view.render(options, local_assigns, &block) - output - end + attr_writer :helper_class - def protect_against_forgery? - false - end + def helper_class + @helper_class ||= determine_default_helper_class(name) + end - class << self - def tests(helper_class) - self.helper_class = helper_class - end + private - def helper_class - if current_helper_class = read_inheritable_attribute(:helper_class) - current_helper_class - else - self.helper_class = determine_default_helper_class(name) + def include_helper_modules! + helper(helper_class) if helper_class + include _helpers end + end - def determine_default_helper_class(name) - name.sub(/Test$/, '').constantize - rescue NameError - nil + def setup_with_controller + @controller = ActionView::TestCase::TestController.new + @output_buffer = ActiveSupport::SafeBuffer.new + @rendered = '' + + self.class.send(:include_helper_modules!) + make_test_case_available_to_view! + say_no_to_protect_against_forgery! end - def helper_method(*methods) - # Almost a duplicate from ActionController::Helpers - methods.flatten.each do |method| - _helpers.module_eval <<-end_eval, __FILE__, __LINE__ + 1 - def #{method}(*args, &block) # def current_user(*args, &block) - _test_case.send(%(#{method}), *args, &block) # test_case.send(%(current_user), *args, &block) - end # end - end_eval - end + def config + @controller.config if @controller.respond_to?(:config) end - private - def include_helper_modules! - helper(helper_class) if helper_class - include _helpers - end - end + def render(options = {}, local_assigns = {}, &block) + @rendered << output = _view.render(options, local_assigns, &block) + output + end + + included do + setup :setup_with_controller + end private + + # Support the selector assertions + # + # Need to experiment if this priority is the best one: rendered => output_buffer + def response_from_page_or_rjs + HTML::Document.new(@rendered.blank? ? @output_buffer : @rendered).root + end + + def say_no_to_protect_against_forgery! + _helpers.module_eval do + def protect_against_forgery? + false + end + end + end + def make_test_case_available_to_view! test_case_instance = self _helpers.module_eval do @@ -110,29 +134,30 @@ module ActionView view = ActionView::Base.new(ActionController::Base.view_paths, _assigns, @controller) view.singleton_class.send :include, _helpers view.singleton_class.send :include, @controller._router.url_helpers + view.singleton_class.send :delegate, :alert, :notice, :to => "request.flash" view.output_buffer = self.output_buffer view end - # Support the selector assertions - # - # Need to experiment if this priority is the best one: rendered => output_buffer - def response_from_page_or_rjs - HTML::Document.new(rendered.blank? ? output_buffer : rendered).root - end - EXCLUDE_IVARS = %w{ + @_result @output_buffer - @fixture_cache + @rendered + @templates + @view_context_class + @layouts + @partials + @controller + @method_name - @_result + @fixture_cache @loaded_fixtures @test_passed - @view } def _instance_variables instance_variables - EXCLUDE_IVARS + instance_variables end def _assigns @@ -155,5 +180,10 @@ module ActionView super end end + + end + + include Behavior + end end diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb index c8ba8bcaf3..d654338dba 100644 --- a/actionpack/test/controller/mime_responds_test.rb +++ b/actionpack/test/controller/mime_responds_test.rb @@ -668,6 +668,19 @@ class RespondWithControllerTest < ActionController::TestCase end end + def test_using_resource_for_put_with_html_rerender_on_failure_even_on_method_override + with_test_route_set do + errors = { :name => :invalid } + Customer.any_instance.stubs(:errors).returns(errors) + @request.env["rack.methodoverride.original_method"] = "POST" + put :using_resource + assert_equal "text/html", @response.content_type + assert_equal 200, @response.status + assert_equal "Edit world!\n", @response.body + assert_nil @response.location + end + end + def test_using_resource_for_put_with_xml_yields_ok_on_success @request.accept = "application/xml" put :using_resource diff --git a/actionpack/test/fixtures/test/array_translation.erb b/actionpack/test/fixtures/test/array_translation.erb deleted file mode 100644 index def3a1a0c1..0000000000 --- a/actionpack/test/fixtures/test/array_translation.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t(['foo', 'bar', 'html']) %>
\ No newline at end of file diff --git a/actionpack/test/fixtures/test/scoped_array_translation.erb b/actionpack/test/fixtures/test/scoped_array_translation.erb deleted file mode 100644 index 0a0c79f717..0000000000 --- a/actionpack/test/fixtures/test/scoped_array_translation.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t(['.foo', '.bar']) %>
\ No newline at end of file diff --git a/actionpack/test/fixtures/test/scoped_translation.erb b/actionpack/test/fixtures/test/scoped_translation.erb new file mode 100644 index 0000000000..30baa61c77 --- /dev/null +++ b/actionpack/test/fixtures/test/scoped_translation.erb @@ -0,0 +1 @@ +<%= t('.foo.bar') %>
\ No newline at end of file diff --git a/actionpack/test/template/form_tag_helper_test.rb b/actionpack/test/template/form_tag_helper_test.rb index 1c095b621e..b75863bb6a 100644 --- a/actionpack/test/template/form_tag_helper_test.rb +++ b/actionpack/test/template/form_tag_helper_test.rb @@ -206,6 +206,12 @@ class FormTagHelperTest < ActionView::TestCase assert_dom_equal expected, actual end + def test_text_area_tag_unescaped_nil_content + actual = text_area_tag "body", nil, :escape => false + expected = %(<textarea id="body" name="body"></textarea>) + assert_dom_equal expected, actual + end + def test_text_field_tag actual = text_field_tag "title", "Hello!" expected = %(<input id="title" name="title" type="text" value="Hello!" />) diff --git a/actionpack/test/template/test_case_test.rb b/actionpack/test/template/test_case_test.rb index c1a38a25de..16e5ee4f72 100644 --- a/actionpack/test/template/test_case_test.rb +++ b/actionpack/test/template/test_case_test.rb @@ -2,21 +2,23 @@ require 'abstract_unit' require 'controller/fake_controllers' module ActionView - class TestCase - module ATestHelper - end - module AnotherTestHelper - def from_another_helper - 'Howdy!' - end + module ATestHelper + end + + module AnotherTestHelper + def from_another_helper + 'Howdy!' end + end - module ASharedTestHelper - def from_shared_helper - 'Holla!' - end + module ASharedTestHelper + def from_shared_helper + 'Holla!' end + end + + class TestCase helper ASharedTestHelper module SharedTests @@ -29,161 +31,186 @@ module ActionView end end end + end - class GeneralViewTest < ActionView::TestCase - include SharedTests - test_case = self + class GeneralViewTest < ActionView::TestCase + include SharedTests + test_case = self - test "works without testing a helper module" do - assert_equal 'Eloy', render('developers/developer', :developer => stub(:name => 'Eloy')) - end + test "works without testing a helper module" do + assert_equal 'Eloy', render('developers/developer', :developer => stub(:name => 'Eloy')) + end - test "can render a layout with block" do - assert_equal "Before (ChrisCruft)\n!\nAfter", - render(:layout => "test/layout_for_partial", :locals => {:name => "ChrisCruft"}) {"!"} - end + test "can render a layout with block" do + assert_equal "Before (ChrisCruft)\n!\nAfter", + render(:layout => "test/layout_for_partial", :locals => {:name => "ChrisCruft"}) {"!"} + end - helper AnotherTestHelper - test "additional helper classes can be specified as in a controller" do - assert test_case.ancestors.include?(AnotherTestHelper) - assert_equal 'Howdy!', from_another_helper - end + helper AnotherTestHelper + test "additional helper classes can be specified as in a controller" do + assert test_case.ancestors.include?(AnotherTestHelper) + assert_equal 'Howdy!', from_another_helper + end + + test "determine_default_helper_class returns nil if name.sub(/Test$/, '').constantize resolves to a class" do + assert_nil self.class.determine_default_helper_class("String") end - class ClassMethodsTest < ActionView::TestCase - include SharedTests - test_case = self + test "delegates notice to request.flash" do + _view.request.flash.expects(:notice).with("this message") + _view.notice("this message") + end - tests ATestHelper - test "tests the specified helper module" do - assert_equal ATestHelper, test_case.helper_class - assert test_case.ancestors.include?(ATestHelper) - end + test "delegates alert to request.flash" do + _view.request.flash.expects(:alert).with("this message") + _view.alert("this message") + end + end - helper AnotherTestHelper - test "additional helper classes can be specified as in a controller" do - assert test_case.ancestors.include?(AnotherTestHelper) - assert_equal 'Howdy!', from_another_helper + class ClassMethodsTest < ActionView::TestCase + include SharedTests + test_case = self - test_case.helper_class.module_eval do - def render_from_helper - from_another_helper - end - end - assert_equal 'Howdy!', render(:partial => 'test/from_helper') - end + tests ATestHelper + test "tests the specified helper module" do + assert_equal ATestHelper, test_case.helper_class + assert test_case.ancestors.include?(ATestHelper) end - class ATestHelperTest < ActionView::TestCase - include SharedTests - test_case = self + helper AnotherTestHelper + test "additional helper classes can be specified as in a controller" do + assert test_case.ancestors.include?(AnotherTestHelper) + assert_equal 'Howdy!', from_another_helper - test "inflects the name of the helper module to test from the test case class" do - assert_equal ATestHelper, test_case.helper_class - assert test_case.ancestors.include?(ATestHelper) + test_case.helper_class.module_eval do + def render_from_helper + from_another_helper + end end + assert_equal 'Howdy!', render(:partial => 'test/from_helper') + end + end - test "a configured test controller is available" do - assert_kind_of ActionController::Base, controller - assert_equal '', controller.controller_path + class HelperInclusionTest < ActionView::TestCase + module RenderHelper + def render_from_helper + render :partial => 'customer', :collection => @customers end + end - test "helper class that is being tested is always included in view instance" do - # This ensure is a hidious hack to deal with these tests bleeding - # methods between eachother - begin - self.class.helper_class.module_eval do - def render_from_helper - render :partial => 'customer', :collection => @customers - end - end + helper RenderHelper - TestController.stubs(:controller_path).returns('test') + test "helper class that is being tested is always included in view instance" do + @controller.controller_path = 'test' - @customers = [stub(:name => 'Eloy'), stub(:name => 'Manfred')] - assert_match /Hello: EloyHello: Manfred/, render(:partial => 'test/from_helper') + @customers = [stub(:name => 'Eloy'), stub(:name => 'Manfred')] + assert_match /Hello: EloyHello: Manfred/, render(:partial => 'test/from_helper') + end + end - ensure - self.class.helper_class.send(:remove_method, :render_from_helper) - end + class HelperExposureTest < ActionView::TestCase + helper(Module.new do + def render_from_helper + from_test_case end + end) + test "is able to make methods available to the view" do + assert_equal 'Word!', render(:partial => 'test/from_helper') + end - test "no additional helpers should shared across test cases" do - assert !test_case.ancestors.include?(AnotherTestHelper) - assert_raise(NoMethodError) { send :from_another_helper } - end + def from_test_case; 'Word!'; end + helper_method :from_test_case + end - test "is able to use routes" do - controller.request.assign_parameters(@routes, 'foo', 'index') - assert_equal '/foo', url_for - assert_equal '/bar', url_for(:controller => 'bar') + class IgnoreProtectAgainstForgeryTest < ActionView::TestCase + module HelperThatInvokesProtectAgainstForgery + def help_me + protect_against_forgery? end + end - test "is able to use named routes" do - with_routing do |set| - set.draw { |map| resources :contents } - assert_equal 'http://test.host/contents/new', new_content_url - assert_equal 'http://test.host/contents/1', content_url(:id => 1) - end - end + helper HelperThatInvokesProtectAgainstForgery - test "named routes can be used from helper included in view" do - with_routing do |set| - set.draw { |map| resources :contents } - _helpers.module_eval do - def render_from_helper - new_content_url - end - end + test "protect_from_forgery? in any helpers returns false" do + assert !_view.help_me + end - assert_equal 'http://test.host/contents/new', render(:partial => 'test/from_helper') - end - end + end - test "is able to render partials with local variables" do - assert_equal 'Eloy', render('developers/developer', :developer => stub(:name => 'Eloy')) - assert_equal 'Eloy', render(:partial => 'developers/developer', - :locals => { :developer => stub(:name => 'Eloy') }) - end + class ATestHelperTest < ActionView::TestCase + include SharedTests + test_case = self + + test "inflects the name of the helper module to test from the test case class" do + assert_equal ATestHelper, test_case.helper_class + assert test_case.ancestors.include?(ATestHelper) + end + + test "a configured test controller is available" do + assert_kind_of ActionController::Base, controller + assert_equal '', controller.controller_path + end - test "is able to render partials from templates and also use instance variables" do - TestController.stubs(:controller_path).returns('test') + test "no additional helpers should shared across test cases" do + assert !test_case.ancestors.include?(AnotherTestHelper) + assert_raise(NoMethodError) { send :from_another_helper } + end - @customers = [stub(:name => 'Eloy'), stub(:name => 'Manfred')] - assert_match /Hello: EloyHello: Manfred/, render(:file => 'test/list') + test "is able to use routes" do + controller.request.assign_parameters(@routes, 'foo', 'index') + assert_equal '/foo', url_for + assert_equal '/bar', url_for(:controller => 'bar') + end + + test "is able to use named routes" do + with_routing do |set| + set.draw { |map| resources :contents } + assert_equal 'http://test.host/contents/new', new_content_url + assert_equal 'http://test.host/contents/1', content_url(:id => 1) end + end - test "is able to make methods available to the view" do - # This ensure is a hidious hack to deal with these tests bleeding - # methods between eachother - begin - _helpers.module_eval do - def render_from_helper; from_test_case end + test "named routes can be used from helper included in view" do + with_routing do |set| + set.draw { |map| resources :contents } + _helpers.module_eval do + def render_from_helper + new_content_url end - assert_equal 'Word!', render(:partial => 'test/from_helper') - ensure - _helpers.send(:remove_method, :render_from_helper) end + + assert_equal 'http://test.host/contents/new', render(:partial => 'test/from_helper') end + end - def from_test_case; 'Word!'; end - helper_method :from_test_case + test "is able to render partials with local variables" do + assert_equal 'Eloy', render('developers/developer', :developer => stub(:name => 'Eloy')) + assert_equal 'Eloy', render(:partial => 'developers/developer', + :locals => { :developer => stub(:name => 'Eloy') }) end - class AssertionsTest < ActionView::TestCase - def render_from_helper - form_tag('/foo') do - safe_concat render(:text => '<ul><li>foo</li></ul>') - end + test "is able to render partials from templates and also use instance variables" do + @controller.controller_path = "test" + + @customers = [stub(:name => 'Eloy'), stub(:name => 'Manfred')] + assert_match /Hello: EloyHello: Manfred/, render(:file => 'test/list') + end + + end + + class AssertionsTest < ActionView::TestCase + def render_from_helper + form_tag('/foo') do + safe_concat render(:text => '<ul><li>foo</li></ul>') end - helper_method :render_from_helper + end + helper_method :render_from_helper - test "uses the output_buffer for assert_select" do - render(:partial => 'test/from_helper') + test "uses the output_buffer for assert_select" do + render(:partial => 'test/from_helper') - assert_select 'form' do - assert_select 'li', :text => 'foo' - end + assert_select 'form' do + assert_select 'li', :text => 'foo' end end end diff --git a/actionpack/test/template/text_helper_test.rb b/actionpack/test/template/text_helper_test.rb index 8b6c107a21..0b84c8f811 100644 --- a/actionpack/test/template/text_helper_test.rb +++ b/actionpack/test/template/text_helper_test.rb @@ -304,6 +304,7 @@ class TextHelperTest < ActionView::TestCase assert_equal %(<p>Link #{link_result_with_options}</p>), auto_link("<p>Link #{link_raw}</p>", :all, {:target => "_blank"}) assert_equal %(Go to #{link_result}.), auto_link(%(Go to #{link_raw}.)) assert_equal %(<p>Go to #{link_result}, then say hello to #{email_result}.</p>), auto_link(%(<p>Go to #{link_raw}, then say hello to #{email_raw}.</p>)) + assert_equal %(#{link_result} #{link_result}), auto_link(%(#{link_result} #{link_raw})) email2_raw = '+david@loudthinking.com' email2_result = %{<a href="mailto:#{email2_raw}">#{email2_raw}</a>} @@ -376,24 +377,38 @@ class TextHelperTest < ActionView::TestCase end def test_auto_link_other_protocols - silence_warnings do - begin - old_re_value = ActionView::Helpers::TextHelper::AUTO_LINK_RE - ActionView::Helpers::TextHelper.const_set :AUTO_LINK_RE, %r{(ftp://)[^\s<]+} - link_raw = 'ftp://example.com/file.txt' - link_result = generate_result(link_raw) - assert_equal %(Download #{link_result}), auto_link("Download #{link_raw}") - ensure - ActionView::Helpers::TextHelper.const_set :AUTO_LINK_RE, old_re_value - end - end + ftp_raw = 'ftp://example.com/file.txt' + assert_equal %(Download #{generate_result(ftp_raw)}), auto_link("Download #{ftp_raw}") + + file_scheme = 'file:///home/username/RomeoAndJuliet.pdf' + z39_scheme = 'z39.50r://host:696/db' + chrome_scheme = 'chrome://package/section/path' + view_source = 'view-source:http://en.wikipedia.org/wiki/URI_scheme' + assert_equal generate_result(z39_scheme), auto_link(z39_scheme) + assert_equal generate_result(chrome_scheme), auto_link(chrome_scheme) + assert_equal generate_result(view_source), auto_link(view_source) end def test_auto_link_already_linked linked1 = generate_result('Ruby On Rails', 'http://www.rubyonrails.com') - linked2 = generate_result('www.rubyonrails.com', 'http://www.rubyonrails.com') + linked2 = %('<a href="http://www.example.com">www.example.com</a>') + linked3 = %('<a href="http://www.example.com" rel="nofollow">www.example.com</a>') + linked4 = %('<a href="http://www.example.com"><b>www.example.com</b></a>') + linked5 = %('<a href="#close">close</a> <a href="http://www.example.com"><b>www.example.com</b></a>') assert_equal linked1, auto_link(linked1) assert_equal linked2, auto_link(linked2) + assert_equal linked3, auto_link(linked3) + assert_equal linked4, auto_link(linked4) + assert_equal linked5, auto_link(linked5) + + linked_email = %Q(<a href="mailto:david@loudthinking.com">Mail me</a>) + assert_equal linked_email, auto_link(linked_email) + end + + def test_auto_link_within_tags + link_raw = 'http://www.rubyonrails.org/images/rails.png' + link_result = %Q(<img src="#{link_raw}" />) + assert_equal link_result, auto_link(link_result) end def test_auto_link_with_brackets @@ -413,12 +428,6 @@ class TextHelperTest < ActionView::TestCase assert_equal "{link: #{link3_result}}", auto_link("{link: #{link3_raw}}") end - def test_auto_link_in_tags - link_raw = 'http://www.rubyonrails.org/images/rails.png' - link_result = %Q(<img src="#{link_raw}" />) - assert_equal link_result, auto_link(link_result) - end - def test_auto_link_at_eol url1 = "http://api.rubyonrails.com/Foo.html" url2 = "http://www.ruby-doc.org/core/Bar.html" @@ -432,6 +441,19 @@ class TextHelperTest < ActionView::TestCase assert_equal %(<p><a href="#{url}">#{url[0...7]}...</a><br /><a href="mailto:#{email}">#{email[0...7]}...</a><br /></p>), auto_link("<p>#{url}<br />#{email}<br /></p>") { |url| truncate(url, :length => 10) } end + + def test_auto_link_with_block_with_html + pic = "http://example.com/pic.png" + url = "http://example.com/album?a&b=c" + + assert_equal %(My pic: <a href="#{pic}"><img src="#{pic}" width="160px"></a> -- full album here #{generate_result(url)}), auto_link("My pic: #{pic} -- full album here #{url}") { |link| + if link =~ /\.(jpg|gif|png|bmp|tif)$/i + raw %(<img src="#{link}" width="160px">) + else + link + end + } + end def test_auto_link_with_options_hash assert_dom_equal 'Welcome to my new blog at <a href="http://www.myblog.com/" class="menu" target="_blank">http://www.myblog.com/</a>. Please e-mail me at <a href="mailto:me@email.com" class="menu" target="_blank">me@email.com</a>.', diff --git a/actionpack/test/template/translation_helper_test.rb b/actionpack/test/template/translation_helper_test.rb index b382b5eb22..1be418a206 100644 --- a/actionpack/test/template/translation_helper_test.rb +++ b/actionpack/test/template/translation_helper_test.rb @@ -18,16 +18,9 @@ class TranslationHelperTest < ActiveSupport::TestCase assert_equal expected, translate(:foo) end - def test_translation_of_an_array - I18n.expects(:translate).with(["foo", "bar"], :raise => true).returns(["foo", "bar"]) - assert_equal "foobar", translate(["foo", "bar"]) - end - - def test_translation_of_an_array_with_html - expected = '<a href="#">foo</a><a href="#">bar</a>' - I18n.expects(:translate).with(["foo", "bar", "html"], :raise => true).returns(['<a href="#">foo</a>', '<a href="#">bar</a>']) - @view = ActionView::Base.new(ActionController::Base.view_paths, {}) - assert_equal expected, @view.render(:file => "test/array_translation") + def test_translation_returning_an_array + I18n.expects(:translate).with(:foo, :raise => true).returns(["foo", "bar"]) + assert_equal ["foo", "bar"], translate(:foo) end def test_delegates_localize_to_i18n @@ -43,9 +36,9 @@ class TranslationHelperTest < ActiveSupport::TestCase end def test_scoping_by_partial_of_an_array - I18n.expects(:translate).with("test.scoped_array_translation.foo.bar", :raise => true).returns(["foo", "bar"]) + I18n.expects(:translate).with("test.scoped_translation.foo.bar", :raise => true).returns(["foo", "bar"]) @view = ActionView::Base.new(ActionController::Base.view_paths, {}) - assert_equal "foobar", @view.render(:file => "test/scoped_array_translation") + assert_equal "foobar", @view.render(:file => "test/scoped_translation") end def test_translate_does_not_mark_plain_text_as_safe_html @@ -62,4 +55,9 @@ class TranslationHelperTest < ActiveSupport::TestCase I18n.expects(:translate).with("hello_html", :raise => true).returns("<a>Hello World</a>") assert translate("hello_html").html_safe? end + + def test_translation_returning_an_array_ignores_html_suffix + I18n.expects(:translate).with(:foo_html, :raise => true).returns(["foo", "bar"]) + assert_equal ["foo", "bar"], translate(:foo_html) + end end |