mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add ActionController:Renderers test
To complement actionpack/test/controller/metal/renderers_test.rb
This commit is contained in:
parent
41ed6e90b1
commit
f27360af04
3 changed files with 99 additions and 24 deletions
|
@ -11,6 +11,7 @@ module ActionController
|
||||||
Renderers.remove(key)
|
Renderers.remove(key)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# See <tt>Responder#api_behavior</tt>
|
||||||
class MissingRenderer < LoadError
|
class MissingRenderer < LoadError
|
||||||
def initialize(format)
|
def initialize(format)
|
||||||
super "No renderer defined for format: #{format}"
|
super "No renderer defined for format: #{format}"
|
||||||
|
@ -67,6 +68,11 @@ module ActionController
|
||||||
alias use_renderer use_renderers
|
alias use_renderer use_renderers
|
||||||
end
|
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)
|
def render_to_body(options)
|
||||||
_render_to_body_with_renderer(options) || super
|
_render_to_body_with_renderer(options) || super
|
||||||
end
|
end
|
||||||
|
@ -137,6 +143,9 @@ module ActionController
|
||||||
remove_method(method_name) if method_defined?(method_name)
|
remove_method(method_name) if method_defined?(method_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Used in <tt>ActionController::Base</tt>
|
||||||
|
# and <tt>ActionController::API</tt> to include all
|
||||||
|
# renderers by default.
|
||||||
module All
|
module All
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
include Renderers
|
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
|
|
90
actionpack/test/controller/renderers_test.rb
Normal file
90
actionpack/test/controller/renderers_test.rb
Normal file
|
@ -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
|
Loading…
Reference in a new issue