require "abstract_unit" class TestDirectUrlHelpers < ActionDispatch::IntegrationTest class Linkable attr_reader :id def initialize(id) @id = id end def linkable_type self.class.name.demodulize.underscore end end class Category < Linkable; end class Collection < Linkable; end class Product < Linkable; end class Model extend ActiveModel::Naming include ActiveModel::Conversion attr_reader :id def initialize(id = nil) @id = id end remove_method :model_name def model_name @_model_name ||= ActiveModel::Name.new(self.class, nil, self.class.name.demodulize) end def persisted? false end end class Basket < Model; end class User < Model; end class Video < Model; end class Article attr_reader :id def self.name "Article" end def initialize(id) @id = id end end Routes = ActionDispatch::Routing::RouteSet.new Routes.draw do default_url_options host: "www.example.com" root to: "pages#index" get "/basket", to: "basket#show", as: :basket get "/posts/:id", to: "posts#show", as: :post get "/profile", to: "users#profile", as: :profile get "/media/:id", to: "media#show", as: :media resources :categories, :collections, :products namespace :admin do get "/dashboard", to: "dashboard#index" end direct(:website) { "http://www.rubyonrails.org" } direct("string") { "http://www.rubyonrails.org" } direct(:helper) { basket_url } direct(:linkable) { |linkable| [:"#{linkable.linkable_type}", { id: linkable.id }] } direct(:params) { |params| params } direct(:symbol) { :basket } direct(:hash) { { controller: "basket", action: "show" } } direct(:array) { [:admin, :dashboard] } direct(:options) { |options| [:products, options] } direct(:defaults, size: 10) { |options| [:products, options] } direct(class: "Article") { |article| [:post, { id: article.id }] } direct(class: "Basket") { |basket| [:basket] } direct(class: "User", anchor: "details") { |user, options| [:profile, options] } direct(class: "Video") { |video| [:media, { id: video.id }] } end APP = build_app Routes def app APP end include Routes.url_helpers def setup @category = Category.new("1") @collection = Collection.new("2") @product = Product.new("3") @basket = Basket.new @user = User.new @video = Video.new("4") @article = Article.new("5") @path_params = { "controller" => "pages", "action" => "index" } @unsafe_params = ActionController::Parameters.new(@path_params) @safe_params = ActionController::Parameters.new(@path_params).permit(:controller, :action) end def test_direct_paths assert_equal "http://www.rubyonrails.org", website_path assert_equal "http://www.rubyonrails.org", Routes.url_helpers.website_path assert_equal "http://www.rubyonrails.org", string_path assert_equal "http://www.rubyonrails.org", Routes.url_helpers.string_path assert_equal "http://www.example.com/basket", helper_url assert_equal "http://www.example.com/basket", Routes.url_helpers.helper_url assert_equal "/categories/1", linkable_path(@category) assert_equal "/categories/1", Routes.url_helpers.linkable_path(@category) assert_equal "/collections/2", linkable_path(@collection) assert_equal "/collections/2", Routes.url_helpers.linkable_path(@collection) assert_equal "/products/3", linkable_path(@product) assert_equal "/products/3", Routes.url_helpers.linkable_path(@product) assert_equal "/", params_path(@safe_params) assert_equal "/", Routes.url_helpers.params_path(@safe_params) assert_raises(ArgumentError) { params_path(@unsafe_params) } assert_raises(ArgumentError) { Routes.url_helpers.params_path(@unsafe_params) } assert_equal "/basket", symbol_path assert_equal "/basket", Routes.url_helpers.symbol_path assert_equal "/basket", hash_path assert_equal "/basket", Routes.url_helpers.hash_path assert_equal "/admin/dashboard", array_path assert_equal "/admin/dashboard", Routes.url_helpers.array_path assert_equal "/products?page=2", options_path(page: 2) assert_equal "/products?page=2", Routes.url_helpers.options_path(page: 2) assert_equal "/products?size=10", defaults_path assert_equal "/products?size=10", Routes.url_helpers.defaults_path assert_equal "/products?size=20", defaults_path(size: 20) assert_equal "/products?size=20", Routes.url_helpers.defaults_path(size: 20) assert_equal "/basket", polymorphic_path(@basket) assert_equal "/basket", Routes.url_helpers.polymorphic_path(@basket) assert_equal "/profile#details", polymorphic_path(@user) assert_equal "/profile#details", Routes.url_helpers.polymorphic_path(@user) assert_equal "/profile#password", polymorphic_path(@user, anchor: "password") assert_equal "/profile#password", Routes.url_helpers.polymorphic_path(@user, anchor: "password") assert_equal "/media/4", polymorphic_path(@video) assert_equal "/media/4", Routes.url_helpers.polymorphic_path(@video) assert_equal "/media/4", ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder.path.handle_model_call(self, @video) assert_equal "/posts/5", polymorphic_path(@article) assert_equal "/posts/5", Routes.url_helpers.polymorphic_path(@article) assert_equal "/posts/5", ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder.path.handle_model_call(self, @article) end def test_direct_urls assert_equal "http://www.rubyonrails.org", website_url assert_equal "http://www.rubyonrails.org", Routes.url_helpers.website_url assert_equal "http://www.rubyonrails.org", string_url assert_equal "http://www.rubyonrails.org", Routes.url_helpers.string_url assert_equal "http://www.example.com/basket", helper_url assert_equal "http://www.example.com/basket", Routes.url_helpers.helper_url assert_equal "http://www.example.com/categories/1", linkable_url(@category) assert_equal "http://www.example.com/categories/1", Routes.url_helpers.linkable_url(@category) assert_equal "http://www.example.com/collections/2", linkable_url(@collection) assert_equal "http://www.example.com/collections/2", Routes.url_helpers.linkable_url(@collection) assert_equal "http://www.example.com/products/3", linkable_url(@product) assert_equal "http://www.example.com/products/3", Routes.url_helpers.linkable_url(@product) assert_equal "http://www.example.com/", params_url(@safe_params) assert_equal "http://www.example.com/", Routes.url_helpers.params_url(@safe_params) assert_raises(ArgumentError) { params_url(@unsafe_params) } assert_raises(ArgumentError) { Routes.url_helpers.params_url(@unsafe_params) } assert_equal "http://www.example.com/basket", symbol_url assert_equal "http://www.example.com/basket", Routes.url_helpers.symbol_url assert_equal "http://www.example.com/basket", hash_url assert_equal "http://www.example.com/basket", Routes.url_helpers.hash_url assert_equal "http://www.example.com/admin/dashboard", array_url assert_equal "http://www.example.com/admin/dashboard", Routes.url_helpers.array_url assert_equal "http://www.example.com/products?page=2", options_url(page: 2) assert_equal "http://www.example.com/products?page=2", Routes.url_helpers.options_url(page: 2) assert_equal "http://www.example.com/products?size=10", defaults_url assert_equal "http://www.example.com/products?size=10", Routes.url_helpers.defaults_url assert_equal "http://www.example.com/products?size=20", defaults_url(size: 20) assert_equal "http://www.example.com/products?size=20", Routes.url_helpers.defaults_url(size: 20) assert_equal "http://www.example.com/basket", polymorphic_url(@basket) assert_equal "http://www.example.com/basket", Routes.url_helpers.polymorphic_url(@basket) assert_equal "http://www.example.com/basket", polymorphic_url(@basket) assert_equal "http://www.example.com/basket", Routes.url_helpers.polymorphic_url(@basket) assert_equal "http://www.example.com/profile#details", polymorphic_url(@user) assert_equal "http://www.example.com/profile#details", Routes.url_helpers.polymorphic_url(@user) assert_equal "http://www.example.com/profile#password", polymorphic_url(@user, anchor: "password") assert_equal "http://www.example.com/profile#password", Routes.url_helpers.polymorphic_url(@user, anchor: "password") assert_equal "http://www.example.com/media/4", polymorphic_url(@video) assert_equal "http://www.example.com/media/4", Routes.url_helpers.polymorphic_url(@video) assert_equal "http://www.example.com/media/4", ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder.url.handle_model_call(self, @video) assert_equal "http://www.example.com/posts/5", polymorphic_url(@article) assert_equal "http://www.example.com/posts/5", Routes.url_helpers.polymorphic_url(@article) assert_equal "http://www.example.com/posts/5", ActionDispatch::Routing::PolymorphicRoutes::HelperMethodBuilder.url.handle_model_call(self, @article) end def test_raises_argument_error routes = ActionDispatch::Routing::RouteSet.new assert_raises ArgumentError do routes.draw do direct(1) { "http://www.rubyonrails.org" } end end end def test_missing_class_raises_argument_error routes = ActionDispatch::Routing::RouteSet.new assert_raises ArgumentError do routes.draw do direct(fragment: "core") { "http://www.rubyonrails.org" } end end end def test_defining_inside_a_scope_raises_runtime_error routes = ActionDispatch::Routing::RouteSet.new assert_raises RuntimeError do routes.draw do namespace :admin do direct(:rubyonrails) { "http://www.rubyonrails.org" } end end end end end