faraday_middleware 0.9.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +16 -22
  3. data/lib/faraday_middleware/backwards_compatibility.rb +16 -12
  4. data/lib/faraday_middleware/gzip.rb +90 -0
  5. data/lib/faraday_middleware/instrumentation.rb +9 -3
  6. data/lib/faraday_middleware/rack_compatible.rb +18 -11
  7. data/lib/faraday_middleware/redirect_limit_reached.rb +16 -0
  8. data/lib/faraday_middleware/request/encode_json.rb +12 -9
  9. data/lib/faraday_middleware/request/method_override.rb +7 -6
  10. data/lib/faraday_middleware/request/oauth.rb +13 -10
  11. data/lib/faraday_middleware/request/oauth2.rb +37 -12
  12. data/lib/faraday_middleware/response/caching.rb +67 -15
  13. data/lib/faraday_middleware/response/chunked.rb +10 -6
  14. data/lib/faraday_middleware/response/follow_redirects.rb +85 -70
  15. data/lib/faraday_middleware/response/mashify.rb +2 -0
  16. data/lib/faraday_middleware/response/parse_dates.rb +6 -3
  17. data/lib/faraday_middleware/response/parse_json.rb +10 -10
  18. data/lib/faraday_middleware/response/parse_marshal.rb +3 -1
  19. data/lib/faraday_middleware/response/parse_xml.rb +4 -2
  20. data/lib/faraday_middleware/response/parse_yaml.rb +27 -3
  21. data/lib/faraday_middleware/response/rashify.rb +3 -1
  22. data/lib/faraday_middleware/response_middleware.rb +27 -18
  23. data/lib/faraday_middleware/version.rb +4 -1
  24. data/lib/faraday_middleware.rb +22 -16
  25. metadata +10 -65
  26. data/CHANGELOG.md +0 -10
  27. data/CONTRIBUTING.md +0 -46
  28. data/Rakefile +0 -28
  29. data/faraday_middleware.gemspec +0 -23
  30. data/lib/faraday_middleware/addressable_patch.rb +0 -20
  31. data/spec/caching_spec.rb +0 -170
  32. data/spec/chunked_spec.rb +0 -78
  33. data/spec/encode_json_spec.rb +0 -95
  34. data/spec/follow_redirects_spec.rb +0 -221
  35. data/spec/helper.rb +0 -59
  36. data/spec/mashify_spec.rb +0 -70
  37. data/spec/method_override_spec.rb +0 -92
  38. data/spec/oauth2_spec.rb +0 -118
  39. data/spec/oauth_spec.rb +0 -151
  40. data/spec/parse_dates_spec.rb +0 -44
  41. data/spec/parse_json_spec.rb +0 -112
  42. data/spec/parse_marshal_spec.rb +0 -16
  43. data/spec/parse_xml_spec.rb +0 -71
  44. data/spec/parse_yaml_spec.rb +0 -53
  45. data/spec/rashify_spec.rb +0 -47
data/spec/oauth2_spec.rb DELETED
@@ -1,118 +0,0 @@
1
- require 'helper'
2
- require 'uri'
3
- require 'faraday_middleware/request/oauth2'
4
- require 'faraday/utils'
5
-
6
- describe FaradayMiddleware::OAuth2 do
7
-
8
- def query_params(env)
9
- Faraday::Utils.parse_query env[:url].query
10
- end
11
-
12
- def auth_header(env)
13
- env[:request_headers]['Authorization']
14
- end
15
-
16
- def perform(params = {}, headers = {})
17
- env = {
18
- :url => URI('http://example.com/?' + Faraday::Utils.build_query(params)),
19
- :request_headers => Faraday::Utils::Headers.new.update(headers)
20
- }
21
- app = make_app
22
- app.call(faraday_env(env))
23
- end
24
-
25
- def make_app
26
- described_class.new(lambda{|env| env}, *Array(options))
27
- end
28
-
29
- context "no token configured" do
30
- let(:options) { nil }
31
-
32
- it "doesn't add params" do
33
- request = perform(:q => 'hello')
34
- expect(query_params(request)).to eq('q' => 'hello')
35
- end
36
-
37
- it "doesn't add headers" do
38
- expect(auth_header(perform)).to be_nil
39
- end
40
-
41
- it "creates header for explicit token" do
42
- request = perform(:q => 'hello', :access_token => 'abc123')
43
- expect(query_params(request)).to eq('q' => 'hello', 'access_token' => 'abc123')
44
- expect(auth_header(request)).to eq(%(Token token="abc123"))
45
- end
46
- end
47
-
48
- context "default token configured" do
49
- let(:options) { 'XYZ' }
50
-
51
- it "adds token param" do
52
- expect(query_params(perform(:q => 'hello'))).to eq('q' => 'hello', 'access_token' => 'XYZ')
53
- end
54
-
55
- it "adds token header" do
56
- expect(auth_header(perform)).to eq(%(Token token="XYZ"))
57
- end
58
-
59
- it "overrides default with explicit token" do
60
- request = perform(:q => 'hello', :access_token => 'abc123')
61
- expect(query_params(request)).to eq('q' => 'hello', 'access_token' => 'abc123')
62
- expect(auth_header(request)).to eq(%(Token token="abc123"))
63
- end
64
-
65
- it "clears default with empty explicit token" do
66
- request = perform(:q => 'hello', :access_token => nil)
67
- expect(query_params(request).fetch('access_token')).to_not eq('XYZ')
68
- expect(auth_header(request)).to be_nil
69
- end
70
- end
71
-
72
- context "existing Authorization header" do
73
- let(:options) { 'XYZ' }
74
- subject { perform({:q => 'hello'}, 'Authorization' => 'custom') }
75
-
76
- it "adds token param" do
77
- expect(query_params(subject)).to eq('q' => 'hello', 'access_token' => 'XYZ')
78
- end
79
-
80
- it "doesn't override existing header" do
81
- expect(auth_header(subject)).to eq('custom')
82
- end
83
- end
84
-
85
- context "custom param name configured" do
86
- let(:options) { ['XYZ', {:param_name => :oauth}] }
87
-
88
- it "adds token param" do
89
- expect(query_params(perform)).to eq('oauth' => 'XYZ')
90
- end
91
-
92
- it "overrides default with explicit token" do
93
- request = perform(:oauth => 'abc123')
94
- expect(query_params(request)).to eq('oauth' => 'abc123')
95
- expect(auth_header(request)).to eq(%(Token token="abc123"))
96
- end
97
- end
98
-
99
- context "options without token configuration" do
100
- let(:options) { [{:param_name => :oauth}] }
101
-
102
- it "doesn't add param" do
103
- expect(query_params(perform)).to be_empty
104
- end
105
-
106
- it "overrides default with explicit token" do
107
- expect(query_params(perform(:oauth => 'abc123'))).to eq('oauth' => 'abc123')
108
- end
109
- end
110
-
111
- context "invalid param name configured" do
112
- let(:options) { ['XYZ', {:param_name => nil}] }
113
-
114
- it "raises error" do
115
- expect{ make_app }.to raise_error(ArgumentError, ":param_name can't be blank")
116
- end
117
- end
118
- end
data/spec/oauth_spec.rb DELETED
@@ -1,151 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/request/oauth'
3
- require 'uri'
4
- require 'forwardable'
5
-
6
- describe FaradayMiddleware::OAuth do
7
- def auth_header(env)
8
- env[:request_headers]['Authorization']
9
- end
10
-
11
- def auth_values(env)
12
- if auth = auth_header(env)
13
- raise "invalid header: #{auth.inspect}" unless auth.sub!('OAuth ', '')
14
- Hash[*auth.split(/, |=/)]
15
- end
16
- end
17
-
18
- def perform(oauth_options = {}, headers = {}, params = {})
19
- env = {
20
- :url => URI('http://example.com/'),
21
- :request_headers => Faraday::Utils::Headers.new.update(headers),
22
- :request => {},
23
- :body => params
24
- }
25
- unless oauth_options.is_a? Hash and oauth_options.empty?
26
- env[:request][:oauth] = oauth_options
27
- end
28
- app = make_app
29
- app.call(faraday_env(env))
30
- end
31
-
32
- def make_app
33
- described_class.new(lambda{|env| env}, *Array(options))
34
- end
35
-
36
- context "invalid options" do
37
- let(:options) { nil }
38
-
39
- it "errors out" do
40
- expect{ make_app }.to raise_error(ArgumentError)
41
- end
42
- end
43
-
44
- context "empty options" do
45
- let(:options) { [{}] }
46
-
47
- it "signs request" do
48
- auth = auth_values(perform)
49
- expected_keys = %w[ oauth_nonce
50
- oauth_signature oauth_signature_method
51
- oauth_timestamp oauth_version ]
52
-
53
- expect(auth.keys).to match_array expected_keys
54
- end
55
- end
56
-
57
- context "configured with consumer and token" do
58
- let(:options) do
59
- [{ :consumer_key => 'CKEY', :consumer_secret => 'CSECRET',
60
- :token => 'TOKEN', :token_secret => 'TSECRET'
61
- }]
62
- end
63
-
64
- it "adds auth info to the header" do
65
- auth = auth_values(perform)
66
- expected_keys = %w[ oauth_consumer_key oauth_nonce
67
- oauth_signature oauth_signature_method
68
- oauth_timestamp oauth_token oauth_version ]
69
-
70
- expect(auth.keys).to match_array expected_keys
71
- expect(auth['oauth_version']).to eq(%("1.0"))
72
- expect(auth['oauth_signature_method']).to eq(%("HMAC-SHA1"))
73
- expect(auth['oauth_consumer_key']).to eq(%("CKEY"))
74
- expect(auth['oauth_token']).to eq(%("TOKEN"))
75
- end
76
-
77
- it "doesn't override existing header" do
78
- request = perform({}, "Authorization" => "iz me!")
79
- expect(auth_header(request)).to eq("iz me!")
80
- end
81
-
82
- it "can override oauth options per-request" do
83
- auth = auth_values(perform(:consumer_key => 'CKEY2'))
84
-
85
- expect(auth['oauth_consumer_key']).to eq(%("CKEY2"))
86
- expect(auth['oauth_token']).to eq(%("TOKEN"))
87
- end
88
-
89
- it "can turn off oauth signing per-request" do
90
- expect(auth_header(perform(false))).to be_nil
91
- end
92
- end
93
-
94
- context "configured without token" do
95
- let(:options) { [{ :consumer_key => 'CKEY', :consumer_secret => 'CSECRET' }] }
96
-
97
- it "adds auth info to the header" do
98
- auth = auth_values(perform)
99
- expect(auth).to include('oauth_consumer_key')
100
- expect(auth).not_to include('oauth_token')
101
- end
102
- end
103
-
104
- context "handling body parameters" do
105
- let(:options) { [{ :consumer_key => 'CKEY',
106
- :consumer_secret => 'CSECRET',
107
- :nonce => '547fed103e122eecf84c080843eedfe6',
108
- :timestamp => '1286830180'}] }
109
-
110
- let(:value) { {'foo' => 'bar'} }
111
-
112
- let(:type_json) { {'Content-Type' => 'application/json'} }
113
- let(:type_form) { {'Content-Type' => 'application/x-www-form-urlencoded'} }
114
-
115
- extend Forwardable
116
- query_method = :build_nested_query
117
- query_module = ::Faraday::Utils.respond_to?(query_method) ? 'Faraday::Utils' : 'Rack::Utils'
118
- def_delegator query_module, query_method
119
-
120
- it "does not include the body for JSON" do
121
- auth_header_with = auth_header(perform({}, type_json, '{"foo":"bar"}'))
122
- auth_header_without = auth_header(perform({}, type_json, {}))
123
-
124
- expect(auth_header_with).to eq(auth_header_without)
125
- end
126
-
127
- it "includes the body parameters with form Content-Type" do
128
- auth_header_with = auth_header(perform({}, type_form, {}))
129
- auth_header_without = auth_header(perform({}, type_form, value))
130
-
131
- expect(auth_header_with).not_to eq(auth_header_without)
132
- end
133
-
134
- it "includes the body parameters with an unspecified Content-Type" do
135
- auth_header_with = auth_header(perform({}, {}, value))
136
- auth_header_without = auth_header(perform({}, type_form, value))
137
-
138
- expect(auth_header_with).to eq(auth_header_without)
139
- end
140
-
141
- it "includes the body parameters for form type with string body" do
142
- # simulates the behavior of Faraday::MiddleWare::UrlEncoded
143
- value = { 'foo' => ['bar', 'baz', 'wat'] }
144
- auth_header_hash = auth_header(perform({}, type_form, value))
145
- auth_header_string = auth_header(perform({}, type_form, build_nested_query(value)))
146
- expect(auth_header_string).to eq(auth_header_hash)
147
- end
148
-
149
- end
150
-
151
- end
@@ -1,44 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/parse_dates'
3
- require 'json'
4
-
5
- describe FaradayMiddleware::ParseDates, :type => :response do
6
- let(:parsed){
7
- if RUBY_VERSION > "1.9"
8
- "2012-02-01 13:14:15 UTC"
9
- else
10
- "Wed Feb 01 13:14:15 UTC 2012"
11
- end
12
- }
13
-
14
- it "parses dates" do
15
- expect(process({"x" => "2012-02-01T13:14:15Z"}).body["x"].to_s).to eq(parsed)
16
- end
17
-
18
- it "parses dates with milliseconds" do
19
- date_str = "2012-02-01T13:14:15.123Z"
20
- expect(process({"x" => date_str}).body["x"]).to eq(Time.parse(date_str))
21
- end
22
-
23
- it "parses nested dates in hash" do
24
- expect(process({"x" => {"y" => "2012-02-01T13:14:15Z"}}).body["x"]["y"].to_s).to eq(parsed)
25
- end
26
-
27
- it "parses nested dates in arrays" do
28
- expect(process({"x" => [{"y" =>"2012-02-01T13:14:15Z"}]}).body["x"][0]["y"].to_s).to eq(parsed)
29
- end
30
-
31
- it "returns nil when body is empty" do
32
- expect(process(nil).body).to eq(nil)
33
- end
34
-
35
- it "leaves arrays with ids alone" do
36
- expect(process({"x" => [1,2,3]}).body).to eq({"x" => [1,2,3]})
37
- end
38
-
39
- it "does not parse date-like things" do
40
- expect(process({"x" => "2012-02-01T13:14:15Z bla"}).body["x"].to_s).to eq "2012-02-01T13:14:15Z bla"
41
- expect(process({"x" => "12012-02-01T13:14:15Z"}).body["x"].to_s).to eq "12012-02-01T13:14:15Z"
42
- expect(process({"x" => "2012-02-01T13:14:15Z\nfoo"}).body["x"].to_s).to eq "2012-02-01T13:14:15Z\nfoo"
43
- end
44
- end
@@ -1,112 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/parse_json'
3
-
4
- describe FaradayMiddleware::ParseJson, :type => :response do
5
- context "no type matching" do
6
- it "doesn't change nil body" do
7
- expect(process(nil).body).to be_nil
8
- end
9
-
10
- it "nullifies empty body" do
11
- expect(process('').body).to be_nil
12
- end
13
-
14
- it "parses json body" do
15
- response = process('{"a":1}')
16
- expect(response.body).to eq('a' => 1)
17
- expect(response.env[:raw_body]).to be_nil
18
- end
19
- end
20
-
21
- context "with preserving raw" do
22
- let(:options) { {:preserve_raw => true} }
23
-
24
- it "parses json body" do
25
- response = process('{"a":1}')
26
- expect(response.body).to eq('a' => 1)
27
- expect(response.env[:raw_body]).to eq('{"a":1}')
28
- end
29
-
30
- it "can opt out of preserving raw" do
31
- response = process('{"a":1}', nil, :preserve_raw => false)
32
- expect(response.env[:raw_body]).to be_nil
33
- end
34
- end
35
-
36
- context "with regexp type matching" do
37
- let(:options) { {:content_type => /\bjson$/} }
38
-
39
- it "parses json body of correct type" do
40
- response = process('{"a":1}', 'application/x-json')
41
- expect(response.body).to eq('a' => 1)
42
- end
43
-
44
- it "ignores json body of incorrect type" do
45
- response = process('{"a":1}', 'text/json-xml')
46
- expect(response.body).to eq('{"a":1}')
47
- end
48
- end
49
-
50
- context "with array type matching" do
51
- let(:options) { {:content_type => %w[a/b c/d]} }
52
-
53
- it "parses json body of correct type" do
54
- expect(process('{"a":1}', 'a/b').body).to be_a(Hash)
55
- expect(process('{"a":1}', 'c/d').body).to be_a(Hash)
56
- end
57
-
58
- it "ignores json body of incorrect type" do
59
- expect(process('{"a":1}', 'a/d').body).not_to be_a(Hash)
60
- end
61
- end
62
-
63
- it "chokes on invalid json" do
64
- ['{!', '"a"', 'true', 'null', '1'].each do |data|
65
- expect{ process(data) }.to raise_error(Faraday::Error::ParsingError)
66
- end
67
- end
68
-
69
- context "with mime type fix" do
70
- let(:middleware) {
71
- app = described_class::MimeTypeFix.new(lambda {|env|
72
- Faraday::Response.new(env)
73
- }, :content_type => /^text\//)
74
- described_class.new(app, :content_type => 'application/json')
75
- }
76
-
77
- it "ignores completely incompatible type" do
78
- response = process('{"a":1}', 'application/xml')
79
- expect(response.body).to eq('{"a":1}')
80
- end
81
-
82
- it "ignores compatible type with bad data" do
83
- response = process('var a = 1', 'text/javascript')
84
- expect(response.body).to eq('var a = 1')
85
- expect(response['content-type']).to eq('text/javascript')
86
- end
87
-
88
- it "corrects compatible type and data" do
89
- response = process('{"a":1}', 'text/javascript')
90
- expect(response.body).to be_a(Hash)
91
- expect(response['content-type']).to eq('application/json')
92
- end
93
-
94
- it "corrects compatible type even when data starts with whitespace" do
95
- response = process(%( \r\n\t{"a":1}), 'text/javascript')
96
- expect(response.body).to be_a(Hash)
97
- expect(response['content-type']).to eq('application/json')
98
- end
99
- end
100
-
101
- context "HEAD responses" do
102
- it "nullifies the body if it's only one space" do
103
- response = process(' ')
104
- expect(response.body).to be_nil
105
- end
106
-
107
- it "nullifies the body if it's two spaces" do
108
- response = process(' ')
109
- expect(response.body).to be_nil
110
- end
111
- end
112
- end
@@ -1,16 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/parse_marshal'
3
-
4
- describe FaradayMiddleware::ParseMarshal, :type => :response do
5
- it "restores a marshaled dump" do
6
- expect(process(Marshal.dump(:a => 1)).body).to be_eql(:a => 1)
7
- end
8
-
9
- it "nulifies blank response" do
10
- expect(process('').body).to be_nil
11
- end
12
-
13
- it "chokes on invalid content" do
14
- expect{ process('abc') }.to raise_error(Faraday::Error::ParsingError)
15
- end
16
- end
@@ -1,71 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/parse_xml'
3
-
4
- describe FaradayMiddleware::ParseXml, :type => :response do
5
- let(:xml) { '<user><name>Erik Michaels-Ober</name><screen_name>sferik</screen_name></user>' }
6
- let(:user) { {'user' => {'name' => 'Erik Michaels-Ober', 'screen_name' => 'sferik'} } }
7
-
8
- context "no type matching" do
9
- it "doesn't change nil body" do
10
- expect(process(nil).body).to be_nil
11
- end
12
-
13
- it "turns empty body into empty hash" do
14
- expect(process('').body).to be_eql({})
15
- end
16
-
17
- it "parses xml body" do
18
- response = process(xml)
19
- expect(response.body).to eq(user)
20
- expect(response.env[:raw_body]).to be_nil
21
- end
22
- end
23
-
24
- context "with preserving raw" do
25
- let(:options) { {:preserve_raw => true} }
26
-
27
- it "parses xml body" do
28
- response = process(xml)
29
- expect(response.body).to eq(user)
30
- expect(response.env[:raw_body]).to eq(xml)
31
- end
32
-
33
- it "can opt out of preserving raw" do
34
- response = process(xml, nil, :preserve_raw => false)
35
- expect(response.env[:raw_body]).to be_nil
36
- end
37
- end
38
-
39
- context "with regexp type matching" do
40
- let(:options) { {:content_type => /\bxml$/} }
41
-
42
- it "parses xml body of correct type" do
43
- response = process(xml, 'application/xml')
44
- expect(response.body).to eq(user)
45
- end
46
-
47
- it "ignores xml body of incorrect type" do
48
- response = process(xml, 'text/html')
49
- expect(response.body).to eq(xml)
50
- end
51
- end
52
-
53
- context "with array type matching" do
54
- let(:options) { {:content_type => %w[a/b c/d]} }
55
-
56
- it "parses xml body of correct type" do
57
- expect(process(xml, 'a/b').body).to be_a(Hash)
58
- expect(process(xml, 'c/d').body).to be_a(Hash)
59
- end
60
-
61
- it "ignores xml body of incorrect type" do
62
- expect(process(xml, 'a/d').body).not_to be_a(Hash)
63
- end
64
- end
65
-
66
- it "chokes on invalid xml" do
67
- ['{!', '"a"', 'true', 'null', '1'].each do |data|
68
- expect{ process(data) }.to raise_error(Faraday::Error::ParsingError)
69
- end
70
- end
71
- end
@@ -1,53 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/parse_yaml'
3
-
4
- describe FaradayMiddleware::ParseYaml, :type => :response do
5
- context "no type matching" do
6
- it "doesn't change nil body" do
7
- expect(process(nil).body).to be_nil
8
- end
9
-
10
- it "returns false for empty body" do
11
- expect(process('').body).to be_false
12
- end
13
-
14
- it "parses yaml body" do
15
- response = process('a: 1')
16
- expect(response.body).to eq('a' => 1)
17
- expect(response.env[:raw_body]).to be_nil
18
- end
19
- end
20
-
21
- context "with preserving raw" do
22
- let(:options) { {:preserve_raw => true} }
23
-
24
- it "parses yaml body" do
25
- response = process('a: 1')
26
- expect(response.body).to eq('a' => 1)
27
- expect(response.env[:raw_body]).to eq('a: 1')
28
- end
29
-
30
- it "can opt out of preserving raw" do
31
- response = process('a: 1', nil, :preserve_raw => false)
32
- expect(response.env[:raw_body]).to be_nil
33
- end
34
- end
35
-
36
- context "with regexp type matching" do
37
- let(:options) { {:content_type => /\byaml$/} }
38
-
39
- it "parses json body of correct type" do
40
- response = process('a: 1', 'application/x-yaml')
41
- expect(response.body).to eq('a' => 1)
42
- end
43
-
44
- it "ignores json body of incorrect type" do
45
- response = process('a: 1', 'text/yaml-xml')
46
- expect(response.body).to eq('a: 1')
47
- end
48
- end
49
-
50
- it "chokes on invalid yaml" do
51
- expect{ process('{!') }.to raise_error(Faraday::Error::ParsingError)
52
- end
53
- end
data/spec/rashify_spec.rb DELETED
@@ -1,47 +0,0 @@
1
- require 'helper'
2
- require 'faraday_middleware/response/rashify'
3
-
4
- describe FaradayMiddleware::Rashify do
5
- context "when used", :type => :response do
6
- it "creates a Hashie::Rash from the body" do
7
- body = { "name" => "Erik Michaels-Ober", "username" => "sferik" }
8
- me = process(body).body
9
- expect(me.name).to eq("Erik Michaels-Ober")
10
- expect(me.username).to eq("sferik")
11
- end
12
-
13
- it "handles strings" do
14
- body = "Most amazing string EVER"
15
- me = process(body).body
16
- expect(me).to eq("Most amazing string EVER")
17
- end
18
-
19
- it "handles hashes and decamelcase the keys" do
20
- body = { "name" => "Erik Michaels-Ober", "userName" => "sferik" }
21
- me = process(body).body
22
- expect(me.name).to eq('Erik Michaels-Ober')
23
- expect(me.user_name).to eq('sferik')
24
- end
25
-
26
- it "handles arrays" do
27
- body = [123, 456]
28
- values = process(body).body
29
- expect(values).to eq([123, 456])
30
- end
31
-
32
- it "handles arrays of hashes" do
33
- body = [{ "username" => "sferik" }, { "username" => "pengwynn" }]
34
- us = process(body).body
35
- expect(us.first.username).to eq('sferik')
36
- expect(us.last.username).to eq('pengwynn')
37
- end
38
-
39
- it "handles mixed arrays" do
40
- body = [123, { "username" => "sferik" }, 456]
41
- values = process(body).body
42
- expect(values.first).to eq(123)
43
- expect(values.last).to eq(456)
44
- expect(values[1].username).to eq('sferik')
45
- end
46
- end
47
- end