capture_helper_test.rb 4.1 KB
Newer Older
1 2 3 4 5
require 'abstract_unit'

class CaptureHelperTest < ActionView::TestCase
  def setup
    super
6
    @av = ActionView::Base.new
7
    @view_flow = ActionView::OutputFlow.new
8 9
  end

X
Xavier Noria 已提交
10 11 12 13 14 15 16 17 18 19
  def test_capture_captures_the_temporary_output_buffer_in_its_block
    assert_nil @av.output_buffer
    string = @av.capture do
      @av.output_buffer << 'foo'
      @av.output_buffer << 'bar'
    end
    assert_nil @av.output_buffer
    assert_equal 'foobar', string
  end

20
  def test_capture_captures_the_value_returned_by_the_block_if_the_temporary_buffer_is_blank
X
Xavier Noria 已提交
21 22 23 24 25 26 27 28 29 30
    string = @av.capture('foo', 'bar') do |a, b|
      a + b
    end
    assert_equal 'foobar', string
  end

  def test_capture_returns_nil_if_the_returned_value_is_not_a_string
    assert_nil @av.capture { 1 }
  end

31
  def test_capture_escapes_html
32 33 34 35 36 37 38
    string = @av.capture { '<em>bar</em>' }
    assert_equal '&lt;em&gt;bar&lt;/em&gt;', string
  end

  def test_capture_doesnt_escape_twice
    string = @av.capture { '&lt;em&gt;bar&lt;/em&gt;'.html_safe }
    assert_equal '&lt;em&gt;bar&lt;/em&gt;', string
39 40
  end

41 42 43 44 45 46
  def test_content_for
    assert ! content_for?(:title)
    content_for :title, 'title'
    assert content_for?(:title)
    assert ! content_for?(:something_else)
  end
47

48 49
  def test_provide
    assert !content_for?(:title)
50
    provide :title, "hi"
51
    assert content_for?(:title)
52
    assert_equal "hi", @view_flow.get(:title)
53
    provide :title, "<p>title</p>"
54
    assert_equal "hi&lt;p&gt;title&lt;/p&gt;", @view_flow.get(:title)
55

56
    @view_flow = ActionView::OutputFlow.new
57
    provide :title, "hi"
58
    provide :title, "<p>title</p>".html_safe
59
    assert_equal "hi<p>title</p>", @view_flow.get(:title)
60 61
  end

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
  def test_with_output_buffer_swaps_the_output_buffer_given_no_argument
    assert_nil @av.output_buffer
    buffer = @av.with_output_buffer do
      @av.output_buffer << '.'
    end
    assert_equal '.', buffer
    assert_nil @av.output_buffer
  end

  def test_with_output_buffer_swaps_the_output_buffer_with_an_argument
    assert_nil @av.output_buffer
    buffer = ActionView::OutputBuffer.new('.')
    @av.with_output_buffer(buffer) do
      @av.output_buffer << '.'
    end
    assert_equal '..', buffer
    assert_nil @av.output_buffer
  end

  def test_with_output_buffer_restores_the_output_buffer
    buffer = ActionView::OutputBuffer.new
    @av.output_buffer = buffer
    @av.with_output_buffer do
      @av.output_buffer << '.'
    end
    assert buffer.equal?(@av.output_buffer)
  end

  unless RUBY_VERSION < '1.9'
    def test_with_output_buffer_sets_proper_encoding
      @av.output_buffer = ActionView::OutputBuffer.new

      # Ensure we set the output buffer to an encoding different than the default one.
95
      alt_encoding = alt_encoding(@av.output_buffer)
96 97 98
      @av.output_buffer.force_encoding(alt_encoding)

      @av.with_output_buffer do
99
        assert_equal alt_encoding, @av.output_buffer.encoding
100 101 102 103
      end
    end
  end

104
  def test_with_output_buffer_does_not_assume_there_is_an_output_buffer
105 106
    assert_nil @av.output_buffer
    assert_equal "", @av.with_output_buffer {}
107
  end
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

  def test_flush_output_buffer_concats_output_buffer_to_response
    view = view_with_controller
    assert_equal [], view.response.body_parts

    view.output_buffer << 'OMG'
    view.flush_output_buffer
    assert_equal ['OMG'], view.response.body_parts
    assert_equal '', view.output_buffer

    view.output_buffer << 'foobar'
    view.flush_output_buffer
    assert_equal ['OMG', 'foobar'], view.response.body_parts
    assert_equal '', view.output_buffer
  end

  unless RUBY_VERSION < '1.9'
    def test_flush_output_buffer_preserves_the_encoding_of_the_output_buffer
      view = view_with_controller
      alt_encoding = alt_encoding(view.output_buffer)
      view.output_buffer.force_encoding(alt_encoding)
      flush_output_buffer
      assert_equal alt_encoding, view.output_buffer.encoding
    end
  end

  def alt_encoding(output_buffer)
    output_buffer.encoding == Encoding::US_ASCII ? Encoding::UTF_8 : Encoding::US_ASCII
  end

  def view_with_controller
S
Santiago Pastorino 已提交
139
    TestController.new.view_context.tap do |view|
140 141 142
      view.output_buffer = ActionView::OutputBuffer.new
    end
  end
143
end