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)

This commit is contained in:
wycats
2010-04-03 02:30:06 -07:00
parent 13004d4f84
commit 3eb97531b8
14 changed files with 332 additions and 307 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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
# * <tt>:confirm => 'question?'</tt> - This will allow the unobtrusive JavaScript
# * <tt>:confirm => 'question?'</tt> - 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.
# * <tt>:method => symbol of HTTP verb</tt> - 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 <tt>post?</tt>, <tt>delete?</tt> or <tt>put?</tt>.
# * The +html_options+ will accept a hash of html attributes for the link tag.
# * <tt>:remote => true</tt> - 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+:
# * <tt>:method</tt> - Specifies the anchor name to be appended to the path.
# * <tt>:disabled</tt> - Specifies the anchor name to be appended to the path.
# * <tt>:confirm</tt> - This will use the unobtrusive JavaScript driver to
# * <tt>:confirm</tt> - 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.
# * <tt>:remote</tt> - If set to true, will allow the Unobtrusive JavaScript drivers to control the
# * <tt>:remote</tt> - 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
# # </form>"
#
#
# <%= 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...') %>
# # => "<form class='button-to' method='post' action='http://www.example.com' data-remote='true'>
# # <div>
@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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(%(<link href="http://www.example.com/collaboration/hieraki" rel="alternate" title="RSS" type="application/rss+xml" />), auto_discovery_link_tag)
assert_dom_equal(%(/collaboration/hieraki/javascripts/xmlhr.js), javascript_path("xmlhr"))

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
sortable_element("mylist", :url => { :action => "order" })
assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}, tag:'div'})\n//]]>\n</script>),
assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}, tag:'div'})\n//]]>\n</script>),
sortable_element("mylist", :tag => "div", :constraint => "horizontal", :url => { :action => "order" })
assert_dom_equal %|<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:['list1','list2'], onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>|,
assert_dom_equal %|<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:['list1','list2'], onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>|,
sortable_element("mylist", :containment => ['list1','list2'], :constraint => "horizontal", :url => { :action => "order" })
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:'list1', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nSortable.create(\"mylist\", {constraint:'horizontal', containment:'list1', onUpdate:function(){new Ajax.Request('http://www.example.com/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(\"mylist\")})}})\n//]]>\n</script>),
sortable_element("mylist", :containment => 'list1', :constraint => "horizontal", :url => { :action => "order" })
end
def test_draggable_element
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {})\n//]]>\n</script>),
draggable_element("product_13")
assert_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nnew Draggable(\"product_13\", {revert:true})\n//]]>\n</script>),
draggable_element("product_13", :revert => true)
end
def test_drop_receiving_element
assert_dom_equal %(<script type=\"text/javascript\">\n//<![CDATA[\nDroppables.add(\"droptarget1\", {onDrop:function(element){new Ajax.Request('http://www.example.com/', {asynchronous:true, evalScripts:true, parameters:'id=' + encodeURIComponent(element.id)})}})\n//]]>\n</script>),
drop_receiving_element("droptarget1")

View File

@@ -3,58 +3,73 @@ require 'abstract_unit'
require 'active_support/ordered_options'
require 'controller/fake_controllers'
class UrlHelperTest < ActionView::TestCase
class UrlHelperTest < ActiveSupport::TestCase
def setup
super
@controller = Class.new(BasicController) do
attr_accessor :url
def url_for(options)
url
end
end
# 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
@controller = @controller.new
@request = @controller.request = ActionDispatch::TestRequest.new
@controller.url = "http://www.example.com"
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
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&amp;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&amp;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&amp;c=d"
assert_equal "http://www.example.com?a=b&amp;c=d", url_for("http://www.example.com?a=b&amp;c=d")
assert_equal "/?a=b&amp;c=d", url_for("/?a=b&amp;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{<a href="/weblog/show">Test Link</a>}, link_to('Test Link', url))
assert_dom_equal(%q{<a href="/">Test Link</a>}, 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{<a href="http://www.example.com/weblog/show">Test Link</a>}, link_to('Test Link', url))
hash = hash_for(:host => "www.example.com")
expected = %q{<a href="http://www.example.com/">Test Link</a>}
assert_dom_equal(expected, link_to('Test Link', hash))
end
def test_link_tag_with_query
assert_dom_equal "<a href=\"http://www.example.com?q1=v1&amp;q2=v2\">Hello</a>", link_to("Hello", "http://www.example.com?q1=v1&amp;q2=v2")
expected = %{<a href="http://www.example.com?q1=v1&amp;q2=v2">Hello</a>}
assert_dom_equal expected, link_to("Hello", "http://www.example.com?q1=v1&amp;q2=v2")
end
def test_link_tag_with_query_and_no_name
assert_dom_equal "<a href=\"http://www.example.com?q1=v1&amp;q2=v2\">http://www.example.com?q1=v1&amp;q2=v2</a>", link_to(nil, "http://www.example.com?q1=v1&amp;q2=v2")
link = link_to(nil, "http://www.example.com?q1=v1&amp;q2=v2")
expected = %{<a href="http://www.example.com?q1=v1&amp;q2=v2">http://www.example.com?q1=v1&amp;q2=v2</a>}
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 "<a href=\"http://www.example.com/referer\">go back</a>", link_to('go back', :back)
env = {"HTTP_REFERER" => "http://www.example.com/referer"}
@controller = Struct.new(:request).new(Struct.new(:env).new(env))
expected = %{<a href="#{env["HTTP_REFERER"]}">go back</a>}
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 "<a href=\"javascript:history.back()\">go back</a>", 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 "<a href=\"http://www.example.com/referer\">go back</a>", 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 "<a href=\"javascript:history.back()\">go back</a>", link_to('go back', :back)
@controller = Struct.new(:request).new(Struct.new(:env).new({}))
link = link_to('go back', :back)
assert_dom_equal %{<a href="javascript:history.back()">go back</a>}, link
end
def test_link_tag_with_img
assert_dom_equal "<a href=\"http://www.example.com\"><img src='/favicon.jpg' alt=\"Favicon\" /></a>", link_to(image_tag("/favicon.jpg"), "http://www.example.com")
link = link_to("<img src='/favicon.jpg' />".html_safe, "/")
expected = %{<a href="/"><img src='/favicon.jpg' /></a>}
assert_dom_equal expected, link
end
def test_link_with_nil_html_options
assert_dom_equal "<a href=\"http://www.example.com\">Hello</a>", link_to("Hello", {:action => 'myaction'}, nil)
link = link_to("Hello", url_hash, nil)
assert_dom_equal %{<a href="/">Hello</a>}, link
end
def test_link_tag_with_custom_onclick
assert_dom_equal "<a href=\"http://www.example.com\" onclick=\"alert('yay!')\">Hello</a>", link_to("Hello", "http://www.example.com", :onclick => "alert('yay!')")
link = link_to("Hello", "http://www.example.com", :onclick => "alert('yay!')")
expected = %{<a href="http://www.example.com" onclick="alert('yay!')">Hello</a>}
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 '<a href="http://example.com">Example site</a>', output_buffer
out = render_erb %{<%= link_to('/') do %>Example site<% end %>}
assert_equal '<a href="/">Example site</a>', out
end
def test_link_to_unless
assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog")
assert_dom_equal "<a href=\"http://www.example.com\">Listing</a>", 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 "<strong>Showing</strong>", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name, options, html_options|
"<strong>#{name}</strong>"
}
assert_equal "<strong>Showing</strong>", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name|
"<strong>#{name}</strong>"
}
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 %{<a href="/">Listing</a>},
link_to_unless(false, "Listing", url_hash)
assert_equal "Showing", link_to_unless(true, "Showing", url_hash)
assert_equal "<strong>Showing</strong>",
link_to_unless(true, "Showing", url_hash) { |name|
"<strong>#{name}</strong>"
}
assert_equal "<strong>Showing</strong>",
link_to_unless(true, "Showing", url_hash) { |name|
"<strong>#{name}</strong>"
}
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 "<a href=\"http://www.example.com\">Listing</a>", 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 %{<a href="/">Listing</a>}, 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&amp;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&amp;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 = request_for_url("/")
@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")
assert_equal "Showing",
link_to_unless_current("Showing", url_hash)
assert_equal "Showing",
link_to_unless_current("Showing", "http://www.example.com/")
@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 = request_for_url("/?order=desc")
@request.env['QUERY_STRING'] = 'order=desc'
@controller.url = "http://www.example.com/weblog/show?order=asc"
assert_equal "<a href=\"http://www.example.com/weblog/show?order=asc\">Showing</a>", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" })
assert_equal "<a href=\"http://www.example.com/weblog/show?order=asc\">Showing</a>", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=asc")
assert_equal "Showing",
link_to_unless_current("Showing", url_hash)
assert_equal "Showing",
link_to_unless_current("Showing", "http://www.example.com/")
@request.env['QUERY_STRING'] = 'order=desc&page=1'
@controller.url = "http://www.example.com/weblog/show?order=desc&page=2"
assert_equal "<a href=\"http://www.example.com/weblog/show?order=desc&page=2\">Showing</a>", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" })
assert_equal "<a href=\"http://www.example.com/weblog/show?order=desc&amp;page=2\">Showing</a>", link_to_unless_current("Showing", "http://www.example.com/weblog/show?order=desc&page=2")
@request = request_for_url("/?order=desc&page=1")
@request.env['QUERY_STRING'] = ''
@controller.url = "http://www.example.com/weblog/list"
assert_equal "<a href=\"http://www.example.com/weblog/list\">Listing</a>",
link_to_unless_current("Listing", :action => "list", :controller => "weblog")
assert_equal "<a href=\"http://www.example.com/weblog/list\">Listing</a>",
link_to_unless_current("Listing", "http://www.example.com/weblog/list")
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 %{<a href="/?order=asc">Showing</a>},
link_to_unless_current("Showing", hash_for(:order => :asc))
assert_equal %{<a href="http://www.example.com/?order=asc">Showing</a>},
link_to_unless_current("Showing", "http://www.example.com/?order=asc")
@request = request_for_url("/?order=desc")
assert_equal %{<a href="/?order=desc&page=2\">Showing</a>},
link_to_unless_current("Showing", hash_for(:order => "desc", :page => 2))
assert_equal %{<a href="http://www.example.com/?order=desc&amp;page=2">Showing</a>},
link_to_unless_current("Showing", "http://www.example.com/?order=desc&page=2")
@request = request_for_url("/show")
assert_equal %{<a href="/">Listing</a>},
link_to_unless_current("Listing", url_hash)
assert_equal %{<a href="http://www.example.com/">Listing</a>},
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 %(<a href="mailto:feedback@example.com"><img src="/feedback.png" /></a>), mail_to('feedback@example.com', '<img src="/feedback.png" />'.html_safe)
assert_dom_equal %(<a href="mailto:feedback@example.com"><img src="/feedback.png" /></a>),
mail_to('feedback@example.com', '<img src="/feedback.png" />'.html_safe)
end
def test_mail_to_with_hex
@@ -369,6 +389,7 @@ class UrlHelperTest < ActionView::TestCase
assert_dom_equal "<script type=\"text/javascript\">eval(decodeURIComponent('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%40%64%6f%6d%61%69%6e%2e%63%6f%6d%22%3e%6d%65%28%61%74%29%64%6f%6d%61%69%6e%28%64%6f%74%29%63%6f%6d%3c%2f%61%3e%27%29%3b'))</script>", 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 "<a href=\"/tasks\">tasks</a>\n" +
"<a href=\"#{@request.protocol}#{@request.host_with_port}/tasks\">tasks</a>",
@response.body
end
get :show, :id => 1
assert_equal "<a href=\"/tasks\">tasks</a>\n" +
"<a href=\"#{@request.protocol}#{@request.host_with_port}/tasks\">tasks</a>",
@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\n<a href=\"/workshops\">Workshop</a>", @response.body
end
get :index
assert_equal "/workshops\n<a href=\"/workshops\">Workshop</a>", @response.body
end
def test_existing_resource
@controller = WorkshopsController.new
with_restful_routing do
get :show, :id => 1
assert_equal "/workshops/1\n<a href=\"/workshops/1\">Workshop</a>", @response.body
end
get :show, :id => 1
assert_equal "/workshops/1\n<a href=\"/workshops/1\">Workshop</a>", @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\n<a href=\"/workshops/1/sessions\">Session</a>", @response.body
end
get :index, :workshop_id => 1
assert_equal "/workshops/1/sessions\n<a href=\"/workshops/1/sessions\">Session</a>", @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\n<a href=\"/workshops/1/sessions/1\">Session</a>", @response.body
end
get :show, :workshop_id => 1, :id => 1
assert_equal "/workshops/1/sessions/1\n<a href=\"/workshops/1/sessions/1\">Session</a>", @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