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 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
require 'abstract_unit'
require 'controller/fake_models'
class CompiledTemplatesTest < Test::Unit::TestCase
def setup
@explicit_view_paths = nil
@compiled_templates = ActionView::Base::CompiledTemplates
@compiled_templates.instance_methods.each do |m|
@compiled_templates.send(:remove_method, m) if m =~ /^_run_/
end
end
def test_template_gets_compiled
with_caching(true) do
assert_equal 0, @compiled_templates.instance_methods.size
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
assert_equal 1, @compiled_templates.instance_methods.size
end
end
def test_template_gets_recompiled_when_using_different_keys_in_local_assigns
with_caching(true) do
assert_equal 0, @compiled_templates.instance_methods.size
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
assert_equal "Hello world!", render(:file => "test/hello_world.erb", :locals => {:foo => "bar"})
assert_equal 2, @compiled_templates.instance_methods.size
end
end
def test_compiled_template_will_not_be_recompiled_when_rendered_with_identical_local_assigns
with_caching(true) do
assert_equal 0, @compiled_templates.instance_methods.size
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
ActionView::Template.any_instance.expects(:compile!).never
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
end
end
def test_template_changes_are_not_reflected_with_cached_template_loading
with_caching(true) do
with_reloading(false) do
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
modify_template "test/hello_world.erb", "Goodbye world!" do
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
end
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
end
end
end
def test_template_changes_are_reflected_without_cached_template_loading
with_caching(true) do
with_reloading(true) do
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
modify_template "test/hello_world.erb", "Goodbye world!" do
assert_equal "Goodbye world!", render(:file => "test/hello_world.erb")
end
assert_equal "Hello world!", render(:file => "test/hello_world.erb")
end
end
end
def test_template_becomes_missing_if_deleted_without_cached_template_loading
with_reloading(true) do
assert_equal 'Hello world!', render(:file => 'test/hello_world.erb')
delete_template 'test/hello_world.erb' do
assert_raise(ActionView::MissingTemplate) { render(:file => 'test/hello_world.erb') }
end
assert_equal 'Hello world!', render(:file => 'test/hello_world.erb')
end
end
def test_swapping_template_handler_is_working_without_cached_template_loading
with_reloading(true) do
assert_equal 'Hello world!', render(:file => 'test/hello_world')
delete_template 'test/hello_world.erb' do
rename_template 'test/hello_world_from_rxml.builder', 'test/hello_world.builder' do
assert_equal "<html>\n <p>Hello</p>\n</html>\n", render(:file => 'test/hello_world')
end
end
assert_equal 'Hello world!', render(:file => 'test/hello_world')
end
end
def test_adding_localized_template_will_take_precedence_without_cached_template_loading
with_reloading(true) do
assert_equal 'Hello world!', render(:file => 'test/hello_world')
rename_template 'test/hello_world.da.html.erb', 'test/hello_world.en.html.erb' do
assert_equal 'Hey verden', render(:file => 'test/hello_world')
end
end
end
def test_deleting_localized_template_will_fall_back_to_non_localized_template_without_cached_template_loading
with_reloading(true) do
rename_template 'test/hello_world.da.html.erb', 'test/hello_world.en.html.erb' do
assert_equal 'Hey verden', render(:file => 'test/hello_world')
delete_template 'test/hello_world.en.html.erb' do
assert_equal 'Hello world!', render(:file => 'test/hello_world')
end
assert_equal 'Hey verden', render(:file => 'test/hello_world')
end
end
end
def test_parallel_reloadable_view_paths_are_working
with_reloading(true) do
view_paths_copy = new_reloadable_view_paths
assert_equal 'Hello world!', render(:file => 'test/hello_world')
with_view_paths(view_paths_copy, new_reloadable_view_paths) do
assert_equal 'Hello world!', render(:file => 'test/hello_world')
end
modify_template 'test/hello_world.erb', 'Goodbye world!' do
assert_equal 'Goodbye world!', render(:file => 'test/hello_world')
modify_template 'test/hello_world.erb', 'So long, world!' do
with_view_paths(view_paths_copy, new_reloadable_view_paths) do
assert_equal 'So long, world!', render(:file => 'test/hello_world')
end
assert_equal 'So long, world!', render(:file => 'test/hello_world')
end
end
end
end
private
def render(*args)
view_paths = @explicit_view_paths || ActionController::Base.view_paths
ActionView::Base.new(view_paths, {}).render(*args)
end
def with_view_paths(*args)
args.each do |view_paths|
begin
@explicit_view_paths = view_paths
yield
ensure
@explicit_view_paths = nil
end
end
end
def reset_mtime_of(template_name, view_paths_to_use)
view_paths_to_use.find_template(template_name).previously_last_modified = 10.seconds.ago unless ActionView::Base.cache_template_loading?
end
def modify_template(template, content, view_paths_to_use = ActionController::Base.view_paths)
filename = filename_for(template)
old_content = File.read(filename)
begin
File.open(filename, "wb+") { |f| f.write(content) }
reset_mtime_of(template, view_paths_to_use)
yield
ensure
File.open(filename, "wb+") { |f| f.write(old_content) }
reset_mtime_of(template, view_paths_to_use)
end
end
def filename_for(template)
File.join(FIXTURE_LOAD_PATH, template)
end
def rename_template(old_name, new_name)
File.rename(filename_for(old_name), filename_for(new_name))
yield
ensure
File.rename(filename_for(new_name), filename_for(old_name))
end
def delete_template(template, &block)
rename_template(template, File.join(File.dirname(template), "__#{File.basename(template)}"), &block)
end
def with_caching(perform_caching)
old_perform_caching = ActionController::Base.perform_caching
begin
ActionController::Base.perform_caching = perform_caching
yield
ensure
ActionController::Base.perform_caching = old_perform_caching
end
end
def with_reloading(reload_templates, view_paths_owner = ActionController::Base)
old_view_paths, old_cache_templates = view_paths_owner.view_paths, ActionView::Base.cache_template_loading
begin
ActionView::Base.cache_template_loading = !reload_templates
view_paths_owner.view_paths = view_paths_for(reload_templates)
yield
ensure
view_paths_owner.view_paths, ActionView::Base.cache_template_loading = old_view_paths, old_cache_templates
end
end
def new_reloadable_view_paths
ActionView::PathSet.new(CACHED_VIEW_PATHS.map(&:to_s))
end
def view_paths_for(reload_templates)
# reloadable paths are cheap to create
reload_templates ? new_reloadable_view_paths : CACHED_VIEW_PATHS
end
end
|