File: parser_spec.rb

package info (click to toggle)
ruby-rack-parser 0.7.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 140 kB
  • sloc: ruby: 172; makefile: 4
file content (113 lines) | stat: -rw-r--r-- 4,255 bytes parent folder | download
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