aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/test/template/streaming_render_test.rb
blob: a5b59a700e9d70ee0ef22599bd4196f0f0b30ba2 (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
# frozen_string_literal: true

require "abstract_unit"

class TestController < ActionController::Base
end

class SetupFiberedBase < ActiveSupport::TestCase
  def setup
    ActionView::LookupContext::DetailsKey.clear

    view_paths = ActionController::Base.view_paths

    @assigns = { secret: "in the sauce", name: nil }
    @view = ActionView::Base.with_empty_template_cache.with_view_paths(view_paths, @assigns)
    @controller_view = TestController.new.view_context
  end

  def render_body(options)
    @view.view_renderer.render_body(@view, options)
  end

  def buffered_render(options)
    body = render_body(options)
    string = +""
    body.each do |piece|
      string << piece
    end
    string
  end
end

class FiberedTest < SetupFiberedBase
  def test_streaming_works
    content = []
    body = render_body(template: "test/hello_world", layout: "layouts/yield")

    body.each do |piece|
      content << piece
    end

    assert_equal "<title>",      content[0]
    assert_equal "",             content[1]
    assert_equal "</title>\n",   content[2]
    assert_equal "Hello world!", content[3]
    assert_equal "\n",           content[4]
  end

  def test_render_file
    assert_equal "Hello world!", buffered_render(file: "test/hello_world")
  end

  def test_render_file_with_locals
    locals = { secret: "in the sauce" }
    assert_equal "The secret is in the sauce\n", buffered_render(file: "test/render_file_with_locals", locals: locals)
  end

  def test_render_partial
    assert_equal "only partial", buffered_render(partial: "test/partial_only")
  end

  def test_render_inline
    assert_equal "Hello, World!", buffered_render(inline: "Hello, World!")
  end

  def test_render_without_layout
    assert_equal "Hello world!", buffered_render(template: "test/hello_world")
  end

  def test_render_with_layout
    assert_equal %(<title></title>\nHello world!\n),
      buffered_render(template: "test/hello_world", layout: "layouts/yield")
  end

  def test_render_with_layout_which_has_render_inline
    assert_equal %(welcome\nHello world!\n),
      buffered_render(template: "test/hello_world", layout: "layouts/yield_with_render_inline_inside")
  end

  def test_render_with_layout_which_renders_another_partial
    assert_equal %(partial html\nHello world!\n),
      buffered_render(template: "test/hello_world", layout: "layouts/yield_with_render_partial_inside")
  end

  def test_render_with_nested_layout
    assert_equal %(<title>title</title>\n\n<div id="column">column</div>\n<div id="content">content</div>\n),
      buffered_render(template: "test/nested_layout", layout: "layouts/yield")
  end

  def test_render_with_file_in_layout
    assert_equal %(\n<title>title</title>\n\n),
      buffered_render(template: "test/layout_render_file")
  end

  def test_render_with_handler_without_streaming_support
    assert_match "<p>This is grand!</p>", buffered_render(template: "test/hello")
  end

  def test_render_with_streaming_multiple_yields_provide_and_content_for
    assert_equal "Yes, \nthis works\n like a charm.",
      buffered_render(template: "test/streaming", layout: "layouts/streaming")
  end

  def test_render_with_streaming_with_fake_yields_and_streaming_buster
    assert_equal "This won't look\n good.",
      buffered_render(template: "test/streaming_buster", layout: "layouts/streaming")
  end

  def test_render_with_nested_streaming_multiple_yields_provide_and_content_for
    assert_equal "?Yes, \n\nthis works\n\n? like a charm.",
      buffered_render(template: "test/nested_streaming", layout: "layouts/streaming")
  end

  def test_render_with_streaming_and_capture
    assert_equal "Yes, \n this works\n like a charm.",
      buffered_render(template: "test/streaming", layout: "layouts/streaming_with_capture")
  end
end

class FiberedWithLocaleTest < SetupFiberedBase
  def setup
    @old_locale = I18n.locale
    I18n.locale = "da"
    super
  end

  def teardown
    I18n.locale = @old_locale
  end

  def test_render_with_streaming_and_locale
    assert_equal "layout.locale: da\nview.locale: da\n\n",
      buffered_render(template: "test/streaming_with_locale", layout: "layouts/streaming_with_locale")
  end
end