aboutsummaryrefslogblamecommitdiffstats
path: root/actionpack/test/dispatch/routing/inspector_test.rb
blob: 4f97d28d2b03ee592546edb6919a2cdc4d8a6031 (plain) (tree)
1
2
3
4
5
6
7
8
9
                       




                                           
                                                       

                                                    







                                                             
                                    
                         

                                                                                                     

         







                                                                            

                                            
                          











                                                           

                                                                          

                                                                          

                                     
                                              
                 





                                         




                                                          





                                                           




                                                                          





                                                   


                                                                               






                                                                             

                                                                             





                                              




                                                      





                                                        




                                                                 





                                                                    




                                                                         





                                                                                




                                                                                         





                                                                            




                                                                     





                                                                




                                                                       










                                                       




                                                                        



                                                                                    
                     









                                                



                                                                          
















                                                                                          





                                                                                         
         






                                         

                                                                                     







                                                                                         








                                                                                          


       
require 'abstract_unit'
require 'rails/engine'
require 'action_dispatch/routing/inspector'

module ActionDispatch
  module Routing
    class RoutesInspectorTest < ActiveSupport::TestCase
      def setup
        @set = ActionDispatch::Routing::RouteSet.new
        app = ActiveSupport::OrderedOptions.new
        app.config = ActiveSupport::OrderedOptions.new
        app.config.assets = ActiveSupport::OrderedOptions.new
        app.config.assets.prefix = '/sprockets'
        Rails.stubs(:application).returns(app)
        Rails.stubs(:env).returns("development")
      end

      def draw(options = {}, &block)
        @set.draw(&block)
        inspector = ActionDispatch::Routing::RoutesInspector.new(@set.routes)
        inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, options[:filter]).split("\n")
      end

      def test_json_regexp_converter
        @set.draw do
          get '/cart', :to => 'cart#show'
        end
        route = ActionDispatch::Routing::RouteWrapper.new(@set.routes.first)
        assert_equal "^\\/cart(?:\\.([^\\/.?]+))?$", route.json_regexp
      end

      def test_displaying_routes_for_engines
        engine = Class.new(Rails::Engine) do
          def self.inspect
            "Blog::Engine"
          end
        end
        engine.routes.draw do
          get '/cart', :to => 'cart#show'
        end

        output = draw do
          get '/custom/assets', :to => 'custom_assets#show'
          mount engine => "/blog", :as => "blog"
        end

        assert_equal [
          "       Prefix Verb URI Pattern              Controller#Action",
          "custom_assets GET /custom/assets(.:format) custom_assets#show",
          "         blog     /blog                    Blog::Engine",
          "",
          "Routes for Blog::Engine:",
          "cart GET /cart(.:format) cart#show"
        ], output
      end

      def test_cart_inspect
        output = draw do
          get '/cart', :to => 'cart#show'
        end

        assert_equal [
          "Prefix Verb URI Pattern     Controller#Action",
          "cart GET /cart(.:format) cart#show"
        ], output
      end

      def test_inspect_shows_custom_assets
        output = draw do
          get '/custom/assets', :to => 'custom_assets#show'
        end

        assert_equal [
          "       Prefix Verb URI Pattern              Controller#Action",
          "custom_assets GET /custom/assets(.:format) custom_assets#show"
        ], output
      end

      def test_inspect_routes_shows_resources_route
        output = draw do
          resources :articles
        end

        assert_equal [
          "      Prefix Verb   URI Pattern                  Controller#Action",
          "    articles GET    /articles(.:format)          articles#index",
          "             POST   /articles(.:format)          articles#create",
          " new_article GET    /articles/new(.:format)      articles#new",
          "edit_article GET    /articles/:id/edit(.:format) articles#edit",
          "     article GET    /articles/:id(.:format)      articles#show",
          "             PATCH  /articles/:id(.:format)      articles#update",
          "             PUT    /articles/:id(.:format)      articles#update",
          "             DELETE /articles/:id(.:format)      articles#destroy"
        ], output
      end

      def test_inspect_routes_shows_root_route
        output = draw do
          root :to => 'pages#main'
        end

        assert_equal [
          "Prefix Verb URI Pattern Controller#Action",
          "root GET / pages#main"
        ], output
      end

      def test_inspect_routes_shows_dynamic_action_route
        output = draw do
          get 'api/:action' => 'api'
        end

        assert_equal [
          "Prefix Verb URI Pattern            Controller#Action",
          " GET /api/:action(.:format) api#:action"
        ], output
      end

      def test_inspect_routes_shows_controller_and_action_only_route
        output = draw do
          get ':controller/:action'
        end

        assert_equal [
          "Prefix Verb URI Pattern                    Controller#Action",
          " GET /:controller/:action(.:format) :controller#:action"
        ], output
      end

      def test_inspect_routes_shows_controller_and_action_route_with_constraints
        output = draw do
          get ':controller(/:action(/:id))', :id => /\d+/
        end

        assert_equal [
          "Prefix Verb URI Pattern                            Controller#Action",
          " GET /:controller(/:action(/:id))(.:format) :controller#:action {:id=>/\\d+/}"
        ], output
      end

      def test_rake_routes_shows_route_with_defaults
        output = draw do
          get 'photos/:id' => 'photos#show', :defaults => {:format => 'jpg'}
        end

        assert_equal [
          "Prefix Verb URI Pattern           Controller#Action",
          %Q[ GET /photos/:id(.:format) photos#show {:format=>"jpg"}]
        ], output
      end

      def test_rake_routes_shows_route_with_constraints
        output = draw do
          get 'photos/:id' => 'photos#show', :id => /[A-Z]\d{5}/
        end

        assert_equal [
          "Prefix Verb URI Pattern           Controller#Action",
          " GET /photos/:id(.:format) photos#show {:id=>/[A-Z]\\d{5}/}"
        ], output
      end

      class RackApp
        def self.call(env)
        end
      end

      def test_rake_routes_shows_route_with_rack_app
        output = draw do
          get 'foo/:id' => RackApp, :id => /[A-Z]\d{5}/
        end

        assert_equal [
          "Prefix Verb URI Pattern        Controller#Action",
          " GET /foo/:id(.:format) #{RackApp.name} {:id=>/[A-Z]\\d{5}/}"
        ], output
      end

      def test_rake_routes_shows_route_with_rack_app_nested_with_dynamic_constraints
        constraint = Class.new do
          def inspect
            "( my custom constraint )"
          end
        end

        output = draw do
          scope :constraint => constraint.new do
            mount RackApp => '/foo'
          end
        end

        assert_equal [
          "Prefix Verb URI Pattern Controller#Action",
          "  /foo #{RackApp.name} {:constraint=>( my custom constraint )}"
        ], output
      end

      def test_rake_routes_dont_show_app_mounted_in_assets_prefix
        output = draw do
          get '/sprockets' => RackApp
        end
        assert_no_match(/RackApp/, output.first)
        assert_no_match(/\/sprockets/, output.first)
      end

      def test_redirect
        output = draw do
          get "/foo"    => redirect("/foo/bar"), :constraints => { :subdomain => "admin" }
          get "/bar"    => redirect(path: "/foo/bar", status: 307)
          get "/foobar" => redirect{ "/foo/bar" }
        end

        assert_equal [
          "Prefix Verb URI Pattern       Controller#Action",
          "   foo GET /foo(.:format)    redirect(301, /foo/bar) {:subdomain=>\"admin\"}",
          "   bar GET /bar(.:format)    redirect(307, path: /foo/bar)",
          "foobar GET /foobar(.:format) redirect(301)"
        ], output
      end

      def test_routes_can_be_filtered
        output = draw(filter: 'posts') do
          resources :articles
          resources :posts
        end

        assert_equal ["   Prefix Verb   URI Pattern               Controller#Action",
                      "    posts GET    /posts(.:format)          posts#index",
                      "          POST   /posts(.:format)          posts#create",
                      " new_post GET    /posts/new(.:format)      posts#new",
                      "edit_post GET    /posts/:id/edit(.:format) posts#edit",
                      "     post GET    /posts/:id(.:format)      posts#show",
                      "          PATCH  /posts/:id(.:format)      posts#update",
                      "          PUT    /posts/:id(.:format)      posts#update",
                      "          DELETE /posts/:id(.:format)      posts#destroy"], output
      end

      def test_regression_route_with_controller_regexp
        output = draw do
          get ':controller(/:action)', controller: /api\/[^\/]+/, format: false
        end

        assert_equal ["Prefix Verb URI Pattern            Controller#Action",
                      " GET /:controller(/:action) (?-mix:api\\/[^\\/]+)#:action"], output
      end
    end
  end
end