Remove assigns and assert_template.

This commit is contained in:
Guo Xiang Tan 2015-05-13 18:28:33 +08:00
parent 109e71d2bb
commit ca83436d1b
26 changed files with 166 additions and 880 deletions

@ -1,3 +1,10 @@
* Remove `assigns` and `assert_template`. Both methods have been extracted
into a gem at https://github.com/rails/rails-controller-testing.
See #18950.
*Alan Guo Xiang Tan*
* `FileHandler` and `Static` middleware initializers accept `index` argument
to configure the directory index file name. Defaults to `index` (as in
`index.html`).

@ -1,188 +1,9 @@
module ActionController
module TemplateAssertions
extend ActiveSupport::Concern
included do
setup :setup_subscriptions
teardown :teardown_subscriptions
end
RENDER_TEMPLATE_INSTANCE_VARIABLES = %w{partials templates layouts files}.freeze
def setup_subscriptions
RENDER_TEMPLATE_INSTANCE_VARIABLES.each do |instance_variable|
instance_variable_set("@_#{instance_variable}", Hash.new(0))
end
@_subscribers = []
@_subscribers << ActiveSupport::Notifications.subscribe("render_template.action_view") do |_name, _start, _finish, _id, payload|
path = payload[:layout]
if path
@_layouts[path] += 1
if path =~ /^layouts\/(.*)/
@_layouts[$1] += 1
end
end
end
@_subscribers << ActiveSupport::Notifications.subscribe("!render_template.action_view") do |_name, _start, _finish, _id, payload|
if virtual_path = payload[:virtual_path]
partial = virtual_path =~ /^.*\/_[^\/]*$/
if partial
@_partials[virtual_path] += 1
@_partials[virtual_path.split("/").last] += 1
end
@_templates[virtual_path] += 1
else
path = payload[:identifier]
if path
@_files[path] += 1
@_files[path.split("/").last] += 1
end
end
end
end
def teardown_subscriptions
@_subscribers.each do |subscriber|
ActiveSupport::Notifications.unsubscribe(subscriber)
end
end
def process(*args)
reset_template_assertion
super
end
def reset_template_assertion
RENDER_TEMPLATE_INSTANCE_VARIABLES.each do |instance_variable|
ivar_name = "@_#{instance_variable}"
if instance_variable_defined?(ivar_name)
instance_variable_get(ivar_name).clear
end
end
end
# Asserts that the request was rendered with the appropriate template file or partials.
#
# # assert that the "new" view template was rendered
# assert_template "new"
#
# # assert that the exact template "admin/posts/new" was rendered
# assert_template %r{\Aadmin/posts/new\Z}
#
# # assert that the layout 'admin' was rendered
# assert_template layout: 'admin'
# assert_template layout: 'layouts/admin'
# assert_template layout: :admin
#
# # assert that no layout was rendered
# assert_template layout: nil
# assert_template layout: false
#
# # assert that the "_customer" partial was rendered twice
# assert_template partial: '_customer', count: 2
#
# # assert that no partials were rendered
# assert_template partial: false
#
# # assert that a file was rendered
# assert_template file: "README.rdoc"
#
# # assert that no file was rendered
# assert_template file: nil
# assert_template file: false
#
# In a view test case, you can also assert that specific locals are passed
# to partials:
#
# # assert that the "_customer" partial was rendered with a specific object
# assert_template partial: '_customer', locals: { customer: @customer }
def assert_template(options = {}, message = nil)
# Force body to be read in case the template is being streamed.
response.body
case options
when NilClass, Regexp, String, Symbol
options = options.to_s if Symbol === options
rendered = @_templates
msg = message || sprintf("expecting <%s> but rendering with <%s>",
options.inspect, rendered.keys)
matches_template =
case options
when String
!options.empty? && rendered.any? do |t, num|
options_splited = options.split(File::SEPARATOR)
t_splited = t.split(File::SEPARATOR)
t_splited.last(options_splited.size) == options_splited
end
when Regexp
rendered.any? { |t,num| t.match(options) }
when NilClass
rendered.blank?
end
assert matches_template, msg
when Hash
options.assert_valid_keys(:layout, :partial, :locals, :count, :file)
if options.key?(:layout)
expected_layout = options[:layout]
msg = message || sprintf("expecting layout <%s> but action rendered <%s>",
expected_layout, @_layouts.keys)
case expected_layout
when String, Symbol
assert_includes @_layouts.keys, expected_layout.to_s, msg
when Regexp
assert(@_layouts.keys.any? {|l| l =~ expected_layout }, msg)
when nil, false
assert(@_layouts.empty?, msg)
else
raise ArgumentError, "assert_template only accepts a String, Symbol, Regexp, nil or false for :layout"
end
end
if options[:file]
assert_includes @_files.keys, options[:file]
elsif options.key?(:file)
assert @_files.blank?, "expected no files but #{@_files.keys} was rendered"
end
if expected_partial = options[:partial]
if expected_locals = options[:locals]
if defined?(@_rendered_views)
view = expected_partial.to_s.sub(/^_/, '').sub(/\/_(?=[^\/]+\z)/, '/')
partial_was_not_rendered_msg = "expected %s to be rendered but it was not." % view
assert_includes @_rendered_views.rendered_views, view, partial_was_not_rendered_msg
msg = 'expecting %s to be rendered with %s but was with %s' % [expected_partial,
expected_locals,
@_rendered_views.locals_for(view)]
assert(@_rendered_views.view_rendered?(view, options[:locals]), msg)
else
warn "the :locals option to #assert_template is only supported in a ActionView::TestCase"
end
elsif expected_count = options[:count]
actual_count = @_partials[expected_partial]
msg = message || sprintf("expecting %s to be rendered %s time(s) but rendered %s time(s)",
expected_partial, expected_count, actual_count)
assert(actual_count == expected_count.to_i, msg)
else
msg = message || sprintf("expecting partial <%s> but action rendered <%s>",
options[:partial], @_partials.keys)
assert_includes @_partials, expected_partial, msg
end
elsif options.key?(:partial)
assert @_partials.empty?,
"Expected no partials to be rendered"
end
else
raise ArgumentError, "assert_template only accepts a String, Symbol, Hash, Regexp, or nil"
end
raise NoMethodError,
"assert_template has been extracted to a gem. To continue using it,
add `gem 'rails-controller-testing'` to your Gemfile."
end
end
end

@ -218,21 +218,15 @@ def load!
# In addition to these specific assertions, you also have easy access to various collections that the regular test/unit assertions
# can be used against. These collections are:
#
# * assigns: Instance variables assigned in the action that are available for the view.
# * session: Objects being saved in the session.
# * flash: The flash objects currently in the session.
# * cookies: \Cookies being sent to the user on this request.
#
# These collections can be used just like any other hash:
#
# assert_not_nil assigns(:person) # makes sure that a @person instance variable was set
# assert_equal "Dave", cookies[:name] # makes sure that a cookie called :name was set as "Dave"
# assert flash.empty? # makes sure that there's nothing in the flash
#
# For historic reasons, the assigns hash uses string-based keys. So <tt>assigns[:person]</tt> won't work, but <tt>assigns["person"]</tt> will. To
# appease our yearning for symbols, though, an alternative accessor has been devised using a method call instead of index referencing.
# So <tt>assigns(:person)</tt> will work just like <tt>assigns["person"]</tt>, but again, <tt>assigns[:person]</tt> will not work.
#
# On top of the collections, you have the complete url that a given action redirected to available in <tt>redirect_to_url</tt>.
#
# For redirects within the same controller, you can even call follow_redirect and the redirect will be followed, triggering another

@ -232,7 +232,6 @@ module ActionDispatch
# def send_to_jail
# get '/jail'
# assert_response :success
# assert_template "jail/front"
# end
#
# def goes_to_login

@ -429,7 +429,6 @@ def remove! # :nodoc:
# reset the html_document variable, except for cookies/assigns calls
unless method == 'cookies' || method == 'assigns'
@html_document = nil
reset_template_assertion
end
integration_session.__send__(method, *args).tap do

@ -5,9 +5,9 @@
module ActionDispatch
module TestProcess
def assigns(key = nil)
assigns = {}.with_indifferent_access
@controller.view_assigns.each { |k, v| assigns.regular_writer(k, v) }
key.nil? ? assigns : assigns[key]
raise NoMethodError,
"assigns has been extracted to a gem. To continue using it,
add `gem 'rails-controller-testing'` to your Gemfile."
end
def session

@ -5,9 +5,6 @@ class ActionPackAssertionsController < ActionController::Base
def nothing() head :ok end
def hello_world() render :template => "test/hello_world"; end
def hello_repeating_in_path() render :template => "test/hello/hello"; end
def hello_xml_world() render :template => "test/hello_xml_world"; end
def hello_xml_world_pdf
@ -20,8 +17,6 @@ def hello_xml_world_pdf_header
render :template => "test/hello_xml_world"
end
def partial() render :partial => 'test/partial'; end
def redirect_internal() redirect_to "/nothing"; end
def redirect_to_action() redirect_to :action => "flash_me", :id => 1, :params => { "panda" => "fun" }; end
@ -73,16 +68,6 @@ def render_text_with_custom_content_type
render :text => "Hello!", :content_type => Mime::RSS
end
def render_with_layout
@variable_for_layout = nil
render "test/hello_world", :layout => "layouts/standard"
end
def render_with_layout_and_partial
@variable_for_layout = nil
render "test/hello_world_with_partial", :layout => "layouts/standard"
end
def session_stuffing
session['xmas'] = 'turkey'
render :text => "ho ho ho"
@ -304,14 +289,6 @@ def session_does_not_exist
assert session.empty?
end
def test_render_template_action
process :nothing
assert_template nil
process :hello_world
assert_template 'hello_world'
end
def test_redirection_location
process :redirect_internal
assert_equal 'http://test.host/nothing', @response.redirect_url
@ -455,192 +432,6 @@ def test_assert_response_failure_response_with_no_exception
end
end
class AssertTemplateTest < ActionController::TestCase
tests ActionPackAssertionsController
def test_with_invalid_hash_keys_raises_argument_error
assert_raise(ArgumentError) do
assert_template foo: "bar"
end
end
def test_with_partial
get :partial
assert_template :partial => '_partial'
end
def test_file_with_absolute_path_success
get :render_file_absolute_path
assert_template :file => File.expand_path('../../../README.rdoc', __FILE__)
end
def test_file_with_relative_path_success
get :render_file_relative_path
assert_template :file => 'README.rdoc'
end
def test_with_file_failure
get :render_file_absolute_path
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template :file => 'test/hello_world'
end
get :render_file_absolute_path
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template file: nil
end
end
def test_with_nil_passes_when_no_template_rendered
get :nothing
assert_template nil
end
def test_with_nil_fails_when_template_rendered
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template nil
end
end
def test_with_empty_string_fails_when_template_rendered
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template ""
end
end
def test_with_empty_string_fails_when_no_template_rendered
get :nothing
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template ""
end
end
def test_passes_with_correct_string
get :hello_world
assert_template 'hello_world'
assert_template 'test/hello_world'
end
def test_passes_with_correct_symbol
get :hello_world
assert_template :hello_world
end
def test_fails_with_incorrect_string
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template 'hello_planet'
end
end
def test_fails_with_incorrect_string_that_matches
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template 'est/he'
end
end
def test_fails_with_repeated_name_in_path
get :hello_repeating_in_path
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template 'test/hello'
end
end
def test_fails_with_incorrect_symbol
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template :hello_planet
end
end
def test_fails_with_incorrect_symbol_that_matches
get :hello_world
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template :"est/he"
end
end
def test_fails_with_wrong_layout
get :render_with_layout
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template :layout => "application"
end
end
def test_fails_expecting_no_layout
get :render_with_layout
assert_raise(ActiveSupport::TestCase::Assertion) do
assert_template :layout => nil
end
end
def test_fails_expecting_not_known_layout
get :render_with_layout
assert_raise(ArgumentError) do
assert_template :layout => 1
end
end
def test_passes_with_correct_layout
get :render_with_layout
assert_template :layout => "layouts/standard"
end
def test_passes_with_layout_and_partial
get :render_with_layout_and_partial
assert_template :layout => "layouts/standard"
end
def test_passed_with_no_layout
get :hello_world
assert_template :layout => nil
end
def test_passed_with_no_layout_false
get :hello_world
assert_template :layout => false
end
def test_passes_with_correct_layout_without_layouts_prefix
get :render_with_layout
assert_template :layout => "standard"
end
def test_passes_with_correct_layout_symbol
get :render_with_layout
assert_template :layout => :standard
end
def test_assert_template_reset_between_requests
get :hello_world
assert_template 'test/hello_world'
get :nothing
assert_template nil
get :partial
assert_template partial: 'test/_partial'
get :nothing
assert_template partial: nil
get :render_with_layout
assert_template layout: 'layouts/standard'
get :nothing
assert_template layout: nil
get :render_file_relative_path
assert_template file: 'README.rdoc'
get :nothing
assert_template file: nil
end
end
class ActionPackHeaderTest < ActionController::TestCase
tests ActionPackAssertionsController

@ -13,16 +13,6 @@ def before_actions
filters.map!(&:raw_filter)
end
end
def assigns(key = nil)
assigns = {}
instance_variables.each do |ivar|
next if ActionController::Base.protected_instance_variables.include?(ivar)
assigns[ivar[1..-1]] = instance_variable_get(ivar)
end
key.nil? ? assigns : assigns[key.to_s]
end
end
class FilterTest < ActionController::TestCase
@ -560,7 +550,7 @@ def test_non_yielding_around_actions_do_not_raise
def test_after_actions_are_not_run_if_around_action_does_not_yield
controller = NonYieldingAroundFilterController.new
test_process(controller, "index")
assert_equal ["filter_one", "it didn't yield"], controller.assigns['filters']
assert_equal ["filter_one", "it didn't yield"], controller.instance_variable_get(:@filters)
end
def test_added_action_to_inheritance_graph
@ -577,140 +567,141 @@ def test_prepending_action
def test_running_actions
test_process(PrependingController)
assert_equal %w( wonderful_life ensure_login ), assigns["ran_filter"]
assert_equal %w( wonderful_life ensure_login ),
@controller.instance_variable_get(:@ran_filter)
end
def test_running_actions_with_proc
test_process(ProcController)
assert assigns["ran_proc_action"]
assert @controller.instance_variable_get(:@ran_proc_action)
end
def test_running_actions_with_implicit_proc
test_process(ImplicitProcController)
assert assigns["ran_proc_action"]
assert @controller.instance_variable_get(:@ran_proc_action)
end
def test_running_actions_with_class
test_process(AuditController)
assert assigns["was_audited"]
assert @controller.instance_variable_get(:@was_audited)
end
def test_running_anomolous_yet_valid_condition_actions
test_process(AnomolousYetValidConditionController)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert assigns["ran_class_action"]
assert assigns["ran_proc_action1"]
assert assigns["ran_proc_action2"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
assert @controller.instance_variable_get(:@ran_class_action)
assert @controller.instance_variable_get(:@ran_proc_action1)
assert @controller.instance_variable_get(:@ran_proc_action2)
test_process(AnomolousYetValidConditionController, "show_without_action")
assert_nil assigns["ran_filter"]
assert !assigns["ran_class_action"]
assert !assigns["ran_proc_action1"]
assert !assigns["ran_proc_action2"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
assert_not @controller.instance_variable_defined?(:@ran_class_action)
assert_not @controller.instance_variable_defined?(:@ran_proc_action1)
assert_not @controller.instance_variable_defined?(:@ran_proc_action2)
end
def test_running_conditional_options
test_process(ConditionalOptionsFilter)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
end
def test_running_conditional_skip_options
test_process(ConditionalOptionsSkipFilter)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
end
def test_if_is_ignored_when_used_with_only
test_process(SkipFilterUsingOnlyAndIf, 'login')
assert_nil assigns['ran_filter']
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_except_is_ignored_when_used_with_if
test_process(SkipFilterUsingIfAndExcept, 'login')
assert_equal %w(ensure_login), assigns["ran_filter"]
assert_equal %w(ensure_login), @controller.instance_variable_get(:@ran_filter)
end
def test_skipping_class_actions
test_process(ClassController)
assert_equal true, assigns["ran_class_action"]
assert_equal true, @controller.instance_variable_get(:@ran_class_action)
skipping_class_controller = Class.new(ClassController) do
skip_before_action ConditionalClassFilter
end
test_process(skipping_class_controller)
assert_nil assigns['ran_class_action']
assert_not @controller.instance_variable_defined?(:@ran_class_action)
end
def test_running_collection_condition_actions
test_process(ConditionalCollectionFilterController)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
test_process(ConditionalCollectionFilterController, "show_without_action")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
test_process(ConditionalCollectionFilterController, "another_action")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_running_only_condition_actions
test_process(OnlyConditionSymController)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
test_process(OnlyConditionSymController, "show_without_action")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
test_process(OnlyConditionProcController)
assert assigns["ran_proc_action"]
assert @controller.instance_variable_get(:@ran_proc_action)
test_process(OnlyConditionProcController, "show_without_action")
assert !assigns["ran_proc_action"]
assert_not @controller.instance_variable_defined?(:@ran_proc_action)
test_process(OnlyConditionClassController)
assert assigns["ran_class_action"]
assert @controller.instance_variable_get(:@ran_class_action)
test_process(OnlyConditionClassController, "show_without_action")
assert !assigns["ran_class_action"]
assert_not @controller.instance_variable_defined?(:@ran_class_action)
end
def test_running_except_condition_actions
test_process(ExceptConditionSymController)
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
test_process(ExceptConditionSymController, "show_without_action")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
test_process(ExceptConditionProcController)
assert assigns["ran_proc_action"]
assert @controller.instance_variable_get(:@ran_proc_action)
test_process(ExceptConditionProcController, "show_without_action")
assert !assigns["ran_proc_action"]
assert_not @controller.instance_variable_defined?(:@ran_proc_action)
test_process(ExceptConditionClassController)
assert assigns["ran_class_action"]
assert @controller.instance_variable_get(:@ran_class_action)
test_process(ExceptConditionClassController, "show_without_action")
assert !assigns["ran_class_action"]
assert_not @controller.instance_variable_defined?(:@ran_class_action)
end
def test_running_only_condition_and_conditional_options
test_process(OnlyConditionalOptionsFilter, "show")
assert_not assigns["ran_conditional_index_proc"]
assert_not @controller.instance_variable_defined?(:@ran_conditional_index_proc)
end
def test_running_before_and_after_condition_actions
test_process(BeforeAndAfterConditionController)
assert_equal %w( ensure_login clean_up_tmp), assigns["ran_filter"]
assert_equal %w( ensure_login clean_up_tmp), @controller.instance_variable_get(:@ran_filter)
test_process(BeforeAndAfterConditionController, "show_without_action")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_around_action
test_process(AroundFilterController)
assert assigns["before_ran"]
assert assigns["after_ran"]
assert @controller.instance_variable_get(:@before_ran)
assert @controller.instance_variable_get(:@after_ran)
end
def test_before_after_class_action
test_process(BeforeAfterClassFilterController)
assert assigns["before_ran"]
assert assigns["after_ran"]
assert @controller.instance_variable_get(:@before_ran)
assert @controller.instance_variable_get(:@after_ran)
end
def test_having_properties_in_around_action
test_process(AroundFilterController)
assert_equal "before and after", assigns["execution_log"]
assert_equal "before and after", @controller.instance_variable_get(:@execution_log)
end
def test_prepending_and_appending_around_action
@ -723,33 +714,33 @@ def test_prepending_and_appending_around_action
def test_rendering_breaks_actioning_chain
response = test_process(RenderingController)
assert_equal "something else", response.body
assert !assigns["ran_action"]
assert_not @controller.instance_variable_defined?(:@ran_action)
end
def test_before_action_rendering_breaks_actioning_chain_for_after_action
test_process(RenderingController)
assert_equal %w( before_action_rendering ), assigns["ran_filter"]
assert !assigns["ran_action"]
assert_equal %w( before_action_rendering ), @controller.instance_variable_get(:@ran_filter)
assert_not @controller.instance_variable_defined?(:@ran_action)
end
def test_before_action_redirects_breaks_actioning_chain_for_after_action
test_process(BeforeActionRedirectionController)
assert_response :redirect
assert_equal "http://test.host/filter_test/before_action_redirection/target_of_redirection", redirect_to_url
assert_equal %w( before_action_redirects ), assigns["ran_filter"]
assert_equal %w( before_action_redirects ), @controller.instance_variable_get(:@ran_filter)
end
def test_before_action_rendering_breaks_actioning_chain_for_preprend_after_action
test_process(RenderingForPrependAfterActionController)
assert_equal %w( before_action_rendering ), assigns["ran_filter"]
assert !assigns["ran_action"]
assert_equal %w( before_action_rendering ), @controller.instance_variable_get(:@ran_filter)
assert_not @controller.instance_variable_defined?(:@ran_action)
end
def test_before_action_redirects_breaks_actioning_chain_for_preprend_after_action
test_process(BeforeActionRedirectionForPrependAfterActionController)
assert_response :redirect
assert_equal "http://test.host/filter_test/before_action_redirection_for_prepend_after_action/target_of_redirection", redirect_to_url
assert_equal %w( before_action_redirects ), assigns["ran_filter"]
assert_equal %w( before_action_redirects ), @controller.instance_variable_get(:@ran_filter)
end
def test_actions_with_mixed_specialization_run_in_order
@ -775,26 +766,26 @@ def test_dynamic_dispatch
def test_running_prepended_before_and_after_action
test_process(PrependingBeforeAndAfterController)
assert_equal %w( before_all between_before_all_and_after_all after_all ), assigns["ran_filter"]
assert_equal %w( before_all between_before_all_and_after_all after_all ), @controller.instance_variable_get(:@ran_filter)
end
def test_skipping_and_limiting_controller
test_process(SkippingAndLimitedController, "index")
assert_equal %w( ensure_login ), assigns["ran_filter"]
assert_equal %w( ensure_login ), @controller.instance_variable_get(:@ran_filter)
test_process(SkippingAndLimitedController, "public")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_skipping_and_reordering_controller
test_process(SkippingAndReorderingController, "index")
assert_equal %w( find_record ensure_login ), assigns["ran_filter"]
assert_equal %w( find_record ensure_login ), @controller.instance_variable_get(:@ran_filter)
end
def test_conditional_skipping_of_actions
test_process(ConditionalSkippingController, "login")
assert_nil assigns["ran_filter"]
assert_not @controller.instance_variable_defined?(:@ran_filter)
test_process(ConditionalSkippingController, "change_password")
assert_equal %w( ensure_login find_user ), assigns["ran_filter"]
assert_equal %w( ensure_login find_user ), @controller.instance_variable_get(:@ran_filter)
test_process(ConditionalSkippingController, "login")
assert !@controller.instance_variable_defined?("@ran_after_action")
@ -804,23 +795,23 @@ def test_conditional_skipping_of_actions
def test_conditional_skipping_of_actions_when_parent_action_is_also_conditional
test_process(ChildOfConditionalParentController)
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter']
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), @controller.instance_variable_get(:@ran_filter)
test_process(ChildOfConditionalParentController, 'another_action')
assert_nil assigns['ran_filter']
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_condition_skipping_of_actions_when_siblings_also_have_conditions
test_process(ChildOfConditionalParentController)
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter']
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), @controller.instance_variable_get(:@ran_filter)
test_process(AnotherChildOfConditionalParentController)
assert_equal %w( conditional_in_parent_after ), assigns['ran_filter']
assert_equal %w( conditional_in_parent_after ), @controller.instance_variable_get(:@ran_filter)
test_process(ChildOfConditionalParentController)
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), assigns['ran_filter']
assert_equal %w( conditional_in_parent_before conditional_in_parent_after ), @controller.instance_variable_get(:@ran_filter)
end
def test_changing_the_requirements
test_process(ChangingTheRequirementsController, "go_wild")
assert_nil assigns['ran_filter']
assert_not @controller.instance_variable_defined?(:@ran_filter)
end
def test_a_rescuing_around_action
@ -835,13 +826,13 @@ def test_a_rescuing_around_action
def test_actions_obey_only_and_except_for_implicit_actions
test_process(ImplicitActionsController, 'show')
assert_equal 'Except', assigns(:except)
assert_nil assigns(:only)
assert_equal 'Except', @controller.instance_variable_get(:@except)
assert_not @controller.instance_variable_defined?(:@only)
assert_equal 'show', response.body
test_process(ImplicitActionsController, 'edit')
assert_equal 'Only', assigns(:only)
assert_nil assigns(:except)
assert_equal 'Only', @controller.instance_variable_get(:@only)
assert_not @controller.instance_variable_defined?(:@except)
assert_equal 'edit', response.body
end
@ -1010,8 +1001,8 @@ def test_with_instance
def test_with_proc
test_process(ControllerWithProcFilter,'no_raise')
assert assigns['before']
assert assigns['after']
assert @controller.instance_variable_get(:@before)
assert @controller.instance_variable_get(:@after)
end
def test_nested_actions
@ -1032,12 +1023,12 @@ def test_nested_actions
def test_action_order_with_all_action_types
test_process(ControllerWithAllTypesOfFilters,'no_raise')
assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) after around (after yield)', assigns['ran_filter'].join(' ')
assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) after around (after yield)', @controller.instance_variable_get(:@ran_filter).join(' ')
end
def test_action_order_with_skip_action_method
test_process(ControllerWithTwoLessFilters,'no_raise')
assert_equal 'before around (before yield) around (after yield)', assigns['ran_filter'].join(' ')
assert_equal 'before around (before yield) around (after yield)', @controller.instance_variable_get(:@ran_filter).join(' ')
end
def test_first_action_in_multiple_before_action_chain_halts
@ -1063,7 +1054,7 @@ def test_last_action_in_multiple_before_action_chain_halts
def test_skipping_with_skip_action_callback
test_process(SkipFilterUsingSkipActionCallback,'no_raise')
assert_equal 'before around (before yield) around (after yield)', assigns['ran_filter'].join(' ')
assert_equal 'before around (before yield) around (after yield)', @controller.instance_variable_get(:@ran_filter).join(' ')
end
def test_deprecated_skip_action_callback

@ -103,54 +103,55 @@ def test_flash
get :set_flash
get :use_flash
assert_equal "hello", assigns["flash_copy"]["that"]
assert_equal "hello", assigns["flashy"]
assert_equal "hello", @controller.instance_variable_get(:@flash_copy)["that"]
assert_equal "hello", @controller.instance_variable_get(:@flashy)
get :use_flash
assert_nil assigns["flash_copy"]["that"], "On second flash"
assert_nil @controller.instance_variable_get(:@flash_copy)["that"], "On second flash"
end
def test_keep_flash
get :set_flash
get :use_flash_and_keep_it
assert_equal "hello", assigns["flash_copy"]["that"]
assert_equal "hello", assigns["flashy"]
assert_equal "hello", @controller.instance_variable_get(:@flash_copy)["that"]
assert_equal "hello", @controller.instance_variable_get(:@flashy)
get :use_flash
assert_equal "hello", assigns["flash_copy"]["that"], "On second flash"
assert_equal "hello", @controller.instance_variable_get(:@flash_copy)["that"], "On second flash"
get :use_flash
assert_nil assigns["flash_copy"]["that"], "On third flash"
assert_nil @controller.instance_variable_get(:@flash_copy)["that"], "On third flash"
end
def test_flash_now
get :set_flash_now
assert_equal "hello", assigns["flash_copy"]["that"]
assert_equal "bar" , assigns["flash_copy"]["foo"]
assert_equal "hello", assigns["flashy"]
assert_equal "hello", @controller.instance_variable_get(:@flash_copy)["that"]
assert_equal "bar", @controller.instance_variable_get(:@flash_copy)["foo"]
assert_equal "hello", @controller.instance_variable_get(:@flashy)
get :attempt_to_use_flash_now
assert_nil assigns["flash_copy"]["that"]
assert_nil assigns["flash_copy"]["foo"]
assert_nil assigns["flashy"]
assert_nil @controller.instance_variable_get(:@flash_copy)["that"]
assert_nil @controller.instance_variable_get(:@flash_copy)["foo"]
assert_nil @controller.instance_variable_get(:@flashy)
end
def test_update_flash
get :set_flash
get :use_flash_and_update_it
assert_equal "hello", assigns["flash_copy"]["that"]
assert_equal "hello again", assigns["flash_copy"]["this"]
assert_equal "hello", @controller.instance_variable_get(:@flash_copy)["that"]
assert_equal "hello again", @controller.instance_variable_get(:@flash_copy)["this"]
get :use_flash
assert_nil assigns["flash_copy"]["that"], "On second flash"
assert_equal "hello again", assigns["flash_copy"]["this"], "On second flash"
assert_nil @controller.instance_variable_get(:@flash_copy)["that"], "On second flash"
assert_equal "hello again",
@controller.instance_variable_get(:@flash_copy)["this"], "On second flash"
end
def test_flash_after_reset_session
get :use_flash_after_reset_session
assert_equal "hello", assigns["flashy_that"]
assert_equal "good-bye", assigns["flashy_this"]
assert_nil assigns["flashy_that_reset"]
assert_equal "hello", @controller.instance_variable_get(:@flashy_that)
assert_equal "good-bye", @controller.instance_variable_get(:@flashy_this)
assert_nil @controller.instance_variable_get(:@flashy_that_reset)
end
def test_does_not_set_the_session_if_the_flash_is_empty
@ -160,13 +161,13 @@ def test_does_not_set_the_session_if_the_flash_is_empty
def test_sweep_after_halted_action_chain
get :std_action
assert_nil assigns["flash_copy"]["foo"]
assert_nil @controller.instance_variable_get(:@flash_copy)["foo"]
get :filter_halting_action
assert_equal "bar", assigns["flash_copy"]["foo"]
assert_equal "bar", @controller.instance_variable_get(:@flash_copy)["foo"]
get :std_action # follow redirection
assert_equal "bar", assigns["flash_copy"]["foo"]
assert_equal "bar", @controller.instance_variable_get(:@flash_copy)["foo"]
get :std_action
assert_nil assigns["flash_copy"]["foo"]
assert_nil @controller.instance_variable_get(:@flash_copy)["foo"]
end
def test_keep_and_discard_return_values

@ -240,8 +240,8 @@ def test_cheeseburger_redirects_to_https
@request.env.delete('PATH_INFO')
get :use_flash
assert_equal "hello", assigns["flash_copy"]["that"]
assert_equal "hello", assigns["flashy"]
assert_equal "hello", @controller.instance_variable_get("@flash_copy")["that"]
assert_equal "hello", @controller.instance_variable_get("@flashy")
end
end

@ -13,7 +13,7 @@ def index
end
def display
render :text => 'Definitely Maybe'
render :text => 'Definitely Maybe' if @logged_in
end
def show
@ -122,7 +122,6 @@ def test_encode_credentials_has_no_newline
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end

@ -14,7 +14,7 @@ def index
end
def display
render :text => 'Definitely Maybe'
render :text => 'Definitely Maybe' if @logged_in
end
private
@ -124,7 +124,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -134,7 +133,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -144,7 +142,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -156,7 +153,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -167,7 +163,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -180,7 +175,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -191,7 +185,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -201,7 +194,6 @@ def authenticate_with_request
put :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end
@ -244,7 +236,6 @@ def authenticate_with_request
get :display
assert_response :success
assert assigns(:logged_in)
assert_equal 'Definitely Maybe', @response.body
end

@ -315,8 +315,6 @@ def test_opens_new_session
session1 = @test.open_session { |sess| }
session2 = @test.open_session # implicit session
assert_respond_to session1, :assert_template, "open_session makes assert_template available"
assert_respond_to session2, :assert_template, "open_session makes assert_template available"
assert !session1.equal?(session2)
end

@ -50,11 +50,6 @@ def module_redirect
redirect_to :controller => 'module_test/module_redirect', :action => "hello_world"
end
def redirect_with_assigns
@hello = "world"
redirect_to :action => "hello_world"
end
def redirect_to_url
redirect_to "http://www.rubyonrails.org/"
end
@ -215,12 +210,6 @@ def test_module_redirect_using_options
assert_redirected_to :controller => 'module_test/module_redirect', :action => 'hello_world'
end
def test_redirect_with_assigns
get :redirect_with_assigns
assert_response :redirect
assert_equal "world", assigns["hello"]
end
def test_redirect_to_url
get :redirect_to_url
assert_response :redirect

@ -140,12 +140,6 @@ def delete_cookie
head :ok
end
def test_assigns
@foo = "foo"
@foo_hash = { foo: :bar }
head :ok
end
def test_without_body
render html: '<div class="foo"></div>'.html_safe
end
@ -174,17 +168,6 @@ def setup
end
end
class ViewAssignsController < ActionController::Base
def test_assigns
@foo = "foo"
head :ok
end
def view_assigns
{ "bar" => "bar" }
end
end
class DefaultUrlOptionsCachingController < ActionController::Base
before_action { @dynamic_opt = 'opt' }
@ -446,30 +429,6 @@ def test_multiple_calls
assert_equal "OK", @response.body
end
def test_assigns
process :test_assigns
# assigns can be accessed using assigns(key)
# or assigns[key], where key is a string or
# a symbol
assert_equal "foo", assigns(:foo)
assert_equal "foo", assigns("foo")
assert_equal "foo", assigns[:foo]
assert_equal "foo", assigns["foo"]
# but the assigned variable should not have its own keys stringified
expected_hash = { foo: :bar }
assert_equal expected_hash, assigns(:foo_hash)
end
def test_view_assigns
@controller = ViewAssignsController.new
process :test_assigns
assert_equal nil, assigns(:foo)
assert_equal nil, assigns[:foo]
assert_equal "bar", assigns(:bar)
assert_equal "bar", assigns[:bar]
end
def test_should_not_impose_childless_html_tags_in_xml
process :test_xml_output

@ -1,110 +0,0 @@
require 'abstract_unit'
class AssertTemplateController < ActionController::Base
def render_with_partial
render partial: 'test/partial'
end
def render_with_template
render 'test/hello_world'
end
def render_with_layout
@variable_for_layout = 'hello'
render 'test/hello_world', layout: "layouts/standard"
end
def render_with_file
render file: 'README.rdoc'
end
def render_nothing
head :ok
end
end
class AssertTemplateControllerTest < ActionDispatch::IntegrationTest
def test_template_reset_between_requests
get '/assert_template/render_with_template'
assert_template 'test/hello_world'
get '/assert_template/render_nothing'
assert_template nil
end
def test_partial_reset_between_requests
get '/assert_template/render_with_partial'
assert_template partial: 'test/_partial'
get '/assert_template/render_nothing'
assert_template partial: nil
end
def test_layout_reset_between_requests
get '/assert_template/render_with_layout'
assert_template layout: 'layouts/standard'
get '/assert_template/render_nothing'
assert_template layout: nil
end
def test_file_reset_between_requests
get '/assert_template/render_with_file'
assert_template file: 'README.rdoc'
get '/assert_template/render_nothing'
assert_template file: nil
end
def test_template_reset_between_requests_when_opening_a_session
open_session do |session|
session.get '/assert_template/render_with_template'
session.assert_template 'test/hello_world'
session.get '/assert_template/render_nothing'
session.assert_template nil
end
end
def test_partial_reset_between_requests_when_opening_a_session
open_session do |session|
session.get '/assert_template/render_with_partial'
session.assert_template partial: 'test/_partial'
session.get '/assert_template/render_nothing'
session.assert_template partial: nil
end
end
def test_layout_reset_between_requests_when_opening_a_session
open_session do |session|
session.get '/assert_template/render_with_layout'
session.assert_template layout: 'layouts/standard'
session.get '/assert_template/render_nothing'
session.assert_template layout: nil
end
end
def test_file_reset_between_requests_when_opening_a_session
open_session do |session|
session.get '/assert_template/render_with_file'
session.assert_template file: 'README.rdoc'
session.get '/assert_template/render_nothing'
session.assert_template file: nil
end
end
def test_assigns_do_not_reset_template_assertion
get '/assert_template/render_with_layout'
assert_equal 'hello', assigns(:variable_for_layout)
assert_template layout: 'layouts/standard'
end
def test_cookies_do_not_reset_template_assertion
get '/assert_template/render_with_layout'
cookies
assert_template layout: 'layouts/standard'
end
end

@ -1 +1 @@
<html><%= yield %><%= @variable_for_layout %></html>
<html><%= yield %><%= @variable_for_layout %></html>

@ -157,75 +157,75 @@ class LayoutSetInResponseTest < ActionController::TestCase
def test_layout_set_when_using_default_layout
@controller = DefaultLayoutController.new
get :hello
assert_template :layout => "layouts/layout_test"
assert_includes @response.body, 'layout_test.erb'
end
def test_layout_set_when_using_streaming_layout
@controller = StreamingLayoutController.new
get :hello
assert_template :hello
assert_includes @response.body, 'layout_test.erb'
end
def test_layout_set_when_set_in_controller
@controller = HasOwnLayoutController.new
get :hello
assert_template :layout => "layouts/item"
assert_includes @response.body, 'item.erb'
end
def test_layout_symbol_set_in_controller_returning_nil_falls_back_to_default
@controller = HasNilLayoutSymbol.new
get :hello
assert_template layout: "layouts/layout_test"
assert_includes @response.body, 'layout_test.erb'
end
def test_layout_proc_set_in_controller_returning_nil_falls_back_to_default
@controller = HasNilLayoutProc.new
get :hello
assert_template layout: "layouts/layout_test"
assert_includes @response.body, 'layout_test.erb'
end
def test_layout_only_exception_when_included
@controller = OnlyLayoutController.new
get :hello
assert_template :layout => "layouts/item"
assert_includes @response.body, 'item.erb'
end
def test_layout_only_exception_when_excepted
@controller = OnlyLayoutController.new
get :goodbye
assert !@response.body.include?("item.erb"), "#{@response.body.inspect} included 'item.erb'"
assert_not_includes @response.body, 'item.erb'
end
def test_layout_except_exception_when_included
@controller = ExceptLayoutController.new
get :hello
assert_template :layout => "layouts/item"
assert_includes @response.body, 'item.erb'
end
def test_layout_except_exception_when_excepted
@controller = ExceptLayoutController.new
get :goodbye
assert !@response.body.include?("item.erb"), "#{@response.body.inspect} included 'item.erb'"
assert_not_includes @response.body, 'item.erb'
end
def test_layout_set_when_using_render
with_template_handler :mab, lambda { |template| template.source.inspect } do
@controller = SetsLayoutInRenderController.new
get :hello
assert_template :layout => "layouts/third_party_template_library"
assert_includes @response.body, 'layouts/third_party_template_library.mab'
end
end
def test_layout_is_not_set_when_none_rendered
@controller = RendersNoLayoutController.new
get :hello
assert_template :layout => nil
assert_equal 'hello.erb', @response.body
end
def test_layout_is_picked_from_the_controller_instances_view_path
@controller = PrependsViewPathController.new
get :hello
assert_template :layout => /layouts\/alt/
assert_includes @response.body, 'alt.erb'
end
def test_absolute_pathed_layout
@ -237,7 +237,7 @@ def test_absolute_pathed_layout
def test_respect_to_parent_layout
@controller = ChildController.new
get :goodbye
assert_template :layout => "layouts/item"
assert_includes @response.body, 'item.erb'
end
end
@ -276,7 +276,7 @@ def test_symlinked_layout_is_rendered
@controller = LayoutSymlinkedTest.new
get :hello
assert_response 200
assert_template :layout => "layouts/symlinked/symlinked_layout"
assert_includes @response.body, 'This is my layout'
end
end
end

@ -692,20 +692,19 @@ def test_simple_show
get :hello_world
assert_response 200
assert_response :success
assert_template "test/hello_world"
assert_equal "<html>Hello world!</html>", @response.body
end
# :ported:
def test_renders_default_template_for_missing_action
get :'hyphen-ated'
assert_template 'test/hyphen-ated'
assert_equal "hyphen-ated.erb", @response.body
end
# :ported:
def test_render
get :render_hello_world
assert_template "test/hello_world"
assert_equal "Hello world!", @response.body
end
def test_line_offset
@ -721,20 +720,18 @@ def test_line_offset
# :ported: compatibility
def test_render_with_forward_slash
get :render_hello_world_with_forward_slash
assert_template "test/hello_world"
assert_equal "Hello world!", @response.body
end
# :ported:
def test_render_in_top_directory
get :render_template_in_top_directory
assert_template "shared"
assert_equal "Elastica", @response.body
end
# :ported:
def test_render_in_top_directory_with_slash
get :render_template_in_top_directory_with_slash
assert_template "shared"
assert_equal "Elastica", @response.body
end
@ -752,7 +749,7 @@ def test_render_from_variable
# :ported:
def test_render_action
get :render_action_hello_world
assert_template "test/hello_world"
assert_equal "Hello world!", @response.body
end
def test_render_action_upcased
@ -764,7 +761,7 @@ def test_render_action_upcased
end
else
get action
assert_template 'test/Hello_world'
assert_equal 'Hello world!', @response.body
end
end
@ -772,13 +769,12 @@ def test_render_action_upcased
def test_render_action_hello_world_as_string
get :render_action_hello_world_as_string
assert_equal "Hello world!", @response.body
assert_template "test/hello_world"
end
# :ported:
def test_render_action_with_symbol
get :render_action_hello_world_with_symbol
assert_template "test/hello_world"
assert_equal "Hello world!", @response.body
end
# :ported:
@ -966,7 +962,7 @@ def test_render_to_string_resets_assigns
def test_render_to_string_inline
get :render_to_string_with_inline_and_render
assert_template "test/hello_world"
assert_equal 'Hello world!', @response.body
end
# :ported:
@ -1051,8 +1047,8 @@ def test_rendering_nothing_on_layout
def test_render_to_string_doesnt_break_assigns
get :render_to_string_with_assigns
assert_equal "i'm before the render", assigns(:before)
assert_equal "i'm after the render", assigns(:after)
assert_equal "i'm before the render", @controller.instance_variable_get(:@before)
assert_equal "i'm after the render", @controller.instance_variable_get(:@after)
end
def test_bad_render_to_string_still_throws_exception
@ -1061,8 +1057,8 @@ def test_bad_render_to_string_still_throws_exception
def test_render_to_string_that_throws_caught_exception_doesnt_break_assigns
assert_nothing_raised { get :render_to_string_with_caught_exception }
assert_equal "i'm before the render", assigns(:before)
assert_equal "i'm after the render", assigns(:after)
assert_equal "i'm before the render", @controller.instance_variable_get(:@before)
assert_equal "i'm after the render", @controller.instance_variable_get(:@after)
end
def test_accessing_params_in_template_with_layout
@ -1123,7 +1119,7 @@ def test_action_talk_to_layout
# :addressed:
def test_render_text_with_assigns
get :render_text_with_assigns
assert_equal "world", assigns["hello"]
assert_equal "world", @controller.instance_variable_get(:@hello)
end
def test_render_text_with_assigns_option
@ -1189,22 +1185,22 @@ def test_should_render_html_partial_with_formats
def test_render_to_string_partial
get :render_to_string_with_partial
assert_equal "only partial", assigns(:partial_only)
assert_equal "Hello: david", assigns(:partial_with_locals)
assert_equal "only partial", @controller.instance_variable_get(:@partial_only)
assert_equal "Hello: david", @controller.instance_variable_get(:@partial_with_locals)
assert_equal "text/html", @response.content_type
end
def test_render_to_string_with_template_and_html_partial
get :render_to_string_with_template_and_html_partial
assert_equal "**only partial**\n", assigns(:text)
assert_equal "<strong>only partial</strong>\n", assigns(:html)
assert_equal "**only partial**\n", @controller.instance_variable_get(:@text)
assert_equal "<strong>only partial</strong>\n", @controller.instance_variable_get(:@html)
assert_equal "<strong>only html partial</strong>\n", @response.body
assert_equal "text/html", @response.content_type
end
def test_render_to_string_and_render_with_different_formats
get :render_to_string_and_render_with_different_formats
assert_equal "<strong>only partial</strong>\n", assigns(:html)
assert_equal "<strong>only partial</strong>\n", @controller.instance_variable_get(:@html)
assert_equal "**only partial**\n", @response.body
assert_equal "text/plain", @response.content_type
end
@ -1228,21 +1224,18 @@ def test_partial_with_locals
def test_partial_with_form_builder
get :partial_with_form_builder
assert_match(/<label/, @response.body)
assert_template('test/_form')
assert_equal "<label for=\"post_title\">Title</label>\n", @response.body
end
def test_partial_with_form_builder_subclass
get :partial_with_form_builder_subclass
assert_match(/<label/, @response.body)
assert_template('test/_labelling_form')
assert_equal "<label for=\"post_title\">Title</label>\n", @response.body
end
def test_nested_partial_with_form_builder
@controller = Fun::GamesController.new
get :nested_partial_with_form_builder
assert_match(/<label/, @response.body)
assert_template('fun/games/_form')
assert_equal "<label for=\"post_title\">Title</label>\n", @response.body
end
def test_namespaced_object_partial
@ -1286,48 +1279,29 @@ def test_partial_collection_with_locals
assert_equal "Bonjour: davidBonjour: mary", @response.body
end
def test_locals_option_to_assert_template_is_not_supported
get :partial_collection_with_locals
warning_buffer = StringIO.new
$stderr = warning_buffer
assert_template partial: 'customer_greeting', locals: { greeting: 'Bonjour' }
assert_equal "the :locals option to #assert_template is only supported in a ActionView::TestCase\n", warning_buffer.string
ensure
$stderr = STDERR
end
def test_partial_collection_with_spacer
get :partial_collection_with_spacer
assert_equal "Hello: davidonly partialHello: mary", @response.body
assert_template :partial => '_customer'
end
def test_partial_collection_with_spacer_which_uses_render
get :partial_collection_with_spacer_which_uses_render
assert_equal "Hello: davidpartial html\npartial with partial\nHello: mary", @response.body
assert_template :partial => '_customer'
end
def test_partial_collection_shorthand_with_locals
get :partial_collection_shorthand_with_locals
assert_equal "Bonjour: davidBonjour: mary", @response.body
assert_template :partial => 'customers/_customer', :count => 2
assert_template :partial => '_completely_fake_and_made_up_template_that_cannot_possibly_be_rendered', :count => 0
end
def test_partial_collection_shorthand_with_different_types_of_records
get :partial_collection_shorthand_with_different_types_of_records
assert_equal "Bonjour bad customer: mark0Bonjour good customer: craig1Bonjour bad customer: john2Bonjour good customer: zach3Bonjour good customer: brandon4Bonjour bad customer: dan5", @response.body
assert_template :partial => 'good_customers/_good_customer', :count => 3
assert_template :partial => 'bad_customers/_bad_customer', :count => 3
end
def test_empty_partial_collection
get :empty_partial_collection
assert_equal " ", @response.body
assert_template :partial => false
end
def test_partial_with_hash_object

@ -52,43 +52,37 @@ class RenderPartialWithRecordIdentificationTest < ActiveRecordTestCase
def test_rendering_partial_with_has_many_and_belongs_to_association
get :render_with_has_many_and_belongs_to_association
assert_template 'projects/_project'
assert_equal assigns(:developer).projects.map(&:name).join, @response.body
assert_equal Developer.find(1).projects.map(&:name).join, @response.body
end
def test_rendering_partial_with_has_many_association
get :render_with_has_many_association
assert_template 'replies/_reply'
assert_equal 'Birdman is better!', @response.body
end
def test_rendering_partial_with_scope
get :render_with_scope
assert_template 'replies/_reply'
assert_equal 'Birdman is better!Nuh uh!', @response.body
end
def test_render_with_record
get :render_with_record
assert_template 'developers/_developer'
assert_equal 'David', @response.body
end
def test_render_with_record_collection
get :render_with_record_collection
assert_template 'developers/_developer'
assert_equal 'DavidJamisfixture_3fixture_4fixture_5fixture_6fixture_7fixture_8fixture_9fixture_10Jamis', @response.body
end
def test_render_with_record_collection_and_spacer_template
get :render_with_record_collection_and_spacer_template
assert_equal assigns(:developer).projects.map(&:name).join('only partial'), @response.body
assert_equal Developer.find(1).projects.map(&:name).join('only partial'), @response.body
end
def test_rendering_partial_with_has_one_association
mascot = Company.find(1).mascot
get :render_with_has_one_association
assert_template 'mascots/_mascot'
assert_equal mascot.name, @response.body
end
end
@ -130,13 +124,11 @@ class RenderPartialWithRecordIdentificationAndNestedControllersTest < ActiveReco
def test_render_with_record_in_nested_controller
get :render_with_record_in_nested_controller
assert_template %r{\Afun/games/_game\Z}
assert_equal "Fun Pong\n", @response.body
end
def test_render_with_record_collection_in_nested_controller
get :render_with_record_collection_in_nested_controller
assert_template %r{\Afun/games/_game\Z}
assert_equal "Fun Pong\nFun Tank\n", @response.body
end
end
@ -149,7 +141,6 @@ def test_render_with_record_in_nested_controller
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_in_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Pong\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
@ -160,7 +151,6 @@ def test_render_with_record_collection_in_nested_controller
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_collection_in_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Pong\nJust Tank\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
@ -172,13 +162,11 @@ class RenderPartialWithRecordIdentificationAndNestedDeeperControllersTest < Acti
def test_render_with_record_in_deeper_nested_controller
get :render_with_record_in_deeper_nested_controller
assert_template %r{\Afun/serious/games/_game\Z}
assert_equal "Serious Chess\n", @response.body
end
def test_render_with_record_collection_in_deeper_nested_controller
get :render_with_record_collection_in_deeper_nested_controller
assert_template %r{\Afun/serious/games/_game\Z}
assert_equal "Serious Chess\nSerious Sudoku\nSerious Solitaire\n", @response.body
end
end
@ -191,7 +179,6 @@ def test_render_with_record_in_deeper_nested_controller
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_in_deeper_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Chess\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config
@ -202,7 +189,6 @@ def test_render_with_record_collection_in_deeper_nested_controller
ActionView::Base.prefix_partial_path_with_controller_namespace = false
get :render_with_record_collection_in_deeper_nested_controller
assert_template %r{\Agames/_game\Z}
assert_equal "Just Chess\nJust Sudoku\nJust Solitaire\n", @response.body
ensure
ActionView::Base.prefix_partial_path_with_controller_namespace = old_config

@ -1 +1 @@
Hello world!
hyphen-ated.erb

@ -306,64 +306,6 @@ def render_from_helper
end
end
class RenderTemplateTest < ActionView::TestCase
test "supports specifying templates with a Regexp" do
controller.controller_path = "fun"
render(:template => "fun/games/hello_world")
assert_template %r{\Afun/games/hello_world\Z}
end
test "supports specifying partials" do
controller.controller_path = "test"
render(:template => "test/calling_partial_with_layout")
assert_template :partial => "_partial_for_use_in_layout"
end
test "supports specifying locals (passing)" do
controller.controller_path = "test"
render(:template => "test/calling_partial_with_layout")
assert_template :partial => "_partial_for_use_in_layout", :locals => { :name => "David" }
end
test "supports specifying locals (failing)" do
controller.controller_path = "test"
render(:template => "test/calling_partial_with_layout")
e = assert_raise ActiveSupport::TestCase::Assertion do
assert_template :partial => "_partial_for_use_in_layout", :locals => { :name => "Somebody Else" }
end
assert_match(/Somebody Else.*David/m, e.message)
end
test 'supports different locals on the same partial' do
controller.controller_path = "test"
render(:template => "test/render_two_partials")
assert_template partial: '_partial', locals: { 'first' => '1' }
assert_template partial: '_partial', locals: { 'second' => '2' }
end
test 'raises descriptive error message when template was not rendered' do
controller.controller_path = "test"
render(template: "test/hello_world_with_partial")
e = assert_raise ActiveSupport::TestCase::Assertion do
assert_template partial: 'i_was_never_rendered', locals: { 'did_not' => 'happen' }
end
assert_match "i_was_never_rendered to be rendered but it was not.", e.message
assert_match 'Expected ["/test/partial"] to include "i_was_never_rendered"', e.message
end
test 'specifying locals works when the partial is inside a directory with underline prefix' do
controller.controller_path = "test"
render(template: 'test/render_partial_inside_directory')
assert_template partial: 'test/_directory/_partial_with_locales', locals: { 'name' => 'Jane' }
end
test 'specifying locals works when the partial is inside a directory without underline prefix' do
controller.controller_path = "test"
render(template: 'test/render_partial_inside_directory')
assert_template partial: 'test/_directory/partial_with_locales', locals: { 'name' => 'Jane' }
end
end
module AHelperWithInitialize
def initialize(*)
super

@ -28,7 +28,7 @@ def assert_not(object, message = nil)
#
# An arbitrary expression is passed in and evaluated.
#
# assert_difference 'assigns(:article).comments(:reload).size' do
# assert_difference 'Article.last.comments(:reload).size' do
# post :create, params: { comment: {...} }
# end
#

@ -467,7 +467,6 @@ Rails adds some custom assertions of its own to the `minitest` framework:
| `assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)` | Asserts that the provided options can be used to generate the provided path. This is the inverse of assert_recognizes. The extras parameter is used to tell the request the names and values of additional request parameters that would be in a query string. The message parameter allows you to specify a custom error message for assertion failures.|
| `assert_response(type, message = nil)` | Asserts that the response comes with a specific status code. You can specify `:success` to indicate 200-299, `:redirect` to indicate 300-399, `:missing` to indicate 404, or `:error` to match the 500-599 range. You can also pass an explicit status number or its symbolic equivalent. For more information, see [full list of status codes](http://rubydoc.info/github/rack/rack/master/Rack/Utils#HTTP_STATUS_CODES-constant) and how their [mapping](http://rubydoc.info/github/rack/rack/master/Rack/Utils#SYMBOL_TO_STATUS_CODE-constant) works.|
| `assert_redirected_to(options = {}, message=nil)` | Assert that the redirection options passed in match those of the redirect called in the latest action. This match can be partial, such that `assert_redirected_to(controller: "weblog")` will also match the redirection of `redirect_to(controller: "weblog", action: "show")` and so on. You can also pass named routes such as `assert_redirected_to root_path` and Active Record objects such as `assert_redirected_to @article`.|
| `assert_template(expected = nil, message=nil)` | Asserts that the request was rendered with the appropriate template file.|
You'll see the usage of some of these assertions in the next chapter.
@ -506,16 +505,18 @@ Now that we have used Rails scaffold generator for our `Article` resource, it ha
Let me take you through one such test, `test_should_get_index` from the file `articles_controller_test.rb`.
```ruby
# articles_controller_test.rb
class ArticlesControllerTest < ActionController::TestCase
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:articles)
assert_includes @response.body, 'Articles'
end
end
```
In the `test_should_get_index` test, Rails simulates a request on the action called `index`, making sure the request was successful and also ensuring that it assigns a valid `articles` instance variable.
In the `test_should_get_index` test, Rails simulates a request on the action called `index`, making sure the request was successful
and also ensuring that the right response body has been generated.
The `get` method kicks off the web request and populates the results into the response. It accepts 4 arguments:
@ -553,7 +554,7 @@ test "should create article" do
post :create, params: { article: { title: 'Some title' } }
end
assert_redirected_to article_path(assigns(:article))
assert_redirected_to article_path(Article.last)
end
```
@ -580,11 +581,11 @@ To test AJAX requests, you can specify the `xhr: true` option to `get`, `post`,
`patch`, `put`, and `delete` methods:
```ruby
test "ajax request responds with no layout" do
test "ajax request" do
get :show, params: { id: articles(:first).id }, xhr: true
assert_template :index
assert_template layout: nil
assert_equal 'hello world', @response.body
assert_equal "text/javascript", @response.content_type
end
```
@ -592,20 +593,16 @@ end
After a request has been made and processed, you will have 4 Hash objects ready for use:
* `assigns` - Any objects that are stored as instance variables in actions for use in views.
* `cookies` - Any cookies that are set.
* `flash` - Any objects living in the flash.
* `session` - Any object living in session variables.
As is the case with normal Hash objects, you can access the values by referencing the keys by string. You can also reference them by symbol name, except for `assigns`. For example:
As is the case with normal Hash objects, you can access the values by referencing the keys by string. You can also reference them by symbol name. For example:
```ruby
flash["gordon"] flash[:gordon]
session["shmession"] session[:shmession]
cookies["are_good_for_u"] cookies[:are_good_for_u]
# Because you can't use assigns[:something] for historical reasons:
assigns["something"] assigns(:something)
```
### Instance Variables Available
@ -633,46 +630,6 @@ get :index # simulate the request with custom header
post :create # simulate the request with custom env variable
```
### Testing Templates and Layouts
Eventually, you may want to test whether a specific layout is rendered in the view of a response.
#### Asserting Templates
If you want to make sure that the response rendered the correct template and layout, you can use the `assert_template`
method:
```ruby
test "index should render correct template and layout" do
get :index
assert_template :index
assert_template layout: "layouts/application"
# You can also pass a regular expression.
assert_template layout: /layouts\/application/
end
```
NOTE: You cannot test for template and layout at the same time, with a single call to `assert_template`.
WARNING: You must include the "layouts" directory name even if you save your layout file in this standard layout directory. Hence, `assert_template layout: "application"` will not work.
#### Asserting Partials
If your view renders any partial, when asserting for the layout, you can to assert for the partial at the same time.
Otherwise, assertion will fail.
Remember, we added the "_form" partial to our new Article view? Let's write an assertion for that in the `:new` action now:
```ruby
test "new should render correct layout" do
get :new
assert_template layout: "layouts/application", partial: "_form"
end
```
This is the correct way to assert for when the view renders a partial with a given name. As identified by the `:partial` key passed to the `assert_template` call.
### Testing `flash` notices
If you remember from earlier one of the Four Hashes of the Apocalypse was `flash`.
@ -688,7 +645,7 @@ test "should create article" do
post :create, params: { article: { title: 'Some title' } }
end
assert_redirected_to article_path(assigns(:article))
assert_redirected_to article_path(Article.last)
assert_equal 'Article was successfully created.', flash[:notice]
end
```
@ -781,7 +738,7 @@ We can also add a test for updating an existing Article.
test "should update article" do
article = articles(:one)
patch :update, params: { id: article.id, article: { title: "updated" } }
assert_redirected_to article_path(assigns(:article))
assert_redirected_to article_path(article)
end
```
@ -820,7 +777,7 @@ class ArticlesControllerTest < ActionController::TestCase
test "should update article" do
patch :update, params: { id: @article.id, article: { title: "updated" } }
assert_redirected_to article_path(assigns(:article))
assert_redirected_to article_path(@article)
end
end
```
@ -857,7 +814,6 @@ class ProfileControllerTest < ActionController::TestCase
get :show
assert_response :success
assert_equal users(:david), assigns(:user)
end
end
```
@ -1071,14 +1027,12 @@ How about testing our ability to create a new article in our blog and see the re
test "can create an article" do
get "/articles/new"
assert_response :success
assert_template "articles/new", partial: "articles/_form"
post "/articles",
params: { article: { title: "can create", body: "article successfully." } }
assert_response :redirect
follow_redirect!
assert_response :success
assert_template "articles/show"
assert_select "p", "Title:\n can create"
end
```

@ -44,7 +44,7 @@ class PostsTest < ActionDispatch::IntegrationTest
def test_index
get '/posts'
assert_response :success
assert_template "index"
assert_includes @response.body, 'Posts#index'
end
end
RUBY