aboutsummaryrefslogblamecommitdiffstats
path: root/railties/test/railties/shared_tests.rb
blob: 3eb79d57c8f85db43f22acd78328a1d6e34c4f87 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                                                 





















                                                                          








                                                                             
                                                                                                
                                                                           
                                                                                                             



                                                                      










                                                                     




                                                              
















                                                                                
                                                  
 



                                                                                        
                                                                                                 

                                                                 
                                                   
 
                                                                         
                                                                                                 

                                                                                       

                                                                    
                                                   

                                                                                


         
                                                
                

                                          

       
                                                       




                                                                     
                                                            




                                                                                          
                                         
















                                                                                     
                                                                             

















                                                                                     
                                             























                                                                                     
                                        


                                                  



                







                                                                       
                                        





















                                                                        
                                               












                                                                
                                        
































                                                 






















                                                                 
                            



                                                                              
                                             

                                         

                                             


                                                             
 
                                                   




                                    

                                                          
                                        
                             
                             
                                             
               



             

                                                                          









                                                     
                          



                                                                
                         








                                                         
                                                  















                                                       
   
module RailtiesTest
  # Holds tests shared between plugin and engines
  module SharedTests
    def boot_rails
      super
      require "#{app_path}/config/environment"
    end

    def app
      @app ||= Rails.application
    end

    def test_install_migrations_and_assets
      @plugin.write "public/javascripts/foo.js", "doSomething()"

      @plugin.write "db/migrate/1_create_users.rb", <<-RUBY
        class CreateUsers < ActiveRecord::Migration
        end
      RUBY

      app_file "db/migrate/1_create_sessions.rb", <<-RUBY
        class CreateSessions < ActiveRecord::Migration
        end
      RUBY

      add_to_config "ActiveRecord::Base.timestamped_migrations = false"

      Dir.chdir(app_path) do
        `rake bukkits:install`
        assert File.exists?("#{app_path}/db/migrate/2_create_users.rb")
        assert File.exists?(app_path("public/bukkits/javascripts/foo.js"))
      end
    end

    def test_copying_assets
      @plugin.write "public/javascripts/foo.js", "doSomething()"
      @plugin.write "public/stylesheets/foo.css", "h1 { font-size: 10000px }"
      @plugin.write "public/images/img.png", ""

      Dir.chdir(app_path) do
        `rake bukkits:install:assets --trace`

        assert File.exists?(app_path("public/bukkits/javascripts/foo.js"))
        assert_equal "doSomething()\n", File.read(app_path("public/bukkits/javascripts/foo.js"))
        assert File.exists?(app_path("public/bukkits/stylesheets/foo.css"))
        assert_equal "h1 { font-size: 10000px }\n", File.read(app_path("public/bukkits/stylesheets/foo.css"))
        assert File.exists?(app_path("public/bukkits/images/img.png"))
      end
    end

    def test_copying_migrations
      @plugin.write "db/migrate/1_create_users.rb", <<-RUBY
        class CreateUsers < ActiveRecord::Migration
        end
      RUBY

      @plugin.write "db/migrate/2_add_last_name_to_users.rb", <<-RUBY
        class AddLastNameToUsers < ActiveRecord::Migration
        end
      RUBY

      @plugin.write "db/migrate/3_create_sessions.rb", <<-RUBY
        class CreateSessions < ActiveRecord::Migration
        end
      RUBY

      app_file "db/migrate/1_create_sessions.rb", <<-RUBY
        class CreateSessions < ActiveRecord::Migration
        end
      RUBY

      yaffle = plugin "acts_as_yaffle", "::LEVEL = config.log_level" do |plugin|
        plugin.write "lib/acts_as_yaffle.rb", "class ActsAsYaffle; end"
      end

      yaffle.write "db/migrate/1_create_yaffles.rb", <<-RUBY
        class CreateYaffles < ActiveRecord::Migration
        end
      RUBY

      add_to_config "ActiveRecord::Base.timestamped_migrations = false"

      Dir.chdir(app_path) do
        output = `rake bukkits:install:migrations`

        assert File.exists?("#{app_path}/db/migrate/2_create_users.rb")
        assert File.exists?("#{app_path}/db/migrate/3_add_last_name_to_users.rb")
        assert_match /Copied migration 2_create_users.rb from bukkits/, output
        assert_match /Copied migration 3_add_last_name_to_users.rb from bukkits/, output
        assert_match /NOTE: Migration 3_create_sessions.rb from bukkits has been skipped/, output
        assert_equal 3, Dir["#{app_path}/db/migrate/*.rb"].length

        output = `rake railties:install:migrations`

        assert File.exists?("#{app_path}/db/migrate/4_create_yaffles.rb")
        assert_match /NOTE: Migration 3_create_sessions.rb from bukkits has been skipped/, output
        assert_match /Copied migration 4_create_yaffles.rb from acts_as_yaffle/, output
        assert_no_match /2_create_users/, output

        migrations_count = Dir["#{app_path}/db/migrate/*.rb"].length
        output = `rake railties:install:migrations`

        assert_equal migrations_count, Dir["#{app_path}/db/migrate/*.rb"].length
      end
    end

    def test_puts_its_lib_directory_on_load_path
      boot_rails
      require "another"
      assert_equal "Another", Another.name
    end

    def test_puts_its_models_directory_on_autoload_path
      @plugin.write "app/models/my_bukkit.rb", "class MyBukkit ; end"
      boot_rails
      assert_nothing_raised { MyBukkit }
    end

    def test_puts_its_controllers_directory_on_autoload_path
      @plugin.write "app/controllers/bukkit_controller.rb", "class BukkitController ; end"
      boot_rails
      assert_nothing_raised { BukkitController }
    end

    def test_adds_its_views_to_view_paths
      @plugin.write "app/controllers/bukkit_controller.rb", <<-RUBY
        class BukkitController < ActionController::Base
          def index
          end
        end
      RUBY

      @plugin.write "app/views/bukkit/index.html.erb", "Hello bukkits"

      boot_rails

      require "action_controller"
      require "rack/mock"
      response = BukkitController.action(:index).call(Rack::MockRequest.env_for("/"))
      assert_equal "Hello bukkits\n", response[2].body
    end

    def test_adds_its_views_to_view_paths_with_lower_proriority_than_app_ones
      @plugin.write "app/controllers/bukkit_controller.rb", <<-RUBY
        class BukkitController < ActionController::Base
          def index
          end
        end
      RUBY

      @plugin.write "app/views/bukkit/index.html.erb", "Hello bukkits"
      app_file "app/views/bukkit/index.html.erb", "Hi bukkits"

      boot_rails

      require "action_controller"
      require "rack/mock"
      response = BukkitController.action(:index).call(Rack::MockRequest.env_for("/"))
      assert_equal "Hi bukkits\n", response[2].body
    end

    def test_adds_helpers_to_controller_views
      @plugin.write "app/controllers/bukkit_controller.rb", <<-RUBY
        class BukkitController < ActionController::Base
          def index
          end
        end
      RUBY

      @plugin.write "app/helpers/bukkit_helper.rb", <<-RUBY
        module BukkitHelper
          def bukkits
            "bukkits"
          end
        end
      RUBY

      @plugin.write "app/views/bukkit/index.html.erb", "Hello <%= bukkits %>"

      boot_rails

      require "rack/mock"
      response = BukkitController.action(:index).call(Rack::MockRequest.env_for("/"))
      assert_equal "Hello bukkits\n", response[2].body
    end

    def test_autoload_any_path_under_app
      @plugin.write "app/anything/foo.rb", <<-RUBY
        module Foo; end
      RUBY
      boot_rails
      assert Foo
    end

    def test_routes_are_added_to_router
      @plugin.write "config/routes.rb", <<-RUBY
        class Sprokkit
          def self.call(env)
            [200, {'Content-Type' => 'text/html'}, ["I am a Sprokkit"]]
          end
        end

        Rails.application.routes.draw do
          match "/sprokkit", :to => Sprokkit
        end
      RUBY

      boot_rails
      require 'rack/test'
      extend Rack::Test::Methods

      get "/sprokkit"
      assert_equal "I am a Sprokkit", last_response.body
    end

    def test_routes_in_plugins_have_lower_priority_than_application_ones
      controller "foo", <<-RUBY
        class FooController < ActionController::Base
          def index
            render :text => "foo"
          end
        end
      RUBY

      app_file "config/routes.rb", <<-RUBY
        AppTemplate::Application.routes.draw do
          match 'foo', :to => 'foo#index'
        end
      RUBY

      @plugin.write "app/controllers/bar_controller.rb", <<-RUBY
        class BarController < ActionController::Base
          def index
            render :text => "bar"
          end
        end
      RUBY

      @plugin.write "config/routes.rb", <<-RUBY
        Rails.application.routes.draw do
          match 'foo', :to => 'bar#index'
          match 'bar', :to => 'bar#index'
        end
      RUBY

      boot_rails
      require 'rack/test'
      extend Rack::Test::Methods

      get '/foo'
      assert_equal 'foo', last_response.body

      get '/bar'
      assert_equal 'bar', last_response.body
    end

    def test_rake_tasks_lib_tasks_are_loaded
      $executed = false
      @plugin.write "lib/tasks/foo.rake", <<-RUBY
        task :foo do
          $executed = true
        end
      RUBY

      boot_rails
      require 'rake'
      require 'rake/rdoctask'
      require 'rake/testtask'
      Rails.application.load_tasks
      Rake::Task[:foo].invoke
      assert $executed
    end

    def test_i18n_files_have_lower_priority_than_application_ones
      add_to_config <<-RUBY
        config.i18n.load_path << "#{app_path}/app/locales/en.yml"
      RUBY

      app_file 'app/locales/en.yml', <<-YAML
en:
  bar: "1"
YAML

      app_file 'config/locales/en.yml', <<-YAML
en:
  foo: "2"
  bar: "2"
YAML

      @plugin.write 'config/locales/en.yml', <<-YAML
en:
  foo: "3"
YAML

      boot_rails

      expected_locales = %W(
        #{RAILS_FRAMEWORK_ROOT}/activesupport/lib/active_support/locale/en.yml
        #{RAILS_FRAMEWORK_ROOT}/activemodel/lib/active_model/locale/en.yml
        #{RAILS_FRAMEWORK_ROOT}/activerecord/lib/active_record/locale/en.yml
        #{RAILS_FRAMEWORK_ROOT}/actionpack/lib/action_view/locale/en.yml
        #{@plugin.path}/config/locales/en.yml
        #{app_path}/config/locales/en.yml
        #{app_path}/app/locales/en.yml
      ).map { |path| File.expand_path(path) }

      actual_locales = I18n.load_path.map { |path|
        File.expand_path(path)
      } & expected_locales # remove locales external to Rails

      assert_equal expected_locales, actual_locales

      assert_equal "2", I18n.t(:foo)
      assert_equal "1", I18n.t(:bar)
    end

    def test_namespaced_controllers_with_namespaced_routes
      @plugin.write "config/routes.rb", <<-RUBY
        Rails.application.routes.draw do
          namespace :admin do
            namespace :foo do
              match "bar", :to => "bar#index"
            end
          end
        end
      RUBY

      @plugin.write "app/controllers/admin/foo/bar_controller.rb", <<-RUBY
        class Admin::Foo::BarController < ApplicationController
          def index
            render :text => "Rendered from namespace"
          end
        end
      RUBY

      boot_rails
      require 'rack/test'
      extend Rack::Test::Methods

      get "/admin/foo/bar"
      assert_equal 200, last_response.status
      assert_equal "Rendered from namespace", last_response.body
    end

    def test_initializers
      $plugin_initializer = false
      @plugin.write "config/initializers/foo.rb", <<-RUBY
        $plugin_initializer = true
      RUBY

      boot_rails
      assert $plugin_initializer
    end

    def test_midleware_referenced_in_configuration
      @plugin.write "lib/bukkits.rb", <<-RUBY
        class Bukkits
          def initialize(app)
            @app = app
          end

          def call(env)
            @app.call(env)
          end
        end
      RUBY

      add_to_config "config.middleware.use \"Bukkits\""
      boot_rails
    end
  end
end