test/sass/importer_test.rb in sass-3.2.0.alpha.7 vs test/sass/importer_test.rb in sass-3.2.0.alpha.8
- old
+ new
@@ -1,9 +1,11 @@
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../test_helper'
require File.dirname(__FILE__) + '/test_helper'
+require 'sass/plugin'
+
class ImporterTest < Test::Unit::TestCase
class FruitImporter < Sass::Importers::Base
def find(name, context = nil)
if name =~ %r{fruits/(\w+)(\.s[ac]ss)?}
@@ -36,10 +38,76 @@
def extensions
{"sscs" => :scss, "ssas" => :sass}
end
end
+ # This importer maps one import to another import
+ # based on the mappings passed to importer's constructor.
+ class IndirectImporter < Sass::Importers::Base
+ def initialize(mappings, mtimes)
+ @mappings = mappings
+ @mtimes = mtimes
+ end
+ def find_relative(uri, base, options)
+ nil
+ end
+ def find(name, options)
+ if @mappings.has_key?(name)
+ Sass::Engine.new(
+ %Q[@import "#{@mappings[name]}";],
+ options.merge(
+ :filename => name,
+ :syntax => :scss,
+ :importer => self
+ )
+ )
+ end
+ end
+ def mtime(uri, options)
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
+ end
+ def key(uri, options)
+ [self.class.name, uri]
+ end
+ def to_s
+ "IndirectImporter(#{@mappings.keys.join(", ")})"
+ end
+ end
+
+ # This importer maps the import to single class
+ # based on the mappings passed to importer's constructor.
+ class ClassImporter < Sass::Importers::Base
+ def initialize(mappings, mtimes)
+ @mappings = mappings
+ @mtimes = mtimes
+ end
+ def find_relative(uri, base, options)
+ nil
+ end
+ def find(name, options)
+ if @mappings.has_key?(name)
+ Sass::Engine.new(
+ %Q[.#{name}{#{@mappings[name]}}],
+ options.merge(
+ :filename => name,
+ :syntax => :scss,
+ :importer => self
+ )
+ )
+ end
+ end
+ def mtime(uri, options)
+ @mtimes.fetch(uri, @mtimes.has_key?(uri) ? Time.now : nil)
+ end
+ def key(uri, options)
+ [self.class.name, uri]
+ end
+ def to_s
+ "ClassImporter(#{@mappings.keys.join(", ")})"
+ end
+ end
+
def test_can_resolve_generated_imports
scss_file = %Q{
$pear-color: green;
@import "fruits/apple"; @import "fruits/orange"; @import "fruits/pear";
.apple { @include apple; }
@@ -76,7 +144,42 @@
CSS
options = {:style => :compact, :load_paths => [ReversedExtImporter.new(absolutize("tmp"))], :syntax => :scss}
assert_equal css_file, Sass::Engine.new(scss_file, options).render
ensure
FileUtils.rm_rf(absolutize("tmp"))
+ end
+
+ def test_staleness_check_across_importers
+ file_system_importer = Sass::Importers::Filesystem.new(fixture_dir)
+ # Make sure the first import is older
+ indirect_importer = IndirectImporter.new({"apple" => "pear"}, {"apple" => Time.now - 1})
+ # Make css file is newer so the dependencies are the only way for the css file to be out of date.
+ FileUtils.touch(fixture_file("test_staleness_check_across_importers.css"))
+ # Make sure the first import is older
+ class_importer = ClassImporter.new({"pear" => %Q{color: green;}}, {"pear" => Time.now + 1})
+
+ options = {
+ :style => :compact,
+ :filename => fixture_file("test_staleness_check_across_importers.scss"),
+ :importer => file_system_importer,
+ :load_paths => [file_system_importer, indirect_importer, class_importer],
+ :syntax => :scss
+ }
+
+ assert_equal File.read(fixture_file("test_staleness_check_across_importers.css")),
+ Sass::Engine.new(File.read(fixture_file("test_staleness_check_across_importers.scss")), options).render
+
+ checker = Sass::Plugin::StalenessChecker.new(options)
+
+ assert checker.stylesheet_needs_update?(
+ fixture_file("test_staleness_check_across_importers.css"),
+ fixture_file("test_staleness_check_across_importers.scss"),
+ file_system_importer
+ )
+ end
+ def fixture_dir
+ File.join(File.dirname(__FILE__), "fixtures")
+ end
+ def fixture_file(path)
+ File.join(fixture_dir, path)
end
end