1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/test/dispatch/prefix_generation_test.rb

161 lines
4.9 KiB
Ruby

require 'abstract_unit'
module TestGenerationPrefix
class WithMountedEngine < ActionDispatch::IntegrationTest
require 'rack/test'
include Rack::Test::Methods
class BlogEngine
def self.routes
@routes ||= begin
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
match "/posts/:id", :to => "inside_engine_generating#index", :as => :post
match "/url_to_application", :to => "inside_engine_generating#url_to_application"
end
routes
end
end
def self.call(env)
env['action_dispatch.routes'] = routes
routes.call(env)
end
end
class RailsApplication
def self.routes
@routes ||= begin
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
scope "/:omg", :omg => "awesome" do
mount BlogEngine => "/blog"
end
match "/generate", :to => "outside_engine_generating#index"
root :to => "outside_engine_generating#index"
end
routes
end
end
def self.call(env)
env['action_dispatch.routes'] = routes
routes.call(env)
end
end
class ::InsideEngineGeneratingController < ActionController::Base
include BlogEngine.routes.url_helpers
def index
render :text => post_path(:id => params[:id])
end
def url_to_application
path = url_for( :routes => RailsApplication.routes,
:controller => "outside_engine_generating",
:action => "index",
:only_path => true)
render :text => path
end
end
class ::OutsideEngineGeneratingController < ActionController::Base
include BlogEngine.routes.url_helpers
def index
render :text => post_path(:id => 1)
end
end
class Foo
include ActionDispatch::Routing::UrlFor
include BlogEngine.routes.url_helpers
def foo
post_path(42)
end
end
class Bar
include ActionDispatch::Routing::UrlFor
include RailsApplication.routes.url_helpers
def bar
root_path
end
end
RailsApplication.routes # force draw
include BlogEngine.routes.url_helpers
def app
RailsApplication
end
def setup
RailsApplication.routes.default_url_options = {}
end
test "generating URL with prefix" do
assert_equal "/awesome/blog/posts/1", post_path(:id => 1)
end
test "use SCRIPT_NAME inside the engine" do
get "/pure-awesomness/blog/posts/1"
assert_equal "/pure-awesomness/blog/posts/1", last_response.body
end
test "prepend prefix outside the engine" do
get "/generate"
assert_equal "/awesome/blog/posts/1", last_response.body
end
test "prepend prefix outside the engine and use default_url_options[:script_name]" do
RailsApplication.routes.default_url_options = {:script_name => "/something"}
get "/generate"
assert_equal "/something/awesome/blog/posts/1", last_response.body
end
test "give higher priority to default_url_options[:script_name]" do
RailsApplication.routes.default_url_options = {:script_name => "/something"}
get "/generate", {}, 'SCRIPT_NAME' => "/foo"
assert_equal "/something/awesome/blog/posts/1", last_response.body
end
test "generating urls with options for prefix and named_route" do
assert_equal "/pure-awesomness/blog/posts/3", post_path(:id => 3, :omg => "pure-awesomness")
end
test "generating urls with url_for should prepend the prefix" do
path = BlogEngine.routes.url_for(:omg => 'omg', :controller => "inside_engine_generating", :action => "index", :id => 1, :only_path => true)
assert_equal "/omg/blog/posts/1", path
end
test "generating urls from a regular class" do
assert_equal "/awesome/blog/posts/42", Foo.new.foo
end
test "generating application's url from engine" do
get "/pure-awesomness/blog/url_to_application"
assert_equal "/generate", last_response.body
end
test "generating application's url from engine with default_url_options[:script_name]" do
RailsApplication.routes.default_url_options = {:script_name => "/something"}
get "/pure-awesomness/blog/url_to_application"
assert_equal "/something/generate", last_response.body
end
test "generating application's url from engine should give higher priority to default_url_options[:script_name]" do
RailsApplication.routes.default_url_options = {:script_name => "/something"}
get "/pure-awesomness/blog/url_to_application", {}, 'SCRIPT_NAME' => '/foo'
assert_equal "/something/generate", last_response.body
end
test "using default_url_options[:script_name] in regular classes" do
RailsApplication.routes.default_url_options = {:script_name => "/something"}
assert_equal "/something/", Bar.new.bar
end
end
end