Add ActionController:Renderers test

To complement actionpack/test/controller/metal/renderers_test.rb
This commit is contained in:
Benjamin Fleischer 2016-01-03 22:13:59 -06:00
parent 41ed6e90b1
commit f27360af04
3 changed files with 99 additions and 24 deletions

@ -11,6 +11,7 @@ def self.remove_renderer(key)
Renderers.remove(key)
end
# See <tt>Responder#api_behavior</tt>
class MissingRenderer < LoadError
def initialize(format)
super "No renderer defined for format: #{format}"
@ -67,6 +68,11 @@ def use_renderers(*args)
alias use_renderer use_renderers
end
# Called by +render+ in <tt>AbstractController::Renderering</tt>
# which sets the return value as the +response_body+.
#
# If no renderer is found, +super+ returns control to
# <tt>ActionView::Rendering.render_to_body</tt>, if present.
def render_to_body(options)
_render_to_body_with_renderer(options) || super
end
@ -137,6 +143,9 @@ def self.remove(key)
remove_method(method_name) if method_defined?(method_name)
end
# Used in <tt>ActionController::Base</tt>
# and <tt>ActionController::API</tt> to include all
# renderers by default.
module All
extend ActiveSupport::Concern
include Renderers

@ -1,24 +0,0 @@
require 'abstract_unit'
class RenderOtherTest < ActionController::TestCase
class TestController < ActionController::Base
def render_simon_says
render :simon => "foo"
end
end
tests TestController
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
end

@ -0,0 +1,90 @@
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.content_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.content_type
assert_equal "c,s,v", @response.body
ensure
ActionController::Renderers.remove :csv
end
end