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
|
require File.expand_path('../spec_helper', __FILE__)
describe Rack::Parser do
it "allows you to setup parsers for content types" do
middleware = Rack::Parser.new ParserApp, :parsers => { 'foo' => 'bar' }
assert_equal 'bar', middleware.parsers['foo']
end
it "should not remove fields from options in setup" do
options = {:parsers => { 'foo' => 'bar' }}
middleware = Rack::Parser.new ParserApp, options
refute_nil options[:parsers]
end
it "allows you to setup error handlers" do
stack = Rack::Parser.new ParserApp, :handlers => { 'foo' => 'bar' }
assert_equal 'bar', stack.handlers['foo']
end
it "parses a Content-Type" do
payload = JSON.dump(:a => 1)
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { 'application/json' => parser }
post '/post', payload, { 'CONTENT_TYPE' => 'application/json' }
assert last_response.ok?
assert_equal "{\"a\"=>1}", last_response.body
end
it "does nothing if unmatched Content-Type" do
payload = JSON.dump(:a => 1)
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { 'application/json' => parser }
post '/post', payload, { 'CONTENT_TYPE' => 'application/xml' }
assert last_response.ok?
assert_equal "{}", last_response.body # request.params won't pick up this content type
end
it "matches Content-Type by regex" do
payload = JSON.dump(:a => 2)
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { %r{json} => parser }
post '/post', payload, { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
assert last_response.ok?
assert_equal "{\"a\"=>2}", last_response.body
end
it 'matches ambiguous string Content-Type and forces explicit regex' do
payload = JSON.dump(:a => 2)
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { 'application/vnd.foo+json' => parser }
post '/post', payload, { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
assert last_response.ok?
assert_equal "{\"a\"=>2}", last_response.body
end
it "handles upstream errors" do
assert_raises StandardError, 'error!' do
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { %r{json} => parser }
post '/error', '{}', { 'CONTENT_TYPE' => 'application/json' }
end
end
it "returns a default error" do
parser = proc { |data| raise StandardError, 'wah wah' }
stack Rack::Parser, :parsers => { %r{json} => parser }
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
assert_equal 400, last_response.status
end
it "returns a custom error message" do
parser = proc { |data| raise StandardError, "wah wah" }
handler = proc { |err, type| [500, {}, "%s : %s" % [type, err]] }
stack Rack::Parser, :parsers => { %r{json} => parser },
:handlers => { %r{json} => handler }
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
assert_equal 500, last_response.status
assert_equal 'application/vnd.foo+json : wah wah', last_response.body
end
it 'returns a custome error for ambiguous string Content-Type and forces explicit regex' do
parser = proc { |data| raise StandardError, "wah wah" }
handler = proc { |err, type| [500, {}, "%s : %s" % [type, err]] }
stack Rack::Parser, :parsers => { %r{json} => parser },
:handlers => { 'application/vnd.foo+json' => handler }
post '/post', '{}', { 'CONTENT_TYPE' => 'application/vnd.foo+json' }
assert_equal 500, last_response.status
assert_equal 'application/vnd.foo+json : wah wah', last_response.body
end
it "parses an array but do not set it to params" do
payload = JSON.dump([1,2,3])
parser = proc { |data| JSON.parse data }
stack Rack::Parser, :parsers => { 'application/json' => parser }
post '/post', payload, { 'CONTENT_TYPE' => 'application/json' }
assert last_response.ok?
assert_equal last_request.env['rack.parser.result'], [1, 2, 3]
if Rack::RELEASE =~ /^2/
assert_equal last_request.env['rack.request.form_hash'], nil
else
assert_equal last_request.env['rack.request.form_hash'], {}
end
end
end
|