require File.dirname(__FILE__) + '/../../../../config/environment'
require 'test/unit'
require 'mocha'

class AssetPackagerTest < Test::Unit::TestCase
  include RailsAssetPackager
  
  def setup
    RailsAssetPackager::AssetPackage.asset_base_path    = "#{Rails.root}/vendor/plugins/asset_packager/test/assets"
    RailsAssetPackager::AssetPackage.asset_packages_yml = YAML.load_file("#{Rails.root}/vendor/plugins/asset_packager/test/asset_packages.yml")

    RailsAssetPackager::AssetPackage.any_instance.stubs(:log)
    RailsAssetPackager::AssetPackage.build_all
  end
  
  def teardown
    RailsAssetPackager::AssetPackage.delete_all
  end
  
  def test_find_by_type
    js_asset_packages = RailsAssetPackager::AssetPackage.find_by_type("javascripts")
    assert_equal 2, js_asset_packages.length
    assert_equal "base", js_asset_packages[0].target
    assert_equal ["prototype", "effects", "controls", "dragdrop"], js_asset_packages[0].sources
  end
  
  def test_find_by_target
    package = RailsAssetPackager::AssetPackage.find_by_target("javascripts", "base")
    assert_equal "base", package.target
    assert_equal ["prototype", "effects", "controls", "dragdrop"], package.sources
  end
  
  def test_find_by_source
    package = RailsAssetPackager::AssetPackage.find_by_source("javascripts", "controls")
    assert_equal "base", package.target
    assert_equal ["prototype", "effects", "controls", "dragdrop"], package.sources
  end
  
  def test_delete_and_build
    RailsAssetPackager::AssetPackage.delete_all
    js_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/javascripts").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.js/) }
    css_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/stylesheets").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.css/) }
    css_subdir_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/stylesheets/subdir").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.css/) }
    
    assert_equal 0, js_package_names.length
    assert_equal 0, css_package_names.length
    assert_equal 0, css_subdir_package_names.length

    RailsAssetPackager::AssetPackage.build_all
    js_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/javascripts").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.js/) }.sort
    css_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/stylesheets").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.css/) }.sort
    css_subdir_package_names = Dir.new("#{RailsAssetPackager::AssetPackage.asset_base_path}/stylesheets/subdir").entries.delete_if { |x| ! (x =~ /\A\w+_packaged.css/) }.sort
    
    assert_equal 2, js_package_names.length
    assert_equal 2, css_package_names.length
    assert_equal 1, css_subdir_package_names.length
    assert js_package_names[0].match(/\Abase_packaged.js\z/)
    assert js_package_names[1].match(/\Asecondary_packaged.js\z/)
    assert css_package_names[0].match(/\Abase_packaged.css\z/)
    assert css_package_names[1].match(/\Asecondary_packaged.css\z/)
    assert css_subdir_package_names[0].match(/\Astyles_packaged.css\z/)
  end
  
  def test_js_names_from_sources
    package_names = RailsAssetPackager::AssetPackage.targets_from_sources("javascripts", ["prototype", "effects", "noexist1", "controls", "foo", "noexist2"])
    assert_equal 4, package_names.length
    assert package_names[0].match(/\Abase_packaged\z/)
    assert_equal package_names[1], "noexist1"
    assert package_names[2].match(/\Asecondary_packaged\z/)
    assert_equal package_names[3], "noexist2"
  end
  
  def test_css_names_from_sources
    package_names = RailsAssetPackager::AssetPackage.targets_from_sources("stylesheets", ["header", "screen", "noexist1", "foo", "noexist2"])
    assert_equal 4, package_names.length
    assert package_names[0].match(/\Abase_packaged\z/)
    assert_equal package_names[1], "noexist1"
    assert package_names[2].match(/\Asecondary_packaged\z/)
    assert_equal package_names[3], "noexist2"
  end
  
  def test_should_return_merge_environments_when_set
    RailsAssetPackager::AssetPackage.merge_environments = ["staging", "production"]
    assert_equal ["staging", "production"], RailsAssetPackager::AssetPackage.merge_environments
  end

  def test_should_only_return_production_merge_environment_when_not_set
    assert_equal ["production"], RailsAssetPackager::AssetPackage.merge_environments
  end
  
end