actionpack-action_caching 1.0.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env rake
2
- require 'bundler/gem_tasks'
3
- require 'rake/testtask'
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
4
 
5
5
  Rake::TestTask.new do |t|
6
- t.libs = ['test']
7
- t.pattern = 'test/**/*_test.rb'
8
- t.ruby_opts = ['-w']
6
+ t.libs = ["test"]
7
+ t.pattern = "test/**/*_test.rb"
8
+ t.ruby_opts = ["-w"]
9
9
  end
10
10
 
11
11
  task default: :test
@@ -1,21 +1,28 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  Gem::Specification.new do |gem|
4
- gem.name = 'actionpack-action_caching'
5
- gem.version = '1.0.0'
6
- gem.author = 'David Heinemeier Hansson'
7
- gem.email = 'david@loudthinking.com'
8
- gem.description = 'Action caching for Action Pack (removed from core in Rails 4.0)'
9
- gem.summary = 'Action caching for Action Pack (removed from core in Rails 4.0)'
10
- gem.homepage = 'https://github.com/rails/actionpack-action_caching'
2
+ gem.name = "actionpack-action_caching"
3
+ gem.version = "1.2.2"
4
+ gem.author = "David Heinemeier Hansson"
5
+ gem.email = "david@loudthinking.com"
6
+ gem.description = "Action caching for Action Pack (removed from core in Rails 4.0)"
7
+ gem.summary = "Action caching for Action Pack (removed from core in Rails 4.0)"
8
+ gem.homepage = "https://github.com/rails/actionpack-action_caching"
9
+
10
+ gem.metadata = {
11
+ "bug_tracker_uri" => "https://github.com/rails/actionpack-action_caching/issues",
12
+ "changelog_uri" => "https://github.com/rails/actionpack-action_caching/blob/v#{gem.version}/CHANGELOG.md",
13
+ "documentation_uri" => "https://www.rubydoc.info/gems/actionpack-action_caching/#{gem.version}",
14
+ "source_code_uri" => "https://github.com/rails/actionpack-action_caching/tree/v#{gem.version}",
15
+ }
11
16
 
17
+ gem.required_ruby_version = ">= 1.9.3"
12
18
  gem.files = `git ls-files`.split($/)
13
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
14
20
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
- gem.require_paths = ['lib']
21
+ gem.require_paths = ["lib"]
22
+ gem.license = "MIT"
16
23
 
17
- gem.add_dependency 'actionpack', '>= 4.0.0.beta', '< 5.0'
24
+ gem.add_dependency "actionpack", ">= 4.0.0"
18
25
 
19
- gem.add_development_dependency 'mocha'
20
- gem.add_development_dependency 'activerecord', '>= 4.0.0.beta', '< 5.0'
26
+ gem.add_development_dependency "mocha"
27
+ gem.add_development_dependency "activerecord", ">= 4.0.0"
21
28
  end
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "4-2-stable"
6
+ gem "mime-types", "< 3"
7
+
8
+ if RUBY_VERSION < "2.1"
9
+ gem "nokogiri", "< 1.7"
10
+ end
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "5-0-stable"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "5-1-stable"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "5-2-stable"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "6-0-stable"
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "6-1-stable"
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec path: ".."
4
+
5
+ gem "rails", github: "rails/rails", branch: "main"
6
+ gem "activerecord", github: "rails/rails", branch: "main"
@@ -1,5 +1,9 @@
1
+ require "action_controller/caching/actions"
2
+
1
3
  module ActionController
2
4
  module Caching
5
+ extend ActiveSupport::Autoload
6
+
3
7
  eager_autoload do
4
8
  autoload :Actions
5
9
  end
@@ -7,3 +11,5 @@ module ActionController
7
11
  include Actions
8
12
  end
9
13
  end
14
+
15
+ ActionController::Base.send(:include, ActionController::Caching::Actions)
@@ -1,4 +1,4 @@
1
- require 'set'
1
+ require "set"
2
2
 
3
3
  module ActionController
4
4
  module Caching
@@ -10,7 +10,7 @@ module ActionController
10
10
  # to execute such action.
11
11
  #
12
12
  # class ListsController < ApplicationController
13
- # before_filter :authenticate, except: :public
13
+ # before_action :authenticate, except: :public
14
14
  #
15
15
  # caches_page :public
16
16
  # caches_action :index, :show
@@ -35,14 +35,16 @@ module ActionController
35
35
  # <tt>http://david.example.com/lists.xml</tt>
36
36
  # are treated like separate requests and so are cached separately.
37
37
  # Keep in mind when expiring an action cache that
38
- # <tt>action: 'lists'</tt> is not the same as
39
- # <tt>action: 'list', format: :xml</tt>.
38
+ # <tt>action: "lists"</tt> is not the same as
39
+ # <tt>action: "lists", format: :xml</tt>.
40
40
  #
41
41
  # You can modify the default action cache path by passing a
42
42
  # <tt>:cache_path</tt> option. This will be passed directly to
43
43
  # <tt>ActionCachePath.new</tt>. This is handy for actions with
44
44
  # multiple possible routes that should be cached differently. If a
45
45
  # block is given, it is called with the current controller instance.
46
+ # If an object that responds to <tt>call</tt> is given, it'll be called
47
+ # with the current controller instance.
46
48
  #
47
49
  # And you can also use <tt>:if</tt> (or <tt>:unless</tt>) to pass a
48
50
  # proc that specifies when the action should be cached.
@@ -52,8 +54,19 @@ module ActionController
52
54
  #
53
55
  # The following example depicts some of the points made above:
54
56
  #
57
+ # class CachePathCreator
58
+ # def initialize(name)
59
+ # @name = name
60
+ # end
61
+ #
62
+ # def call(controller)
63
+ # "cache-path-#{@name}"
64
+ # end
65
+ # end
66
+ #
67
+ #
55
68
  # class ListsController < ApplicationController
56
- # before_filter :authenticate, except: :public
69
+ # before_action :authenticate, except: :public
57
70
  #
58
71
  # caches_page :public
59
72
  #
@@ -71,6 +84,8 @@ module ActionController
71
84
  # list_url(params[:id])
72
85
  # end
73
86
  # end
87
+ #
88
+ # caches_action :posts, cache_path: CachePathCreator.new("posts")
74
89
  # end
75
90
  #
76
91
  # If you pass <tt>layout: false</tt>, it will only cache your action
@@ -98,12 +113,12 @@ module ActionController
98
113
  filter_options = options.extract!(:if, :unless).merge(only: actions)
99
114
  cache_options = options.extract!(:layout, :cache_path).merge(store_options: options)
100
115
 
101
- around_filter ActionCacheFilter.new(cache_options), filter_options
116
+ around_action ActionCacheFilter.new(cache_options), filter_options
102
117
  end
103
118
  end
104
119
 
105
120
  def _save_fragment(name, options)
106
- content = ''
121
+ content = ""
107
122
  response_body.each do |parts|
108
123
  content << parts
109
124
  end
@@ -137,14 +152,8 @@ module ActionController
137
152
  end
138
153
 
139
154
  def around(controller)
140
- cache_layout = @cache_layout.respond_to?(:call) ? @cache_layout.call(controller) : @cache_layout
141
-
142
- path_options = if @cache_path.respond_to?(:call)
143
- controller.instance_exec(controller, &@cache_path)
144
- else
145
- @cache_path
146
- end
147
-
155
+ cache_layout = expand_option(controller, @cache_layout)
156
+ path_options = expand_option(controller, @cache_path)
148
157
  cache_path = ActionCachePath.new(controller, path_options || {})
149
158
 
150
159
  body = controller.read_fragment(cache_path.path, @store_options)
@@ -156,11 +165,41 @@ module ActionController
156
165
  body = controller._save_fragment(cache_path.path, @store_options)
157
166
  end
158
167
 
159
- body = controller.render_to_string(text: body, layout: true) unless cache_layout
168
+ body = render_to_string(controller, body) unless cache_layout
160
169
 
161
170
  controller.response_body = body
162
171
  controller.content_type = Mime[cache_path.extension || :html]
163
172
  end
173
+
174
+ if ActionPack::VERSION::STRING < "4.1"
175
+ def render_to_string(controller, body)
176
+ controller.render_to_string(text: body, layout: true)
177
+ end
178
+ else
179
+ def render_to_string(controller, body)
180
+ controller.render_to_string(html: body.html_safe, layout: true)
181
+ end
182
+ end
183
+
184
+ private
185
+ def expand_option(controller, option)
186
+ option = option.to_proc if option.respond_to?(:to_proc)
187
+
188
+ if option.is_a?(Proc)
189
+ case option.arity
190
+ when -2, -1, 1
191
+ controller.instance_exec(controller, &option)
192
+ when 0
193
+ controller.instance_exec(&option)
194
+ else
195
+ raise ArgumentError, "Invalid proc arity of #{option.arity} - proc options should have an arity of 0 or 1"
196
+ end
197
+ elsif option.respond_to?(:call)
198
+ option.call(controller)
199
+ else
200
+ option
201
+ end
202
+ end
164
203
  end
165
204
 
166
205
  class ActionCachePath
@@ -172,20 +211,27 @@ module ActionController
172
211
  # request format.
173
212
  def initialize(controller, options = {}, infer_extension = true)
174
213
  if infer_extension
175
- @extension = controller.params[:format]
214
+ if controller.params.key?(:format)
215
+ @extension = controller.params[:format]
216
+ elsif !controller.request.format.html?
217
+ @extension = controller.request.format.to_sym
218
+ else
219
+ @extension = nil
220
+ end
221
+
176
222
  options.reverse_merge!(format: @extension) if options.is_a?(Hash)
177
223
  end
178
224
 
179
- path = controller.url_for(options).split('://', 2).last
225
+ path = controller.url_for(options).split("://", 2).last
180
226
  @path = normalize!(path)
181
227
  end
182
228
 
183
229
  private
184
230
  def normalize!(path)
185
- ext = URI.parser.escape(extension) if extension
186
- path << 'index' if path[-1] == ?/
187
- path << ".#{ext}" if extension and !path.split('?', 2).first.ends_with?(".#{ext}")
188
- URI.parser.unescape(path)
231
+ ext = URI::DEFAULT_PARSER.escape(extension.to_s) if extension
232
+ path << "index" if path[-1] == ?/
233
+ path << ".#{ext}" if extension && !path.split("?", 2).first.end_with?(".#{ext}")
234
+ URI::DEFAULT_PARSER.unescape(path)
189
235
  end
190
236
  end
191
237
  end
@@ -1 +1 @@
1
- require 'action_controller/action_caching'
1
+ require "actionpack/action_caching/railtie"
@@ -0,0 +1,13 @@
1
+ require "rails/railtie"
2
+
3
+ module ActionPack
4
+ module ActionCaching
5
+ class Railtie < Rails::Railtie
6
+ initializer "action_pack.action_caching" do
7
+ ActiveSupport.on_load(:action_controller) do
8
+ require "action_controller/action_caching"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,40 +1,11 @@
1
- require 'bundler/setup'
2
- require 'minitest/autorun'
3
- require 'action_controller'
4
- require 'active_record'
5
- require 'action_controller/action_caching'
1
+ require "bundler/setup"
2
+ require "minitest/autorun"
3
+ require "action_controller"
4
+ require "active_record"
5
+ require "action_controller/action_caching"
6
6
 
7
- FIXTURE_LOAD_PATH = File.join(File.dirname(__FILE__), 'fixtures')
7
+ FIXTURE_LOAD_PATH = File.expand_path("../fixtures", __FILE__)
8
8
 
9
- SharedTestRoutes = ActionDispatch::Routing::RouteSet.new
10
-
11
- module ActionController
12
- class Base
13
- include SharedTestRoutes.url_helpers
14
-
15
- self.view_paths = FIXTURE_LOAD_PATH
16
- end
17
-
18
- class TestCase
19
- def setup
20
- @routes = SharedTestRoutes
21
-
22
- @routes.draw do
23
- get ':controller(/:action)'
24
- end
25
- end
26
- end
27
- end
28
-
29
- module RackTestUtils
30
- def body_to_string(body)
31
- if body.respond_to?(:each)
32
- str = ''
33
- body.each {|s| str << s }
34
- str
35
- else
36
- body
37
- end
38
- end
39
- extend self
9
+ if ActiveSupport.respond_to?(:test_order)
10
+ ActiveSupport.test_order = :random
40
11
  end
data/test/caching_test.rb CHANGED
@@ -1,8 +1,10 @@
1
- require 'abstract_unit'
1
+ require "abstract_unit"
2
+ require "mocha/setup"
2
3
 
3
- CACHE_DIR = 'test_cache'
4
- # Don't change '/../temp/' cavalierly or you might hose something you don't want hosed
5
- FILE_STORE_PATH = File.join(File.dirname(__FILE__), '/../temp/', CACHE_DIR)
4
+ CACHE_DIR = "test_cache"
5
+ # Don't change "../tmp" cavalierly or you might hose something you don't want hosed
6
+ TEST_TMP_DIR = File.expand_path("../tmp", __FILE__)
7
+ FILE_STORE_PATH = File.join(TEST_TMP_DIR, CACHE_DIR)
6
8
 
7
9
  class CachingController < ActionController::Base
8
10
  abstract!
@@ -10,6 +12,12 @@ class CachingController < ActionController::Base
10
12
  self.cache_store = :file_store, FILE_STORE_PATH
11
13
  end
12
14
 
15
+ class CachePath
16
+ def call(controller)
17
+ ["controller", controller.params[:id]].compact.join("-")
18
+ end
19
+ end
20
+
13
21
  class ActionCachingTestController < CachingController
14
22
  rescue_from(Exception) { head 500 }
15
23
  rescue_from(ActionController::UnknownFormat) { head :not_acceptable }
@@ -17,97 +25,160 @@ class ActionCachingTestController < CachingController
17
25
  rescue_from(ActiveRecord::RecordNotFound) { head :not_found }
18
26
  end
19
27
 
20
- # Eliminate uninitialized ivar warning
21
- before_filter { @title = nil }
28
+ self.view_paths = FIXTURE_LOAD_PATH
22
29
 
23
- caches_action :index, :redirected, :forbidden, if: Proc.new { |c| c.request.format && !c.request.format.json? }, expires_in: 1.hour
24
- caches_action :show, cache_path: 'http://test.host/custom/show'
25
- caches_action :edit, cache_path: Proc.new { |c| c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : 'http://test.host/edit' }
30
+ before_action only: :with_symbol_format do
31
+ request.params[:format] = :json
32
+ end
33
+
34
+ caches_action :index, :redirected, :forbidden, if: ->(c) { c.request.format && !c.request.format.json? }, expires_in: 1.hour
35
+ caches_action :show, cache_path: "http://test.host/custom/show"
36
+ caches_action :edit, cache_path: ->(c) { c.params[:id] ? "http://test.host/#{c.params[:id]};edit" : "http://test.host/edit" }
37
+ caches_action :custom_cache_path, cache_path: CachePath.new
38
+ caches_action :symbol_cache_path, cache_path: :cache_path_protected_method
26
39
  caches_action :with_layout
27
- caches_action :with_format_and_http_param, cache_path: Proc.new { |c| { key: 'value' } }
40
+ caches_action :with_format_and_http_param, cache_path: ->(c) { { key: "value" } }
41
+ caches_action :with_symbol_format, cache_path: "http://test.host/action_caching_test/with_symbol_format"
42
+ caches_action :not_url_cache_path, cache_path: ->(c) { "#{c.params[:action]}_key" }
43
+ caches_action :not_url_cache_path_no_args, cache_path: -> { "#{params[:action]}_key" }
28
44
  caches_action :layout_false, layout: false
29
- caches_action :with_layout_proc_param, layout: Proc.new { |c| c.params[:layout] }
45
+ caches_action :with_layout_proc_param, layout: ->(c) { c.params[:layout] != "false" }
46
+ caches_action :with_layout_proc_param_no_args, layout: -> { params[:layout] != "false" }
30
47
  caches_action :record_not_found, :four_oh_four, :simple_runtime_error
31
48
  caches_action :streaming
32
49
  caches_action :invalid
50
+ caches_action :accept
33
51
 
34
- layout 'talk_from_action'
52
+ layout "talk_from_action"
35
53
 
36
54
  def index
37
- @cache_this = MockTime.now.to_f.to_s
38
- render text: @cache_this
55
+ @cache_this = CacheContent.to_s
56
+ render plain: @cache_this
39
57
  end
40
58
 
41
59
  def redirected
42
- redirect_to action: 'index'
60
+ redirect_to action: "index"
43
61
  end
44
62
 
45
63
  def forbidden
46
- render text: 'Forbidden'
47
- response.status = '403 Forbidden'
64
+ render plain: "Forbidden"
65
+ response.status = "403 Forbidden"
48
66
  end
49
67
 
50
68
  def with_layout
51
- @cache_this = MockTime.now.to_f.to_s
52
- @title = nil
53
- render text: @cache_this, layout: true
69
+ @cache_this = CacheContent.to_s
70
+ render html: @cache_this, layout: true
54
71
  end
55
72
 
56
73
  def with_format_and_http_param
57
- @cache_this = MockTime.now.to_f.to_s
58
- render text: @cache_this
74
+ @cache_this = CacheContent.to_s
75
+ render plain: @cache_this
76
+ end
77
+
78
+ def with_symbol_format
79
+ @cache_this = CacheContent.to_s
80
+ render json: { timestamp: @cache_this }
81
+ end
82
+
83
+ def not_url_cache_path
84
+ render plain: "cache_this"
59
85
  end
86
+ alias_method :not_url_cache_path_no_args, :not_url_cache_path
60
87
 
61
88
  def record_not_found
62
- raise ActiveRecord::RecordNotFound, 'oops!'
89
+ raise ActiveRecord::RecordNotFound, "oops!"
63
90
  end
64
91
 
65
92
  def four_oh_four
66
- render text: "404'd!", status: 404
93
+ render plain: "404'd!", status: 404
67
94
  end
68
95
 
69
96
  def simple_runtime_error
70
- raise 'oops!'
97
+ raise "oops!"
71
98
  end
72
99
 
73
100
  alias_method :show, :index
74
101
  alias_method :edit, :index
75
102
  alias_method :destroy, :index
103
+ alias_method :custom_cache_path, :index
104
+ alias_method :symbol_cache_path, :index
76
105
  alias_method :layout_false, :with_layout
77
106
  alias_method :with_layout_proc_param, :with_layout
107
+ alias_method :with_layout_proc_param_no_args, :with_layout
78
108
 
79
109
  def expire
80
- expire_action controller: 'action_caching_test', action: 'index'
81
- render nothing: true
110
+ expire_action controller: "action_caching_test", action: "index"
111
+ head :ok
82
112
  end
83
113
 
84
114
  def expire_xml
85
- expire_action controller: 'action_caching_test', action: 'index', format: 'xml'
86
- render nothing: true
115
+ expire_action controller: "action_caching_test", action: "index", format: "xml"
116
+ head :ok
87
117
  end
88
118
 
89
119
  def expire_with_url_string
90
- expire_action url_for(controller: 'action_caching_test', action: 'index')
91
- render nothing: true
120
+ expire_action url_for(controller: "action_caching_test", action: "index")
121
+ head :ok
92
122
  end
93
123
 
94
124
  def streaming
95
- render text: 'streaming', stream: true
125
+ render plain: "streaming", stream: true
96
126
  end
97
127
 
98
128
  def invalid
99
- @cache_this = MockTime.now.to_f.to_s
129
+ @cache_this = CacheContent.to_s
130
+
131
+ respond_to do |format|
132
+ format.json { render json: @cache_this }
133
+ end
134
+ end
135
+
136
+ def accept
137
+ @cache_this = CacheContent.to_s
100
138
 
101
139
  respond_to do |format|
102
- format.json{ render json: @cache_this }
140
+ format.html { render html: @cache_this }
141
+ format.json { render json: @cache_this }
142
+ end
143
+ end
144
+
145
+ def expire_accept
146
+ if params.key?(:format)
147
+ expire_action action: "accept", format: params[:format]
148
+ elsif !request.format.html?
149
+ expire_action action: "accept", format: request.format.to_sym
150
+ else
151
+ expire_action action: "accept"
103
152
  end
153
+
154
+ head :ok
104
155
  end
156
+
157
+ protected
158
+ def cache_path_protected_method
159
+ ["controller", params[:id]].compact.join("-")
160
+ end
161
+
162
+ if ActionPack::VERSION::STRING < "4.1"
163
+ def render(options)
164
+ if options.key?(:plain)
165
+ super({ text: options.delete(:plain) }.merge(options))
166
+ response.content_type = "text/plain"
167
+ elsif options.key?(:html)
168
+ super({ text: options.delete(:html) }.merge(options))
169
+ response.content_type = "text/html"
170
+ else
171
+ super
172
+ end
173
+ end
174
+ end
105
175
  end
106
176
 
107
- class MockTime < Time
108
- # Let Time spicy to assure that Time.now != Time.now
109
- def to_f
110
- super+rand
177
+ class CacheContent
178
+ def self.to_s
179
+ # Let Time spicy to assure that Time.now != Time.now
180
+ time = Time.now.to_f + rand
181
+ (time.to_s + "<div />").html_safe
111
182
  end
112
183
  end
113
184
 
@@ -128,9 +199,9 @@ class ActionCachingMockController
128
199
  end
129
200
 
130
201
  def request
131
- Object.new.instance_eval(<<-EVAL)
132
- def path; '#{@mock_path}' end
133
- def format; 'all' end
202
+ Object.new.instance_eval <<-EVAL
203
+ def path; "#{@mock_path}" end
204
+ def format; "all" end
134
205
  def parameters; { format: nil }; end
135
206
  self
136
207
  EVAL
@@ -142,7 +213,10 @@ class ActionCacheTest < ActionController::TestCase
142
213
 
143
214
  def setup
144
215
  super
145
- @request.host = 'hostname.com'
216
+
217
+ @routes = ActionDispatch::Routing::RouteSet.new
218
+
219
+ @request.host = "hostname.com"
146
220
  FileUtils.mkdir_p(FILE_STORE_PATH)
147
221
  @path_class = ActionController::Caching::Actions::ActionCachePath
148
222
  @mock_controller = ActionCachingMockController.new
@@ -154,11 +228,15 @@ class ActionCacheTest < ActionController::TestCase
154
228
  end
155
229
 
156
230
  def test_simple_action_cache_with_http_head
231
+ draw do
232
+ get "/action_caching_test", to: "action_caching_test#index"
233
+ end
234
+
157
235
  head :index
158
236
  assert_response :success
159
237
  cached_time = content_to_cache
160
238
  assert_equal cached_time, @response.body
161
- assert fragment_exist?('hostname.com/action_caching_test')
239
+ assert fragment_exist?("hostname.com/action_caching_test")
162
240
 
163
241
  head :index
164
242
  assert_response :success
@@ -166,11 +244,15 @@ class ActionCacheTest < ActionController::TestCase
166
244
  end
167
245
 
168
246
  def test_simple_action_cache
247
+ draw do
248
+ get "/action_caching_test", to: "action_caching_test#index"
249
+ end
250
+
169
251
  get :index
170
252
  assert_response :success
171
253
  cached_time = content_to_cache
172
254
  assert_equal cached_time, @response.body
173
- assert fragment_exist?('hostname.com/action_caching_test')
255
+ assert fragment_exist?("hostname.com/action_caching_test")
174
256
 
175
257
  get :index
176
258
  assert_response :success
@@ -178,103 +260,155 @@ class ActionCacheTest < ActionController::TestCase
178
260
  end
179
261
 
180
262
  def test_simple_action_not_cached
263
+ draw do
264
+ get "/action_caching_test/destroy", to: "action_caching_test#destroy"
265
+ end
266
+
181
267
  get :destroy
182
268
  assert_response :success
183
269
  cached_time = content_to_cache
184
270
  assert_equal cached_time, @response.body
185
- assert !fragment_exist?('hostname.com/action_caching_test/destroy')
271
+ assert !fragment_exist?("hostname.com/action_caching_test/destroy")
186
272
 
187
273
  get :destroy
188
274
  assert_response :success
189
275
  assert_not_equal cached_time, @response.body
190
276
  end
191
277
 
192
- include RackTestUtils
193
-
194
278
  def test_action_cache_with_layout
279
+ draw do
280
+ get "/action_caching_test/with_layout", to: "action_caching_test#with_layout"
281
+ end
282
+
195
283
  get :with_layout
196
284
  assert_response :success
197
285
  cached_time = content_to_cache
198
286
  assert_not_equal cached_time, @response.body
199
- assert fragment_exist?('hostname.com/action_caching_test/with_layout')
287
+ assert fragment_exist?("hostname.com/action_caching_test/with_layout")
200
288
 
201
289
  get :with_layout
202
290
  assert_response :success
203
291
  assert_not_equal cached_time, @response.body
204
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout'))
205
- assert_equal @response.body, body
292
+ assert_equal @response.body, read_fragment("hostname.com/action_caching_test/with_layout")
206
293
  end
207
294
 
208
295
  def test_action_cache_with_layout_and_layout_cache_false
209
- get :layout_false
296
+ draw do
297
+ get "/action_caching_test/layout_false", to: "action_caching_test#layout_false"
298
+ end
299
+
300
+ get :layout_false, params: { title: "Request 1" }
210
301
  assert_response :success
211
302
  cached_time = content_to_cache
212
- assert_not_equal cached_time, @response.body
213
- assert fragment_exist?('hostname.com/action_caching_test/layout_false')
303
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
304
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
214
305
 
215
- get :layout_false
306
+ get :layout_false, params: { title: "Request 2" }
216
307
  assert_response :success
217
- assert_not_equal cached_time, @response.body
218
- body = body_to_string(read_fragment('hostname.com/action_caching_test/layout_false'))
219
- assert_equal cached_time, body
308
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
309
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/layout_false")
220
310
  end
221
311
 
222
312
  def test_action_cache_with_layout_and_layout_cache_false_via_proc
223
- get :with_layout_proc_param, layout: false
313
+ draw do
314
+ get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
315
+ end
316
+
317
+ get :with_layout_proc_param, params: { title: "Request 1", layout: "false" }
224
318
  assert_response :success
225
319
  cached_time = content_to_cache
226
- assert_not_equal cached_time, @response.body
227
- assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
320
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
321
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
228
322
 
229
- get :with_layout_proc_param, layout: false
323
+ get :with_layout_proc_param, params: { title: "Request 2", layout: "false" }
230
324
  assert_response :success
231
- assert_not_equal cached_time, @response.body
232
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
233
- assert_equal cached_time, body
325
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
326
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
234
327
  end
235
328
 
236
329
  def test_action_cache_with_layout_and_layout_cache_true_via_proc
237
- get :with_layout_proc_param, layout: true
330
+ draw do
331
+ get "/action_caching_test/with_layout_proc_param", to: "action_caching_test#with_layout_proc_param"
332
+ end
333
+
334
+ get :with_layout_proc_param, params: { title: "Request 1", layout: "true" }
238
335
  assert_response :success
239
336
  cached_time = content_to_cache
240
- assert_not_equal cached_time, @response.body
241
- assert fragment_exist?('hostname.com/action_caching_test/with_layout_proc_param')
337
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
338
+ assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
242
339
 
243
- get :with_layout_proc_param, layout: true
340
+ get :with_layout_proc_param, params: { title: "Request 2", layout: "true" }
244
341
  assert_response :success
245
- assert_not_equal cached_time, @response.body
246
- body = body_to_string(read_fragment('hostname.com/action_caching_test/with_layout_proc_param'))
247
- assert_equal @response.body, body
342
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
343
+ assert_equal "<title>Request 1</title>\n#{cached_time}", read_fragment("hostname.com/action_caching_test/with_layout_proc_param")
248
344
  end
249
345
 
250
346
  def test_action_cache_conditional_options
251
- @request.env['HTTP_ACCEPT'] = 'application/json'
347
+ draw do
348
+ get "/action_caching_test", to: "action_caching_test#index"
349
+ end
350
+
351
+ @request.accept = "application/json"
252
352
  get :index
253
353
  assert_response :success
254
- assert !fragment_exist?('hostname.com/action_caching_test')
354
+ assert !fragment_exist?("hostname.com/action_caching_test")
255
355
  end
256
356
 
257
357
  def test_action_cache_with_format_and_http_param
258
- get :with_format_and_http_param, format: 'json'
358
+ draw do
359
+ get "/action_caching_test/with_format_and_http_param", to: "action_caching_test#with_format_and_http_param"
360
+ end
361
+
362
+ get :with_format_and_http_param, format: "json"
363
+ assert_response :success
364
+ assert !fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json")
365
+ assert fragment_exist?("hostname.com/action_caching_test/with_format_and_http_param.json?key=value")
366
+ end
367
+
368
+ def test_action_cache_with_symbol_format
369
+ draw do
370
+ get "/action_caching_test/with_symbol_format", to: "action_caching_test#with_symbol_format"
371
+ end
372
+
373
+ get :with_symbol_format
374
+ assert_response :success
375
+ assert !fragment_exist?("test.host/action_caching_test/with_symbol_format")
376
+ assert fragment_exist?("test.host/action_caching_test/with_symbol_format.json")
377
+ end
378
+
379
+ def test_action_cache_not_url_cache_path
380
+ draw do
381
+ get "/action_caching_test/not_url_cache_path", to: "action_caching_test#not_url_cache_path"
382
+ end
383
+
384
+ get :not_url_cache_path
259
385
  assert_response :success
260
- assert !fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value.json')
261
- assert fragment_exist?('hostname.com/action_caching_test/with_format_and_http_param.json?key=value')
386
+ assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path")
387
+ assert fragment_exist?("not_url_cache_path_key")
262
388
  end
263
389
 
264
390
  def test_action_cache_with_store_options
265
- MockTime.expects(:now).returns(12345).once
266
- @controller.expects(:read_fragment).with('hostname.com/action_caching_test', expires_in: 1.hour).once
267
- @controller.expects(:write_fragment).with('hostname.com/action_caching_test', '12345.0', expires_in: 1.hour).once
391
+ draw do
392
+ get "/action_caching_test", to: "action_caching_test#index"
393
+ end
394
+
395
+ CacheContent.expects(:to_s).returns('12345.0').once
396
+ @controller.expects(:read_fragment).with("hostname.com/action_caching_test", expires_in: 1.hour).once
397
+ @controller.expects(:write_fragment).with("hostname.com/action_caching_test", "12345.0", expires_in: 1.hour).once
268
398
  get :index
269
399
  assert_response :success
270
400
  end
271
401
 
272
402
  def test_action_cache_with_custom_cache_path
403
+ draw do
404
+ get "/action_caching_test/show", to: "action_caching_test#show"
405
+ end
406
+
273
407
  get :show
274
408
  assert_response :success
275
409
  cached_time = content_to_cache
276
410
  assert_equal cached_time, @response.body
277
- assert fragment_exist?('test.host/custom/show')
411
+ assert fragment_exist?("test.host/custom/show")
278
412
 
279
413
  get :show
280
414
  assert_response :success
@@ -282,16 +416,53 @@ class ActionCacheTest < ActionController::TestCase
282
416
  end
283
417
 
284
418
  def test_action_cache_with_custom_cache_path_in_block
419
+ draw do
420
+ get "/action_caching_test/edit(/:id)", to: "action_caching_test#edit"
421
+ end
422
+
285
423
  get :edit
286
424
  assert_response :success
287
- assert fragment_exist?('test.host/edit')
425
+ assert fragment_exist?("test.host/edit")
426
+
427
+ get :edit, params: { id: 1 }
428
+ assert_response :success
429
+ assert fragment_exist?("test.host/1;edit")
430
+ end
431
+
432
+ def test_action_cache_with_custom_cache_path_with_custom_object
433
+ draw do
434
+ get "/action_caching_test/custom_cache_path(/:id)", to: "action_caching_test#custom_cache_path"
435
+ end
436
+
437
+ get :custom_cache_path
438
+ assert_response :success
439
+ assert fragment_exist?("controller")
440
+
441
+ get :custom_cache_path, params: { id: 1 }
442
+ assert_response :success
443
+ assert fragment_exist?("controller-1")
444
+ end
445
+
446
+ def test_action_cache_with_symbol_cache_path
447
+ draw do
448
+ get "/action_caching_test/symbol_cache_path(/:id)", to: "action_caching_test#symbol_cache_path"
449
+ end
450
+
451
+ get :symbol_cache_path
452
+ assert_response :success
453
+ assert fragment_exist?("controller")
288
454
 
289
- get :edit, id: 1
455
+ get :symbol_cache_path, params: { id: 1 }
290
456
  assert_response :success
291
- assert fragment_exist?('test.host/1;edit')
457
+ assert fragment_exist?("controller-1")
292
458
  end
293
459
 
294
460
  def test_cache_expiration
461
+ draw do
462
+ get "/action_caching_test", to: "action_caching_test#index"
463
+ get "/action_caching_test/expire", to: "action_caching_test#expire"
464
+ end
465
+
295
466
  get :index
296
467
  assert_response :success
297
468
  cached_time = content_to_cache
@@ -314,6 +485,11 @@ class ActionCacheTest < ActionController::TestCase
314
485
  end
315
486
 
316
487
  def test_cache_expiration_isnt_affected_by_request_format
488
+ draw do
489
+ get "/action_caching_test", to: "action_caching_test#index"
490
+ get "/action_caching_test/expire", to: "action_caching_test#expire"
491
+ end
492
+
317
493
  get :index
318
494
  cached_time = content_to_cache
319
495
 
@@ -327,6 +503,11 @@ class ActionCacheTest < ActionController::TestCase
327
503
  end
328
504
 
329
505
  def test_cache_expiration_with_url_string
506
+ draw do
507
+ get "/action_caching_test", to: "action_caching_test#index"
508
+ get "/action_caching_test/expire_with_url_string", to: "action_caching_test#expire_with_url_string"
509
+ end
510
+
330
511
  get :index
331
512
  cached_time = content_to_cache
332
513
 
@@ -340,29 +521,38 @@ class ActionCacheTest < ActionController::TestCase
340
521
  end
341
522
 
342
523
  def test_cache_is_scoped_by_subdomain
343
- @request.host = 'jamis.hostname.com'
524
+ draw do
525
+ get "/action_caching_test", to: "action_caching_test#index"
526
+ end
527
+
528
+ @request.host = "jamis.hostname.com"
344
529
  get :index
345
530
  assert_response :success
346
531
  jamis_cache = content_to_cache
347
532
 
348
- @request.host = 'david.hostname.com'
533
+ @request.host = "david.hostname.com"
349
534
  get :index
350
535
  assert_response :success
351
536
  david_cache = content_to_cache
352
537
  assert_not_equal jamis_cache, @response.body
353
538
 
354
- @request.host = 'jamis.hostname.com'
539
+ @request.host = "jamis.hostname.com"
355
540
  get :index
356
541
  assert_response :success
357
542
  assert_equal jamis_cache, @response.body
358
543
 
359
- @request.host = 'david.hostname.com'
544
+ @request.host = "david.hostname.com"
360
545
  get :index
361
546
  assert_response :success
362
547
  assert_equal david_cache, @response.body
363
548
  end
364
549
 
365
550
  def test_redirect_is_not_cached
551
+ draw do
552
+ get "/action_caching_test", to: "action_caching_test#index"
553
+ get "/action_caching_test/redirected", to: "action_caching_test#redirected"
554
+ end
555
+
366
556
  get :redirected
367
557
  assert_response :redirect
368
558
  get :redirected
@@ -370,6 +560,10 @@ class ActionCacheTest < ActionController::TestCase
370
560
  end
371
561
 
372
562
  def test_forbidden_is_not_cached
563
+ draw do
564
+ get "/action_caching_test/forbidden", to: "action_caching_test#forbidden"
565
+ end
566
+
373
567
  get :forbidden
374
568
  assert_response :forbidden
375
569
  get :forbidden
@@ -377,71 +571,103 @@ class ActionCacheTest < ActionController::TestCase
377
571
  end
378
572
 
379
573
  def test_xml_version_of_resource_is_treated_as_different_cache
380
- with_routing do |set|
381
- set.draw do
382
- get ':controller(/:action(.:format))'
383
- end
574
+ draw do
575
+ get "/action_caching_test/index", to: "action_caching_test#index"
576
+ get "/action_caching_test/expire_xml", to: "action_caching_test#expire_xml"
577
+ end
384
578
 
385
- get :index, format: 'xml'
386
- assert_response :success
387
- cached_time = content_to_cache
388
- assert_equal cached_time, @response.body
389
- assert fragment_exist?('hostname.com/action_caching_test/index.xml')
579
+ get :index, format: "xml"
580
+ assert_response :success
581
+ cached_time = content_to_cache
582
+ assert_equal cached_time, @response.body
583
+ assert fragment_exist?("hostname.com/action_caching_test/index.xml")
390
584
 
391
- get :index, format: 'xml'
392
- assert_response :success
393
- assert_equal cached_time, @response.body
394
- assert_equal 'application/xml', @response.content_type
585
+ get :index, format: "xml"
586
+ assert_cached(cached_time, "application/xml")
395
587
 
396
- get :expire_xml
397
- assert_response :success
588
+ get :expire_xml
589
+ assert_response :success
398
590
 
399
- get :index, format: 'xml'
400
- assert_response :success
401
- assert_not_equal cached_time, @response.body
402
- end
591
+ get :index, format: "xml"
592
+ assert_response :success
593
+ assert_not_equal cached_time, @response.body
403
594
  end
404
595
 
405
596
  def test_correct_content_type_is_returned_for_cache_hit
597
+ draw do
598
+ get "/action_caching_test/index/:id", to: "action_caching_test#index"
599
+ end
600
+
406
601
  # run it twice to cache it the first time
407
- get :index, id: 'content-type', format: 'xml'
408
- get :index, id: 'content-type', format: 'xml'
602
+ get :index, params: { id: "content-type" }, format: "xml"
603
+ get :index, params: { id: "content-type" }, format: "xml"
409
604
  assert_response :success
410
- assert_equal 'application/xml', @response.content_type
605
+
606
+ if @response.respond_to?(:media_type)
607
+ assert_equal "application/xml", @response.media_type
608
+ else
609
+ assert_equal "application/xml", @response.content_type
610
+ end
411
611
  end
412
612
 
413
613
  def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key
614
+ draw do
615
+ get "/action_caching_test/show", to: "action_caching_test#show"
616
+ end
617
+
414
618
  # run it twice to cache it the first time
415
- get :show, format: 'xml'
416
- get :show, format: 'xml'
619
+ get :show, format: "xml"
620
+ get :show, format: "xml"
417
621
  assert_response :success
418
- assert_equal 'application/xml', @response.content_type
622
+
623
+ if @response.respond_to?(:media_type)
624
+ assert_equal "application/xml", @response.media_type
625
+ else
626
+ assert_equal "application/xml", @response.content_type
627
+ end
419
628
  end
420
629
 
421
630
  def test_correct_content_type_is_returned_for_cache_hit_on_action_with_string_key_from_proc
631
+ draw do
632
+ get "/action_caching_test/edit/:id", to: "action_caching_test#edit"
633
+ end
634
+
422
635
  # run it twice to cache it the first time
423
- get :edit, id: 1, format: 'xml'
424
- get :edit, id: 1, format: 'xml'
636
+ get :edit, params: { id: 1 }, format: "xml"
637
+ get :edit, params: { id: 1 }, format: "xml"
425
638
  assert_response :success
426
- assert_equal 'application/xml', @response.content_type
639
+
640
+ if @response.respond_to?(:media_type)
641
+ assert_equal "application/xml", @response.media_type
642
+ else
643
+ assert_equal "application/xml", @response.content_type
644
+ end
427
645
  end
428
646
 
429
647
  def test_empty_path_is_normalized
430
- @mock_controller.mock_url_for = 'http://example.org/'
431
- @mock_controller.mock_path = '/'
648
+ @mock_controller.mock_url_for = "http://example.org/"
649
+ @mock_controller.mock_path = "/"
432
650
 
433
- assert_equal 'example.org/index', @path_class.new(@mock_controller, {}).path
651
+ assert_equal "example.org/index", @path_class.new(@mock_controller, {}).path
434
652
  end
435
653
 
436
654
  def test_file_extensions
437
- get :index, id: 'kitten.jpg'
438
- get :index, id: 'kitten.jpg'
655
+ draw do
656
+ get "/action_caching_test/index/*id", to: "action_caching_test#index", format: false
657
+ end
658
+
659
+ get :index, params: { id: "kitten.jpg" }
660
+ get :index, params: { id: "kitten.jpg" }
439
661
 
440
662
  assert_response :success
441
663
  end
442
664
 
443
665
  if defined? ActiveRecord
444
666
  def test_record_not_found_returns_404_for_multiple_requests
667
+ draw do
668
+ get "/action_caching_test/record_not_found", to: "action_caching_test#record_not_found"
669
+ end
670
+
445
671
  get :record_not_found
446
672
  assert_response 404
447
673
  get :record_not_found
@@ -450,6 +676,10 @@ class ActionCacheTest < ActionController::TestCase
450
676
  end
451
677
 
452
678
  def test_four_oh_four_returns_404_for_multiple_requests
679
+ draw do
680
+ get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
681
+ end
682
+
453
683
  get :four_oh_four
454
684
  assert_response 404
455
685
  get :four_oh_four
@@ -457,11 +687,19 @@ class ActionCacheTest < ActionController::TestCase
457
687
  end
458
688
 
459
689
  def test_four_oh_four_renders_content
690
+ draw do
691
+ get "/action_caching_test/four_oh_four", to: "action_caching_test#four_oh_four"
692
+ end
693
+
460
694
  get :four_oh_four
461
695
  assert_equal "404'd!", @response.body
462
696
  end
463
697
 
464
698
  def test_simple_runtime_error_returns_500_for_multiple_requests
699
+ draw do
700
+ get "/action_caching_test/simple_runtime_error", to: "action_caching_test#simple_runtime_error"
701
+ end
702
+
465
703
  get :simple_runtime_error
466
704
  assert_response 500
467
705
  get :simple_runtime_error
@@ -469,35 +707,187 @@ class ActionCacheTest < ActionController::TestCase
469
707
  end
470
708
 
471
709
  def test_action_caching_plus_streaming
710
+ draw do
711
+ get "/action_caching_test/streaming", to: "action_caching_test#streaming"
712
+ end
713
+
472
714
  get :streaming
473
715
  assert_response :success
474
716
  assert_match(/streaming/, @response.body)
475
- assert fragment_exist?('hostname.com/action_caching_test/streaming')
717
+ assert fragment_exist?("hostname.com/action_caching_test/streaming")
476
718
  end
477
719
 
478
720
  def test_invalid_format_returns_not_acceptable
479
- get :invalid, format: 'json'
721
+ draw do
722
+ get "/action_caching_test/invalid", to: "action_caching_test#invalid"
723
+ end
724
+
725
+ get :invalid, format: "json"
480
726
  assert_response :success
481
727
  cached_time = content_to_cache
482
728
  assert_equal cached_time, @response.body
483
729
 
484
730
  assert fragment_exist?("hostname.com/action_caching_test/invalid.json")
485
731
 
486
- get :invalid, format: 'json'
732
+ get :invalid, format: "json"
487
733
  assert_response :success
488
734
  assert_equal cached_time, @response.body
489
735
 
490
- get :invalid, format: 'xml'
736
+ get :invalid, format: "xml"
491
737
  assert_response :not_acceptable
492
738
 
493
- get :invalid, format: '\xC3\x83'
739
+ get :invalid, format: "\xC3\x83"
494
740
  assert_response :not_acceptable
495
741
  end
496
742
 
743
+ def test_format_from_accept_header
744
+ draw do
745
+ get "/action_caching_test/accept", to: "action_caching_test#accept"
746
+ get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
747
+ end
748
+
749
+ # Cache the JSON format
750
+ get_json :accept
751
+ json_cached_time = content_to_cache
752
+ assert_cached json_cached_time, "application/json"
753
+
754
+ # Check that the JSON format is cached
755
+ get_json :accept
756
+ assert_cached json_cached_time, "application/json"
757
+
758
+ # Cache the HTML format
759
+ get_html :accept
760
+ html_cached_time = content_to_cache
761
+ assert_cached html_cached_time
762
+
763
+ # Check that it's not the JSON format
764
+ assert_not_equal json_cached_time, @response.body
765
+
766
+ # Check that the HTML format is cached
767
+ get_html :accept
768
+ assert_cached html_cached_time
769
+
770
+ # Check that the JSON format is still cached
771
+ get_json :accept
772
+ assert_cached json_cached_time, "application/json"
773
+
774
+ # Expire the JSON format
775
+ get_json :expire_accept
776
+ assert_response :success
777
+
778
+ # Check that the HTML format is still cached
779
+ get_html :accept
780
+ assert_cached html_cached_time
781
+
782
+ # Check the JSON format was expired
783
+ get_json :accept
784
+ new_json_cached_time = content_to_cache
785
+ assert_cached new_json_cached_time, "application/json"
786
+ assert_not_equal json_cached_time, @response.body
787
+
788
+ # Expire the HTML format
789
+ get_html :expire_accept
790
+ assert_response :success
791
+
792
+ # Check that the JSON format is still cached
793
+ get_json :accept
794
+ assert_cached new_json_cached_time, "application/json"
795
+
796
+ # Check the HTML format was expired
797
+ get_html :accept
798
+ new_html_cached_time = content_to_cache
799
+ assert_cached new_html_cached_time
800
+ assert_not_equal html_cached_time, @response.body
801
+ end
802
+
803
+ def test_explicit_html_format_is_used_for_fragment_path
804
+ draw do
805
+ get "/action_caching_test/accept", to: "action_caching_test#accept"
806
+ get "/action_caching_test/accept/expire", to: "action_caching_test#expire_accept"
807
+ end
808
+
809
+ get :accept, format: "html"
810
+ cached_time = content_to_cache
811
+ assert_cached cached_time
812
+
813
+ assert fragment_exist?("hostname.com/action_caching_test/accept.html")
814
+
815
+ get :accept, format: "html"
816
+ cached_time = content_to_cache
817
+ assert_cached cached_time
818
+
819
+ get :expire_accept, format: "html"
820
+ assert_response :success
821
+
822
+ assert !fragment_exist?("hostname.com/action_caching_test/accept.html")
823
+
824
+ get :accept, format: "html"
825
+ assert_not_cached cached_time
826
+ end
827
+
828
+ def test_lambda_arity_with_cache_path
829
+ draw do
830
+ get "/action_caching_test/not_url_cache_path_no_args", to: "action_caching_test#not_url_cache_path_no_args"
831
+ end
832
+
833
+ get :not_url_cache_path_no_args
834
+ assert_response :success
835
+ assert !fragment_exist?("test.host/action_caching_test/not_url_cache_path_no_args")
836
+ assert fragment_exist?("not_url_cache_path_no_args_key")
837
+ end
838
+
839
+ def test_lambda_arity_with_layout
840
+ draw do
841
+ get "/action_caching_test/with_layout_proc_param_no_args", to: "action_caching_test#with_layout_proc_param_no_args"
842
+ end
843
+
844
+ get :with_layout_proc_param_no_args, params: { title: "Request 1", layout: "false" }
845
+ assert_response :success
846
+ cached_time = content_to_cache
847
+ assert_equal "<title>Request 1</title>\n#{cached_time}", @response.body
848
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
849
+
850
+ get :with_layout_proc_param_no_args, params: { title: "Request 2", layout: "false" }
851
+ assert_response :success
852
+ assert_equal "<title>Request 2</title>\n#{cached_time}", @response.body
853
+ assert_equal cached_time, read_fragment("hostname.com/action_caching_test/with_layout_proc_param_no_args")
854
+ end
855
+
497
856
  private
857
+ def get_html(*args)
858
+ @request.accept = "text/html"
859
+ get(*args)
860
+ end
861
+
862
+ def get_json(*args)
863
+ @request.accept = "application/json"
864
+ get(*args)
865
+ end
866
+
867
+ def assert_cached(cache_time, media_type = "text/html")
868
+ assert_response :success
869
+ assert_equal cache_time, @response.body
870
+
871
+ if @response.respond_to?(:media_type)
872
+ assert_equal media_type, @response.media_type
873
+ else
874
+ assert_equal media_type, @response.content_type
875
+ end
876
+ end
877
+
878
+ def assert_not_cached(cache_time, media_type = "text/html")
879
+ assert_response :success
880
+ assert_not_equal cache_time, @response.body
881
+
882
+ if @response.respond_to?(:media_type)
883
+ assert_equal media_type, @response.media_type
884
+ else
885
+ assert_equal media_type, @response.content_type
886
+ end
887
+ end
498
888
 
499
889
  def content_to_cache
500
- assigns(:cache_this)
890
+ @controller.instance_variable_get(:@cache_this)
501
891
  end
502
892
 
503
893
  def fragment_exist?(path)
@@ -507,4 +897,21 @@ class ActionCacheTest < ActionController::TestCase
507
897
  def read_fragment(path)
508
898
  @controller.read_fragment(path)
509
899
  end
900
+
901
+ def draw(&block)
902
+ @routes = ActionDispatch::Routing::RouteSet.new
903
+ @routes.draw(&block)
904
+ @controller.extend(@routes.url_helpers)
905
+ end
906
+
907
+ if ActionPack::VERSION::STRING < "5.0"
908
+ def get(action, options = {})
909
+ format = options.slice(:format)
910
+ params = options[:params] || {}
911
+ session = options[:session] || {}
912
+ flash = options[:flash] || {}
913
+
914
+ super(action, params.merge(format), session, flash)
915
+ end
916
+ end
510
917
  end