1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
# frozen_string_literal: true
require "abstract_unit"
class ReloaderTest < ActiveSupport::TestCase
teardown do
ActiveSupport::Reloader.reset_callbacks :prepare
ActiveSupport::Reloader.reset_callbacks :complete
end
class MyBody < Array
def initialize(&block)
@on_close = block
end
def foo
"foo"
end
def bar
"bar"
end
def close
@on_close.call if @on_close
end
end
def test_prepare_callbacks
a = b = c = nil
reloader.to_prepare { |*args| a = b = c = 1 }
reloader.to_prepare { |*args| b = c = 2 }
reloader.to_prepare { |*args| c = 3 }
# 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
def test_returned_body_object_always_responds_to_close
body = call_and_return_body
assert_respond_to body, :close
end
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
def test_condition_specifies_when_to_reload
i, j = 0, 0, 0, 0
reloader = reloader(lambda { i < 3 })
reloader.to_prepare { |*args| i += 1 }
reloader.to_complete { |*args| j += 1 }
app = middleware(lambda { |env| [200, {}, []] }, reloader)
env = Rack::MockRequest.env_for("", {})
5.times do
resp = app.call(env)
resp[2].close
end
assert_equal 3, i
assert_equal 3, j
end
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
def test_complete_callbacks_are_called_when_body_is_closed
completed = false
reloader.to_complete { completed = true }
body = call_and_return_body
assert_not completed
body.close
assert completed
end
def test_prepare_callbacks_arent_called_when_body_is_closed
prepared = false
reloader.to_prepare { prepared = true }
body = call_and_return_body
prepared = false
body.close
assert_not prepared
end
def test_complete_callbacks_are_called_on_exceptions
completed = false
reloader.to_complete { completed = true }
begin
call_and_return_body do
raise "error"
end
rescue
end
assert completed
end
private
def call_and_return_body(&block)
app = block || proc { [200, {}, "response"] }
env = Rack::MockRequest.env_for("", {})
_, _, body = middleware(app).call(env)
body
end
def middleware(inner_app, reloader = reloader())
Rack::Lint.new(ActionDispatch::Reloader.new(Rack::Lint.new(inner_app), reloader))
end
def reloader(check = lambda { true })
@reloader ||= begin
reloader = Class.new(ActiveSupport::Reloader)
reloader.check = check
reloader
end
end
end
|