From 29be3f5d8386fc9a8a67844fa9b7d6860574e715 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Strza=C5=82kowski?=
 <lukasz.strzalkowski@gmail.com>
Date: Tue, 12 Aug 2014 21:57:51 +0200
Subject: Add config option for cookies digest

You can now configure custom digest for cookies in the same way as `serializer`:

  config.action_dispatch.cookies_digest = 'SHA256'
---
 actionpack/test/dispatch/cookies_test.rb | 50 ++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

(limited to 'actionpack/test')

diff --git a/actionpack/test/dispatch/cookies_test.rb b/actionpack/test/dispatch/cookies_test.rb
index 0f145666d1..b40c21c067 100644
--- a/actionpack/test/dispatch/cookies_test.rb
+++ b/actionpack/test/dispatch/cookies_test.rb
@@ -369,6 +369,35 @@ class CookiesTest < ActionController::TestCase
     assert_equal 'Jamie', @controller.send(:cookies).permanent[:user_name]
   end
 
+  def test_signed_cookie_using_default_digest
+    get :set_signed_cookie
+    cookies = @controller.send :cookies
+    assert_not_equal 45, cookies[:user_id]
+    assert_equal 45, cookies.signed[:user_id]
+
+    key_generator = @request.env["action_dispatch.key_generator"]
+    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
+    secret = key_generator.generate_key(signed_cookie_salt)
+
+    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: Marshal, digest: 'SHA1')
+    assert_equal verifier.generate(45), cookies[:user_id]
+  end
+
+  def test_signed_cookie_using_custom_digest
+    @request.env["action_dispatch.cookies_digest"] = 'SHA256'
+    get :set_signed_cookie
+    cookies = @controller.send :cookies
+    assert_not_equal 45, cookies[:user_id]
+    assert_equal 45, cookies.signed[:user_id]
+
+    key_generator = @request.env["action_dispatch.key_generator"]
+    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
+    secret = key_generator.generate_key(signed_cookie_salt)
+
+    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: Marshal, digest: 'SHA256')
+    assert_equal verifier.generate(45), cookies[:user_id]
+  end
+
   def test_signed_cookie_using_default_serializer
     get :set_signed_cookie
     cookies = @controller.send :cookies
@@ -481,6 +510,27 @@ class CookiesTest < ActionController::TestCase
     assert_equal 'bar was dumped and loaded', cookies.encrypted[:foo]
   end
 
+  def test_encrypted_cookie_using_custom_digest
+    @request.env["action_dispatch.cookies_digest"] = 'SHA256'
+    get :set_encrypted_cookie
+    cookies = @controller.send :cookies
+    assert_not_equal 'bar', cookies[:foo]
+    assert_equal 'bar', cookies.encrypted[:foo]
+
+    sign_secret = @request.env["action_dispatch.key_generator"].generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
+
+    sha1_verifier   = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActionDispatch::Cookies::NullSerializer, digest: 'SHA1')
+    sha256_verifier = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActionDispatch::Cookies::NullSerializer, digest: 'SHA256')
+
+    assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
+      sha1_verifier.verify(cookies[:foo])
+    end
+
+    assert_nothing_raised do
+      sha256_verifier.verify(cookies[:foo])
+    end
+  end
+
   def test_encrypted_cookie_using_hybrid_serializer_can_migrate_marshal_dumped_value_to_json
     @request.env["action_dispatch.cookies_serializer"] = :hybrid
 
-- 
cgit v1.2.3


From 6c96602bc1480b41f5fd20aef46fc70bcf582aab Mon Sep 17 00:00:00 2001
From: Jeremy Kemper <jeremykemper@gmail.com>
Date: Sat, 16 Aug 2014 15:06:20 -0700
Subject: When your templates change, browser caches bust automatically.

New default: the template digest is automatically included in your ETags.
When you call `fresh_when @post`, the digest for `posts/show.html.erb`
is mixed in so future changes to the HTML will blow HTTP caches for you.
This makes it easy to HTTP-cache many more of your actions.

If you render a different template, you can now pass the `:template`
option to include its digest instead:

  fresh_when @post, template: 'widgets/show'

Pass `template: false` to skip the lookup. To turn this off entirely, set:

  config.action_controller.etag_with_template_digest = false
---
 actionpack/test/controller/live_stream_test.rb |  2 +-
 actionpack/test/controller/render_test.rb      | 36 ++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 3 deletions(-)

(limited to 'actionpack/test')

diff --git a/actionpack/test/controller/live_stream_test.rb b/actionpack/test/controller/live_stream_test.rb
index 0500b7c789..7fd1276e98 100644
--- a/actionpack/test/controller/live_stream_test.rb
+++ b/actionpack/test/controller/live_stream_test.rb
@@ -162,7 +162,7 @@ module ActionController
       end
 
       def with_stale
-        render :text => 'stale' if stale?(:etag => "123")
+        render text: 'stale' if stale?(etag: "123", template: false)
       end
 
       def exception_in_view
diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb
index 9926130c02..b036b6c08e 100644
--- a/actionpack/test/controller/render_test.rb
+++ b/actionpack/test/controller/render_test.rb
@@ -10,11 +10,17 @@ class TestControllerWithExtraEtags < ActionController::Base
   etag { nil  }
 
   def fresh
-    render text: "stale" if stale?(etag: '123')
+    render text: "stale" if stale?(etag: '123', template: false)
   end
 
   def array
-    render text: "stale" if stale?(etag: %w(1 2 3))
+    render text: "stale" if stale?(etag: %w(1 2 3), template: false)
+  end
+
+  def with_template
+    if stale? template: 'test/hello_world'
+      render text: 'stale'
+    end
   end
 end
 
@@ -409,6 +415,32 @@ class EtagRenderTest < ActionController::TestCase
     assert_response :success
   end
 
+  def test_etag_reflects_template_digest
+    get :with_template
+    assert_response :ok
+    assert_not_nil etag = @response.etag
+
+    request.if_none_match = etag
+    get :with_template
+    assert_response :not_modified
+
+    # Modify the template digest
+    path = File.expand_path('../../fixtures/test/hello_world.erb', __FILE__)
+    old = File.read(path)
+
+    begin
+      File.write path, 'foo'
+      ActionView::Digestor.cache.clear
+
+      request.if_none_match = etag
+      get :with_template
+      assert_response :ok
+      assert_not_equal etag, @response.etag
+    ensure
+      File.write path, old
+    end
+  end
+
   def etag(record)
     Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(record)).inspect
   end
-- 
cgit v1.2.3


From ee77770d57de9da87b05a2fe84b9d46ec6852c62 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@plataformatec.com.br>
Date: Sat, 16 Aug 2014 16:24:08 -0400
Subject: Move respond_with to the responders gem

respond_with (and consequently the class-level respond_to)
are being removed from Rails. Instead of moving it to a 3rd
library, the functionality will be moved to responders gem
(at github.com/plataformatec/responders) which already provides
some responders extensions.
---
 .../test/controller/mime/respond_with_test.rb      | 737 ---------------------
 1 file changed, 737 deletions(-)
 delete mode 100644 actionpack/test/controller/mime/respond_with_test.rb

(limited to 'actionpack/test')

diff --git a/actionpack/test/controller/mime/respond_with_test.rb b/actionpack/test/controller/mime/respond_with_test.rb
deleted file mode 100644
index 115f3b2f41..0000000000
--- a/actionpack/test/controller/mime/respond_with_test.rb
+++ /dev/null
@@ -1,737 +0,0 @@
-require 'abstract_unit'
-require 'controller/fake_models'
-
-class RespondWithController < ActionController::Base
-  class CustomerWithJson < Customer
-    def to_json; super; end
-  end
-
-  respond_to :html, :json, :touch
-  respond_to :xml, :except => :using_resource_with_block
-  respond_to :js,  :only => [ :using_resource_with_block, :using_resource, 'using_hash_resource' ]
-
-  def using_resource
-    respond_with(resource)
-  end
-
-  def using_hash_resource
-    respond_with({:result => resource})
-  end
-
-  def using_resource_with_block
-    respond_with(resource) do |format|
-      format.csv { render :text => "CSV" }
-    end
-  end
-
-  def using_resource_with_overwrite_block
-    respond_with(resource) do |format|
-      format.html { render :text => "HTML" }
-    end
-  end
-
-  def using_resource_with_collection
-    respond_with([resource, Customer.new("jamis", 9)])
-  end
-
-  def using_resource_with_parent
-    respond_with(Quiz::Store.new("developer?", 11), Customer.new("david", 13))
-  end
-
-  def using_resource_with_status_and_location
-    respond_with(resource, :location => "http://test.host/", :status => :created)
-  end
-
-  def using_resource_with_json
-    respond_with(CustomerWithJson.new("david", request.delete? ? nil : 13))
-  end
-
-  def using_invalid_resource_with_template
-    respond_with(resource)
-  end
-
-  def using_options_with_template
-    @customer = resource
-    respond_with(@customer, :status => 123, :location => "http://test.host/")
-  end
-
-  def using_resource_with_responder
-    responder = proc { |c, r, o| c.render :text => "Resource name is #{r.first.name}" }
-    respond_with(resource, :responder => responder)
-  end
-
-  def using_resource_with_action
-    respond_with(resource, :action => :foo) do |format|
-      format.html { raise ActionView::MissingTemplate.new([], "bar", ["foo"], {}, false) }
-    end
-  end
-
-  def using_responder_with_respond
-    responder = Class.new(ActionController::Responder) do
-      def respond; @controller.render :text => "respond #{format}"; end
-    end
-    respond_with(resource, :responder => responder)
-  end
-
-  def respond_with_additional_params
-    @params = RespondWithController.params
-    respond_with({:result => resource}, @params)
-  end
-
-protected
-  def self.params
-    {
-        :foo => 'bar'
-    }
-  end
-
-  def resource
-    Customer.new("david", request.delete? ? nil : 13)
-  end
-end
-
-class InheritedRespondWithController < RespondWithController
-  clear_respond_to
-  respond_to :xml, :json
-
-  def index
-    respond_with(resource) do |format|
-      format.json { render :text => "JSON" }
-    end
-  end
-end
-
-class RenderJsonRespondWithController < RespondWithController
-  clear_respond_to
-  respond_to :json
-
-  def index
-    respond_with(resource) do |format|
-      format.json { render :json => RenderJsonTestException.new('boom') }
-    end
-  end
-
-  def create
-    resource = ValidatedCustomer.new(params[:name], 1)
-    respond_with(resource) do |format|
-      format.json do
-        if resource.errors.empty?
-          render :json => { :valid => true }
-        else
-          render :json => { :valid => false }
-        end
-      end
-    end
-  end
-end
-
-class CsvRespondWithController < ActionController::Base
-  respond_to :csv
-
-  class RespondWithCsv
-    def to_csv
-      "c,s,v"
-    end
-  end
-
-  def index
-    respond_with(RespondWithCsv.new)
-  end
-end
-
-class EmptyRespondWithController < ActionController::Base
-  def index
-    respond_with(Customer.new("david", 13))
-  end
-end
-
-class RespondWithControllerTest < ActionController::TestCase
-  def setup
-    super
-    @request.host = "www.example.com"
-    Mime::Type.register_alias('text/html', :iphone)
-    Mime::Type.register_alias('text/html', :touch)
-    Mime::Type.register('text/x-mobile', :mobile)
-  end
-
-  def teardown
-    super
-    Mime::Type.unregister(:iphone)
-    Mime::Type.unregister(:touch)
-    Mime::Type.unregister(:mobile)
-  end
-
-  def test_respond_with_shouldnt_modify_original_hash
-    get :respond_with_additional_params
-    assert_equal RespondWithController.params, assigns(:params)
-  end
-
-  def test_using_resource
-    @request.accept = "application/xml"
-    get :using_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal "<name>david</name>", @response.body
-
-    @request.accept = "application/json"
-    assert_raise ActionView::MissingTemplate do
-      get :using_resource
-    end
-  end
-
-  def test_using_resource_with_js_simply_tries_to_render_the_template
-    @request.accept = "text/javascript"
-    get :using_resource
-    assert_equal "text/javascript", @response.content_type
-    assert_equal "alert(\"Hi\");", @response.body
-  end
-
-  def test_using_hash_resource_with_js_raises_an_error_if_template_cant_be_found
-    @request.accept = "text/javascript"
-    assert_raise ActionView::MissingTemplate do
-      get :using_hash_resource
-    end
-  end
-
-  def test_using_hash_resource
-    @request.accept = "application/xml"
-    get :using_hash_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n  <name>david</name>\n</hash>\n", @response.body
-
-    @request.accept = "application/json"
-    get :using_hash_resource
-    assert_equal "application/json", @response.content_type
-    assert @response.body.include?("result")
-    assert @response.body.include?('"name":"david"')
-    assert @response.body.include?('"id":13')
-  end
-
-  def test_using_hash_resource_with_post
-    @request.accept = "application/json"
-    assert_raise ArgumentError, "Nil location provided. Can't build URI." do
-      post :using_hash_resource
-    end
-  end
-
-  def test_using_resource_with_block
-    @request.accept = "*/*"
-    get :using_resource_with_block
-    assert_equal "text/html", @response.content_type
-    assert_equal 'Hello world!', @response.body
-
-    @request.accept = "text/csv"
-    get :using_resource_with_block
-    assert_equal "text/csv", @response.content_type
-    assert_equal "CSV", @response.body
-
-    @request.accept = "application/xml"
-    get :using_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal "<name>david</name>", @response.body
-  end
-
-  def test_using_resource_with_overwrite_block
-    get :using_resource_with_overwrite_block
-    assert_equal "text/html", @response.content_type
-    assert_equal "HTML", @response.body
-  end
-
-  def test_not_acceptable
-    @request.accept = "application/xml"
-    assert_raises(ActionController::UnknownFormat) do
-      get :using_resource_with_block
-    end
-
-    @request.accept = "text/javascript"
-    assert_raises(ActionController::UnknownFormat) do
-      get :using_resource_with_overwrite_block
-    end
-  end
-
-  def test_using_resource_for_post_with_html_redirects_on_success
-    with_test_route_set do
-      post :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 302, @response.status
-      assert_equal "http://www.example.com/customers/13", @response.location
-      assert @response.redirect?
-    end
-  end
-
-  def test_using_resource_for_post_with_html_rerender_on_failure
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      post :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 200, @response.status
-      assert_equal "New world!\n", @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_post_with_xml_yields_created_on_success
-    with_test_route_set do
-      @request.accept = "application/xml"
-      post :using_resource
-      assert_equal "application/xml", @response.content_type
-      assert_equal 201, @response.status
-      assert_equal "<name>david</name>", @response.body
-      assert_equal "http://www.example.com/customers/13", @response.location
-    end
-  end
-
-  def test_using_resource_for_post_with_xml_yields_unprocessable_entity_on_failure
-    with_test_route_set do
-      @request.accept = "application/xml"
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      post :using_resource
-      assert_equal "application/xml", @response.content_type
-      assert_equal 422, @response.status
-      assert_equal errors.to_xml, @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_post_with_json_yields_unprocessable_entity_on_failure
-    with_test_route_set do
-      @request.accept = "application/json"
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      post :using_resource
-      assert_equal "application/json", @response.content_type
-      assert_equal 422, @response.status
-      errors = {:errors => errors}
-      assert_equal errors.to_json, @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_patch_with_html_redirects_on_success
-    with_test_route_set do
-      patch :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 302, @response.status
-      assert_equal "http://www.example.com/customers/13", @response.location
-      assert @response.redirect?
-    end
-  end
-
-  def test_using_resource_for_patch_with_html_rerender_on_failure
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      patch :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 200, @response.status
-      assert_equal "Edit world!\n", @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_patch_with_html_rerender_on_failure_even_on_method_override
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      @request.env["rack.methodoverride.original_method"] = "POST"
-      patch :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 200, @response.status
-      assert_equal "Edit world!\n", @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_put_with_html_redirects_on_success
-    with_test_route_set do
-      put :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 302, @response.status
-      assert_equal "http://www.example.com/customers/13", @response.location
-      assert @response.redirect?
-    end
-  end
-
-  def test_using_resource_for_put_with_html_rerender_on_failure
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      put :using_resource
-
-      assert_equal "text/html", @response.content_type
-      assert_equal 200, @response.status
-      assert_equal "Edit world!\n", @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_put_with_html_rerender_on_failure_even_on_method_override
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      @request.env["rack.methodoverride.original_method"] = "POST"
-      put :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 200, @response.status
-      assert_equal "Edit world!\n", @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_for_put_with_xml_yields_no_content_on_success
-    @request.accept = "application/xml"
-    put :using_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal 204, @response.status
-    assert_equal "", @response.body
-  end
-
-  def test_using_resource_for_put_with_json_yields_no_content_on_success
-    @request.accept = "application/json"
-    put :using_resource_with_json
-    assert_equal "application/json", @response.content_type
-    assert_equal 204, @response.status
-    assert_equal "", @response.body
-  end
-
-  def test_using_resource_for_put_with_xml_yields_unprocessable_entity_on_failure
-    @request.accept = "application/xml"
-    errors = { :name => :invalid }
-    Customer.any_instance.stubs(:errors).returns(errors)
-    put :using_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal 422, @response.status
-    assert_equal errors.to_xml, @response.body
-    assert_nil @response.location
-  end
-
-  def test_using_resource_for_put_with_json_yields_unprocessable_entity_on_failure
-    @request.accept = "application/json"
-    errors = { :name => :invalid }
-    Customer.any_instance.stubs(:errors).returns(errors)
-    put :using_resource
-    assert_equal "application/json", @response.content_type
-    assert_equal 422, @response.status
-    errors = {:errors => errors}
-    assert_equal errors.to_json, @response.body
-    assert_nil @response.location
-  end
-
-  def test_using_resource_for_delete_with_html_redirects_on_success
-    with_test_route_set do
-      Customer.any_instance.stubs(:destroyed?).returns(true)
-      delete :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 302, @response.status
-      assert_equal "http://www.example.com/customers", @response.location
-    end
-  end
-
-  def test_using_resource_for_delete_with_xml_yields_no_content_on_success
-    Customer.any_instance.stubs(:destroyed?).returns(true)
-    @request.accept = "application/xml"
-    delete :using_resource
-    assert_equal "application/xml", @response.content_type
-    assert_equal 204, @response.status
-    assert_equal "", @response.body
-  end
-
-  def test_using_resource_for_delete_with_json_yields_no_content_on_success
-    Customer.any_instance.stubs(:destroyed?).returns(true)
-    @request.accept = "application/json"
-    delete :using_resource_with_json
-    assert_equal "application/json", @response.content_type
-    assert_equal 204, @response.status
-    assert_equal "", @response.body
-  end
-
-  def test_using_resource_for_delete_with_html_redirects_on_failure
-    with_test_route_set do
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      Customer.any_instance.stubs(:destroyed?).returns(false)
-      delete :using_resource
-      assert_equal "text/html", @response.content_type
-      assert_equal 302, @response.status
-      assert_equal "http://www.example.com/customers", @response.location
-    end
-  end
-
-  def test_using_resource_with_parent_for_get
-    @request.accept = "application/xml"
-    get :using_resource_with_parent
-    assert_equal "application/xml", @response.content_type
-    assert_equal 200, @response.status
-    assert_equal "<name>david</name>", @response.body
-  end
-
-  def test_using_resource_with_parent_for_post
-    with_test_route_set do
-      @request.accept = "application/xml"
-
-      post :using_resource_with_parent
-      assert_equal "application/xml", @response.content_type
-      assert_equal 201, @response.status
-      assert_equal "<name>david</name>", @response.body
-      assert_equal "http://www.example.com/quiz_stores/11/customers/13", @response.location
-
-      errors = { :name => :invalid }
-      Customer.any_instance.stubs(:errors).returns(errors)
-      post :using_resource
-      assert_equal "application/xml", @response.content_type
-      assert_equal 422, @response.status
-      assert_equal errors.to_xml, @response.body
-      assert_nil @response.location
-    end
-  end
-
-  def test_using_resource_with_collection
-    @request.accept = "application/xml"
-    get :using_resource_with_collection
-    assert_equal "application/xml", @response.content_type
-    assert_equal 200, @response.status
-    assert_match(/<name>david<\/name>/, @response.body)
-    assert_match(/<name>jamis<\/name>/, @response.body)
-  end
-
-  def test_using_resource_with_action
-    @controller.instance_eval do
-      def render(params={})
-        self.response_body = "#{params[:action]} - #{formats}"
-      end
-    end
-
-    errors = { :name => :invalid }
-    Customer.any_instance.stubs(:errors).returns(errors)
-
-    post :using_resource_with_action
-    assert_equal "foo - #{[:html].to_s}", @controller.response.body
-  end
-
-  def test_respond_as_responder_entry_point
-    @request.accept = "text/html"
-    get :using_responder_with_respond
-    assert_equal "respond html", @response.body
-
-    @request.accept = "application/xml"
-    get :using_responder_with_respond
-    assert_equal "respond xml", @response.body
-  end
-
-  def test_clear_respond_to
-    @controller = InheritedRespondWithController.new
-    @request.accept = "text/html"
-    assert_raises(ActionController::UnknownFormat) do
-      get :index
-    end
-  end
-
-  def test_first_in_respond_to_has_higher_priority
-    @controller = InheritedRespondWithController.new
-    @request.accept = "*/*"
-    get :index
-    assert_equal "application/xml", @response.content_type
-    assert_equal "<name>david</name>", @response.body
-  end
-
-  def test_block_inside_respond_with_is_rendered
-    @controller = InheritedRespondWithController.new
-    @request.accept = "application/json"
-    get :index
-    assert_equal "JSON", @response.body
-  end
-
-  def test_render_json_object_responds_to_str_still_produce_json
-    @controller = RenderJsonRespondWithController.new
-    @request.accept = "application/json"
-    get :index, :format => :json
-    assert_match(/"message":"boom"/, @response.body)
-    assert_match(/"error":"RenderJsonTestException"/, @response.body)
-  end
-
-  def test_api_response_with_valid_resource_respect_override_block
-    @controller = RenderJsonRespondWithController.new
-    post :create, :name => "sikachu", :format => :json
-    assert_equal '{"valid":true}', @response.body
-  end
-
-  def test_api_response_with_invalid_resource_respect_override_block
-    @controller = RenderJsonRespondWithController.new
-    post :create, :name => "david", :format => :json
-    assert_equal '{"valid":false}', @response.body
-  end
-
-  def test_no_double_render_is_raised
-    @request.accept = "text/html"
-    assert_raise ActionView::MissingTemplate do
-      get :using_resource
-    end
-  end
-
-  def test_using_resource_with_status_and_location
-    @request.accept = "text/html"
-    post :using_resource_with_status_and_location
-    assert @response.redirect?
-    assert_equal "http://test.host/", @response.location
-
-    @request.accept = "application/xml"
-    get :using_resource_with_status_and_location
-    assert_equal 201, @response.status
-  end
-
-  def test_using_resource_with_status_and_location_with_invalid_resource
-    errors = { :name => :invalid }
-    Customer.any_instance.stubs(:errors).returns(errors)
-
-    @request.accept = "text/xml"
-
-    post :using_resource_with_status_and_location
-    assert_equal errors.to_xml, @response.body
-    assert_equal 422, @response.status
-    assert_equal nil, @response.location
-
-    put :using_resource_with_status_and_location
-    assert_equal errors.to_xml, @response.body
-    assert_equal 422, @response.status
-    assert_equal nil, @response.location
-  end
-
-  def test_using_invalid_resource_with_template
-    errors = { :name => :invalid }
-    Customer.any_instance.stubs(:errors).returns(errors)
-
-    @request.accept = "text/xml"
-
-    post :using_invalid_resource_with_template
-    assert_equal errors.to_xml, @response.body
-    assert_equal 422, @response.status
-    assert_equal nil, @response.location
-
-    put :using_invalid_resource_with_template
-    assert_equal errors.to_xml, @response.body
-    assert_equal 422, @response.status
-    assert_equal nil, @response.location
-  end
-
-  def test_using_options_with_template
-    @request.accept = "text/xml"
-
-    post :using_options_with_template
-    assert_equal "<customer-name>david</customer-name>", @response.body
-    assert_equal 123, @response.status
-    assert_equal "http://test.host/", @response.location
-
-    put :using_options_with_template
-    assert_equal "<customer-name>david</customer-name>", @response.body
-    assert_equal 123, @response.status
-    assert_equal "http://test.host/", @response.location
-  end
-
-  def test_using_resource_with_responder
-    get :using_resource_with_responder
-    assert_equal "Resource name is david", @response.body
-  end
-
-  def test_using_resource_with_set_responder
-    RespondWithController.responder = proc { |c, r, o| c.render :text => "Resource name is #{r.first.name}" }
-    get :using_resource
-    assert_equal "Resource name is david", @response.body
-  ensure
-    RespondWithController.responder = ActionController::Responder
-  end
-
-  def test_uses_renderer_if_an_api_behavior
-    ActionController::Renderers.add :csv do |obj, options|
-      send_data obj.to_csv, type: Mime::CSV
-    end
-    @controller = CsvRespondWithController.new
-    get :index, format: 'csv'
-    assert_equal Mime::CSV, @response.content_type
-    assert_equal "c,s,v", @response.body
-  ensure
-    ActionController::Renderers.remove :csv
-  end
-
-  def test_raises_missing_renderer_if_an_api_behavior_with_no_renderer
-    @controller = CsvRespondWithController.new
-    assert_raise ActionController::MissingRenderer do
-      get :index, format: 'csv'
-    end
-  end
-
-  def test_removing_renderers
-    ActionController::Renderers.add :csv do |obj, options|
-      send_data obj.to_csv, type: Mime::CSV
-    end
-    @controller = CsvRespondWithController.new
-    @request.accept = "text/csv"
-    get :index, format: 'csv'
-    assert_equal Mime::CSV, @response.content_type
-
-    ActionController::Renderers.remove :csv
-    assert_raise ActionController::MissingRenderer do
-      get :index, format: 'csv'
-    end
-  ensure
-    ActionController::Renderers.remove :csv
-  end
-
-  def test_error_is_raised_if_no_respond_to_is_declared_and_respond_with_is_called
-    @controller = EmptyRespondWithController.new
-    @request.accept = "*/*"
-    assert_raise RuntimeError do
-      get :index
-    end
-  end
-
-  private
-    def with_test_route_set
-      with_routing do |set|
-        set.draw do
-          resources :customers
-          resources :quiz_stores do
-            resources :customers
-          end
-          get ":controller/:action"
-        end
-        yield
-      end
-    end
-end
-
-class FlashResponder < ActionController::Responder
-  def initialize(controller, resources, options={})
-    super
-  end
-
-  def to_html
-    controller.flash[:notice] = 'Success'
-    super
-  end
-end
-
-class FlashResponderController < ActionController::Base
-  self.responder = FlashResponder
-  respond_to :html
-
-  def index
-    respond_with Object.new do |format|
-      format.html { render :text => 'HTML' }
-    end
-  end
-end
-
-class FlashResponderControllerTest < ActionController::TestCase
-  tests FlashResponderController
-
-  def test_respond_with_block_executed
-    get :index
-    assert_equal 'HTML', @response.body
-  end
-
-  def test_flash_responder_executed
-    get :index
-    assert_equal 'Success', flash[:notice]
-  end
-end
-- 
cgit v1.2.3


From 57f5b00ba4f675873d5bab3bc88dae55d4fe7857 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20Valim?= <jose.valim@plataformatec.com.br>
Date: Sat, 16 Aug 2014 17:04:26 -0400
Subject: Remove more references to respond_with

---
 actionpack/test/fixtures/respond_with/edit.html.erb                      | 1 -
 actionpack/test/fixtures/respond_with/new.html.erb                       | 1 -
 .../test/fixtures/respond_with/respond_with_additional_params.html.erb   | 0
 .../fixtures/respond_with/using_invalid_resource_with_template.xml.erb   | 1 -
 .../test/fixtures/respond_with/using_options_with_template.xml.erb       | 1 -
 actionpack/test/fixtures/respond_with/using_resource.js.erb              | 1 -
 actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb | 1 -
 7 files changed, 6 deletions(-)
 delete mode 100644 actionpack/test/fixtures/respond_with/edit.html.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/new.html.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/respond_with_additional_params.html.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/using_invalid_resource_with_template.xml.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/using_options_with_template.xml.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/using_resource.js.erb
 delete mode 100644 actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb

(limited to 'actionpack/test')

diff --git a/actionpack/test/fixtures/respond_with/edit.html.erb b/actionpack/test/fixtures/respond_with/edit.html.erb
deleted file mode 100644
index ae82dfa4fc..0000000000
--- a/actionpack/test/fixtures/respond_with/edit.html.erb
+++ /dev/null
@@ -1 +0,0 @@
-Edit world!
diff --git a/actionpack/test/fixtures/respond_with/new.html.erb b/actionpack/test/fixtures/respond_with/new.html.erb
deleted file mode 100644
index 96c8f1b88b..0000000000
--- a/actionpack/test/fixtures/respond_with/new.html.erb
+++ /dev/null
@@ -1 +0,0 @@
-New world!
diff --git a/actionpack/test/fixtures/respond_with/respond_with_additional_params.html.erb b/actionpack/test/fixtures/respond_with/respond_with_additional_params.html.erb
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/actionpack/test/fixtures/respond_with/using_invalid_resource_with_template.xml.erb b/actionpack/test/fixtures/respond_with/using_invalid_resource_with_template.xml.erb
deleted file mode 100644
index bf5869ed22..0000000000
--- a/actionpack/test/fixtures/respond_with/using_invalid_resource_with_template.xml.erb
+++ /dev/null
@@ -1 +0,0 @@
-<content>I should not be displayed</content>
\ No newline at end of file
diff --git a/actionpack/test/fixtures/respond_with/using_options_with_template.xml.erb b/actionpack/test/fixtures/respond_with/using_options_with_template.xml.erb
deleted file mode 100644
index b313017913..0000000000
--- a/actionpack/test/fixtures/respond_with/using_options_with_template.xml.erb
+++ /dev/null
@@ -1 +0,0 @@
-<customer-name><%= @customer.name %></customer-name>
\ No newline at end of file
diff --git a/actionpack/test/fixtures/respond_with/using_resource.js.erb b/actionpack/test/fixtures/respond_with/using_resource.js.erb
deleted file mode 100644
index 4417680bce..0000000000
--- a/actionpack/test/fixtures/respond_with/using_resource.js.erb
+++ /dev/null
@@ -1 +0,0 @@
-alert("Hi");
\ No newline at end of file
diff --git a/actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb b/actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb
deleted file mode 100644
index 6769dd60bd..0000000000
--- a/actionpack/test/fixtures/respond_with/using_resource_with_block.html.erb
+++ /dev/null
@@ -1 +0,0 @@
-Hello world!
\ No newline at end of file
-- 
cgit v1.2.3


From 69ed422a9c534224eb818636d79d4263e2abd0a2 Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Sun, 17 Aug 2014 11:44:31 -0700
Subject: Fixed broken reference caused by 14965ba

---
 actionpack/test/dispatch/cookies_test.rb | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'actionpack/test')

diff --git a/actionpack/test/dispatch/cookies_test.rb b/actionpack/test/dispatch/cookies_test.rb
index b40c21c067..7e7dd94425 100644
--- a/actionpack/test/dispatch/cookies_test.rb
+++ b/actionpack/test/dispatch/cookies_test.rb
@@ -519,8 +519,8 @@ class CookiesTest < ActionController::TestCase
 
     sign_secret = @request.env["action_dispatch.key_generator"].generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
 
-    sha1_verifier   = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActionDispatch::Cookies::NullSerializer, digest: 'SHA1')
-    sha256_verifier = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActionDispatch::Cookies::NullSerializer, digest: 'SHA256')
+    sha1_verifier   = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer, digest: 'SHA1')
+    sha256_verifier = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer, digest: 'SHA256')
 
     assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
       sha1_verifier.verify(cookies[:foo])
-- 
cgit v1.2.3


From 24226c51f075ed8d8e721cdefb6d2661c0a1f53a Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Sun, 17 Aug 2014 11:54:09 -0700
Subject: Raise a more helpful error for people who are using these extracted
 features

---
 actionpack/test/controller/mime/responder_test.rb | 30 +++++++++++++++++++++++
 1 file changed, 30 insertions(+)
 create mode 100644 actionpack/test/controller/mime/responder_test.rb

(limited to 'actionpack/test')

diff --git a/actionpack/test/controller/mime/responder_test.rb b/actionpack/test/controller/mime/responder_test.rb
new file mode 100644
index 0000000000..6201af3299
--- /dev/null
+++ b/actionpack/test/controller/mime/responder_test.rb
@@ -0,0 +1,30 @@
+require 'abstract_unit'
+require 'controller/fake_models'
+
+class ResponderTest < ActionController::TestCase
+  def test_class_level_respond_to
+    e = assert_raises(NoMethodError) do
+      Class.new(ActionController::Base) do
+        respond_to :json
+      end
+    end
+
+    assert_includes e.message, '`responder` gem'
+  end
+
+  def test_respond_with
+    klass = Class.new(ActionController::Base) do
+      def index
+        respond_with Customer.new("david", 13)
+      end
+    end
+
+    @controller = klass.new
+
+    e = assert_raises(NoMethodError) do
+      get :index
+    end
+
+    assert_includes e.message, '`responder` gem'
+  end
+end
-- 
cgit v1.2.3


From b662273df3d546a1fdd2de79005fd802f0e12643 Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Sun, 17 Aug 2014 11:58:17 -0700
Subject: The gem is called 'responders'

---
 actionpack/test/controller/mime/responder_test.rb  | 30 ----------------------
 actionpack/test/controller/mime/responders_test.rb | 30 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 30 deletions(-)
 delete mode 100644 actionpack/test/controller/mime/responder_test.rb
 create mode 100644 actionpack/test/controller/mime/responders_test.rb

(limited to 'actionpack/test')

diff --git a/actionpack/test/controller/mime/responder_test.rb b/actionpack/test/controller/mime/responder_test.rb
deleted file mode 100644
index 6201af3299..0000000000
--- a/actionpack/test/controller/mime/responder_test.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-require 'abstract_unit'
-require 'controller/fake_models'
-
-class ResponderTest < ActionController::TestCase
-  def test_class_level_respond_to
-    e = assert_raises(NoMethodError) do
-      Class.new(ActionController::Base) do
-        respond_to :json
-      end
-    end
-
-    assert_includes e.message, '`responder` gem'
-  end
-
-  def test_respond_with
-    klass = Class.new(ActionController::Base) do
-      def index
-        respond_with Customer.new("david", 13)
-      end
-    end
-
-    @controller = klass.new
-
-    e = assert_raises(NoMethodError) do
-      get :index
-    end
-
-    assert_includes e.message, '`responder` gem'
-  end
-end
diff --git a/actionpack/test/controller/mime/responders_test.rb b/actionpack/test/controller/mime/responders_test.rb
new file mode 100644
index 0000000000..416e3191e6
--- /dev/null
+++ b/actionpack/test/controller/mime/responders_test.rb
@@ -0,0 +1,30 @@
+require 'abstract_unit'
+require 'controller/fake_models'
+
+class ResponderTest < ActionController::TestCase
+  def test_class_level_respond_to
+    e = assert_raises(NoMethodError) do
+      Class.new(ActionController::Base) do
+        respond_to :json
+      end
+    end
+
+    assert_includes e.message, '`responders` gem'
+  end
+
+  def test_respond_with
+    klass = Class.new(ActionController::Base) do
+      def index
+        respond_with Customer.new("david", 13)
+      end
+    end
+
+    @controller = klass.new
+
+    e = assert_raises(NoMethodError) do
+      get :index
+    end
+
+    assert_includes e.message, '`responders` gem'
+  end
+end
-- 
cgit v1.2.3


From a485633b16abd64b0955010fa93e0bc4894c7b7c Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Sun, 17 Aug 2014 12:19:06 -0700
Subject: `responders` 1.x won't do it. Told you to RTFM for details!

---
 actionpack/test/controller/mime/responders_test.rb | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'actionpack/test')

diff --git a/actionpack/test/controller/mime/responders_test.rb b/actionpack/test/controller/mime/responders_test.rb
index 416e3191e6..032b4c0ab1 100644
--- a/actionpack/test/controller/mime/responders_test.rb
+++ b/actionpack/test/controller/mime/responders_test.rb
@@ -10,6 +10,7 @@ class ResponderTest < ActionController::TestCase
     end
 
     assert_includes e.message, '`responders` gem'
+    assert_includes e.message, '~> 2.0'
   end
 
   def test_respond_with
@@ -26,5 +27,6 @@ class ResponderTest < ActionController::TestCase
     end
 
     assert_includes e.message, '`responders` gem'
+    assert_includes e.message, '~> 2.0'
   end
 end
-- 
cgit v1.2.3


From e158ee50e64e2ae2460cd26be53039922f588300 Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Sun, 17 Aug 2014 12:40:24 -0700
Subject: Use AS::JSON for (de)serializing cookies

Use the Active Support JSON encoder for cookie jars using the `:json` or
`:hybrid` serializer. This allows you to serialize custom Ruby objects into
cookies by defining the `#as_json` hook on such objects.

Fixes #16520.
---
 actionpack/test/dispatch/cookies_test.rb | 39 ++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

(limited to 'actionpack/test')

diff --git a/actionpack/test/dispatch/cookies_test.rb b/actionpack/test/dispatch/cookies_test.rb
index 7e7dd94425..9b03c805a0 100644
--- a/actionpack/test/dispatch/cookies_test.rb
+++ b/actionpack/test/dispatch/cookies_test.rb
@@ -21,6 +21,16 @@ class CookiesTest < ActionController::TestCase
     end
   end
 
+  class JSONWrapper
+    def initialize(obj)
+      @obj = obj
+    end
+
+    def as_json(options = nil)
+      "wrapped: #{@obj.as_json(options)}"
+    end
+  end
+
   class TestController < ActionController::Base
     def authenticate
       cookies["user_name"] = "david"
@@ -85,6 +95,11 @@ class CookiesTest < ActionController::TestCase
       head :ok
     end
 
+    def set_wrapped_signed_cookie
+      cookies.signed[:user_id] = JSONWrapper.new(45)
+      head :ok
+    end
+
     def get_signed_cookie
       cookies.signed[:user_id]
       head :ok
@@ -95,6 +110,11 @@ class CookiesTest < ActionController::TestCase
       head :ok
     end
 
+    def set_wrapped_encrypted_cookie
+      cookies.encrypted[:foo] = JSONWrapper.new('bar')
+      head :ok
+    end
+
     def get_encrypted_cookie
       cookies.encrypted[:foo]
       head :ok
@@ -421,6 +441,14 @@ class CookiesTest < ActionController::TestCase
     assert_equal 45, cookies.signed[:user_id]
   end
 
+  def test_wrapped_signed_cookie_using_json_serializer
+    @request.env["action_dispatch.cookies_serializer"] = :json
+    get :set_wrapped_signed_cookie
+    cookies = @controller.send :cookies
+    assert_not_equal 'wrapped: 45', cookies[:user_id]
+    assert_equal 'wrapped: 45', cookies.signed[:user_id]
+  end
+
   def test_signed_cookie_using_custom_serializer
     @request.env["action_dispatch.cookies_serializer"] = CustomSerializer
     get :set_signed_cookie
@@ -503,6 +531,17 @@ class CookiesTest < ActionController::TestCase
     assert_equal 'bar', cookies.encrypted[:foo]
   end
 
+  def test_wrapped_encrypted_cookie_using_json_serializer
+    @request.env["action_dispatch.cookies_serializer"] = :json
+    get :set_wrapped_encrypted_cookie
+    cookies = @controller.send :cookies
+    assert_not_equal 'wrapped: bar', cookies[:foo]
+    assert_raises ::JSON::ParserError do
+      cookies.signed[:foo]
+    end
+    assert_equal 'wrapped: bar', cookies.encrypted[:foo]
+  end
+
   def test_encrypted_cookie_using_custom_serializer
     @request.env["action_dispatch.cookies_serializer"] = CustomSerializer
     get :set_encrypted_cookie
-- 
cgit v1.2.3