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