aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/test/template/resolver_shared_tests.rb
blob: 8b47c5bc89322e526cd6b1d2fc1d46ceeaef32a3 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# frozen_string_literal: true

module ResolverSharedTests
  attr_reader :tmpdir

  def run(*args)
    capture_exceptions do
      Dir.mktmpdir(nil, __dir__) { |dir| @tmpdir = dir; super }
    end
  end

  def with_file(filename, source = "File at #{filename}")
    path = File.join(tmpdir, filename)
    FileUtils.mkdir_p(File.dirname(path))
    File.write(path, source)
  end

  def context
    @context ||= ActionView::LookupContext.new(resolver)
  end

  def test_can_find_with_no_extensions
    with_file "test/hello_world", "Hello default!"

    templates = resolver.find_all("hello_world", "test", false, locale: [:en], formats: [:html], variants: [:phone], handlers: [:erb])
    assert_equal 1, templates.size
    assert_equal "Hello default!",   templates[0].source
    assert_equal "test/hello_world", templates[0].virtual_path
    assert_nil templates[0].format
    assert_nil templates[0].variant
    assert_kind_of ActionView::Template::Handlers::Raw, templates[0].handler
  end

  def test_can_find_with_just_handler
    with_file "test/hello_world.erb", "Hello erb!"

    templates = resolver.find_all("hello_world", "test", false, locale: [:en], formats: [:html], variants: [:phone], handlers: [:erb])
    assert_equal 1, templates.size
    assert_equal "Hello erb!",   templates[0].source
    assert_equal "test/hello_world", templates[0].virtual_path
    assert_nil templates[0].format
    assert_nil templates[0].variant
    assert_kind_of ActionView::Template::Handlers::ERB, templates[0].handler
  end

  def test_can_find_with_format_and_handler
    with_file "test/hello_world.text.builder", "Hello plain text!"

    templates = resolver.find_all("hello_world", "test", false, locale: [:en], formats: [:html, :text], variants: [:phone], handlers: [:erb, :builder])
    assert_equal 1, templates.size
    assert_equal "Hello plain text!", templates[0].source
    assert_equal "test/hello_world",  templates[0].virtual_path
    assert_equal :text, templates[0].format
    assert_nil templates[0].variant
    assert_kind_of ActionView::Template::Handlers::Builder, templates[0].handler
  end

  def test_can_find_with_variant_format_and_handler
    with_file "test/hello_world.html+phone.erb", "Hello plain text!"

    templates = resolver.find_all("hello_world", "test", false, locale: [:en], formats: [:html], variants: [:phone], handlers: [:erb])
    assert_equal 1, templates.size
    assert_equal "Hello plain text!", templates[0].source
    assert_equal "test/hello_world",  templates[0].virtual_path
    assert_equal :html, templates[0].format
    assert_equal "phone", templates[0].variant
    assert_kind_of ActionView::Template::Handlers::ERB, templates[0].handler
  end

  def test_can_find_with_any_variant_format_and_handler
    with_file "test/hello_world.html+phone.erb", "Hello plain text!"

    templates = resolver.find_all("hello_world", "test", false, locale: [:en], formats: [:html], variants: :any, handlers: [:erb])
    assert_equal 1, templates.size
    assert_equal "Hello plain text!", templates[0].source
    assert_equal "test/hello_world",  templates[0].virtual_path
    assert_equal :html, templates[0].format
    assert_equal "phone", templates[0].variant
    assert_kind_of ActionView::Template::Handlers::ERB, templates[0].handler
  end

  def test_doesnt_find_template_with_wrong_details
    with_file "test/hello_world.html.erb", "Hello plain text!"

    templates = resolver.find_all("hello_world", "test", false, locale: [], formats: [:xml], variants: :any, handlers: [:builder])
    assert_equal 0, templates.size

    templates = resolver.find_all("hello_world", "test", false, locale: [], formats: [:xml], variants: :any, handlers: [:erb])
    assert_equal 0, templates.size
  end

  def test_found_template_is_cached
    with_file "test/hello_world.html.erb", "Hello HTML!"

    a = context.find("hello_world", "test", false, [], {})
    b = context.find("hello_world", "test", false, [], {})
    assert_same a, b
  end

  def test_different_templates_when_cache_disabled
    with_file "test/hello_world.html.erb", "Hello HTML!"

    a = context.find("hello_world", "test", false, [], {})
    b = context.disable_cache { context.find("hello_world", "test", false, [], {}) }
    c = context.find("hello_world", "test", false, [], {})

    # disable_cache should give us a new object
    assert_not_same a, b

    # but it should not clear the cache
    assert_same a, c
  end

  def test_same_template_from_different_details_is_same_object
    with_file "test/hello_world.html.erb", "Hello HTML!"

    a = context.find("hello_world", "test", false, [], locale: [:en])
    b = context.find("hello_world", "test", false, [], locale: [:fr])
    assert_same a, b
  end

  def test_templates_with_optional_locale_shares_common_object
    with_file "test/hello_world.text.erb", "Generic plain text!"
    with_file "test/hello_world.fr.text.erb", "Texte en Francais!"

    en = context.find_all("hello_world", "test", false, [], locale: [:en])
    fr = context.find_all("hello_world", "test", false, [], locale: [:fr])

    assert_equal 1, en.size
    assert_equal 2, fr.size

    assert_equal "Generic plain text!", en[0].source
    assert_equal "Texte en Francais!",  fr[0].source
    assert_equal "Generic plain text!", fr[1].source

    assert_same en[0], fr[1]
  end

  def test_virtual_path_is_preserved_with_dot
    with_file "test/hello_world.html.erb", "Hello html!"

    template = context.find("hello_world.html", "test", false, [], {})
    assert_equal "test/hello_world.html", template.virtual_path

    template = context.find("hello_world", "test", false, [], {})
    assert_equal "test/hello_world", template.virtual_path
  end
end