require 'test_helper'
class FlashResponder < ActionController::Responder
include Responders::FlashResponder
end
class AddressesController < ApplicationController
before_filter :set_resource
self.responder = FlashResponder
respond_to :js, :only => :create
def action
options = params.slice(:flash, :flash_now)
flash[:success] = "Flash is set" if params[:set_flash]
respond_with(@resource, options)
end
alias :new :action
alias :create :action
alias :update :action
alias :destroy :action
def with_block
respond_with(@resource) do |format|
format.html { render :text => "Success!" }
end
end
def another
respond_with(@resource, :notice => "Yes, notice this!", :alert => "Warning, warning!")
end
def with_html
respond_with(@resource)
end
def flexible
options = params[:responder_options] || {}
respond_with(@resource, options)
end
protected
def interpolation_options
{ :reference => 'Ocean Avenue', :xss => '' }
end
def set_resource
@resource = Address.new
@resource.errors[:fail] << "FAIL" if params[:fail]
end
end
module Admin
class AddressesController < ::AddressesController
end
end
class FlashResponderTest < ActionController::TestCase
tests AddressesController
def setup
Responders::FlashResponder.flash_keys = [ :success, :failure ]
@controller.stubs(:polymorphic_url).returns("/")
end
def test_sets_success_flash_message_on_non_get_requests
post :create
assert_equal "Resource created with success", flash[:success]
end
def test_sets_failure_flash_message_on_not_get_requests
post :create, :fail => true
assert_equal "Resource could not be created", flash[:failure]
end
def test_does_not_set_flash_message_on_get_requests
get :new
assert flash.empty?
end
def test_sets_flash_message_for_the_current_controller
put :update, :fail => true
assert_equal "Oh no! We could not update your address!", flash[:failure]
end
def test_sets_flash_message_with_resource_name
put :update
assert_equal "Nice! Address was updated with success!", flash[:success]
end
def test_sets_flash_message_with_interpolation_options
delete :destroy
assert_equal "Successfully deleted the address at Ocean Avenue", flash[:success]
end
def test_does_not_set_flash_if_flash_false_is_given
post :create, :flash => false
assert flash.empty?
end
def test_does_not_overwrite_the_flash_if_already_set
post :create, :set_flash => true
assert_equal "Flash is set", flash[:success]
end
def test_sets_flash_message_even_if_block_is_given
post :with_block
assert_equal "Resource with block created with success", flash[:success]
end
def test_sets_now_flash_message_on_javascript_requests
post :create, :format => :js
assert_equal "Resource created with success", flash[:success]
assert_flash_now :success
end
def test_sets_flash_message_can_be_set_to_now
post :create, :flash_now => true
assert_equal "Resource created with success", @controller.flash.now[:success]
assert_flash_now :success
end
def test_sets_flash_message_can_be_set_to_now_only_on_success
post :create, :flash_now => :on_success
assert_equal "Resource created with success", @controller.flash.now[:success]
end
def test_sets_flash_message_can_be_set_to_now_only_on_failure
post :create, :flash_now => :on_failure
assert_not_flash_now :success
end
def test_sets_message_based_on_notice_key
Responders::FlashResponder.flash_keys = [ :notice, :alert ]
post :another
assert_equal "Yes, notice this!", flash[:notice]
end
def test_sets_message_based_on_alert_key
Responders::FlashResponder.flash_keys = [ :notice, :alert ]
post :another, :fail => true
assert_equal "Warning, warning!", flash[:alert]
end
def test_sets_html_using_controller_scope
post :with_html
assert_equal "Yay! You did it!", flash[:success]
end
def test_sets_html_using_actions_scope
post :with_html, :fail => true
assert_equal "OH NOES! You did it wrong!", flash[:failure]
end
def test_escapes_html_interpolations
Responders::FlashResponder.flash_keys = [ :xss, :xss ]
post :with_html
assert_equal "Yay! <script>alert(1)</script>", flash[:xss]
end
def test_sets_flash_now_on_failure_by_default
post :another, :fail => true
assert_flash_now :alert
end
def test_never_set_flash_now
post :flexible, :fail => true, :responder_options => { :flash_now => false, :alert => "Warning" }
assert_not_flash_now :alert
end
# If we have flash.now, it's always marked as used.
def assert_flash_now(k)
assert flash.instance_variable_get(:@used).to_a.include?(k.to_sym),
"Expected #{k} to be in flash.now, but it's not."
end
def assert_not_flash_now(k)
assert flash[k], "Expected #{k} to be set"
assert !flash.instance_variable_get(:@used).include?(k.to_sym),
"Expected #{k} to not be in flash.now, but it is."
end
end
class NamespacedFlashResponderTest < ActionController::TestCase
tests Admin::AddressesController
def setup
Responders::FlashResponder.flash_keys = [ :notice, :alert ]
@controller.stubs(:polymorphic_url).returns("/")
end
def test_sets_the_flash_message_based_on_the_current_controller
put :update
assert_equal "Admin updated address with success", flash[:notice]
end
def test_sets_the_flash_message_based_on_namespace_actions
Responders::FlashResponder.namespace_lookup = true
post :create
assert_equal "Admin created address with success", flash[:notice]
ensure
Responders::FlashResponder.namespace_lookup = false
end
def test_fallbacks_to_non_namespaced_controller_flash_message
Responders::FlashResponder.namespace_lookup = true
delete :destroy
assert_equal "Successfully deleted the chosen address at Ocean Avenue", flash[:notice]
ensure
Responders::FlashResponder.namespace_lookup = false
end
def test_does_not_fallbacks_to_namespaced_actions_if_disabled
post :create
assert_equal "Address was successfully created.", flash[:notice]
end
def test_does_not_fallbacks_to_non_namespaced_controller_flash_message_if_disabled
post :new
assert_equal nil, flash[:notice]
end
end