Skip to content

Commit 3161606

Browse files
committed
Clear filtered request attributes between requests in tests
The request attributes filtered_parameters, filtered_env and filtered_path are memoized for performance reasons. However this can cause unusual behavior in tests where there are multiple calls to get, post, etc. Fixes rails#13803.
1 parent 9673d5d commit 3161606

File tree

4 files changed

+29
-0
lines changed

4 files changed

+29
-0
lines changed

actionpack/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
* Ensure that `request.filtered_parameters` is reset between calls to `process`
2+
in `ActionController::TestCase`.
3+
4+
Fixes #13803.
5+
6+
*Andrew White*
7+
18
* Fix `rake routes` error when `Rails::Engine` with empty routes is mounted.
29

310
Fixes #13810.

actionpack/lib/action_controller/test_case.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ def assign_parameters(routes, controller_path, action, parameters = {})
213213
# Clear the combined params hash in case it was already referenced.
214214
@env.delete("action_dispatch.request.parameters")
215215

216+
# Clear the filter cache variables so they're not stale
217+
@filtered_parameters = @filtered_env = @filtered_path = nil
218+
216219
params = self.request_parameters.dup
217220
%w(controller action only_path).each do |k|
218221
params.delete(k)

actionpack/test/controller/log_subscriber_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,17 @@ def test_process_action_with_parameters
137137
assert_equal 'Parameters: {"id"=>"10"}', logs[1]
138138
end
139139

140+
def test_multiple_process_with_parameters
141+
get :show, :id => '10'
142+
get :show, :id => '20'
143+
144+
wait
145+
146+
assert_equal 6, logs.size
147+
assert_equal 'Parameters: {"id"=>"10"}', logs[1]
148+
assert_equal 'Parameters: {"id"=>"20"}', logs[4]
149+
end
150+
140151
def test_process_action_with_wrapped_parameters
141152
@request.env['CONTENT_TYPE'] = 'application/json'
142153
post :show, :id => '10', :name => 'jose'

actionpack/test/controller/test_case_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,14 @@ def test_params_reset_after_post_request
706706
assert @request.params[:foo].blank?
707707
end
708708

709+
def test_filtered_parameters_reset_between_requests
710+
get :no_op, :foo => "bar"
711+
assert_equal "bar", @request.filtered_parameters[:foo]
712+
713+
get :no_op, :foo => "baz"
714+
assert_equal "baz", @request.filtered_parameters[:foo]
715+
end
716+
709717
def test_symbolized_path_params_reset_after_request
710718
get :test_params, :id => "foo"
711719
assert_equal "foo", @request.symbolized_path_parameters[:id]

0 commit comments

Comments
 (0)