- CLASS ReloaderTest::MyBody
- CLASS ReloaderTest::Reloader
- T
-
- test_class_unload_block,
- test_cleanup_callbacks_are_called_on_exceptions,
- test_cleanup_callbacks_are_called_when_body_is_closed,
- test_condition_specifies_when_to_reload,
- test_full_reload_sequence,
- test_it_calls_close_on_underlying_object_when_close_is_called_on_body,
- test_manual_reloading,
- test_only_run_when_check_passes,
- test_prepare_callback,
- test_prepare_callbacks,
- test_prepare_callbacks_arent_called_when_body_is_closed,
- test_prepend_prepare_callback,
- test_returned_body_object_always_responds_to_close,
- test_returned_body_object_always_responds_to_close_even_if_called_twice,
- test_returned_body_object_behaves_like_underlying_object,
- test_returned_body_object_responds_to_all_methods_supported_by_underlying_object
| Reloader | = | ActionDispatch::Reloader |
ActionDispatch::Reloader provides prepare and cleanup callbacks, intended to assist with code reloading during development. Prepare callbacks are run before each request, and cleanup callbacks after each request. In this respect they are analogs of ActionDispatch::Callback's before and after callbacks. However, cleanup callbacks are not called until the request is fully complete – that is, after close has been called on the response body. This is important for streaming responses such as the following:
Cleanup callbacks will not be called until after the response_body lambda is evaluated, ensuring that it can refer to application models and other classes before they are unloaded. By default, ActionDispatch::Reloader is
included in the middleware stack only in the development environment;
specifically, when |
||
# File activesupport/test/reloader_test.rb, line 60 def test_class_unload_block called = [] reloader.before_class_unload { called << :before_unload } reloader.after_class_unload { called << :after_unload } reloader.to_run do class_unload! do called << :unload end end reloader.wrap { called << :body } assert_equal [:before_unload, :unload, :after_unload, :body], called end
# File actionpack/test/dispatch/reloader_test.rb, line 63 def test_condition_specifies_when_to_reload i, j = 0, 0, 0, 0 assert_deprecated do Reloader.to_prepare { |*args| i += 1 } Reloader.to_cleanup { |*args| j += 1 } end x = Class.new(ActiveSupport::Reloader) x.check = lambda { i < 3 } app = Reloader.new(lambda { |env| [200, {}, []] }, x) 5.times do resp = app.call({}) resp[2].close end assert_equal 3, i assert_equal 3, j end
# File activesupport/test/reloader_test.rb, line 34 def test_full_reload_sequence called = [] reloader.to_prepare { called << :prepare } reloader.to_run { called << :reloader_run } reloader.to_complete { called << :reloader_complete } reloader.executor.to_run { called << :executor_run } reloader.executor.to_complete { called << :executor_complete } reloader.wrap { } assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete], called called = [] reloader.reload! assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete, :prepare], called reloader.check = lambda { false } called = [] reloader.wrap { } assert_equal [:executor_run, :executor_complete], called called = [] reloader.reload! assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete, :prepare], called end
# File actionpack/test/dispatch/reloader_test.rb, line 96 def test_it_calls_close_on_underlying_object_when_close_is_called_on_body close_called = false body = call_and_return_body do b = MyBody.new do close_called = true end [200, { "Content-Type" => "text/html" }, b] end body.close assert close_called end
# File actionpack/test/dispatch/reloader_test.rb, line 144 def test_manual_reloading prepared = cleaned = false assert_deprecated do Reloader.to_prepare { prepared = true } Reloader.to_cleanup { cleaned = true } end assert_deprecated do Reloader.prepare! end assert prepared assert !cleaned prepared = cleaned = false assert_deprecated do Reloader.cleanup! end assert prepared assert cleaned end
# File activesupport/test/reloader_test.rb, line 20 def test_only_run_when_check_passes r = new_reloader { true } invoked = false r.to_run { invoked = true } r.wrap { } assert invoked r = new_reloader { false } invoked = false r.to_run { invoked = true } r.wrap { } assert !invoked end
# File activesupport/test/reloader_test.rb, line 4 def test_prepare_callback prepared = false reloader.to_prepare { prepared = true } assert !prepared reloader.prepare! assert prepared prepared = false reloader.wrap do assert prepared prepared = false end assert !prepared end
# File actionpack/test/dispatch/reloader_test.rb, line 11 def test_prepare_callbacks a = b = c = nil assert_deprecated do Reloader.to_prepare { |*args| a = b = c = 1 } Reloader.to_prepare { |*args| b = c = 2 } Reloader.to_prepare { |*args| c = 3 } end # Ensure to_prepare callbacks are not run when defined assert_nil a || b || c # Run callbacks call_and_return_body assert_equal 1, a assert_equal 2, b assert_equal 3, c end
# File actionpack/test/dispatch/reloader_test.rb, line 131 def test_prepare_callbacks_arent_called_when_body_is_closed prepared = false assert_deprecated do Reloader.to_prepare { prepared = true } end body = call_and_return_body prepared = false body.close assert !prepared end
# File actionpack/test/dispatch/reloader_test.rb, line 53 def test_returned_body_object_always_responds_to_close_even_if_called_twice body = call_and_return_body assert_respond_to body, :close body.close body = call_and_return_body assert_respond_to body, :close body.close end
# File actionpack/test/dispatch/reloader_test.rb, line 82 def test_returned_body_object_behaves_like_underlying_object body = call_and_return_body do b = MyBody.new b << "hello" b << "world" [200, { "Content-Type" => "text/html" }, b] end assert_equal 2, body.size assert_equal "hello", body[0] assert_equal "world", body[1] assert_equal "foo", body.foo assert_equal "bar", body.bar end
# File actionpack/test/dispatch/reloader_test.rb, line 108 def test_returned_body_object_responds_to_all_methods_supported_by_underlying_object body = call_and_return_body do [200, { "Content-Type" => "text/html" }, MyBody.new] end assert_respond_to body, :size assert_respond_to body, :each assert_respond_to body, :foo assert_respond_to body, :bar end