PageRenderTime 45ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/integration-tests/apps/rails2/frozen/vendor/rails/actionpack/test/controller/filters_test.rb

https://gitlab.com/meetly/torquebox
Ruby | 885 lines | 793 code | 89 blank | 3 comment | 4 complexity | 7b69ce451cab51c2ea00af2b65cd0d6a MD5 | raw file
  1. require 'abstract_unit'
  2. # FIXME: crashes Ruby 1.9
  3. class FilterTest < Test::Unit::TestCase
  4. class TestController < ActionController::Base
  5. before_filter :ensure_login
  6. after_filter :clean_up
  7. def show
  8. render :inline => "ran action"
  9. end
  10. private
  11. def ensure_login
  12. @ran_filter ||= []
  13. @ran_filter << "ensure_login"
  14. end
  15. def clean_up
  16. @ran_after_filter ||= []
  17. @ran_after_filter << "clean_up"
  18. end
  19. end
  20. class ChangingTheRequirementsController < TestController
  21. before_filter :ensure_login, :except => [:go_wild]
  22. def go_wild
  23. render :text => "gobble"
  24. end
  25. end
  26. class TestMultipleFiltersController < ActionController::Base
  27. before_filter :try_1
  28. before_filter :try_2
  29. before_filter :try_3
  30. (1..3).each do |i|
  31. define_method "fail_#{i}" do
  32. render :text => i.to_s
  33. end
  34. end
  35. protected
  36. (1..3).each do |i|
  37. define_method "try_#{i}" do
  38. instance_variable_set :@try, i
  39. if action_name == "fail_#{i}"
  40. head(404)
  41. end
  42. end
  43. end
  44. end
  45. class RenderingController < ActionController::Base
  46. before_filter :render_something_else
  47. def show
  48. @ran_action = true
  49. render :inline => "ran action"
  50. end
  51. private
  52. def render_something_else
  53. render :inline => "something else"
  54. end
  55. end
  56. class ConditionalFilterController < ActionController::Base
  57. def show
  58. render :inline => "ran action"
  59. end
  60. def another_action
  61. render :inline => "ran action"
  62. end
  63. def show_without_filter
  64. render :inline => "ran action without filter"
  65. end
  66. private
  67. def ensure_login
  68. @ran_filter ||= []
  69. @ran_filter << "ensure_login"
  70. end
  71. def clean_up_tmp
  72. @ran_filter ||= []
  73. @ran_filter << "clean_up_tmp"
  74. end
  75. def rescue_action(e) raise(e) end
  76. end
  77. class ConditionalCollectionFilterController < ConditionalFilterController
  78. before_filter :ensure_login, :except => [ :show_without_filter, :another_action ]
  79. end
  80. class OnlyConditionSymController < ConditionalFilterController
  81. before_filter :ensure_login, :only => :show
  82. end
  83. class ExceptConditionSymController < ConditionalFilterController
  84. before_filter :ensure_login, :except => :show_without_filter
  85. end
  86. class BeforeAndAfterConditionController < ConditionalFilterController
  87. before_filter :ensure_login, :only => :show
  88. after_filter :clean_up_tmp, :only => :show
  89. end
  90. class OnlyConditionProcController < ConditionalFilterController
  91. before_filter(:only => :show) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
  92. end
  93. class ExceptConditionProcController < ConditionalFilterController
  94. before_filter(:except => :show_without_filter) {|c| c.instance_variable_set(:"@ran_proc_filter", true) }
  95. end
  96. class ConditionalClassFilter
  97. def self.filter(controller) controller.instance_variable_set(:"@ran_class_filter", true) end
  98. end
  99. class OnlyConditionClassController < ConditionalFilterController
  100. before_filter ConditionalClassFilter, :only => :show
  101. end
  102. class ExceptConditionClassController < ConditionalFilterController
  103. before_filter ConditionalClassFilter, :except => :show_without_filter
  104. end
  105. class AnomolousYetValidConditionController < ConditionalFilterController
  106. before_filter(ConditionalClassFilter, :ensure_login, Proc.new {|c| c.instance_variable_set(:"@ran_proc_filter1", true)}, :except => :show_without_filter) { |c| c.instance_variable_set(:"@ran_proc_filter2", true)}
  107. end
  108. class ConditionalOptionsFilter < ConditionalFilterController
  109. before_filter :ensure_login, :if => Proc.new { |c| true }
  110. before_filter :clean_up_tmp, :if => Proc.new { |c| false }
  111. end
  112. class EmptyFilterChainController < TestController
  113. self.filter_chain.clear
  114. def show
  115. @action_executed = true
  116. render :text => "yawp!"
  117. end
  118. end
  119. class PrependingController < TestController
  120. prepend_before_filter :wonderful_life
  121. # skip_before_filter :fire_flash
  122. private
  123. def wonderful_life
  124. @ran_filter ||= []
  125. @ran_filter << "wonderful_life"
  126. end
  127. end
  128. class SkippingAndLimitedController < TestController
  129. skip_before_filter :ensure_login
  130. before_filter :ensure_login, :only => :index
  131. def index
  132. render :text => 'ok'
  133. end
  134. def public
  135. end
  136. end
  137. class SkippingAndReorderingController < TestController
  138. skip_before_filter :ensure_login
  139. before_filter :find_record
  140. before_filter :ensure_login
  141. private
  142. def find_record
  143. @ran_filter ||= []
  144. @ran_filter << "find_record"
  145. end
  146. end
  147. class ConditionalSkippingController < TestController
  148. skip_before_filter :ensure_login, :only => [ :login ]
  149. skip_after_filter :clean_up, :only => [ :login ]
  150. before_filter :find_user, :only => [ :change_password ]
  151. def login
  152. render :inline => "ran action"
  153. end
  154. def change_password
  155. render :inline => "ran action"
  156. end
  157. protected
  158. def find_user
  159. @ran_filter ||= []
  160. @ran_filter << "find_user"
  161. end
  162. end
  163. class ConditionalParentOfConditionalSkippingController < ConditionalFilterController
  164. before_filter :conditional_in_parent, :only => [:show, :another_action]
  165. after_filter :conditional_in_parent, :only => [:show, :another_action]
  166. private
  167. def conditional_in_parent
  168. @ran_filter ||= []
  169. @ran_filter << 'conditional_in_parent'
  170. end
  171. end
  172. class ChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController
  173. skip_before_filter :conditional_in_parent, :only => :another_action
  174. skip_after_filter :conditional_in_parent, :only => :another_action
  175. end
  176. class AnotherChildOfConditionalParentController < ConditionalParentOfConditionalSkippingController
  177. skip_before_filter :conditional_in_parent, :only => :show
  178. end
  179. class ProcController < PrependingController
  180. before_filter(proc { |c| c.instance_variable_set(:"@ran_proc_filter", true) })
  181. end
  182. class ImplicitProcController < PrependingController
  183. before_filter { |c| c.instance_variable_set(:"@ran_proc_filter", true) }
  184. end
  185. class AuditFilter
  186. def self.filter(controller)
  187. controller.instance_variable_set(:"@was_audited", true)
  188. end
  189. end
  190. class AroundFilter
  191. def before(controller)
  192. @execution_log = "before"
  193. controller.class.execution_log << " before aroundfilter " if controller.respond_to? :execution_log
  194. controller.instance_variable_set(:"@before_ran", true)
  195. end
  196. def after(controller)
  197. controller.instance_variable_set(:"@execution_log", @execution_log + " and after")
  198. controller.instance_variable_set(:"@after_ran", true)
  199. controller.class.execution_log << " after aroundfilter " if controller.respond_to? :execution_log
  200. end
  201. end
  202. class AppendedAroundFilter
  203. def before(controller)
  204. controller.class.execution_log << " before appended aroundfilter "
  205. end
  206. def after(controller)
  207. controller.class.execution_log << " after appended aroundfilter "
  208. end
  209. end
  210. class AuditController < ActionController::Base
  211. before_filter(AuditFilter)
  212. def show
  213. render :text => "hello"
  214. end
  215. end
  216. class AroundFilterController < PrependingController
  217. around_filter AroundFilter.new
  218. end
  219. class BeforeAfterClassFilterController < PrependingController
  220. begin
  221. filter = AroundFilter.new
  222. before_filter filter
  223. after_filter filter
  224. end
  225. end
  226. class MixedFilterController < PrependingController
  227. cattr_accessor :execution_log
  228. def initialize
  229. @@execution_log = ""
  230. end
  231. before_filter { |c| c.class.execution_log << " before procfilter " }
  232. prepend_around_filter AroundFilter.new
  233. after_filter { |c| c.class.execution_log << " after procfilter " }
  234. append_around_filter AppendedAroundFilter.new
  235. end
  236. class MixedSpecializationController < ActionController::Base
  237. class OutOfOrder < StandardError; end
  238. before_filter :first
  239. before_filter :second, :only => :foo
  240. def foo
  241. render :text => 'foo'
  242. end
  243. def bar
  244. render :text => 'bar'
  245. end
  246. protected
  247. def first
  248. @first = true
  249. end
  250. def second
  251. raise OutOfOrder unless @first
  252. end
  253. end
  254. class DynamicDispatchController < ActionController::Base
  255. before_filter :choose
  256. %w(foo bar baz).each do |action|
  257. define_method(action) { render :text => action }
  258. end
  259. private
  260. def choose
  261. self.action_name = params[:choose]
  262. end
  263. end
  264. class PrependingBeforeAndAfterController < ActionController::Base
  265. prepend_before_filter :before_all
  266. prepend_after_filter :after_all
  267. before_filter :between_before_all_and_after_all
  268. def before_all
  269. @ran_filter ||= []
  270. @ran_filter << 'before_all'
  271. end
  272. def after_all
  273. @ran_filter ||= []
  274. @ran_filter << 'after_all'
  275. end
  276. def between_before_all_and_after_all
  277. @ran_filter ||= []
  278. @ran_filter << 'between_before_all_and_after_all'
  279. end
  280. def show
  281. render :text => 'hello'
  282. end
  283. end
  284. class ErrorToRescue < Exception; end
  285. class RescuingAroundFilterWithBlock
  286. def filter(controller)
  287. begin
  288. yield
  289. rescue ErrorToRescue => ex
  290. controller.__send__ :render, :text => "I rescued this: #{ex.inspect}"
  291. end
  292. end
  293. end
  294. class RescuedController < ActionController::Base
  295. around_filter RescuingAroundFilterWithBlock.new
  296. def show
  297. raise ErrorToRescue.new("Something made the bad noise.")
  298. end
  299. private
  300. def rescue_action(exception)
  301. raise exception
  302. end
  303. end
  304. class NonYieldingAroundFilterController < ActionController::Base
  305. before_filter :filter_one
  306. around_filter :non_yielding_filter
  307. before_filter :filter_two
  308. after_filter :filter_three
  309. def index
  310. render :inline => "index"
  311. end
  312. #make sure the controller complains
  313. def rescue_action(e); raise e; end
  314. private
  315. def filter_one
  316. @filters ||= []
  317. @filters << "filter_one"
  318. end
  319. def filter_two
  320. @filters << "filter_two"
  321. end
  322. def non_yielding_filter
  323. @filters << "zomg it didn't yield"
  324. @filter_return_value
  325. end
  326. def filter_three
  327. @filters << "filter_three"
  328. end
  329. end
  330. def test_non_yielding_around_filters_not_returning_false_do_not_raise
  331. controller = NonYieldingAroundFilterController.new
  332. controller.instance_variable_set "@filter_return_value", true
  333. assert_nothing_raised do
  334. test_process(controller, "index")
  335. end
  336. end
  337. def test_non_yielding_around_filters_returning_false_do_not_raise
  338. controller = NonYieldingAroundFilterController.new
  339. controller.instance_variable_set "@filter_return_value", false
  340. assert_nothing_raised do
  341. test_process(controller, "index")
  342. end
  343. end
  344. def test_after_filters_are_not_run_if_around_filter_returns_false
  345. controller = NonYieldingAroundFilterController.new
  346. controller.instance_variable_set "@filter_return_value", false
  347. test_process(controller, "index")
  348. assert_equal ["filter_one", "zomg it didn't yield"], controller.assigns['filters']
  349. end
  350. def test_after_filters_are_not_run_if_around_filter_does_not_yield
  351. controller = NonYieldingAroundFilterController.new
  352. controller.instance_variable_set "@filter_return_value", true
  353. test_process(controller, "index")
  354. assert_equal ["filter_one", "zomg it didn't yield"], controller.assigns['filters']
  355. end
  356. def test_empty_filter_chain
  357. assert_equal 0, EmptyFilterChainController.filter_chain.size
  358. assert test_process(EmptyFilterChainController).template.assigns['action_executed']
  359. end
  360. def test_added_filter_to_inheritance_graph
  361. assert_equal [ :ensure_login ], TestController.before_filters
  362. end
  363. def test_base_class_in_isolation
  364. assert_equal [ ], ActionController::Base.before_filters
  365. end
  366. def test_prepending_filter
  367. assert_equal [ :wonderful_life, :ensure_login ], PrependingController.before_filters
  368. end
  369. def test_running_filters
  370. assert_equal %w( wonderful_life ensure_login ), test_process(PrependingController).template.assigns["ran_filter"]
  371. end
  372. def test_running_filters_with_proc
  373. assert test_process(ProcController).template.assigns["ran_proc_filter"]
  374. end
  375. def test_running_filters_with_implicit_proc
  376. assert test_process(ImplicitProcController).template.assigns["ran_proc_filter"]
  377. end
  378. def test_running_filters_with_class
  379. assert test_process(AuditController).template.assigns["was_audited"]
  380. end
  381. def test_running_anomolous_yet_valid_condition_filters
  382. response = test_process(AnomolousYetValidConditionController)
  383. assert_equal %w( ensure_login ), response.template.assigns["ran_filter"]
  384. assert response.template.assigns["ran_class_filter"]
  385. assert response.template.assigns["ran_proc_filter1"]
  386. assert response.template.assigns["ran_proc_filter2"]
  387. response = test_process(AnomolousYetValidConditionController, "show_without_filter")
  388. assert_equal nil, response.template.assigns["ran_filter"]
  389. assert !response.template.assigns["ran_class_filter"]
  390. assert !response.template.assigns["ran_proc_filter1"]
  391. assert !response.template.assigns["ran_proc_filter2"]
  392. end
  393. def test_running_conditional_options
  394. response = test_process(ConditionalOptionsFilter)
  395. assert_equal %w( ensure_login ), response.template.assigns["ran_filter"]
  396. end
  397. def test_running_collection_condition_filters
  398. assert_equal %w( ensure_login ), test_process(ConditionalCollectionFilterController).template.assigns["ran_filter"]
  399. assert_equal nil, test_process(ConditionalCollectionFilterController, "show_without_filter").template.assigns["ran_filter"]
  400. assert_equal nil, test_process(ConditionalCollectionFilterController, "another_action").template.assigns["ran_filter"]
  401. end
  402. def test_running_only_condition_filters
  403. assert_equal %w( ensure_login ), test_process(OnlyConditionSymController).template.assigns["ran_filter"]
  404. assert_equal nil, test_process(OnlyConditionSymController, "show_without_filter").template.assigns["ran_filter"]
  405. assert test_process(OnlyConditionProcController).template.assigns["ran_proc_filter"]
  406. assert !test_process(OnlyConditionProcController, "show_without_filter").template.assigns["ran_proc_filter"]
  407. assert test_process(OnlyConditionClassController).template.assigns["ran_class_filter"]
  408. assert !test_process(OnlyConditionClassController, "show_without_filter").template.assigns["ran_class_filter"]
  409. end
  410. def test_running_except_condition_filters
  411. assert_equal %w( ensure_login ), test_process(ExceptConditionSymController).template.assigns["ran_filter"]
  412. assert_equal nil, test_process(ExceptConditionSymController, "show_without_filter").template.assigns["ran_filter"]
  413. assert test_process(ExceptConditionProcController).template.assigns["ran_proc_filter"]
  414. assert !test_process(ExceptConditionProcController, "show_without_filter").template.assigns["ran_proc_filter"]
  415. assert test_process(ExceptConditionClassController).template.assigns["ran_class_filter"]
  416. assert !test_process(ExceptConditionClassController, "show_without_filter").template.assigns["ran_class_filter"]
  417. end
  418. def test_running_before_and_after_condition_filters
  419. assert_equal %w( ensure_login clean_up_tmp), test_process(BeforeAndAfterConditionController).template.assigns["ran_filter"]
  420. assert_equal nil, test_process(BeforeAndAfterConditionController, "show_without_filter").template.assigns["ran_filter"]
  421. end
  422. def test_around_filter
  423. controller = test_process(AroundFilterController)
  424. assert controller.template.assigns["before_ran"]
  425. assert controller.template.assigns["after_ran"]
  426. end
  427. def test_before_after_class_filter
  428. controller = test_process(BeforeAfterClassFilterController)
  429. assert controller.template.assigns["before_ran"]
  430. assert controller.template.assigns["after_ran"]
  431. end
  432. def test_having_properties_in_around_filter
  433. controller = test_process(AroundFilterController)
  434. assert_equal "before and after", controller.template.assigns["execution_log"]
  435. end
  436. def test_prepending_and_appending_around_filter
  437. controller = test_process(MixedFilterController)
  438. assert_equal " before aroundfilter before procfilter before appended aroundfilter " +
  439. " after appended aroundfilter after aroundfilter after procfilter ",
  440. MixedFilterController.execution_log
  441. end
  442. def test_rendering_breaks_filtering_chain
  443. response = test_process(RenderingController)
  444. assert_equal "something else", response.body
  445. assert !response.template.assigns["ran_action"]
  446. end
  447. def test_filters_with_mixed_specialization_run_in_order
  448. assert_nothing_raised do
  449. response = test_process(MixedSpecializationController, 'bar')
  450. assert_equal 'bar', response.body
  451. end
  452. assert_nothing_raised do
  453. response = test_process(MixedSpecializationController, 'foo')
  454. assert_equal 'foo', response.body
  455. end
  456. end
  457. def test_dynamic_dispatch
  458. %w(foo bar baz).each do |action|
  459. request = ActionController::TestRequest.new
  460. request.query_parameters[:choose] = action
  461. response = DynamicDispatchController.process(request, ActionController::TestResponse.new)
  462. assert_equal action, response.body
  463. end
  464. end
  465. def test_running_prepended_before_and_after_filter
  466. assert_equal 3, PrependingBeforeAndAfterController.filter_chain.length
  467. response = test_process(PrependingBeforeAndAfterController)
  468. assert_equal %w( before_all between_before_all_and_after_all after_all ), response.template.assigns["ran_filter"]
  469. end
  470. def test_skipping_and_limiting_controller
  471. assert_equal %w( ensure_login ), test_process(SkippingAndLimitedController, "index").template.assigns["ran_filter"]
  472. assert_nil test_process(SkippingAndLimitedController, "public").template.assigns["ran_filter"]
  473. end
  474. def test_skipping_and_reordering_controller
  475. assert_equal %w( find_record ensure_login ), test_process(SkippingAndReorderingController, "index").template.assigns["ran_filter"]
  476. end
  477. def test_conditional_skipping_of_filters
  478. assert_nil test_process(ConditionalSkippingController, "login").template.assigns["ran_filter"]
  479. assert_equal %w( ensure_login find_user ), test_process(ConditionalSkippingController, "change_password").template.assigns["ran_filter"]
  480. assert_nil test_process(ConditionalSkippingController, "login").template.controller.instance_variable_get("@ran_after_filter")
  481. assert_equal %w( clean_up ), test_process(ConditionalSkippingController, "change_password").template.controller.instance_variable_get("@ran_after_filter")
  482. end
  483. def test_conditional_skipping_of_filters_when_parent_filter_is_also_conditional
  484. assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter']
  485. assert_nil test_process(ChildOfConditionalParentController, 'another_action').template.assigns['ran_filter']
  486. end
  487. def test_condition_skipping_of_filters_when_siblings_also_have_conditions
  488. assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter'], "1"
  489. assert_equal nil, test_process(AnotherChildOfConditionalParentController).template.assigns['ran_filter']
  490. assert_equal %w( conditional_in_parent conditional_in_parent ), test_process(ChildOfConditionalParentController).template.assigns['ran_filter']
  491. end
  492. def test_changing_the_requirements
  493. assert_equal nil, test_process(ChangingTheRequirementsController, "go_wild").template.assigns['ran_filter']
  494. end
  495. def test_a_rescuing_around_filter
  496. response = nil
  497. assert_nothing_raised do
  498. response = test_process(RescuedController)
  499. end
  500. assert response.success?
  501. assert_equal("I rescued this: #<FilterTest::ErrorToRescue: Something made the bad noise.>", response.body)
  502. end
  503. private
  504. def test_process(controller, action = "show")
  505. ActionController::Base.class_eval { include ActionController::ProcessWithTest } unless ActionController::Base < ActionController::ProcessWithTest
  506. request = ActionController::TestRequest.new
  507. request.action = action
  508. controller = controller.new if controller.is_a?(Class)
  509. controller.process_with_test(request, ActionController::TestResponse.new)
  510. end
  511. end
  512. class PostsController < ActionController::Base
  513. def rescue_action(e); raise e; end
  514. module AroundExceptions
  515. class Error < StandardError ; end
  516. class Before < Error ; end
  517. class After < Error ; end
  518. end
  519. include AroundExceptions
  520. class DefaultFilter
  521. include AroundExceptions
  522. end
  523. module_eval %w(raises_before raises_after raises_both no_raise no_filter).map { |action| "def #{action}; default_action end" }.join("\n")
  524. private
  525. def default_action
  526. render :inline => "#{action_name} called"
  527. end
  528. end
  529. class ControllerWithSymbolAsFilter < PostsController
  530. around_filter :raise_before, :only => :raises_before
  531. around_filter :raise_after, :only => :raises_after
  532. around_filter :without_exception, :only => :no_raise
  533. private
  534. def raise_before
  535. raise Before
  536. yield
  537. end
  538. def raise_after
  539. yield
  540. raise After
  541. end
  542. def without_exception
  543. # Do stuff...
  544. 1 + 1
  545. yield
  546. # Do stuff...
  547. 1 + 1
  548. end
  549. end
  550. class ControllerWithFilterClass < PostsController
  551. class YieldingFilter < DefaultFilter
  552. def self.filter(controller)
  553. yield
  554. raise After
  555. end
  556. end
  557. around_filter YieldingFilter, :only => :raises_after
  558. end
  559. class ControllerWithFilterInstance < PostsController
  560. class YieldingFilter < DefaultFilter
  561. def filter(controller)
  562. yield
  563. raise After
  564. end
  565. end
  566. around_filter YieldingFilter.new, :only => :raises_after
  567. end
  568. class ControllerWithFilterMethod < PostsController
  569. class YieldingFilter < DefaultFilter
  570. def filter(controller)
  571. yield
  572. raise After
  573. end
  574. end
  575. around_filter YieldingFilter.new.method(:filter), :only => :raises_after
  576. end
  577. class ControllerWithProcFilter < PostsController
  578. around_filter(:only => :no_raise) do |c,b|
  579. c.instance_variable_set(:"@before", true)
  580. b.call
  581. c.instance_variable_set(:"@after", true)
  582. end
  583. end
  584. class ControllerWithNestedFilters < ControllerWithSymbolAsFilter
  585. around_filter :raise_before, :raise_after, :without_exception, :only => :raises_both
  586. end
  587. class ControllerWithAllTypesOfFilters < PostsController
  588. before_filter :before
  589. around_filter :around
  590. after_filter :after
  591. around_filter :around_again
  592. private
  593. def before
  594. @ran_filter ||= []
  595. @ran_filter << 'before'
  596. end
  597. def around
  598. @ran_filter << 'around (before yield)'
  599. yield
  600. @ran_filter << 'around (after yield)'
  601. end
  602. def after
  603. @ran_filter << 'after'
  604. end
  605. def around_again
  606. @ran_filter << 'around_again (before yield)'
  607. yield
  608. @ran_filter << 'around_again (after yield)'
  609. end
  610. end
  611. class ControllerWithTwoLessFilters < ControllerWithAllTypesOfFilters
  612. skip_filter :around_again
  613. skip_filter :after
  614. end
  615. class YieldingAroundFiltersTest < Test::Unit::TestCase
  616. include PostsController::AroundExceptions
  617. def test_filters_registering
  618. assert_equal 1, ControllerWithFilterMethod.filter_chain.size
  619. assert_equal 1, ControllerWithFilterClass.filter_chain.size
  620. assert_equal 1, ControllerWithFilterInstance.filter_chain.size
  621. assert_equal 3, ControllerWithSymbolAsFilter.filter_chain.size
  622. assert_equal 6, ControllerWithNestedFilters.filter_chain.size
  623. assert_equal 4, ControllerWithAllTypesOfFilters.filter_chain.size
  624. end
  625. def test_base
  626. controller = PostsController
  627. assert_nothing_raised { test_process(controller,'no_raise') }
  628. assert_nothing_raised { test_process(controller,'raises_before') }
  629. assert_nothing_raised { test_process(controller,'raises_after') }
  630. assert_nothing_raised { test_process(controller,'no_filter') }
  631. end
  632. def test_with_symbol
  633. controller = ControllerWithSymbolAsFilter
  634. assert_nothing_raised { test_process(controller,'no_raise') }
  635. assert_raise(Before) { test_process(controller,'raises_before') }
  636. assert_raise(After) { test_process(controller,'raises_after') }
  637. assert_nothing_raised { test_process(controller,'no_raise') }
  638. end
  639. def test_with_class
  640. controller = ControllerWithFilterClass
  641. assert_nothing_raised { test_process(controller,'no_raise') }
  642. assert_raise(After) { test_process(controller,'raises_after') }
  643. end
  644. def test_with_instance
  645. controller = ControllerWithFilterInstance
  646. assert_nothing_raised { test_process(controller,'no_raise') }
  647. assert_raise(After) { test_process(controller,'raises_after') }
  648. end
  649. def test_with_method
  650. controller = ControllerWithFilterMethod
  651. assert_nothing_raised { test_process(controller,'no_raise') }
  652. assert_raise(After) { test_process(controller,'raises_after') }
  653. end
  654. def test_with_proc
  655. controller = test_process(ControllerWithProcFilter,'no_raise')
  656. assert controller.template.assigns['before']
  657. assert controller.template.assigns['after']
  658. end
  659. def test_nested_filters
  660. controller = ControllerWithNestedFilters
  661. assert_nothing_raised do
  662. begin
  663. test_process(controller,'raises_both')
  664. rescue Before, After
  665. end
  666. end
  667. assert_raise Before do
  668. begin
  669. test_process(controller,'raises_both')
  670. rescue After
  671. end
  672. end
  673. end
  674. def test_filter_order_with_all_filter_types
  675. controller = test_process(ControllerWithAllTypesOfFilters,'no_raise')
  676. assert_equal 'before around (before yield) around_again (before yield) around_again (after yield) around (after yield) after',controller.template.assigns['ran_filter'].join(' ')
  677. end
  678. def test_filter_order_with_skip_filter_method
  679. controller = test_process(ControllerWithTwoLessFilters,'no_raise')
  680. assert_equal 'before around (before yield) around (after yield)',controller.template.assigns['ran_filter'].join(' ')
  681. end
  682. def test_first_filter_in_multiple_before_filter_chain_halts
  683. controller = ::FilterTest::TestMultipleFiltersController.new
  684. response = test_process(controller, 'fail_1')
  685. assert_equal ' ', response.body
  686. assert_equal 1, controller.instance_variable_get(:@try)
  687. assert controller.instance_variable_get(:@before_filter_chain_aborted)
  688. end
  689. def test_second_filter_in_multiple_before_filter_chain_halts
  690. controller = ::FilterTest::TestMultipleFiltersController.new
  691. response = test_process(controller, 'fail_2')
  692. assert_equal ' ', response.body
  693. assert_equal 2, controller.instance_variable_get(:@try)
  694. assert controller.instance_variable_get(:@before_filter_chain_aborted)
  695. end
  696. def test_last_filter_in_multiple_before_filter_chain_halts
  697. controller = ::FilterTest::TestMultipleFiltersController.new
  698. response = test_process(controller, 'fail_3')
  699. assert_equal ' ', response.body
  700. assert_equal 3, controller.instance_variable_get(:@try)
  701. assert controller.instance_variable_get(:@before_filter_chain_aborted)
  702. end
  703. protected
  704. def test_process(controller, action = "show")
  705. ActionController::Base.class_eval { include ActionController::ProcessWithTest } unless ActionController::Base < ActionController::ProcessWithTest
  706. request = ActionController::TestRequest.new
  707. request.action = action
  708. controller = controller.new if controller.is_a?(Class)
  709. controller.process_with_test(request, ActionController::TestResponse.new)
  710. end
  711. end