From 3b3975b7dbc115636188126eed2a15bebd4e2c98 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 11 Feb 2019 13:15:53 -0800 Subject: Add a failing test for #35222 --- actionview/test/fixtures/test/_first.xml.erb | 1 + actionview/test/fixtures/test/_second.html.erb | 1 + actionview/test/fixtures/test/_second.xml.erb | 1 + actionview/test/fixtures/test/mixing_formats.html.erb | 5 +++++ actionview/test/template/render_test.rb | 6 ++++++ 5 files changed, 14 insertions(+) create mode 100644 actionview/test/fixtures/test/_first.xml.erb create mode 100644 actionview/test/fixtures/test/_second.html.erb create mode 100644 actionview/test/fixtures/test/_second.xml.erb create mode 100644 actionview/test/fixtures/test/mixing_formats.html.erb (limited to 'actionview/test') diff --git a/actionview/test/fixtures/test/_first.xml.erb b/actionview/test/fixtures/test/_first.xml.erb new file mode 100644 index 0000000000..6dad140cd4 --- /dev/null +++ b/actionview/test/fixtures/test/_first.xml.erb @@ -0,0 +1 @@ +XML diff --git a/actionview/test/fixtures/test/_second.html.erb b/actionview/test/fixtures/test/_second.html.erb new file mode 100644 index 0000000000..f05185c383 --- /dev/null +++ b/actionview/test/fixtures/test/_second.html.erb @@ -0,0 +1 @@ +HTML diff --git a/actionview/test/fixtures/test/_second.xml.erb b/actionview/test/fixtures/test/_second.xml.erb new file mode 100644 index 0000000000..6dad140cd4 --- /dev/null +++ b/actionview/test/fixtures/test/_second.xml.erb @@ -0,0 +1 @@ +XML diff --git a/actionview/test/fixtures/test/mixing_formats.html.erb b/actionview/test/fixtures/test/mixing_formats.html.erb new file mode 100644 index 0000000000..bb4a1d182a --- /dev/null +++ b/actionview/test/fixtures/test/mixing_formats.html.erb @@ -0,0 +1,5 @@ +{"format":"HTML", "children": +[ + "<%= render(partial: "first", formats: :xml).chomp %>", + "<%= render(partial: "second").chomp %>" +]} diff --git a/actionview/test/template/render_test.rb b/actionview/test/template/render_test.rb index 3f298d81f3..a0b493af9d 100644 --- a/actionview/test/template/render_test.rb +++ b/actionview/test/template/render_test.rb @@ -30,6 +30,12 @@ module RenderTestCases assert_equal ORIGINAL_LOCALES, I18n.available_locales.map(&:to_s).sort end + def test_implicit_format_comes_from_parent_template + rendered_templates = JSON.parse(@controller_view.render(template: "test/mixing_formats")) + assert_equal({ "format" => "HTML", + "children" => ["XML", "HTML"]}, rendered_templates) + end + def test_render_without_options e = assert_raises(ArgumentError) { @view.render() } assert_match(/You invoked render but did not give any of (.+) option\./, e.message) -- cgit v1.2.3 From 9439a18bf76b3b7c759340abf0d7a5fb17fc82f7 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 11 Feb 2019 15:24:55 -0800 Subject: Adding another failing test case --- actionview/test/fixtures/test/_first.html.erb | 1 + actionview/test/fixtures/test/_first.xml.erb | 2 +- actionview/test/fixtures/test/_first_layer.html.erb | 6 ++++++ actionview/test/fixtures/test/_first_layer.xml.erb | 4 ++++ actionview/test/fixtures/test/_second.html.erb | 2 +- actionview/test/fixtures/test/_second.xml.erb | 2 +- actionview/test/fixtures/test/_second_layer.html.erb | 4 ++++ actionview/test/fixtures/test/_second_layer.xml.erb | 4 ++++ actionview/test/fixtures/test/mixing_formats.html.erb | 4 ++-- actionview/test/fixtures/test/mixing_formats_deep.html.erb | 5 +++++ actionview/test/template/render_test.rb | 11 ++++++++++- 11 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 actionview/test/fixtures/test/_first.html.erb create mode 100644 actionview/test/fixtures/test/_first_layer.html.erb create mode 100644 actionview/test/fixtures/test/_first_layer.xml.erb create mode 100644 actionview/test/fixtures/test/_second_layer.html.erb create mode 100644 actionview/test/fixtures/test/_second_layer.xml.erb create mode 100644 actionview/test/fixtures/test/mixing_formats_deep.html.erb (limited to 'actionview/test') diff --git a/actionview/test/fixtures/test/_first.html.erb b/actionview/test/fixtures/test/_first.html.erb new file mode 100644 index 0000000000..2e2c825acb --- /dev/null +++ b/actionview/test/fixtures/test/_first.html.erb @@ -0,0 +1 @@ +"HTML" diff --git a/actionview/test/fixtures/test/_first.xml.erb b/actionview/test/fixtures/test/_first.xml.erb index 6dad140cd4..9cf4f4ec85 100644 --- a/actionview/test/fixtures/test/_first.xml.erb +++ b/actionview/test/fixtures/test/_first.xml.erb @@ -1 +1 @@ -XML +"XML" diff --git a/actionview/test/fixtures/test/_first_layer.html.erb b/actionview/test/fixtures/test/_first_layer.html.erb new file mode 100644 index 0000000000..9f60d20e24 --- /dev/null +++ b/actionview/test/fixtures/test/_first_layer.html.erb @@ -0,0 +1,6 @@ +{"format":"HTML", "children": +[ + <%= render(partial: "first").chomp.html_safe %>, +]} + + diff --git a/actionview/test/fixtures/test/_first_layer.xml.erb b/actionview/test/fixtures/test/_first_layer.xml.erb new file mode 100644 index 0000000000..b8581bbbfc --- /dev/null +++ b/actionview/test/fixtures/test/_first_layer.xml.erb @@ -0,0 +1,4 @@ +{"format":"XML", "children": +[ + <%= render(partial: "first").chomp.html_safe %> +]} diff --git a/actionview/test/fixtures/test/_second.html.erb b/actionview/test/fixtures/test/_second.html.erb index f05185c383..2e2c825acb 100644 --- a/actionview/test/fixtures/test/_second.html.erb +++ b/actionview/test/fixtures/test/_second.html.erb @@ -1 +1 @@ -HTML +"HTML" diff --git a/actionview/test/fixtures/test/_second.xml.erb b/actionview/test/fixtures/test/_second.xml.erb index 6dad140cd4..9cf4f4ec85 100644 --- a/actionview/test/fixtures/test/_second.xml.erb +++ b/actionview/test/fixtures/test/_second.xml.erb @@ -1 +1 @@ -XML +"XML" diff --git a/actionview/test/fixtures/test/_second_layer.html.erb b/actionview/test/fixtures/test/_second_layer.html.erb new file mode 100644 index 0000000000..307706abd2 --- /dev/null +++ b/actionview/test/fixtures/test/_second_layer.html.erb @@ -0,0 +1,4 @@ +{"format":"HTML", "children": +[ + <%= render(partial: "first").chomp.html_safe %> +]} diff --git a/actionview/test/fixtures/test/_second_layer.xml.erb b/actionview/test/fixtures/test/_second_layer.xml.erb new file mode 100644 index 0000000000..b8581bbbfc --- /dev/null +++ b/actionview/test/fixtures/test/_second_layer.xml.erb @@ -0,0 +1,4 @@ +{"format":"XML", "children": +[ + <%= render(partial: "first").chomp.html_safe %> +]} diff --git a/actionview/test/fixtures/test/mixing_formats.html.erb b/actionview/test/fixtures/test/mixing_formats.html.erb index bb4a1d182a..c65cdd7dd4 100644 --- a/actionview/test/fixtures/test/mixing_formats.html.erb +++ b/actionview/test/fixtures/test/mixing_formats.html.erb @@ -1,5 +1,5 @@ {"format":"HTML", "children": [ - "<%= render(partial: "first", formats: :xml).chomp %>", - "<%= render(partial: "second").chomp %>" + <%= render(partial: "first", formats: :xml).chomp.html_safe %>, + <%= render(partial: "second").chomp.html_safe %> ]} diff --git a/actionview/test/fixtures/test/mixing_formats_deep.html.erb b/actionview/test/fixtures/test/mixing_formats_deep.html.erb new file mode 100644 index 0000000000..e328887eeb --- /dev/null +++ b/actionview/test/fixtures/test/mixing_formats_deep.html.erb @@ -0,0 +1,5 @@ +{"format":"HTML", "children": +[ + <%= render(partial: "first_layer", formats: :xml).chomp.html_safe %>, + <%= render(partial: "second_layer").chomp.html_safe %> +]} diff --git a/actionview/test/template/render_test.rb b/actionview/test/template/render_test.rb index a0b493af9d..e36babfd25 100644 --- a/actionview/test/template/render_test.rb +++ b/actionview/test/template/render_test.rb @@ -33,7 +33,16 @@ module RenderTestCases def test_implicit_format_comes_from_parent_template rendered_templates = JSON.parse(@controller_view.render(template: "test/mixing_formats")) assert_equal({ "format" => "HTML", - "children" => ["XML", "HTML"]}, rendered_templates) + "children" => ["XML", "HTML"] }, rendered_templates) + end + + def test_implicit_format_comes_from_parent_template_cascading + rendered_templates = JSON.parse(@controller_view.render(template: "test/mixing_formats_deep")) + assert_equal({ "format" => "HTML", + "children" => [ + { "format" => "XML", "children" => ["XML"] }, + { "format" => "HTML", "children" => ["HTML"] }, + ] }, rendered_templates) end def test_render_without_options -- cgit v1.2.3 From 2b6d2d20374130da469ece24842ce3b681d3b788 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 11 Feb 2019 17:24:24 -0800 Subject: Turn lookup context in to a stack, push and pop if formats change This commit keeps a stack of lookup contexts on the ActionView::Base instance. If a format is passed to render, we instantiate a new lookup context and push it on the stack, that way any child calls to "render" will use the same format information as the parent. This also isolates "sibling" calls to render (multiple calls to render in the same template). Fixes #35222 #34138 --- actionview/test/template/log_subscriber_test.rb | 3 +-- actionview/test/template/render_test.rb | 7 +++++-- 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'actionview/test') diff --git a/actionview/test/template/log_subscriber_test.rb b/actionview/test/template/log_subscriber_test.rb index 83bb651ea3..85735139c1 100644 --- a/actionview/test/template/log_subscriber_test.rb +++ b/actionview/test/template/log_subscriber_test.rb @@ -16,8 +16,7 @@ class AVLogSubscriberTest < ActiveSupport::TestCase view_paths = ActionController::Base.view_paths lookup_context = ActionView::LookupContext.new(view_paths, {}, ["test"]) - renderer = ActionView::Renderer.new(lookup_context) - @view = ActionView::Base.with_empty_template_cache.new(renderer, {}) + @view = ActionView::Base.with_empty_template_cache.new(lookup_context, {}) ActionView::LogSubscriber.attach_to :action_view diff --git a/actionview/test/template/render_test.rb b/actionview/test/template/render_test.rb index e36babfd25..88047fd920 100644 --- a/actionview/test/template/render_test.rb +++ b/actionview/test/template/render_test.rb @@ -20,7 +20,10 @@ module RenderTestCases controller = TestController.new - @controller_view = controller.view_context_class.with_empty_template_cache.new(controller.view_renderer, controller.view_assigns, controller) + @controller_view = controller.view_context_class.with_empty_template_cache.new( + controller.lookup_context, + controller.view_assigns, + controller) # Reload and register danish language for testing I18n.backend.store_translations "da", {} @@ -83,7 +86,7 @@ module RenderTestCases def test_render_partial_use_last_prepended_format_for_partials_with_the_same_names @view.lookup_context.formats = [:html] - assert_equal "\nHTML Template, but JSON partial", @view.render(template: "test/change_priority") + assert_equal "\nHTML Template, but HTML partial", @view.render(template: "test/change_priority") end def test_render_template_with_a_missing_partial_of_another_format -- cgit v1.2.3