assets_test.rb 11.1 KB
Newer Older
1
require 'isolation/abstract_unit'
2
require 'active_support/core_ext/kernel/reporting'
3 4 5
require 'rack/test'

module ApplicationTests
6
  class AssetsTest < Test::Unit::TestCase
7 8 9 10
    include ActiveSupport::Testing::Isolation
    include Rack::Test::Methods

    def setup
11
      build_app(:initializers => true)
12 13 14
      boot_rails
    end

15 16 17 18
    def teardown
      teardown_app
    end

J
José Valim 已提交
19 20 21 22
    def app
      @app ||= Rails.application
    end

23 24 25 26 27 28 29 30 31
    test "assets routes have higher priority" do
      app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"

      app_file 'config/routes.rb', <<-RUBY
        AppTemplate::Application.routes.draw do
          match '*path', :to => lambda { |env| [200, { "Content-Type" => "text/html" }, "Not an asset"] }
        end
      RUBY

32 33
      require "#{app_path}/config/environment"

34 35 36
      get "/assets/demo.js"
      assert_match "alert()", last_response.body
    end
J
José Valim 已提交
37

J
José Valim 已提交
38 39
    test "assets do not require compressors until it is used" do
      app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"
40 41
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.compile = true"

J
José Valim 已提交
42 43 44 45 46 47 48 49 50
      ENV["RAILS_ENV"] = "production"
      require "#{app_path}/config/environment"

      assert !defined?(Uglifier)
      get "/assets/demo.js"
      assert_match "alert()", last_response.body
      assert defined?(Uglifier)
    end

S
Santiago Pastorino 已提交
51
    test "precompile creates the file, gives it the original asset's content and run in production as default" do
52
      app_file "app/assets/javascripts/application.js", "alert();"
53
      app_file "app/assets/javascripts/foo/application.js", "alert();"
54

55
      ENV["RAILS_ENV"] = nil
56 57 58
      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end
J
Jon Leighton 已提交
59 60
      files = Dir["#{app_path}/public/assets/application-*.js"]
      files << Dir["#{app_path}/public/assets/foo/application-*.js"].first
61 62
      files.each do |file|
        assert_not_nil file, "Expected application.js asset to be generated, but none found"
63
        assert_equal "alert()", File.read(file)
64
      end
65 66
    end

67 68 69 70 71 72 73 74 75
    test "asset pipeline should use a Sprockets::Index when config.assets.digest is true" do
      app_file "config/initializers/digest.rb", "Rails.application.config.assets.digest = true"
      app_file "config/initializers/caching.rb", "Rails.application.config.action_controller.perform_caching = false"
      ENV["RAILS_ENV"] = "production"
      require "#{app_path}/config/environment"

      assert_equal Sprockets::Index, Rails.application.assets.class
    end

76
    test "precompile creates a manifest file with all the assets listed" do
77 78
      app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
      app_file "app/assets/javascripts/application.js", "alert();"
79 80
      # digest is default in false, we must enable it for test environment
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.digest = true"
81 82 83 84 85 86 87 88

      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      manifest = "#{app_path}/public/assets/manifest.yml"

      assets = YAML.load_file(manifest)
89 90
      assert_match(/application-([0-z]+)\.js/, assets["application.js"])
      assert_match(/application-([0-z]+)\.css/, assets["application.css"])
91 92
    end

93 94 95 96 97
    test "precompile creates a manifest file in a custom path with all the assets listed" do
      app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
      app_file "app/assets/javascripts/application.js", "alert();"
      FileUtils.mkdir "#{app_path}/shared"
      app_file "config/initializers/manifest.rb", "Rails.application.config.assets.manifest = '#{app_path}/shared'"
98 99
      # digest is default in false, we must enable it for test environment
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.digest = true"
100 101 102 103 104 105 106 107

      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      manifest = "#{app_path}/shared/manifest.yml"

      assets = YAML.load_file(manifest)
108 109
      assert_match(/application-([0-z]+)\.js/, assets["application.js"])
      assert_match(/application-([0-z]+)\.css/, assets["application.css"])
110 111
    end

112

113 114 115
    test "the manifest file should be saved by default in the same assets folder" do
      app_file "app/assets/javascripts/application.js", "alert();"
      app_file "config/initializers/manifest.rb", "Rails.application.config.assets.prefix = '/x'"
116 117
      # digest is default in false, we must enable it for test environment
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.digest = true"
118 119 120 121 122 123 124

      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      manifest = "#{app_path}/public/x/manifest.yml"
      assets = YAML.load_file(manifest)
125
      assert_match(/application-([0-z]+)\.js/, assets["application.js"])
126 127
    end

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    test "precompile does not append asset digests when config.assets.digest is false" do
      app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
      app_file "app/assets/javascripts/application.js", "alert();"
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.digest = false"

      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      assert File.exists?("#{app_path}/public/assets/application.js")
      assert File.exists?("#{app_path}/public/assets/application.css")

      manifest = "#{app_path}/public/assets/manifest.yml"

      assets = YAML.load_file(manifest)
      assert_equal "application.js", assets["application.js"]
      assert_equal "application.css", assets["application.css"]
    end

147
    test "assets do not require any assets group gem when manifest file is present" do
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
      app_file "app/assets/javascripts/application.js", "alert();"

      ENV["RAILS_ENV"] = "production"
      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end
      manifest = "#{app_path}/public/assets/manifest.yml"
      assets = YAML.load_file(manifest)
      asset_path = assets["application.js"]

      require "#{app_path}/config/environment"

      # Checking if Uglifier is defined we can know if Sprockets was reached or not
      assert !defined?(Uglifier)
      get "/assets/#{asset_path}"
      assert_match "alert()", last_response.body
      assert !defined?(Uglifier)
    end

167
    test "assets raise AssetNotPrecompiledError when manifest file is present and requested file isn't precompiled" do
168 169 170 171 172 173 174 175 176
      app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'app' %>"

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

      ENV["RAILS_ENV"] = "production"
177 178 179 180 181 182 183
      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      # Create file after of precompile
      app_file "app/assets/javascripts/app.js", "alert();"

184 185 186 187
      require "#{app_path}/config/environment"
      class ::PostsController < ActionController::Base ; end

      get '/posts'
188
      assert_match(/AssetNotPrecompiledError/, last_response.body)
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
      assert_match(/app.js isn't precompiled/, last_response.body)
    end

    test "assets raise AssetNotPrecompiledError when manifest file is present and requested file isn't precompiled if digest is disabled" do
      app_file "app/views/posts/index.html.erb", "<%= javascript_include_tag 'app' %>"
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.compile = false"

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

      ENV["RAILS_ENV"] = "development"
      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile` }
      end

      # Create file after of precompile
      app_file "app/assets/javascripts/app.js", "alert();"

      require "#{app_path}/config/environment"
      class ::PostsController < ActionController::Base ; end

      get '/posts'
      assert_match(/AssetNotPrecompiledError/, last_response.body)
215
      assert_match(/app.js isn't precompiled/, last_response.body)
216 217
    end

218
    test "precompile appends the md5 hash to files referenced with asset_path and run in the provided RAILS_ENV" do
219
      app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
220 221
      # digest is default in false, we must enable it for test environment
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.digest = true"
222

223 224 225
      # capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:precompile RAILS_ENV=test` }
      # end
J
Jon Leighton 已提交
226
      file = Dir["#{app_path}/public/assets/application-*.css"].first
227
      assert_match(/\/assets\/rails-([0-z]+)\.png/, File.read(file))
228 229 230 231
    end

    test "precompile appends the md5 hash to files referenced with asset_path and run in production as default even using RAILS_GROUPS=assets" do
      app_file "app/assets/stylesheets/application.css.erb", "<%= asset_path('rails.png') %>"
232
      app_file "config/initializers/compile.rb", "Rails.application.config.assets.compile = true"
233 234

      ENV["RAILS_ENV"] = nil
235
      capture(:stdout) do
236
        Dir.chdir(app_path){ `bundle exec rake assets:precompile RAILS_GROUPS=assets` }
237
      end
J
Jon Leighton 已提交
238
      file = Dir["#{app_path}/public/assets/application-*.css"].first
239
      assert_match(/\/assets\/rails-([0-z]+)\.png/, File.read(file))
240 241
    end

242 243 244 245 246 247 248 249 250
    test "assets are cleaned up properly" do
      app_file "public/assets/application.js", "alert();"
      app_file "public/assets/application.css", "a { color: green; }"
      app_file "public/assets/subdir/broken.png", "not really an image file"

      capture(:stdout) do
        Dir.chdir(app_path){ `bundle exec rake assets:clean` }
      end

251
      files = Dir["#{app_path}/public/assets/**/*", "#{app_path}/tmp/cache/*"]
252 253 254
      assert_equal 0, files.length, "Expected no assets, but found #{files.join(', ')}"
    end

J
José Valim 已提交
255
    test "does not stream session cookies back" do
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
      app_file "app/assets/javascripts/demo.js.erb", "<%= :alert %>();"

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

      require "#{app_path}/config/environment"

      class ::OmgController < ActionController::Base
        def index
          flash[:cool_story] = true
          render :text => "ok"
        end
      end

      get "/omg"
      assert_equal 'ok', last_response.body

      get "/assets/demo.js"
      assert_match "alert()", last_response.body
      assert_equal nil, last_response.headers["Set-Cookie"]
J
José Valim 已提交
279
    end
280 281 282 283 284 285 286 287 288 289 290 291 292 293

    test "files in any assets/ directories are not added to Sprockets" do
      %w[app lib vendor].each do |dir|
        app_file "#{dir}/assets/#{dir}_test.erb", "testing"
      end

      app_file "app/assets/javascripts/demo.js", "alert();"

      require "#{app_path}/config/environment"

      get "/assets/demo.js"
      assert_match "alert();", last_response.body
      assert_equal 200, last_response.status
    end
294 295
  end
end