From 3eb97531b8650db5cc7b9558cc3828c56a526b6a Mon Sep 17 00:00:00 2001 From: wycats Date: Sat, 3 Apr 2010 02:30:06 -0700 Subject: Refactored url_for in AV to have its own instances of the helpers instead of proxying back to the controller. This potentially allows for more standalone usage of AV. It also kicked up a lot of dust in the tests, which were mocking out controllers to get this behavior. By moving it to the view, it made a lot of the tests more standalone (a win) --- actionpack/lib/action_view/base.rb | 7 +- actionpack/lib/action_view/helpers.rb | 9 +- actionpack/lib/action_view/helpers/form_helper.rb | 1 + actionpack/lib/action_view/helpers/url_helper.rb | 52 ++- actionpack/lib/action_view/test_case.rb | 7 +- actionpack/test/abstract_unit.rb | 20 + .../test/template/active_model_helper_test.rb | 9 +- actionpack/test/template/asset_tag_helper_test.rb | 26 +- actionpack/test/template/erb/helper.rb | 11 +- actionpack/test/template/form_helper_test.rb | 18 +- actionpack/test/template/form_tag_helper_test.rb | 14 +- actionpack/test/template/prototype_helper_test.rb | 25 +- .../test/template/scriptaculous_helper_test.rb | 33 +- actionpack/test/template/url_helper_test.rb | 419 ++++++++++----------- 14 files changed, 338 insertions(+), 313 deletions(-) (limited to 'actionpack') diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb index a9b0715b2e..fde61e9df9 100644 --- a/actionpack/lib/action_view/base.rb +++ b/actionpack/lib/action_view/base.rb @@ -168,6 +168,8 @@ module ActionView #:nodoc: remove_method :helpers attr_reader :helpers + class_attribute :_router + class << self delegate :erb_trim_mode=, :to => 'ActionView::Template::Handlers::ERB' delegate :logger, :to => 'ActionController::Base', :allow_nil => true @@ -204,7 +206,10 @@ module ActionView #:nodoc: @assigns = assigns_for_first_render.each { |key, value| instance_variable_set("@#{key}", value) } @helpers = self.class.helpers || Module.new - @_controller = controller + if @_controller = controller + @_request = controller.request if controller.respond_to?(:request) + end + @_config = ActiveSupport::InheritableOptions.new(controller.config) if controller && controller.respond_to?(:config) @_content_for = Hash.new { |h,k| h[k] = ActiveSupport::SafeBuffer.new } @_virtual_path = nil diff --git a/actionpack/lib/action_view/helpers.rb b/actionpack/lib/action_view/helpers.rb index a50c180f63..ba3bdd0d18 100644 --- a/actionpack/lib/action_view/helpers.rb +++ b/actionpack/lib/action_view/helpers.rb @@ -29,16 +29,13 @@ module ActionView #:nodoc: autoload :TranslationHelper autoload :UrlHelper - def self.included(base) - base.extend(ClassMethods) - end + extend ActiveSupport::Concern - module ClassMethods - include SanitizeHelper::ClassMethods + included do + extend SanitizeHelper::ClassMethods end include ActiveSupport::Benchmarkable - include ActiveModelHelper include AssetTagHelper include AtomFeedHelper diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 89560d0b49..6a14f0be9c 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -96,6 +96,7 @@ module ActionView extend ActiveSupport::Concern include FormTagHelper + include UrlHelper # Creates a form and a scope around a specific model object that is used # as a base for questioning about values for the fields. diff --git a/actionpack/lib/action_view/helpers/url_helper.rb b/actionpack/lib/action_view/helpers/url_helper.rb index b23d5fcb68..1415966869 100644 --- a/actionpack/lib/action_view/helpers/url_helper.rb +++ b/actionpack/lib/action_view/helpers/url_helper.rb @@ -13,14 +13,15 @@ module ActionView extend ActiveSupport::Concern include ActionDispatch::Routing::UrlFor - include JavaScriptHelper + include TagHelper # Need to map default url options to controller one. - def default_url_options(*args) #:nodoc: - controller.send(:default_url_options, *args) - end - + # def default_url_options(*args) #:nodoc: + # controller.send(:default_url_options, *args) + # end + # def url_options + return super unless controller.respond_to?(:url_options) controller.url_options end @@ -97,7 +98,7 @@ module ActionView when Hash options = { :only_path => options[:host].nil? }.update(options.symbolize_keys) escape = options.key?(:escape) ? options.delete(:escape) : false - controller.send(:url_for, options) + super when :back escape = false controller.request.env["HTTP_REFERER"] || 'javascript:history.back()' @@ -119,13 +120,24 @@ module ActionView # # ==== Signatures # - # link_to(name, options = {}, html_options = nil) - # link_to(options = {}, html_options = nil) do + # link_to(body, url, html_options = {}) + # # url is a String; you can use URL helpers like + # # posts_path + # + # link_to(body, url_options = {}, html_options = {}) + # # url_options, except :confirm or :method, + # # is passed to url_for + # + # link_to(options = {}, html_options = {}) do + # # name + # end + # + # link_to(url, html_options = {}) do # # name # end # # ==== Options - # * :confirm => 'question?' - This will allow the unobtrusive JavaScript + # * :confirm => 'question?' - This will allow the unobtrusive JavaScript # driver to prompt with the question specified. If the user accepts, the link is # processed normally, otherwise no action is taken. # * :method => symbol of HTTP verb - This modifier will dynamically @@ -138,7 +150,11 @@ module ActionView # disabled clicking the link will have no effect. If you are relying on the # POST behavior, you should check for it in your controller's action by using # the request object's methods for post?, delete? or put?. - # * The +html_options+ will accept a hash of html attributes for the link tag. + # * :remote => true - This will allow the unobtrusive JavaScript + # driver to make an Ajax request to the URL in question instead of following + # the link. The drivers each provide mechanisms for listening for the + # completion of the Ajax request and performing JavaScript operations once + # they're complete # # ==== Examples # Because it relies on +url_for+, +link_to+ supports both older-style controller/action/id arguments @@ -220,8 +236,8 @@ module ActionView options = args[1] || {} html_options = args[2] - url = url_for(options) html_options = convert_options_to_data_attributes(options, html_options) + url = url_for(options) if html_options html_options = html_options.stringify_keys @@ -259,10 +275,10 @@ module ActionView # There are a few special +html_options+: # * :method - Specifies the anchor name to be appended to the path. # * :disabled - Specifies the anchor name to be appended to the path. - # * :confirm - This will use the unobtrusive JavaScript driver to + # * :confirm - This will use the unobtrusive JavaScript driver to # prompt with the question specified. If the user accepts, the link is # processed normally, otherwise no action is taken. - # * :remote - If set to true, will allow the Unobtrusive JavaScript drivers to control the + # * :remote - If set to true, will allow the Unobtrusive JavaScript drivers to control the # submit behaviour. By default this behaviour is an ajax submit. # # ==== Examples @@ -282,7 +298,7 @@ module ActionView # # " # # - # <%= button_to('Destroy', 'http://www.example.com', :confirm => 'Are you sure?', + # <%= button_to('Destroy', 'http://www.example.com', :confirm => 'Are you sure?', # :method => "delete", :remote => true, :disable_with => 'loading...') %> # # => "
# #
@@ -546,8 +562,14 @@ module ActionView # current_page?(:controller => 'library', :action => 'checkout') # # => false def current_page?(options) + unless request + raise "You cannot use helpers that need to determine the current " \ + "page unless your view context provides a Request object " \ + "in a #request method" + end + url_string = CGI.unescapeHTML(url_for(options)) - request = controller.request + # We ignore any extra parameters in the request_uri if the # submitted url doesn't have any either. This lets the function # work with things like ?order=asc diff --git a/actionpack/lib/action_view/test_case.rb b/actionpack/lib/action_view/test_case.rb index 23b0c6e121..ddea9cfd92 100644 --- a/actionpack/lib/action_view/test_case.rb +++ b/actionpack/lib/action_view/test_case.rb @@ -142,8 +142,13 @@ module ActionView end end + def _router + @controller._router if @controller.respond_to?(:_router) + end + def method_missing(selector, *args) - if @controller._router.named_routes.helpers.include?(selector) + if @controller.respond_to?(:_router) && + @controller._router.named_routes.helpers.include?(selector) @controller.__send__(selector, *args) else super diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 143491a640..fe78b8ec1f 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -57,6 +57,18 @@ module RackTestUtils extend self end +module RenderERBUtils + def render_erb(string) + template = ActionView::Template.new( + string.strip, + "test template", + ActionView::Template::Handlers::ERB, + {}) + + template.render(self, {}).strip + end +end + module SetupOnce extend ActiveSupport::Concern @@ -225,6 +237,14 @@ class Rack::TestCase < ActionController::IntegrationTest end end +class ActionController::Base + def self.test_routes(&block) + router = ActionDispatch::Routing::RouteSet.new + router.draw(&block) + include router.url_helpers + end +end + class ::ApplicationController < ActionController::Base end diff --git a/actionpack/test/template/active_model_helper_test.rb b/actionpack/test/template/active_model_helper_test.rb index 1a5316a689..47eb620f7a 100644 --- a/actionpack/test/template/active_model_helper_test.rb +++ b/actionpack/test/template/active_model_helper_test.rb @@ -118,13 +118,12 @@ class ActiveModelHelperTest < ActionView::TestCase setup_user @response = ActionController::TestResponse.new + end - @controller = Object.new - def @controller.url_for(options) - options = options.symbolize_keys + def url_for(options) + options = options.symbolize_keys - [options[:action], options[:id].to_param].compact.join('/') - end + [options[:action], options[:id].to_param].compact.join('/') end def test_generic_input_tag diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb index fbd504ae7d..223a430f92 100644 --- a/actionpack/test/template/asset_tag_helper_test.rb +++ b/actionpack/test/template/asset_tag_helper_test.rb @@ -34,9 +34,7 @@ class AssetTagHelperTest < ActionView::TestCase ) end - @controller = Class.new(BasicController) do - def url_for(*args) "http://www.example.com" end - end.new + @controller = BasicController.new @request = Class.new do def protocol() 'http://' end @@ -49,6 +47,10 @@ class AssetTagHelperTest < ActionView::TestCase ActionView::Helpers::AssetTagHelper::reset_javascript_include_default end + def url_for(*args) + "http://www.example.com" + end + def teardown config.perform_caching = false ENV.delete('RAILS_ASSET_ID') @@ -893,25 +895,19 @@ class AssetTagHelperNonVhostTest < ActionView::TestCase def setup super - @controller = Class.new(BasicController) do - def url_for(options) - "http://www.example.com/collaboration/hieraki" - end - end.new - + @controller = BasicController.new @controller.config.relative_url_root = "/collaboration/hieraki" - @request = Class.new do - def protocol - 'gopher://' - end - end.new - + @request = Struct.new(:protocol).new("gopher://") @controller.request = @request ActionView::Helpers::AssetTagHelper::reset_javascript_include_default end + def url_for(options) + "http://www.example.com/collaboration/hieraki" + end + def test_should_compute_proper_path assert_dom_equal(%(), auto_discovery_link_tag) assert_dom_equal(%(/collaboration/hieraki/javascripts/xmlhr.js), javascript_path("xmlhr")) diff --git a/actionpack/test/template/erb/helper.rb b/actionpack/test/template/erb/helper.rb index 7147178849..799f9e4036 100644 --- a/actionpack/test/template/erb/helper.rb +++ b/actionpack/test/template/erb/helper.rb @@ -1,20 +1,13 @@ module ERBTest class ViewContext - mock_controller = Class.new do - include SharedTestRoutes.url_helpers - end - + include SharedTestRoutes.url_helpers include ActionView::Helpers::TagHelper include ActionView::Helpers::JavaScriptHelper include ActionView::Helpers::FormHelper - attr_accessor :output_buffer + attr_accessor :output_buffer, :controller def protect_against_forgery?() false end - - define_method(:controller) do - mock_controller.new - end end class BlockTestCase < ActiveSupport::TestCase diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb index 7c5ccfd6ed..4af38e52dd 100644 --- a/actionpack/test/template/form_helper_test.rb +++ b/actionpack/test/template/form_helper_test.rb @@ -63,15 +63,15 @@ class FormHelperTest < ActionView::TestCase @post.body = "Back to the hill and over it again!" @post.secret = 1 @post.written_on = Date.new(2004, 6, 15) + end - @controller = Class.new do - attr_reader :url_for_options - def url_for(options) - @url_for_options = options - "http://www.example.com" - end + def url_for(object) + @url_for_options = object + if object.is_a?(Hash) + "http://www.example.com" + else + super end - @controller = @controller.new end def test_label @@ -1348,8 +1348,8 @@ class FormHelperTest < ActionView::TestCase def test_form_for_with_hash_url_option form_for(:post, @post, :url => {:controller => 'controller', :action => 'action'}) do |f| end - assert_equal 'controller', @controller.url_for_options[:controller] - assert_equal 'action', @controller.url_for_options[:action] + assert_equal 'controller', @url_for_options[:controller] + assert_equal 'action', @url_for_options[:action] end def test_form_for_with_record_url_option diff --git a/actionpack/test/template/form_tag_helper_test.rb b/actionpack/test/template/form_tag_helper_test.rb index 1f26840289..3b8760351e 100644 --- a/actionpack/test/template/form_tag_helper_test.rb +++ b/actionpack/test/template/form_tag_helper_test.rb @@ -8,11 +8,15 @@ class FormTagHelperTest < ActionView::TestCase def setup super - @controller = Class.new(BasicController) do - def url_for(options) - "http://www.example.com" - end - end.new + @controller = BasicController.new + end + + def url_for(options) + if options.is_a?(Hash) + "http://www.example.com" + else + super + end end VALID_HTML_ID = /^[A-Za-z][-_:.A-Za-z0-9]*$/ # see http://www.w3.org/TR/html4/types.html#type-name diff --git a/actionpack/test/template/prototype_helper_test.rb b/actionpack/test/template/prototype_helper_test.rb index 619293dc43..0ff37f44c2 100644 --- a/actionpack/test/template/prototype_helper_test.rb +++ b/actionpack/test/template/prototype_helper_test.rb @@ -47,19 +47,18 @@ class PrototypeHelperBaseTest < ActionView::TestCase def setup super @template = self - @controller = Class.new do - def url_for(options) - if options.is_a?(String) - options - else - url = "http://www.example.com/" - url << options[:action].to_s if options and options[:action] - url << "?a=#{options[:a]}" if options && options[:a] - url << "&b=#{options[:b]}" if options && options[:a] && options[:b] - url - end - end - end.new + end + + def url_for(options) + if options.is_a?(String) + options + else + url = "http://www.example.com/" + url << options[:action].to_s if options and options[:action] + url << "?a=#{options[:a]}" if options && options[:a] + url << "&b=#{options[:b]}" if options && options[:a] && options[:b] + url + end end protected diff --git a/actionpack/test/template/scriptaculous_helper_test.rb b/actionpack/test/template/scriptaculous_helper_test.rb index bebc3cb9f4..233012bfdd 100644 --- a/actionpack/test/template/scriptaculous_helper_test.rb +++ b/actionpack/test/template/scriptaculous_helper_test.rb @@ -3,21 +3,16 @@ require 'abstract_unit' class ScriptaculousHelperTest < ActionView::TestCase tests ActionView::Helpers::ScriptaculousHelper - def setup - super - @controller = Class.new do - def url_for(options) - url = "http://www.example.com/" - url << options[:action].to_s if options and options[:action] - url - end - end.new + def url_for(options) + url = "http://www.example.com/" + url << options[:action].to_s if options and options[:action] + url end - + def test_effect assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, "posts") assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect("highlight", :posts) - assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, :posts) + assert_equal "new Effect.Highlight(\"posts\",{});", visual_effect(:highlight, :posts) assert_equal "new Effect.Fade(\"fademe\",{duration:4.0});", visual_effect(:fade, "fademe", :duration => 4.0) assert_equal "new Effect.Shake(element,{});", visual_effect(:shake) assert_equal "new Effect.DropOut(\"dropme\",{queue:'end'});", visual_effect(:drop_out, 'dropme', :queue => :end) @@ -43,7 +38,7 @@ class ScriptaculousHelperTest < ActionView::TestCase assert ve[2].include?("scope:'test'") assert ve[2].include?("position:'end'") end - + def test_toggle_effects assert_equal "Effect.toggle(\"posts\",'appear',{});", visual_effect(:toggle_appear, "posts") assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect(:toggle_slide, "posts") @@ -52,26 +47,26 @@ class ScriptaculousHelperTest < ActionView::TestCase assert_equal "Effect.toggle(\"posts\",'slide',{});", visual_effect("toggle_slide", "posts") assert_equal "Effect.toggle(\"posts\",'blind',{});", visual_effect("toggle_blind", "posts") end - + def test_sortable_element - assert_dom_equal %(), + assert_dom_equal %(), sortable_element("mylist", :url => { :action => "order" }) - assert_equal %(), + assert_equal %(), sortable_element("mylist", :tag => "div", :constraint => "horizontal", :url => { :action => "order" }) - assert_dom_equal %||, + assert_dom_equal %||, sortable_element("mylist", :containment => ['list1','list2'], :constraint => "horizontal", :url => { :action => "order" }) - assert_dom_equal %(), + assert_dom_equal %(), sortable_element("mylist", :containment => 'list1', :constraint => "horizontal", :url => { :action => "order" }) end - + def test_draggable_element assert_dom_equal %(), draggable_element("product_13") assert_equal %(), draggable_element("product_13", :revert => true) end - + def test_drop_receiving_element assert_dom_equal %(), drop_receiving_element("droptarget1") diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb index 87b2e59255..35e73fbf1e 100644 --- a/actionpack/test/template/url_helper_test.rb +++ b/actionpack/test/template/url_helper_test.rb @@ -3,58 +3,73 @@ require 'abstract_unit' require 'active_support/ordered_options' require 'controller/fake_controllers' -class UrlHelperTest < ActionView::TestCase - - def setup - super - @controller = Class.new(BasicController) do - attr_accessor :url - def url_for(options) - url - end - end +class UrlHelperTest < ActiveSupport::TestCase + + # In a few cases, the helper proxies to 'controller' + # or request. + # + # In those cases, we'll set up a simple mock + attr_accessor :controller, :request + + routes = ActionDispatch::Routing::RouteSet.new + routes.draw do + match "/" => "foo#bar" + match "/other" => "foo#other" + end + + include routes.url_helpers + + include ActionView::Helpers::UrlHelper + include ActionDispatch::Assertions::DomAssertions + include ActionView::Context + include RenderERBUtils + + # self.default_url_options = {:host => "www.example.com"} + + # TODO: This shouldn't be needed (see template.rb:53) + def assigns + {} + end - @controller = @controller.new - @request = @controller.request = ActionDispatch::TestRequest.new - @controller.url = "http://www.example.com" + def abcd(hash = {}) + hash_for(:a => :b, :c => :d).merge(hash) end + def hash_for(opts = {}) + {:controller => "foo", :action => "bar"}.merge(opts) + end + alias url_hash hash_for + def test_url_for_escapes_urls - @controller.url = "http://www.example.com?a=b&c=d" - assert_equal "http://www.example.com?a=b&c=d", url_for(:a => 'b', :c => 'd') - assert_equal "http://www.example.com?a=b&c=d", url_for(:a => 'b', :c => 'd', :escape => true) - assert_equal "http://www.example.com?a=b&c=d", url_for(:a => 'b', :c => 'd', :escape => false) + assert_equal "/?a=b&c=d", url_for(abcd) + assert_equal "/?a=b&c=d", url_for(abcd(:escape => true)) + assert_equal "/?a=b&c=d", url_for(abcd(:escape => false)) end def test_url_for_escaping_is_safety_aware - assert url_for(:a => 'b', :c => 'd', :escape => true).html_safe?, "escaped urls should be html_safe?" - assert !url_for(:a => 'b', :c => 'd', :escape => false).html_safe?, "non-escaped urls shouldn't be safe" + assert url_for(abcd(:escape => true)).html_safe?, "escaped urls should be html_safe?" + assert !url_for(abcd(:escape => false)).html_safe?, "non-escaped urls should not be html_safe?" end def test_url_for_escapes_url_once - @controller.url = "http://www.example.com?a=b&c=d" - assert_equal "http://www.example.com?a=b&c=d", url_for("http://www.example.com?a=b&c=d") + assert_equal "/?a=b&c=d", url_for("/?a=b&c=d") end def test_url_for_with_back - @request.env['HTTP_REFERER'] = 'http://www.example.com/referer' + referer = 'http://www.example.com/referer' + @controller = Struct.new(:request).new(Struct.new(:env).new({"HTTP_REFERER" => referer})) + assert_equal 'http://www.example.com/referer', url_for(:back) end def test_url_for_with_back_and_no_referer - @request.env['HOST_NAME'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' + @controller = Struct.new(:request).new(Struct.new(:env).new({})) assert_equal 'javascript:history.back()', url_for(:back) end def test_url_for_from_hash_doesnt_escape_ampersand - @controller = TestController.new - @view = ActionView::Base.new - @view.controller = @controller - - path = @view.url_for(:controller => :cheeses, :foo => :bar, :baz => :quux) - - assert_equal '/cheeses?baz=quux&foo=bar', sort_query_string_params(path) + path = url_for(hash_for(:foo => :bar, :baz => :quux)) + assert_equal '/?baz=quux&foo=bar', sort_query_string_params(path) end # todo: missing test cases @@ -118,65 +133,54 @@ class UrlHelperTest < ActionView::TestCase end def test_link_tag_without_host_option - ActionController::Base.class_eval { attr_accessor :url } - url = {:controller => 'weblog', :action => 'show'} - @controller = ActionController::Base.new - @controller.request = ActionController::TestRequest.new - assert_dom_equal(%q{Test Link}, link_to('Test Link', url)) + assert_dom_equal(%q{Test Link}, link_to('Test Link', url_hash)) end def test_link_tag_with_host_option - ActionController::Base.class_eval { attr_accessor :url } - url = {:controller => 'weblog', :action => 'show', :host => 'www.example.com'} - @controller = ActionController::Base.new - @controller.request = ActionController::TestRequest.new - assert_dom_equal(%q{Test Link}, link_to('Test Link', url)) + hash = hash_for(:host => "www.example.com") + expected = %q{Test Link} + assert_dom_equal(expected, link_to('Test Link', hash)) end def test_link_tag_with_query - assert_dom_equal "Hello", link_to("Hello", "http://www.example.com?q1=v1&q2=v2") + expected = %{Hello} + assert_dom_equal expected, link_to("Hello", "http://www.example.com?q1=v1&q2=v2") end def test_link_tag_with_query_and_no_name - assert_dom_equal "http://www.example.com?q1=v1&q2=v2", link_to(nil, "http://www.example.com?q1=v1&q2=v2") + link = link_to(nil, "http://www.example.com?q1=v1&q2=v2") + expected = %{http://www.example.com?q1=v1&q2=v2} + assert_dom_equal expected, link end def test_link_tag_with_back - @request.env['HOST_NAME'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @request.env['HTTP_REFERER'] = 'http://www.example.com/referer' - assert_dom_equal "go back", link_to('go back', :back) + env = {"HTTP_REFERER" => "http://www.example.com/referer"} + @controller = Struct.new(:request).new(Struct.new(:env).new(env)) + expected = %{go back} + assert_dom_equal expected, link_to('go back', :back) end def test_link_tag_with_back_and_no_referer - @request.env['HOST_NAME'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - assert_dom_equal "go back", link_to('go back', :back) - end - - def test_link_tag_with_back - @request.env['HOST_NAME'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @request.env['HTTP_REFERER'] = 'http://www.example.com/referer' - assert_dom_equal "go back", link_to('go back', :back) - end - - def test_link_tag_with_back_and_no_referer - @request.env['HOST_NAME'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - assert_dom_equal "go back", link_to('go back', :back) + @controller = Struct.new(:request).new(Struct.new(:env).new({})) + link = link_to('go back', :back) + assert_dom_equal %{go back}, link end def test_link_tag_with_img - assert_dom_equal "\"Favicon\"", link_to(image_tag("/favicon.jpg"), "http://www.example.com") + link = link_to("".html_safe, "/") + expected = %{} + assert_dom_equal expected, link end def test_link_with_nil_html_options - assert_dom_equal "Hello", link_to("Hello", {:action => 'myaction'}, nil) + link = link_to("Hello", url_hash, nil) + assert_dom_equal %{Hello}, link end def test_link_tag_with_custom_onclick - assert_dom_equal "Hello", link_to("Hello", "http://www.example.com", :onclick => "alert('yay!')") + link = link_to("Hello", "http://www.example.com", :onclick => "alert('yay!')") + expected = %{Hello} + assert_dom_equal expected, link end def test_link_tag_with_javascript_confirm @@ -238,91 +242,106 @@ class UrlHelperTest < ActionView::TestCase end def test_link_tag_using_block_in_erb - output_buffer = link_to("http://example.com") { concat("Example site") } - assert_equal 'Example site', output_buffer + out = render_erb %{<%= link_to('/') do %>Example site<% end %>} + assert_equal 'Example site', out end def test_link_to_unless - assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog") - assert_dom_equal "Listing", link_to_unless(false, "Listing", :action => "list", :controller => "weblog") - assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) - assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name, options, html_options| - "#{name}" - } - assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name| - "#{name}" - } - assert_equal "test", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { - "test" - } + assert_equal "Showing", link_to_unless(true, "Showing", url_hash) + + assert_dom_equal %{Listing}, + link_to_unless(false, "Listing", url_hash) + + assert_equal "Showing", link_to_unless(true, "Showing", url_hash) + + assert_equal "Showing", + link_to_unless(true, "Showing", url_hash) { |name| + "#{name}" + } + + assert_equal "Showing", + link_to_unless(true, "Showing", url_hash) { |name| + "#{name}" + } + + assert_equal "test", + link_to_unless(true, "Showing", url_hash) { + "test" + } end def test_link_to_if - assert_equal "Showing", link_to_if(false, "Showing", :action => "show", :controller => "weblog") - assert_dom_equal "Listing", link_to_if(true, "Listing", :action => "list", :controller => "weblog") - assert_equal "Showing", link_to_if(false, "Showing", :action => "show", :controller => "weblog", :id => 1) + assert_equal "Showing", link_to_if(false, "Showing", url_hash) + assert_dom_equal %{Listing}, link_to_if(true, "Listing", url_hash) + assert_equal "Showing", link_to_if(false, "Showing", url_hash) + end + + def request_for_url(url) + env = Rack::MockRequest.env_for("http://www.example.com#{url}") + ActionDispatch::Request.new(env) end def test_current_page_with_simple_url - @request.env['HTTP_HOST'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @controller.url = "http://www.example.com/weblog/show" - assert current_page?({ :action => "show", :controller => "weblog" }) - assert current_page?("http://www.example.com/weblog/show") + @request = request_for_url("/") + assert current_page?(url_hash) + assert current_page?("http://www.example.com/") end def test_current_page_ignoring_params - @request.env['HTTP_HOST'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @request.env['QUERY_STRING'] = 'order=desc&page=1' - @controller.url = "http://www.example.com/weblog/show?order=desc&page=1" - assert current_page?({ :action => "show", :controller => "weblog" }) - assert current_page?("http://www.example.com/weblog/show") + @request = request_for_url("/?order=desc&page=1") + + assert current_page?(url_hash) + assert current_page?("http://www.example.com/") end def test_current_page_with_params_that_match - @request.env['HTTP_HOST'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @request.env['QUERY_STRING'] = 'order=desc&page=1' - @controller.url = "http://www.example.com/weblog/show?order=desc&page=1" - assert current_page?({ :action => "show", :controller => "weblog", :order => "desc", :page => "1" }) - assert current_page?("http://www.example.com/weblog/show?order=desc&page=1") + @request = request_for_url("/?order=desc&page=1") + + assert current_page?(hash_for(:order => "desc", :page => "1")) + assert current_page?("http://www.example.com/?order=desc&page=1") end def test_link_unless_current - @request.env['HTTP_HOST'] = 'www.example.com' - @request.env['PATH_INFO'] = '/weblog/show' - @controller.url = "http://www.example.com/weblog/show" - assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" }) - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show") - - @request.env['QUERY_STRING'] = 'order=desc' - @controller.url = "http://www.example.com/weblog/show" - assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" }) - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show") - - @request.env['QUERY_STRING'] = 'order=desc&page=1' - @controller.url = "http://www.example.com/weblog/show?order=desc&page=1" - assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog", :order=>'desc', :page=>'1' }) - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=desc&page=1") - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=desc&page=1") - - @request.env['QUERY_STRING'] = 'order=desc' - @controller.url = "http://www.example.com/weblog/show?order=asc" - assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" }) - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=asc") - - @request.env['QUERY_STRING'] = 'order=desc&page=1' - @controller.url = "http://www.example.com/weblog/show?order=desc&page=2" - assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" }) - assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=desc&page=2") - - @request.env['QUERY_STRING'] = '' - @controller.url = "http://www.example.com/weblog/list" - assert_equal "Listing", - link_to_unless_current("Listing", :action => "list", :controller => "weblog") - assert_equal "Listing", - link_to_unless_current("Listing", "http://www.example.com/weblog/list") + @request = request_for_url("/") + + assert_equal "Showing", + link_to_unless_current("Showing", url_hash) + assert_equal "Showing", + link_to_unless_current("Showing", "http://www.example.com/") + + @request = request_for_url("/?order=desc") + + assert_equal "Showing", + link_to_unless_current("Showing", url_hash) + assert_equal "Showing", + link_to_unless_current("Showing", "http://www.example.com/") + + @request = request_for_url("/?order=desc&page=1") + + assert_equal "Showing", + link_to_unless_current("Showing", hash_for(:order=>'desc', :page=>'1')) + assert_equal "Showing", + link_to_unless_current("Showing", "http://www.example.com/?order=desc&page=1") + + @request = request_for_url("/?order=desc") + + assert_equal %{Showing}, + link_to_unless_current("Showing", hash_for(:order => :asc)) + assert_equal %{Showing}, + link_to_unless_current("Showing", "http://www.example.com/?order=asc") + + @request = request_for_url("/?order=desc") + assert_equal %{Showing}, + link_to_unless_current("Showing", hash_for(:order => "desc", :page => 2)) + assert_equal %{Showing}, + link_to_unless_current("Showing", "http://www.example.com/?order=desc&page=2") + + @request = request_for_url("/show") + + assert_equal %{Listing}, + link_to_unless_current("Listing", url_hash) + assert_equal %{Listing}, + link_to_unless_current("Listing", "http://www.example.com/") end def test_mail_to @@ -352,7 +371,8 @@ class UrlHelperTest < ActionView::TestCase end def test_mail_to_with_img - assert_dom_equal %(), mail_to('feedback@example.com', ''.html_safe) + assert_dom_equal %(), + mail_to('feedback@example.com', ''.html_safe) end def test_mail_to_with_hex @@ -369,6 +389,7 @@ class UrlHelperTest < ActionView::TestCase assert_dom_equal "", mail_to("me@domain.com", nil, :encode => "javascript", :replace_at => "(at)", :replace_dot => "(dot)") end + # TODO: button_to looks at this ... why? def protect_against_forgery? false end @@ -383,6 +404,15 @@ end class UrlHelperControllerTest < ActionController::TestCase class UrlHelperController < ActionController::Base + test_routes do |map| + match 'url_helper_controller_test/url_helper/show_named_route', + :to => 'url_helper_controller_test/url_helper#show_named_route', + :as => :show_named_route + + map.connect ":controller/:action/:id" + # match "/:controller(/:action(/:id))" + end + def show_url_for render :inline => "<%= url_for :controller => 'url_helper_controller_test/url_helper', :action => 'show_url_for' %>" end @@ -406,17 +436,14 @@ class UrlHelperControllerTest < ActionController::TestCase end def test_named_route_url_shows_host_and_path - with_url_helper_routing do - get :show_named_route, :kind => 'url' - assert_equal 'http://test.host/url_helper_controller_test/url_helper/show_named_route', @response.body - end + get :show_named_route, :kind => 'url' + assert_equal 'http://test.host/url_helper_controller_test/url_helper/show_named_route', + @response.body end def test_named_route_path_shows_only_path - with_url_helper_routing do - get :show_named_route, :kind => 'path' - assert_equal '/url_helper_controller_test/url_helper/show_named_route', @response.body - end + get :show_named_route, :kind => 'path' + assert_equal '/url_helper_controller_test/url_helper/show_named_route', @response.body end def test_url_for_nil_returns_current_path @@ -431,24 +458,16 @@ class UrlHelperControllerTest < ActionController::TestCase end end - with_url_helper_routing do - get :show_named_route, :kind => 'url' - assert_equal 'http://testtwo.host/url_helper_controller_test/url_helper/show_named_route', @response.body - end + get :show_named_route, :kind => 'url' + assert_equal 'http://testtwo.host/url_helper_controller_test/url_helper/show_named_route', @response.body end - - protected - def with_url_helper_routing - with_routing do |set| - set.draw do |map| - match 'url_helper_controller_test/url_helper/show_named_route', :to => 'url_helper_controller_test/url_helper#show_named_route', :as => :show_named_route - end - yield - end - end end class TasksController < ActionController::Base + test_routes do + resources :tasks + end + def index render_default end @@ -468,36 +487,19 @@ class TasksController < ActionController::Base end class LinkToUnlessCurrentWithControllerTest < ActionController::TestCase - def setup - super - @controller = TasksController.new - end + tests TasksController def test_link_to_unless_current_to_current - with_restful_routing do - get :index - assert_equal "tasks\ntasks", @response.body - end + get :index + assert_equal "tasks\ntasks", @response.body end def test_link_to_unless_current_shows_link - with_restful_routing do - get :show, :id => 1 - assert_equal "tasks\n" + - "tasks", - @response.body - end + get :show, :id => 1 + assert_equal "tasks\n" + + "tasks", + @response.body end - - protected - def with_restful_routing - with_routing do |set| - set.draw do |map| - resources :tasks - end - yield - end - end end class Workshop @@ -537,6 +539,12 @@ class Session end class WorkshopsController < ActionController::Base + test_routes do + resources :workshops do + resources :sessions + end + end + def index @workshop = Workshop.new(nil) render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>" @@ -551,6 +559,12 @@ class WorkshopsController < ActionController::Base end class SessionsController < ActionController::Base + test_routes do + resources :workshops do + resources :sessions + end + end + def index @workshop = Workshop.new(params[:workshop_id]) @session = Session.new(nil) @@ -567,56 +581,31 @@ class SessionsController < ActionController::Base end class PolymorphicControllerTest < ActionController::TestCase - def setup - super - @response = ActionController::TestResponse.new - end - def test_new_resource @controller = WorkshopsController.new - with_restful_routing do - get :index - assert_equal "/workshops\nWorkshop", @response.body - end + get :index + assert_equal "/workshops\nWorkshop", @response.body end def test_existing_resource @controller = WorkshopsController.new - with_restful_routing do - get :show, :id => 1 - assert_equal "/workshops/1\nWorkshop", @response.body - end + get :show, :id => 1 + assert_equal "/workshops/1\nWorkshop", @response.body end def test_new_nested_resource @controller = SessionsController.new - with_restful_routing do - get :index, :workshop_id => 1 - assert_equal "/workshops/1/sessions\nSession", @response.body - end + get :index, :workshop_id => 1 + assert_equal "/workshops/1/sessions\nSession", @response.body end - + def test_existing_nested_resource @controller = SessionsController.new - - with_restful_routing do - get :show, :workshop_id => 1, :id => 1 - assert_equal "/workshops/1/sessions/1\nSession", @response.body - end + + get :show, :workshop_id => 1, :id => 1 + assert_equal "/workshops/1/sessions/1\nSession", @response.body end - - protected - def with_restful_routing - with_routing do |set| - set.draw do |map| - resources :workshops do - resources :sessions - end - end - yield - end - end end -- cgit v1.2.3