digestor_test.rb 5.2 KB
Newer Older
1 2 3 4
require 'abstract_unit'
require 'fileutils'

class FixtureTemplate
5
  attr_reader :source, :handler
6

7 8
  def initialize(template_path)
    @source = File.read(template_path)
9
    @handler = ActionView::Template.handler_for_extension(:erb)
10 11 12 13 14 15 16
  rescue Errno::ENOENT
    raise ActionView::MissingTemplate.new([], "", [], true, [])
  end
end

class FixtureFinder
  FIXTURES_DIR = "#{File.dirname(__FILE__)}/../fixtures/digestor"
17

18
  def find(logical_name, keys, partial, options)
19
    FixtureTemplate.new("digestor/#{partial ? logical_name.gsub(%r|/([^/]+)$|, '/_\1') : logical_name}.#{options[:formats].first}.erb")
20 21 22 23 24
  end
end

class TemplateDigestorTest < ActionView::TestCase
  def setup
25 26 27 28 29
    @cwd     = Dir.pwd
    @tmp_dir = Dir.mktmpdir

    FileUtils.cp_r FixtureFinder::FIXTURES_DIR, @tmp_dir
    Dir.chdir @tmp_dir
30
  end
31

32
  def teardown
33 34
    Dir.chdir @cwd
    FileUtils.rm_r @tmp_dir
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
    ActionView::Digestor.cache.clear
  end

  def test_top_level_change_reflected
    assert_digest_difference("messages/show") do
      change_template("messages/show")
    end
  end

  def test_explicit_dependency
    assert_digest_difference("messages/show") do
      change_template("messages/_message")
    end
  end

50 51 52 53 54 55
  def test_explicit_dependency_in_multiline_erb_tag
    assert_digest_difference("messages/show") do
      change_template("messages/_form")
    end
  end

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
  def test_second_level_dependency
    assert_digest_difference("messages/show") do
      change_template("comments/_comments")
    end
  end

  def test_second_level_dependency_within_same_directory
    assert_digest_difference("messages/show") do
      change_template("messages/_header")
    end
  end

  def test_third_level_dependency
    assert_digest_difference("messages/show") do
      change_template("comments/_comment")
    end
  end
73

74 75 76 77 78
  def test_directory_depth_dependency
    assert_digest_difference("level/below/index") do
      change_template("level/below/_header")
    end
  end
79 80 81 82 83 84 85

  def test_logging_of_missing_template
    assert_logged "Couldn't find template for digesting: messages/something_missing.html" do
      digest("messages/show")
    end
  end

86 87 88 89 90 91
  def test_logging_of_missing_template_ending_with_number
    assert_logged "Couldn't find template for digesting: messages/something_missing_1.html" do
      digest("messages/show")
    end
  end

92 93 94 95 96
  def test_nested_template_directory
    assert_digest_difference("messages/show") do
      change_template("messages/actions/_move")
    end
  end
97

98 99 100 101 102 103 104 105 106 107 108 109 110
  def test_dont_generate_a_digest_for_missing_templates
    assert_equal '', digest("nothing/there")
  end

  def test_collection_dependency
    assert_digest_difference("messages/index") do
      change_template("messages/_message")
    end

    assert_digest_difference("messages/index") do
      change_template("events/_event")
    end
  end
111

112 113 114 115 116 117
  def test_collection_derived_from_record_dependency
    assert_digest_difference("messages/show") do
      change_template("events/_event")
    end
  end

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
  def test_extra_whitespace_in_render_partial
    assert_digest_difference("messages/edit") do
      change_template("messages/_form")
    end
  end

  def test_extra_whitespace_in_render_named_partial
    assert_digest_difference("messages/edit") do
      change_template("messages/_header")
    end
  end

  def test_extra_whitespace_in_render_record
    assert_digest_difference("messages/edit") do
      change_template("messages/_message")
    end
  end

  def test_extra_whitespace_in_render_with_parenthesis
    assert_digest_difference("messages/edit") do
      change_template("events/_event")
    end
  end
141

142 143 144 145 146 147
  def test_old_style_hash_in_render_invocation
    assert_digest_difference("messages/edit") do
      change_template("comments/_comment")
    end
  end

J
Jamis Buck 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160 161
  def test_dependencies_via_options_results_in_different_digest
    digest_plain        = digest("comments/_comment")
    digest_fridge       = digest("comments/_comment", dependencies: ["fridge"])
    digest_phone        = digest("comments/_comment", dependencies: ["phone"])
    digest_fridge_phone = digest("comments/_comment", dependencies: ["fridge", "phone"])

    assert_not_equal digest_plain, digest_fridge
    assert_not_equal digest_plain, digest_phone
    assert_not_equal digest_plain, digest_fridge_phone
    assert_not_equal digest_fridge, digest_phone
    assert_not_equal digest_fridge, digest_fridge_phone
    assert_not_equal digest_phone, digest_fridge_phone
  end

162 163
  private
    def assert_logged(message)
164
      old_logger = ActionView::Base.logger
165
      log = StringIO.new
166
      ActionView::Base.logger = Logger.new(log)
167

168 169 170 171 172 173 174 175
      begin
        yield

        log.rewind
        assert_match message, log.read
      ensure
        ActionView::Base.logger = old_logger
      end
176 177 178 179 180 181 182 183 184 185 186
    end

    def assert_digest_difference(template_name)
      previous_digest = digest(template_name)
      ActionView::Digestor.cache.clear

      yield

      assert previous_digest != digest(template_name), "digest didn't change"
      ActionView::Digestor.cache.clear
    end
187

J
Jamis Buck 已提交
188 189
    def digest(template_name, options={})
      ActionView::Digestor.digest(template_name, :html, FixtureFinder.new, options)
190
    end
191

192
    def change_template(template_name)
193
      File.open("digestor/#{template_name}.html.erb", "w") do |f|
194 195 196 197
        f.write "\nTHIS WAS CHANGED!"
      end
    end
end