require 'abstract_unit'
require 'sprockets'
require 'sprockets/helpers/rails_helper'
require 'mocha'
class SprocketsHelperTest < ActionView::TestCase
tests Sprockets::Helpers::RailsHelper
attr_accessor :assets
def setup
super
@controller = BasicController.new
@request = Class.new do
def protocol() 'http://' end
def ssl?() false end
def host_with_port() 'localhost' end
end.new
@controller.request = @request
@assets = Sprockets::Environment.new
@assets.paths << FIXTURES.join("sprockets/app/javascripts")
@assets.paths << FIXTURES.join("sprockets/app/stylesheets")
@assets.paths << FIXTURES.join("sprockets/app/images")
application = Struct.new(:config, :assets).new(config, @assets)
Rails.stubs(:application).returns(application)
@config = config
@config.action_controller ||= ActiveSupport::InheritableOptions.new
@config.perform_caching = true
end
def url_for(*args)
"http://www.example.com"
end
test "asset_path" do
assert_equal "/assets/logo-9c0a079bdd7701d7e729bd956823d153.png",
asset_path("logo.png")
end
test "asset_path with root relative assets" do
assert_equal "/images/logo",
asset_path("/images/logo")
assert_equal "/images/logo.gif",
asset_path("/images/logo.gif")
assert_equal "/dir/audio",
asset_path("/dir/audio")
end
test "asset_path with absolute urls" do
assert_equal "http://www.example.com/video/play",
asset_path("http://www.example.com/video/play")
assert_equal "http://www.example.com/video/play.mp4",
asset_path("http://www.example.com/video/play.mp4")
end
test "with a simple asset host the url should default to protocol relative" do
@controller.config.asset_host = "assets-%d.example.com"
assert_match %r{//assets-\d.example.com/assets/logo-[0-9a-f]+.png},
asset_path("logo.png")
end
test "with a simple asset host the url can be changed to use the request protocol" do
@controller.config.asset_host = "assets-%d.example.com"
@controller.config.default_asset_host_protocol = :request
assert_match %r{http://assets-\d.example.com/assets/logo-[0-9a-f]+.png},
asset_path("logo.png")
end
test "With a proc asset host that returns no protocol the url should be protocol relative" do
@controller.config.asset_host = Proc.new do |asset|
"assets-999.example.com"
end
assert_match %r{//assets-999.example.com/assets/logo-[0-9a-f]+.png},
asset_path("logo.png")
end
test "with a proc asset host that returns a protocol the url use it" do
@controller.config.asset_host = Proc.new do |asset|
"http://assets-999.example.com"
end
assert_match %r{http://assets-999.example.com/assets/logo-[0-9a-f]+.png},
asset_path("logo.png")
end
test "stylesheets served with a controller in scope can access the request" do
config.asset_host = Proc.new do |asset, request|
assert_not_nil request
"http://assets-666.example.com"
end
assert_match %r{http://assets-666.example.com/assets/logo-[0-9a-f]+.png},
asset_path("logo.png")
end
test "stylesheets served without a controller in scope cannot access the request" do
remove_instance_variable("@controller")
@config.action_controller.asset_host = Proc.new do |asset, request|
fail "This should not have been called."
end
assert_raises ActionController::RoutingError do
asset_path("logo.png")
end
end
test "stylesheets served without a controller in do not use asset hosts when the default protocol is :request" do
remove_instance_variable("@controller")
@config.action_controller.asset_host = "assets-%d.example.com"
@config.action_controller.default_asset_host_protocol = :request
@config.action_controller.perform_caching = true
assert_equal "/assets/logo-9c0a079bdd7701d7e729bd956823d153.png",
asset_path("logo.png")
end
test "asset path with relative url root" do
@controller.config.relative_url_root = "/collaboration/hieraki"
assert_equal "/collaboration/hieraki/images/logo.gif",
asset_path("/images/logo.gif")
end
test "javascript path" do
assert_equal "/assets/application-d41d8cd98f00b204e9800998ecf8427e.js",
asset_path(:application, "js")
assert_equal "/assets/xmlhr-d41d8cd98f00b204e9800998ecf8427e.js",
asset_path("xmlhr", "js")
assert_equal "/assets/dir/xmlhr-d41d8cd98f00b204e9800998ecf8427e.js",
asset_path("dir/xmlhr.js", "js")
assert_equal "/dir/xmlhr.js",
asset_path("/dir/xmlhr", "js")
assert_equal "http://www.example.com/js/xmlhr",
asset_path("http://www.example.com/js/xmlhr", "js")
assert_equal "http://www.example.com/js/xmlhr.js",
asset_path("http://www.example.com/js/xmlhr.js", "js")
end
test "javascript include tag" do
assert_equal '',
javascript_include_tag(:application)
assert_equal '',
javascript_include_tag("xmlhr")
assert_equal '',
javascript_include_tag("xmlhr.js")
assert_equal '',
javascript_include_tag("http://www.example.com/xmlhr")
assert_equal "\n",
javascript_include_tag(:application, :debug => true)
assert_equal "\n",
javascript_include_tag("xmlhr", "extra")
end
test "stylesheet path" do
assert_equal "/assets/application-68b329da9893e34099c7d8ad5cb9c940.css", asset_path(:application, "css")
assert_equal "/assets/style-d41d8cd98f00b204e9800998ecf8427e.css", asset_path("style", "css")
assert_equal "/assets/dir/style-d41d8cd98f00b204e9800998ecf8427e.css", asset_path("dir/style.css", "css")
assert_equal "/dir/style.css", asset_path("/dir/style.css", "css")
assert_equal "http://www.example.com/css/style",
asset_path("http://www.example.com/css/style", "css")
assert_equal "http://www.example.com/css/style.css",
asset_path("http://www.example.com/css/style.css", "css")
end
test "stylesheet link tag" do
assert_equal '',
stylesheet_link_tag(:application)
assert_equal '',
stylesheet_link_tag("style")
assert_equal '',
stylesheet_link_tag("style.css")
assert_equal '',
stylesheet_link_tag("http://www.example.com/style.css")
assert_equal '',
stylesheet_link_tag("style", :media => "all")
assert_equal '',
stylesheet_link_tag("style", :media => "print")
assert_equal "\n",
stylesheet_link_tag(:application, :debug => true)
assert_equal "\n",
stylesheet_link_tag("style", "extra")
end
test "alternate asset prefix" do
stubs(:asset_prefix).returns("/themes/test")
assert_equal "/themes/test/style-d41d8cd98f00b204e9800998ecf8427e.css", asset_path("style", "css")
end
test "alternate asset environment" do
assets = Sprockets::Environment.new
assets.paths << FIXTURES.join("sprockets/alternate/stylesheets")
stubs(:asset_environment).returns(assets)
assert_equal "/assets/style-df0b97ad35a8e1f7f61097461f77c19a.css", asset_path("style", "css")
end
end