aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/template/digestor_test.rb
blob: 067ab500f51e0413af50c9869186d4d504303605 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
require 'abstract_unit'
require 'fileutils'

class FixtureTemplate
  attr_reader :source
  
  def initialize(template_path)
    @source = File.read(template_path)
  rescue Errno::ENOENT
    raise ActionView::MissingTemplate.new([], "", [], true, [])
  end
end

class FixtureFinder
  FIXTURES_DIR = "#{File.dirname(__FILE__)}/../fixtures/digestor"
  TMP_DIR      = "#{File.dirname(__FILE__)}/../tmp"
  
  def find(logical_name, keys, partial, options)
    FixtureTemplate.new("#{TMP_DIR}/#{partial ? logical_name.gsub(%r|/([^/]+)$|, '/_\1') : logical_name}.#{options[:formats].first}.erb")
  end
end

class TemplateDigestorTest < ActionView::TestCase
  def setup
    FileUtils.cp_r FixtureFinder::FIXTURES_DIR, FixtureFinder::TMP_DIR
  end
  
  def teardown
    FileUtils.rm_r FixtureFinder::TMP_DIR
    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

  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

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

  def test_nested_template_directory
    assert_digest_difference("messages/show") do
      change_template("messages/actions/_move")
    end
  end
  
  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
  
  def test_collection_derived_from_record_dependency
    assert_digest_difference("messages/show") do
      change_template("events/_event")
    end
  end


  private
    def assert_logged(message)
      log = StringIO.new
      ActionView::Digestor.logger = Logger.new(log)

      yield
      
      log.rewind
      assert_match message, log.read
      
      ActionView::Digestor.logger = nil
    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
  
    def digest(template_name)
      ActionView::Digestor.digest(template_name, :html, FixtureFinder.new)
    end
    
    def change_template(template_name)
      File.open("#{FixtureFinder::TMP_DIR}/#{template_name}.html.erb", "w") do |f|
        f.write "\nTHIS WAS CHANGED!"
      end
    end
end