aboutsummaryrefslogblamecommitdiffstats
path: root/actionpack/test/controller/new_base/render_streaming_test.rb
blob: 5cd8f82323d7da4c83309ca0984a988b23d949ae (plain) (tree)
1
2
3
4
5
6
7
8
9
                       




                                                                     
                                                                                

                                                                                         


                        

                   
                         

       
                        
                                                                


                          
                                         

       
            
                                                 

       
                
                                                


                 
                                                               



                                          
                                                



























                                                                                             




                                                           

                                                    
                                                                                                                        




                                                      
                                                                                                 


                       

                                                                  
                                                                                            



                                                        
                                              
            
                                      


         
                                       
                                                                                          





                                                    





                                                          
     
   
require "abstract_unit"

module RenderStreaming
  class BasicController < ActionController::Base
    self.view_paths = [ActionView::FixtureResolver.new(
      "render_streaming/basic/hello_world.html.erb" => "Hello world",
      "render_streaming/basic/boom.html.erb" => "<%= raise 'Ruby was here!' %>",
      "layouts/application.html.erb" => "<%= yield %>, I'm here!",
      "layouts/boom.html.erb" => "<body class=\"<%= nil.invalid! %>\"<%= yield %></body>"
    )]

    layout "application"

    def hello_world
      render stream: true
    end

    def layout_exception
      render action: "hello_world", stream: true, layout: "boom"
    end

    def template_exception
      render action: "boom", stream: true
    end

    def skip
      render action: "hello_world", stream: false
    end

    def explicit
      render action: "hello_world", stream: true
    end

    def no_layout
      render action: "hello_world", stream: true, layout: false
    end

    def explicit_cache
      headers["Cache-Control"] = "private"
      render action: "hello_world", stream: true
    end
  end

  class StreamingTest < Rack::TestCase
    test "rendering with streaming enabled at the class level" do
      get "/render_streaming/basic/hello_world"
      assert_body "b\r\nHello world\r\nb\r\n, I'm here!\r\n0\r\n\r\n"
      assert_streaming!
    end

    test "rendering with streaming given to render" do
      get "/render_streaming/basic/explicit"
      assert_body "b\r\nHello world\r\nb\r\n, I'm here!\r\n0\r\n\r\n"
      assert_streaming!
    end

    test "rendering with streaming do not override explicit cache control given to render" do
      get "/render_streaming/basic/explicit_cache"
      assert_body "b\r\nHello world\r\nb\r\n, I'm here!\r\n0\r\n\r\n"
      assert_streaming! "private"
    end

    test "rendering with streaming no layout" do
      get "/render_streaming/basic/no_layout"
      assert_body "b\r\nHello world\r\n0\r\n\r\n"
      assert_streaming!
    end

    test "skip rendering with streaming at render level" do
      get "/render_streaming/basic/skip"
      assert_body "Hello world, I'm here!"
    end

    test "rendering with layout exception" do
      get "/render_streaming/basic/layout_exception"
      assert_body "d\r\n<body class=\"\r\n37\r\n\"><script>window.location = \"/500.html\"</script></html>\r\n0\r\n\r\n"
      assert_streaming!
    end

    test "rendering with template exception" do
      get "/render_streaming/basic/template_exception"
      assert_body "37\r\n\"><script>window.location = \"/500.html\"</script></html>\r\n0\r\n\r\n"
      assert_streaming!
    end

    test "rendering with template exception logs the exception" do
      io = StringIO.new
      _old, ActionView::Base.logger = ActionView::Base.logger, ActiveSupport::Logger.new(io)

      begin
        get "/render_streaming/basic/template_exception"
        io.rewind
        assert_match "Ruby was here!", io.read
      ensure
        ActionView::Base.logger = _old
      end
    end

    test "do not stream on HTTP/1.0" do
      get "/render_streaming/basic/hello_world", headers: { "HTTP_VERSION" => "HTTP/1.0" }
      assert_body "Hello world, I'm here!"
      assert_status 200
      assert_equal "22", headers["Content-Length"]
      assert_equal nil, headers["Transfer-Encoding"]
    end

    def assert_streaming!(cache="no-cache")
      assert_status 200
      assert_equal nil, headers["Content-Length"]
      assert_equal "chunked", headers["Transfer-Encoding"]
      assert_equal cache, headers["Cache-Control"]
    end
  end
end