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
|
# frozen_string_literal: true
require_relative 'helper'
separate_testing do
require_relative '../lib/rack/show_status'
require_relative '../lib/rack/lint'
require_relative '../lib/rack/mock_request'
end
describe Rack::ShowStatus do
def show_status(app)
Rack::Lint.new Rack::ShowStatus.new(app)
end
it "provide a default status message" do
req = Rack::MockRequest.new(
show_status(lambda{|env|
[404, { "content-type" => "text/plain", "content-length" => "0" }, []]
}))
res = req.get("/", lint: true)
res.must_be :not_found?
res.wont_be_empty
res["content-type"].must_equal "text/html"
assert_match(res, /404/)
assert_match(res, /Not Found/)
end
it "let the app provide additional information" do
req = Rack::MockRequest.new(
show_status(
lambda{|env|
env["rack.showstatus.detail"] = "gone too meta."
[404, { "content-type" => "text/plain", "content-length" => "0" }, []]
}))
res = req.get("/", lint: true)
res.must_be :not_found?
res.wont_be_empty
res["content-type"].must_equal "text/html"
assert_match(res, /404/)
assert_match(res, /Not Found/)
assert_match(res, /too meta/)
end
it "let the app provide additional information with non-String details" do
req = Rack::MockRequest.new(
show_status(
lambda{|env|
env["rack.showstatus.detail"] = ['gone too meta.']
[404, { "content-type" => "text/plain", "content-length" => "0" }, []]
}))
res = req.get("/", lint: true)
res.must_be :not_found?
res.wont_be_empty
res["content-type"].must_equal "text/html"
assert_includes(res.body, '404')
assert_includes(res.body, 'Not Found')
assert_includes(res.body, '["gone too meta."]')
end
it "escape error" do
detail = "<script>alert('hi \"')</script>"
req = Rack::MockRequest.new(
show_status(
lambda{|env|
env["rack.showstatus.detail"] = detail
[500, { "content-type" => "text/plain", "content-length" => "0" }, []]
}))
res = req.get("/", lint: true)
res.wont_be_empty
res["content-type"].must_equal "text/html"
assert_match(res, /500/)
res.wont_include detail
res.body.must_include Rack::Utils.escape_html(detail)
end
it "not replace existing messages" do
req = Rack::MockRequest.new(
show_status(
lambda{|env|
[404, { "content-type" => "text/plain", "content-length" => "4" }, ["foo!"]]
}))
res = req.get("/", lint: true)
res.must_be :not_found?
res.body.must_equal "foo!"
end
it "pass on original headers" do
headers = { "www-authenticate" => "Basic blah" }
req = Rack::MockRequest.new(
show_status(lambda{|env| [401, headers, []] }))
res = req.get("/", lint: true)
res["www-authenticate"].must_equal "Basic blah"
end
it "replace existing messages if there is detail" do
req = Rack::MockRequest.new(
show_status(
lambda{|env|
env["rack.showstatus.detail"] = "gone too meta."
[404, { "content-type" => "text/plain", "content-length" => "4" }, ["foo!"]]
}))
res = req.get("/", lint: true)
res.must_be :not_found?
res.wont_be_empty
res["content-type"].must_equal "text/html"
res["content-length"].wont_equal "4"
assert_match(res, /404/)
assert_match(res, /too meta/)
res.body.wont_match(/foo/)
end
it "close the original body" do
closed = false
body = Object.new
def body.each; yield 's' end
body.define_singleton_method(:close) { closed = true }
req = Rack::MockRequest.new(
show_status(lambda{|env|
[404, { "content-type" => "text/plain", "content-length" => "0" }, body]
}))
req.get("/", lint: true)
closed.must_equal true
end
end
|