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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
require "abstract_unit"
require "abstract_controller/rendering"
ActionView::LookupContext::DetailsKey.class_eval do
def self.details_keys
@details_keys
end
end
class LookupContextTest < ActiveSupport::TestCase
def setup
@lookup_context = ActionView::LookupContext.new(FIXTURE_LOAD_PATH, {})
end
def teardown
I18n.locale = :en
ActionView::LookupContext::DetailsKey.details_keys.clear
end
test "process view paths on initialization" do
assert_kind_of ActionView::PathSet, @lookup_context.view_paths
end
test "normalizes details on initialization" do
formats = Mime::SET + [nil]
locale = [I18n.locale, nil]
assert_equal Hash[:formats => formats, :locale => locale], @lookup_context.details
end
test "allows me to set details" do
@lookup_context.details = { :formats => [:html], :locale => :pt }
assert_equal Hash[:formats => [:html, nil], :locale => [:pt, nil]], @lookup_context.details
end
test "does not allow details to be modified in place" do
assert_raise TypeError do
@lookup_context.details.clear
end
end
test "allows me to update an specific detail" do
@lookup_context.update_details(:locale => :pt)
assert_equal :pt, I18n.locale
formats = Mime::SET + [nil]
locale = [I18n.locale, nil]
assert_equal Hash[:formats => formats, :locale => locale], @lookup_context.details
end
test "allows me to change some details to execute an specific block of code" do
formats = Mime::SET + [nil]
@lookup_context.update_details(:locale => :pt) do
assert_equal Hash[:formats => formats, :locale => [:pt, nil]], @lookup_context.details
end
assert_equal Hash[:formats => formats, :locale => [:en, nil]], @lookup_context.details
end
test "provides getters and setters for formats" do
@lookup_context.formats = :html
assert_equal [:html], @lookup_context.formats
end
test "handles */* formats" do
@lookup_context.formats = [:"*/*"]
assert_equal Mime::SET, @lookup_context.formats
end
test "provides getters and setters for locale" do
@lookup_context.locale = :pt
assert_equal :pt, @lookup_context.locale
end
test "changing lookup_context locale, changes I18n.locale" do
@lookup_context.locale = :pt
assert_equal :pt, I18n.locale
end
test "delegates changing the locale to the I18n configuration object if it contains a lookup_context object" do
begin
I18n.config = AbstractController::I18nProxy.new(I18n.config, @lookup_context)
@lookup_context.locale = :pt
assert_equal :pt, I18n.locale
assert_equal :pt, @lookup_context.locale
ensure
I18n.config = I18n.config.i18n_config
end
assert_equal :pt, I18n.locale
end
test "find templates using the given view paths and configured details" do
template = @lookup_context.find("hello_world", "test")
assert_equal "Hello world!", template.source
@lookup_context.locale = :da
template = @lookup_context.find("hello_world", "test")
assert_equal "Hey verden", template.source
end
test "adds fallbacks to view paths when required" do
assert_equal 1, @lookup_context.view_paths.size
@lookup_context.with_fallbacks do
assert_equal 3, @lookup_context.view_paths.size
assert @lookup_context.view_paths.include?(ActionView::FileSystemResolver.new(""))
assert @lookup_context.view_paths.include?(ActionView::FileSystemResolver.new("/"))
end
end
test "add fallbacks just once in nested fallbacks calls" do
@lookup_context.with_fallbacks do
@lookup_context.with_fallbacks do
assert_equal 3, @lookup_context.view_paths.size
end
end
end
test "generates a new details key for each details hash" do
keys = []
keys << @lookup_context.details_key
assert_equal 1, keys.uniq.size
@lookup_context.locale = :da
keys << @lookup_context.details_key
assert_equal 2, keys.uniq.size
@lookup_context.locale = :en
keys << @lookup_context.details_key
assert_equal 2, keys.uniq.size
@lookup_context.formats = :html
keys << @lookup_context.details_key
assert_equal 3, keys.uniq.size
@lookup_context.formats = nil
keys << @lookup_context.details_key
assert_equal 3, keys.uniq.size
end
test "gives the key forward to the resolver, so it can be used as cache key" do
@lookup_context.view_paths = ActionView::FixtureResolver.new("test/_foo.erb" => "Foo")
template = @lookup_context.find("foo", "test", true)
assert_equal "Foo", template.source
# Now we are going to change the template, but it won't change the returned template
# since we will hit the cache.
@lookup_context.view_paths.first.hash["test/_foo.erb"] = "Bar"
template = @lookup_context.find("foo", "test", true)
assert_equal "Foo", template.source
# This time we will change the locale. The updated template should be picked since
# lookup_context generated a new key after we changed the locale.
@lookup_context.locale = :da
template = @lookup_context.find("foo", "test", true)
assert_equal "Bar", template.source
# Now we will change back the locale and it will still pick the old template.
# This is expected because lookup_context will reuse the previous key for :en locale.
@lookup_context.locale = :en
template = @lookup_context.find("foo", "test", true)
assert_equal "Foo", template.source
# Finally, we can expire the cache. And the expected template will be used.
@lookup_context.view_paths.first.clear_cache
template = @lookup_context.find("foo", "test", true)
assert_equal "Bar", template.source
end
end
|