class TemplateDigestorTest

Public Instance Methods

setup() click to toggle source
# File actionview/test/template/digestor_test.rb, line 34
def setup
  @cwd     = Dir.pwd
  @tmp_dir = Dir.mktmpdir

  ActionView::LookupContext::DetailsKey.clear
  FileUtils.cp_r FixtureFinder::FIXTURES_DIR, @tmp_dir
  Dir.chdir @tmp_dir
end
teardown() click to toggle source
# File actionview/test/template/digestor_test.rb, line 43
def teardown
  Dir.chdir @cwd
  FileUtils.rm_r @tmp_dir
end
test_chaining_the_partial_template_on_recursion() click to toggle source
# File actionview/test/template/digestor_test.rb, line 189
def test_chaining_the_partial_template_on_recursion
  assert digest("level/recursion") # assert recursion is possible

  assert_digest_difference("level/recursion") do
    change_template("level/_recursion")
  end

  assert_not_nil digest("level/recursion") # assert digest is stored
end
test_chaining_the_top_template_on_recursion() click to toggle source
# File actionview/test/template/digestor_test.rb, line 179
def test_chaining_the_top_template_on_recursion
  assert digest("level/recursion") # assert recursion is possible

  assert_digest_difference("level/recursion") do
    change_template("level/recursion")
  end

  assert_not_nil digest("level/recursion") # assert digest is stored
end
test_collection_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 203
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
test_collection_derived_from_record_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 213
def test_collection_derived_from_record_dependency
  assert_digest_difference("messages/show") do
    change_template("events/_event")
  end
end
test_dependencies_via_options_results_in_different_digest() click to toggle source
# File actionview/test/template/digestor_test.rb, line 271
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
test_details_are_included_in_cache_key() click to toggle source
# File actionview/test/template/digestor_test.rb, line 219
def test_details_are_included_in_cache_key
  # Cache the template digest.
  @finder = FixtureFinder.new(formats: [:html])
  old_digest = digest("events/_event")

  # Change the template; the cached digest remains unchanged.
  change_template("events/_event")

  # The details are changed, so a new cache key is generated.
  @finder = FixtureFinder.new

  # The cache is busted.
  assert_not_equal old_digest, digest("events/_event")
end
test_different_formats_with_same_logical_template_names_results_in_different_digests() click to toggle source
# File actionview/test/template/digestor_test.rb, line 285
def test_different_formats_with_same_logical_template_names_results_in_different_digests
  html_digest = digest("comments/_comment", format: :html)
  json_digest = digest("comments/_comment", format: :json)

  assert_not_equal html_digest, json_digest
end
test_digest_cache_cleanup_with_recursion() click to toggle source
# File actionview/test/template/digestor_test.rb, line 292
def test_digest_cache_cleanup_with_recursion
  first_digest = digest("level/_recursion")
  second_digest = digest("level/_recursion")

  assert first_digest

  # If the cache is cleaned up correctly, subsequent digests should return the same
  assert_equal first_digest, second_digest
end
test_digest_cache_cleanup_with_recursion_and_template_caching_off() click to toggle source
# File actionview/test/template/digestor_test.rb, line 302
def test_digest_cache_cleanup_with_recursion_and_template_caching_off
  disable_resolver_caching do
    first_digest = digest("level/_recursion")
    second_digest = digest("level/_recursion")

    assert first_digest

    # If the cache is cleaned up correctly, subsequent digests should return the same
    assert_equal first_digest, second_digest
  end
end
test_directory_depth_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 108
def test_directory_depth_dependency
  assert_digest_difference("level/below/index") do
    change_template("level/below/_header")
  end
end
test_dont_generate_a_digest_for_missing_templates() click to toggle source
# File actionview/test/template/digestor_test.rb, line 199
def test_dont_generate_a_digest_for_missing_templates
  assert_equal "", digest("nothing/there")
end
test_explicit_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 54
def test_explicit_dependency
  assert_digest_difference("messages/show") do
    change_template("messages/_message")
  end
end
test_explicit_dependency_in_multiline_erb_tag() click to toggle source
# File actionview/test/template/digestor_test.rb, line 60
def test_explicit_dependency_in_multiline_erb_tag
  assert_digest_difference("messages/show") do
    change_template("messages/_form")
  end
end
test_explicit_dependency_wildcard() click to toggle source
# File actionview/test/template/digestor_test.rb, line 66
def test_explicit_dependency_wildcard
  assert_digest_difference("events/index") do
    change_template("events/_completed")
  end
end
test_explicit_dependency_wildcard_picks_up_added_file() click to toggle source
# File actionview/test/template/digestor_test.rb, line 72
def test_explicit_dependency_wildcard_picks_up_added_file
  disable_resolver_caching do
    assert_digest_difference("events/index") do
      add_template("events/_uncompleted")
    end
  end
end
test_explicit_dependency_wildcard_picks_up_removed_file() click to toggle source
# File actionview/test/template/digestor_test.rb, line 80
def test_explicit_dependency_wildcard_picks_up_removed_file
  disable_resolver_caching do
    add_template("events/_subscribers_changed")

    assert_digest_difference("events/index") do
      remove_template("events/_subscribers_changed")
    end
  end
end
test_extra_whitespace_in_render_named_partial() click to toggle source
# File actionview/test/template/digestor_test.rb, line 240
def test_extra_whitespace_in_render_named_partial
  assert_digest_difference("messages/edit") do
    change_template("messages/_header")
  end
end
test_extra_whitespace_in_render_partial() click to toggle source
# File actionview/test/template/digestor_test.rb, line 234
def test_extra_whitespace_in_render_partial
  assert_digest_difference("messages/edit") do
    change_template("messages/_form")
  end
end
test_extra_whitespace_in_render_record() click to toggle source
# File actionview/test/template/digestor_test.rb, line 246
def test_extra_whitespace_in_render_record
  assert_digest_difference("messages/edit") do
    change_template("messages/_message")
  end
end
test_extra_whitespace_in_render_with_parenthesis() click to toggle source
# File actionview/test/template/digestor_test.rb, line 252
def test_extra_whitespace_in_render_with_parenthesis
  assert_digest_difference("messages/edit") do
    change_template("events/_event")
  end
end
test_getting_of_doubly_nested_dependencies() click to toggle source
# File actionview/test/template/digestor_test.rb, line 143
def test_getting_of_doubly_nested_dependencies
  doubly_nested = [{ "comments/comments" => ["comments/comment"] }, "messages/message"]
  assert_equal doubly_nested, nested_dependencies("messages/peek")
end
test_getting_of_singly_nested_dependencies() click to toggle source
# File actionview/test/template/digestor_test.rb, line 138
def test_getting_of_singly_nested_dependencies
  singly_nested_dependencies = ["messages/header", "messages/form", "messages/message", "events/event", "comments/comment"]
  assert_equal singly_nested_dependencies, nested_dependencies("messages/edit")
end
test_logging_of_missing_template() click to toggle source
# File actionview/test/template/digestor_test.rb, line 114
def test_logging_of_missing_template
  assert_logged "Couldn't find template for digesting: messages/something_missing" do
    digest("messages/show")
  end
end
test_logging_of_missing_template_ending_with_number() click to toggle source
# File actionview/test/template/digestor_test.rb, line 120
def test_logging_of_missing_template_ending_with_number
  assert_logged "Couldn't find template for digesting: messages/something_missing_1" do
    digest("messages/show")
  end
end
test_logging_of_missing_template_for_dependencies() click to toggle source
# File actionview/test/template/digestor_test.rb, line 126
def test_logging_of_missing_template_for_dependencies
  assert_logged "Couldn't find template for digesting: messages/something_missing" do
    dependencies("messages/something_missing")
  end
end
test_logging_of_missing_template_for_nested_dependencies() click to toggle source
# File actionview/test/template/digestor_test.rb, line 132
def test_logging_of_missing_template_for_nested_dependencies
  assert_logged "Couldn't find template for digesting: messages/something_missing" do
    nested_dependencies("messages/something_missing")
  end
end
test_nested_template_deps() click to toggle source
# File actionview/test/template/digestor_test.rb, line 154
def test_nested_template_deps
  nested_deps = ["messages/header", { "comments/comments" => ["comments/comment"] }, "messages/actions/move", "events/event", "messages/something_missing", "messages/something_missing_1", "messages/message", "messages/form"]
  assert_equal nested_deps, nested_dependencies("messages/show")
end
test_nested_template_deps_with_non_default_rendered_format() click to toggle source
# File actionview/test/template/digestor_test.rb, line 159
def test_nested_template_deps_with_non_default_rendered_format
  finder.rendered_format = nil
  nested_deps = [{ "comments/comments" => ["comments/comment"] }]
  assert_equal nested_deps, nested_dependencies("messages/thread")
end
test_nested_template_directory() click to toggle source
# File actionview/test/template/digestor_test.rb, line 148
def test_nested_template_directory
  assert_digest_difference("messages/show") do
    change_template("messages/actions/_move")
  end
end
test_old_style_hash_in_render_invocation() click to toggle source
# File actionview/test/template/digestor_test.rb, line 258
def test_old_style_hash_in_render_invocation
  assert_digest_difference("messages/edit") do
    change_template("comments/_comment")
  end
end
test_recursion_in_renders() click to toggle source
# File actionview/test/template/digestor_test.rb, line 174
def test_recursion_in_renders
  assert digest("level/recursion") # assert recursion is possible
  assert_not_nil digest("level/recursion") # assert digest is stored
end
test_second_level_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 90
def test_second_level_dependency
  assert_digest_difference("messages/show") do
    change_template("comments/_comments")
  end
end
test_second_level_dependency_within_same_directory() click to toggle source
# File actionview/test/template/digestor_test.rb, line 96
def test_second_level_dependency_within_same_directory
  assert_digest_difference("messages/show") do
    change_template("messages/_header")
  end
end
test_template_formats_of_dependencies_with_same_logical_name_and_different_rendered_format() click to toggle source
# File actionview/test/template/digestor_test.rb, line 170
def test_template_formats_of_dependencies_with_same_logical_name_and_different_rendered_format
  assert_equal [:html], tree_template_formats("messages/show").uniq
end
test_template_formats_of_nested_deps_with_non_default_rendered_format() click to toggle source
# File actionview/test/template/digestor_test.rb, line 165
def test_template_formats_of_nested_deps_with_non_default_rendered_format
  finder.rendered_format = nil
  assert_equal [:json], tree_template_formats("messages/thread").uniq
end
test_third_level_dependency() click to toggle source
# File actionview/test/template/digestor_test.rb, line 102
def test_third_level_dependency
  assert_digest_difference("messages/show") do
    change_template("comments/_comment")
  end
end
test_top_level_change_reflected() click to toggle source
# File actionview/test/template/digestor_test.rb, line 48
def test_top_level_change_reflected
  assert_digest_difference("messages/show") do
    change_template("messages/show")
  end
end
test_variants() click to toggle source
# File actionview/test/template/digestor_test.rb, line 264
def test_variants
  assert_digest_difference("messages/new", variants: [:iphone]) do
    change_template("messages/new",     :iphone)
    change_template("messages/_header", :iphone)
  end
end

Private Instance Methods

add_template(template_name, variant = nil)
Alias for: change_template
assert_digest_difference(template_name, options = {}) { || ... } click to toggle source
# File actionview/test/template/digestor_test.rb, line 330
def assert_digest_difference(template_name, options = {})
  previous_digest = digest(template_name, options)
  finder.digest_cache.clear

  yield

  assert_not_equal previous_digest, digest(template_name, options), "digest didn't change"
  finder.digest_cache.clear
end
assert_logged(message) { || ... } click to toggle source
# File actionview/test/template/digestor_test.rb, line 315
def assert_logged(message)
  old_logger = ActionView::Base.logger
  log = StringIO.new
  ActionView::Base.logger = Logger.new(log)

  begin
    yield

    log.rewind
    assert_match message, log.read
  ensure
    ActionView::Base.logger = old_logger
  end
end
change_template(template_name, variant = nil) click to toggle source
# File actionview/test/template/digestor_test.rb, line 376
def change_template(template_name, variant = nil)
  variant = "+#{variant}" if variant.present?

  File.open("digestor/#{template_name}.html#{variant}.erb", "w") do |f|
    f.write "\nTHIS WAS CHANGED!"
  end
end
Also aliased as: add_template
dependencies(template_name) click to toggle source
# File actionview/test/template/digestor_test.rb, line 350
def dependencies(template_name)
  tree = ActionView::Digestor.tree(template_name, finder)
  tree.children.map(&:name)
end
digest(template_name, options = {}) click to toggle source
# File actionview/test/template/digestor_test.rb, line 340
def digest(template_name, options = {})
  options = options.dup
  finder_options = options.extract!(:variants, :format)

  finder.variants = finder_options[:variants] || []
  finder.rendered_format = finder_options[:format] if finder_options[:format]

  ActionView::Digestor.digest(name: template_name, finder: finder, dependencies: (options[:dependencies] || []))
end
disable_resolver_caching() { || ... } click to toggle source
# File actionview/test/template/digestor_test.rb, line 365
def disable_resolver_caching
  old_caching, ActionView::Resolver.caching = ActionView::Resolver.caching, false
  yield
ensure
  ActionView::Resolver.caching = old_caching
end
finder() click to toggle source
# File actionview/test/template/digestor_test.rb, line 372
def finder
  @finder ||= FixtureFinder.new
end
nested_dependencies(template_name) click to toggle source
# File actionview/test/template/digestor_test.rb, line 355
def nested_dependencies(template_name)
  tree = ActionView::Digestor.tree(template_name, finder)
  tree.children.map(&:to_dep_map)
end
remove_template(template_name) click to toggle source
# File actionview/test/template/digestor_test.rb, line 385
def remove_template(template_name)
  File.delete("digestor/#{template_name}.html.erb")
end
tree_template_formats(template_name) click to toggle source
# File actionview/test/template/digestor_test.rb, line 360
def tree_template_formats(template_name)
  tree = ActionView::Digestor.tree(template_name, finder)
  tree.flatten.map(&:template).compact.flat_map(&:formats)
end