1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/test/controller/renderers_test.rb
yuuji.yaginuma ea5f509643 Change ActionDispatch::Response#content_type returning Content-Type header as it is
Since #35709, `Response#conten_type` returns only MIME type correctly.
It is a documented behavior that this method only returns MIME type, so
this change seems appropriate.
39de7fac05/actionpack/lib/action_dispatch/http/response.rb (L245-L249)

But unfortunately, some users expect this method to return all
Content-Type that does not contain charset. This seems to be breaking
changes.

We can change this behavior with the deprecate cycle.
But, in that case, a method needs that include Content-Type with
additional parameters. And that method name is probably the
`content_type` seems to properly.

So I changed the new behavior to more appropriate `media_type` method.
And `Response#content_type` changed (as the method name) to return Content-Type
header as it is.

Fixes #35709.

[Rafael Mendonça França & Yuuji Yaginuma ]
2019-06-01 09:20:13 +09:00

91 lines
2.4 KiB
Ruby

# frozen_string_literal: true
require "abstract_unit"
require "controller/fake_models"
require "active_support/logger"
class RenderersTest < ActionController::TestCase
class XmlRenderable
def to_xml(options)
options[:root] ||= "i-am-xml"
"<#{options[:root]}/>"
end
end
class JsonRenderable
def as_json(options = {})
hash = { a: :b, c: :d, e: :f }
hash.except!(*options[:except]) if options[:except]
hash
end
def to_json(options = {})
super except: [:c, :e]
end
end
class CsvRenderable
def to_csv
"c,s,v"
end
end
class TestController < ActionController::Base
def render_simon_says
render simon: "foo"
end
def respond_to_mime
respond_to do |type|
type.json do
render json: JsonRenderable.new
end
type.js { render json: "JS", callback: "alert" }
type.csv { render csv: CsvRenderable.new }
type.xml { render xml: XmlRenderable.new }
type.html { render body: "HTML" }
type.rss { render body: "RSS" }
type.all { render body: "Nothing" }
type.any(:js, :xml) { render body: "Either JS or XML" }
end
end
end
tests TestController
def setup
# enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
# a more accurate simulation of what happens in "real life".
super
@controller.logger = ActiveSupport::Logger.new(nil)
end
def test_using_custom_render_option
ActionController.add_renderer :simon do |says, options|
self.content_type = Mime[:text]
self.response_body = "Simon says: #{says}"
end
get :render_simon_says
assert_equal "Simon says: foo", @response.body
ensure
ActionController.remove_renderer :simon
end
def test_raises_missing_template_no_renderer
assert_raise ActionView::MissingTemplate do
get :respond_to_mime, format: "csv"
end
assert_equal Mime[:csv], @response.media_type
assert_equal "", @response.body
end
def test_adding_csv_rendering_via_renderers_add
ActionController::Renderers.add :csv do |value, options|
send_data value.to_csv, type: Mime[:csv]
end
@request.accept = "text/csv"
get :respond_to_mime, format: "csv"
assert_equal Mime[:csv], @response.media_type
assert_equal "c,s,v", @response.body
ensure
ActionController::Renderers.remove :csv
end
end