faraday_middleware 0.9.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +16 -22
- data/lib/faraday_middleware/backwards_compatibility.rb +16 -12
- data/lib/faraday_middleware/gzip.rb +90 -0
- data/lib/faraday_middleware/instrumentation.rb +9 -3
- data/lib/faraday_middleware/rack_compatible.rb +18 -11
- data/lib/faraday_middleware/redirect_limit_reached.rb +16 -0
- data/lib/faraday_middleware/request/encode_json.rb +12 -9
- data/lib/faraday_middleware/request/method_override.rb +7 -6
- data/lib/faraday_middleware/request/oauth.rb +13 -10
- data/lib/faraday_middleware/request/oauth2.rb +37 -12
- data/lib/faraday_middleware/response/caching.rb +67 -15
- data/lib/faraday_middleware/response/chunked.rb +10 -6
- data/lib/faraday_middleware/response/follow_redirects.rb +85 -70
- data/lib/faraday_middleware/response/mashify.rb +2 -0
- data/lib/faraday_middleware/response/parse_dates.rb +6 -3
- data/lib/faraday_middleware/response/parse_json.rb +10 -10
- data/lib/faraday_middleware/response/parse_marshal.rb +3 -1
- data/lib/faraday_middleware/response/parse_xml.rb +4 -2
- data/lib/faraday_middleware/response/parse_yaml.rb +27 -3
- data/lib/faraday_middleware/response/rashify.rb +3 -1
- data/lib/faraday_middleware/response_middleware.rb +27 -18
- data/lib/faraday_middleware/version.rb +4 -1
- data/lib/faraday_middleware.rb +22 -16
- metadata +10 -65
- data/CHANGELOG.md +0 -10
- data/CONTRIBUTING.md +0 -46
- data/Rakefile +0 -28
- data/faraday_middleware.gemspec +0 -23
- data/lib/faraday_middleware/addressable_patch.rb +0 -20
- data/spec/caching_spec.rb +0 -170
- data/spec/chunked_spec.rb +0 -78
- data/spec/encode_json_spec.rb +0 -95
- data/spec/follow_redirects_spec.rb +0 -221
- data/spec/helper.rb +0 -59
- data/spec/mashify_spec.rb +0 -70
- data/spec/method_override_spec.rb +0 -92
- data/spec/oauth2_spec.rb +0 -118
- data/spec/oauth_spec.rb +0 -151
- data/spec/parse_dates_spec.rb +0 -44
- data/spec/parse_json_spec.rb +0 -112
- data/spec/parse_marshal_spec.rb +0 -16
- data/spec/parse_xml_spec.rb +0 -71
- data/spec/parse_yaml_spec.rb +0 -53
- data/spec/rashify_spec.rb +0 -47
data/spec/chunked_spec.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'faraday_middleware/response/chunked'
|
3
|
-
|
4
|
-
describe FaradayMiddleware::Chunked, :type => :response do
|
5
|
-
context "no transfer-encoding" do
|
6
|
-
it "doesn't change nil body" do
|
7
|
-
expect(process(nil).body).to be_nil
|
8
|
-
end
|
9
|
-
|
10
|
-
it "doesn't change an empty body" do
|
11
|
-
expect(process('').body).to eq('')
|
12
|
-
end
|
13
|
-
|
14
|
-
it "doesn't change a normal body" do
|
15
|
-
expect(process('asdf').body).to eq('asdf')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "transfer-encoding gzip" do
|
20
|
-
let(:headers) { {"transfer-encoding" => "gzip"}}
|
21
|
-
|
22
|
-
it "doesn't change nil body" do
|
23
|
-
expect(process(nil).body).to be_nil
|
24
|
-
end
|
25
|
-
|
26
|
-
it "doesn't change an empty body" do
|
27
|
-
expect(process('').body).to eq('')
|
28
|
-
end
|
29
|
-
|
30
|
-
it "doesn't change a normal body" do
|
31
|
-
expect(process('asdf').body).to eq('asdf')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "transfer-encoding chunked" do
|
36
|
-
let(:headers) { {"transfer-encoding" => "chunked"}}
|
37
|
-
|
38
|
-
it "doesn't change nil body" do
|
39
|
-
expect(process(nil).body).to be_nil
|
40
|
-
end
|
41
|
-
|
42
|
-
it "doesn't change an empty body" do
|
43
|
-
expect(process('').body).to eq('')
|
44
|
-
end
|
45
|
-
|
46
|
-
it "parses a basic chunked body" do
|
47
|
-
expect(process("10\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
48
|
-
end
|
49
|
-
|
50
|
-
it "parses a chunked body with no ending chunk" do
|
51
|
-
expect(process("10\r\nasdfghjklasdfghj\r\n").body).to eq('asdfghjklasdfghj')
|
52
|
-
end
|
53
|
-
|
54
|
-
it "parses a chunked body with no trailing CRLF on the data chunk" do
|
55
|
-
expect(process("10\r\nasdfghjklasdfghj0\r\n").body).to eq('asdfghjklasdfghj')
|
56
|
-
end
|
57
|
-
|
58
|
-
it "parses a chunked body with an extension" do
|
59
|
-
expect(process("10;foo=bar\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
60
|
-
end
|
61
|
-
|
62
|
-
it "parses a chunked body with two extensions" do
|
63
|
-
expect(process("10;foo=bar;bar=baz\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
64
|
-
end
|
65
|
-
|
66
|
-
it "parses a chunked body with two chunks" do
|
67
|
-
expect(process("8\r\nasdfghjk\r\n8\r\nlasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context "transfer-encoding chunked,chunked" do
|
72
|
-
let(:headers) { {"transfer-encoding" => "chunked,chunked"}}
|
73
|
-
|
74
|
-
it "parses a basic chunked body" do
|
75
|
-
expect(process("10\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
data/spec/encode_json_spec.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'faraday_middleware/request/encode_json'
|
3
|
-
|
4
|
-
describe FaradayMiddleware::EncodeJson do
|
5
|
-
let(:middleware) { described_class.new(lambda{|env| env}) }
|
6
|
-
|
7
|
-
def process(body, content_type = nil)
|
8
|
-
env = {:body => body, :request_headers => Faraday::Utils::Headers.new}
|
9
|
-
env[:request_headers]['content-type'] = content_type if content_type
|
10
|
-
middleware.call(faraday_env(env))
|
11
|
-
end
|
12
|
-
|
13
|
-
def result_body() result[:body] end
|
14
|
-
def result_type() result[:request_headers]['content-type'] end
|
15
|
-
|
16
|
-
context "no body" do
|
17
|
-
let(:result) { process(nil) }
|
18
|
-
|
19
|
-
it "doesn't change body" do
|
20
|
-
expect(result_body).to be_nil
|
21
|
-
end
|
22
|
-
|
23
|
-
it "doesn't add content type" do
|
24
|
-
expect(result_type).to be_nil
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context "empty body" do
|
29
|
-
let(:result) { process('') }
|
30
|
-
|
31
|
-
it "doesn't change body" do
|
32
|
-
expect(result_body).to be_empty
|
33
|
-
end
|
34
|
-
|
35
|
-
it "doesn't add content type" do
|
36
|
-
expect(result_type).to be_nil
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context "string body" do
|
41
|
-
let(:result) { process('{"a":1}') }
|
42
|
-
|
43
|
-
it "doesn't change body" do
|
44
|
-
expect(result_body).to eq('{"a":1}')
|
45
|
-
end
|
46
|
-
|
47
|
-
it "adds content type" do
|
48
|
-
expect(result_type).to eq('application/json')
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "object body" do
|
53
|
-
let(:result) { process({:a => 1}) }
|
54
|
-
|
55
|
-
it "encodes body" do
|
56
|
-
expect(result_body).to eq('{"a":1}')
|
57
|
-
end
|
58
|
-
|
59
|
-
it "adds content type" do
|
60
|
-
expect(result_type).to eq('application/json')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "empty object body" do
|
65
|
-
let(:result) { process({}) }
|
66
|
-
|
67
|
-
it "encodes body" do
|
68
|
-
expect(result_body).to eq('{}')
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context "object body with json type" do
|
73
|
-
let(:result) { process({:a => 1}, 'application/json; charset=utf-8') }
|
74
|
-
|
75
|
-
it "encodes body" do
|
76
|
-
expect(result_body).to eq('{"a":1}')
|
77
|
-
end
|
78
|
-
|
79
|
-
it "doesn't change content type" do
|
80
|
-
expect(result_type).to eq('application/json; charset=utf-8')
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context "object body with incompatible type" do
|
85
|
-
let(:result) { process({:a => 1}, 'application/xml; charset=utf-8') }
|
86
|
-
|
87
|
-
it "doesn't change body" do
|
88
|
-
expect(result_body).to eq({:a => 1})
|
89
|
-
end
|
90
|
-
|
91
|
-
it "doesn't change content type" do
|
92
|
-
expect(result_type).to eq('application/xml; charset=utf-8')
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
@@ -1,221 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'faraday_middleware/response/follow_redirects'
|
3
|
-
require 'faraday'
|
4
|
-
|
5
|
-
# expose a method in Test adapter that should have been public
|
6
|
-
Faraday::Adapter::Test::Stubs.class_eval { public :new_stub }
|
7
|
-
|
8
|
-
describe FaradayMiddleware::FollowRedirects do
|
9
|
-
let(:middleware_options) { Hash.new }
|
10
|
-
|
11
|
-
shared_examples_for "a successful redirection" do |status_code|
|
12
|
-
it "follows the redirection for a GET request" do
|
13
|
-
expect(connection do |stub|
|
14
|
-
stub.get('/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
15
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
16
|
-
end.get('/permanent').body).to eq 'fin'
|
17
|
-
end
|
18
|
-
|
19
|
-
it "follows the redirection for a HEAD request" do
|
20
|
-
expect(connection do |stub|
|
21
|
-
stub.head('/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
22
|
-
stub.head('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
23
|
-
end.head('/permanent').status).to eq 200
|
24
|
-
end
|
25
|
-
|
26
|
-
it "follows the redirection for a OPTIONS request" do
|
27
|
-
expect(connection do |stub|
|
28
|
-
stub.new_stub(:options, '/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
29
|
-
stub.new_stub(:options, '/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
30
|
-
end.run_request(:options, '/permanent', nil, nil).status).to eq 200
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
shared_examples_for "a forced GET redirection" do |status_code|
|
35
|
-
[:put, :post, :delete, :patch].each do |method|
|
36
|
-
it "a #{method.to_s.upcase} request is converted to a GET" do
|
37
|
-
expect(connection do |stub|
|
38
|
-
stub.new_stub(method, '/redirect') {
|
39
|
-
[status_code, {'Location' => '/found'}, 'elsewhere']
|
40
|
-
}
|
41
|
-
stub.get('/found') { |env|
|
42
|
-
body = env[:body] and body.empty? && (body = nil)
|
43
|
-
[200, {'Content-Type' => 'text/plain'}, body.inspect]
|
44
|
-
}
|
45
|
-
end.run_request(method, '/redirect', 'request data', nil).body).to eq('nil')
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
shared_examples_for "a replayed redirection" do |status_code|
|
51
|
-
it "redirects with the original request headers" do
|
52
|
-
conn = connection do |stub|
|
53
|
-
stub.get('/redirect') {
|
54
|
-
[status_code, {'Location' => '/found'}, '']
|
55
|
-
}
|
56
|
-
stub.get('/found') { |env|
|
57
|
-
[200, {'Content-Type' => 'text/plain'}, env[:request_headers]['X-Test-Value']]
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
response = conn.get('/redirect') { |req|
|
62
|
-
req.headers['X-Test-Value'] = 'success'
|
63
|
-
}
|
64
|
-
|
65
|
-
expect(response.body).to eq('success')
|
66
|
-
end
|
67
|
-
|
68
|
-
[:put, :post, :delete, :patch].each do |method|
|
69
|
-
it "replays a #{method.to_s.upcase} request" do
|
70
|
-
expect(connection do |stub|
|
71
|
-
stub.new_stub(method, '/redirect') { [status_code, {'Location' => '/found'}, ''] }
|
72
|
-
stub.new_stub(method, '/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
73
|
-
end.run_request(method, '/redirect', nil, nil).body).to eq 'fin'
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
[:put, :post, :patch].each do |method|
|
78
|
-
it "forwards request body for a #{method.to_s.upcase} request" do
|
79
|
-
conn = connection do |stub|
|
80
|
-
stub.new_stub(method, '/redirect') {
|
81
|
-
[status_code, {'Location' => '/found'}, '']
|
82
|
-
}
|
83
|
-
stub.new_stub(method, '/found') { |env|
|
84
|
-
[200, {'Content-Type' => 'text/plain'}, env[:body]]
|
85
|
-
}
|
86
|
-
end
|
87
|
-
|
88
|
-
response = conn.run_request(method, '/redirect', 'original data', nil)
|
89
|
-
expect(response.body).to eq('original data')
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
|
-
it "returns non-redirect response results" do
|
96
|
-
expect(connection do |stub|
|
97
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
98
|
-
end.get('/found').body).to eq 'fin'
|
99
|
-
end
|
100
|
-
|
101
|
-
it "follows a single redirection" do
|
102
|
-
expect(connection do |stub|
|
103
|
-
stub.get('/') { [301, {'Location' => '/found'}, ''] }
|
104
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
105
|
-
end.get('/').body).to eq 'fin'
|
106
|
-
end
|
107
|
-
|
108
|
-
it "follows many redirections" do
|
109
|
-
expect(connection do |stub|
|
110
|
-
stub.get('/') { [301, {'Location' => '/redirect1'}, ''] }
|
111
|
-
stub.get('/redirect1') { [301, {'Location' => '/redirect2'}, ''] }
|
112
|
-
stub.get('/redirect2') { [301, {'Location' => '/found'}, ''] }
|
113
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
114
|
-
end.get('/').body).to eq 'fin'
|
115
|
-
end
|
116
|
-
|
117
|
-
it "raises a FaradayMiddleware::RedirectLimitReached after 3 redirections (by default)" do
|
118
|
-
conn = connection do |stub|
|
119
|
-
stub.get('/') { [301, {'Location' => '/redirect1'}, ''] }
|
120
|
-
stub.get('/redirect1') { [301, {'Location' => '/redirect2'}, ''] }
|
121
|
-
stub.get('/redirect2') { [301, {'Location' => '/redirect3'}, ''] }
|
122
|
-
stub.get('/redirect3') { [301, {'Location' => '/found'}, ''] }
|
123
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
124
|
-
end
|
125
|
-
|
126
|
-
expect{ conn.get('/') }.to raise_error(FaradayMiddleware::RedirectLimitReached)
|
127
|
-
end
|
128
|
-
|
129
|
-
it "raises a FaradayMiddleware::RedirectLimitReached after the initialized limit" do
|
130
|
-
conn = connection(:limit => 1) do |stub|
|
131
|
-
stub.get('/') { [301, {'Location' => '/redirect1'}, ''] }
|
132
|
-
stub.get('/redirect1') { [301, {'Location' => '/found'}, ''] }
|
133
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
134
|
-
end
|
135
|
-
|
136
|
-
expect{ conn.get('/') }.to raise_error(FaradayMiddleware::RedirectLimitReached)
|
137
|
-
end
|
138
|
-
|
139
|
-
context "when cookies option" do
|
140
|
-
|
141
|
-
let(:cookies) { 'cookie1=abcdefg; cookie2=1234567; cookie3=awesome' }
|
142
|
-
|
143
|
-
context "is :all" do
|
144
|
-
it "puts all cookies from the response into the next request" do
|
145
|
-
expect(connection(:cookies => :all) do |stub|
|
146
|
-
stub.get('/') { [301, {'Location' => '/found', 'Cookies' => cookies }, ''] }
|
147
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
148
|
-
end.get('/').env[:request_headers][:cookies]).to eq(cookies)
|
149
|
-
end
|
150
|
-
|
151
|
-
it "not set cookies header on request when response has no cookies" do
|
152
|
-
expect(connection(:cookies => :all) do |stub|
|
153
|
-
stub.get('/') { [301, {'Location' => '/found'}, ''] }
|
154
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
155
|
-
end.get('/').env[:request_headers].has_key?('Cookies')).to eq(false)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
context "is an array of cookie names" do
|
160
|
-
it "puts selected cookies from the response into the next request" do
|
161
|
-
expect(connection(:cookies => ['cookie2']) do |stub|
|
162
|
-
stub.get('/') { [301, {'Location' => '/found', 'Cookies' => cookies }, ''] }
|
163
|
-
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
164
|
-
end.get('/').env[:request_headers][:cookies]).to eq('cookie2=1234567')
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
context "for an HTTP 301 response" do
|
170
|
-
it_behaves_like 'a successful redirection', 301
|
171
|
-
it_behaves_like 'a forced GET redirection', 301
|
172
|
-
end
|
173
|
-
|
174
|
-
context "for an HTTP 302 response" do
|
175
|
-
it_behaves_like 'a successful redirection', 302
|
176
|
-
|
177
|
-
context "by default" do
|
178
|
-
it_behaves_like 'a forced GET redirection', 302
|
179
|
-
end
|
180
|
-
|
181
|
-
context "with standards compliancy enabled" do
|
182
|
-
let(:middleware_options) { { :standards_compliant => true } }
|
183
|
-
it_behaves_like 'a replayed redirection', 302
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
context "for an HTTP 303 response" do
|
188
|
-
it_behaves_like 'a successful redirection', 303
|
189
|
-
it_behaves_like 'a forced GET redirection', 303
|
190
|
-
end
|
191
|
-
|
192
|
-
context "for an HTTP 307 response" do
|
193
|
-
it_behaves_like 'a successful redirection', 307
|
194
|
-
it_behaves_like 'a replayed redirection', 307
|
195
|
-
end
|
196
|
-
|
197
|
-
# checks env hash in request phase for basic validity
|
198
|
-
class Lint < Struct.new(:app)
|
199
|
-
def call(env)
|
200
|
-
if env[:status] or env[:response] or env[:response_headers]
|
201
|
-
raise "invalid request: #{env.inspect}"
|
202
|
-
end
|
203
|
-
if defined?(Faraday::Env) && !env.is_a?(Faraday::Env)
|
204
|
-
raise "expected Faraday::Env, got #{env.class}"
|
205
|
-
end
|
206
|
-
app.call(env)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
private
|
211
|
-
|
212
|
-
def connection(options = middleware_options)
|
213
|
-
Faraday.new do |c|
|
214
|
-
c.use described_class, options
|
215
|
-
c.use Lint
|
216
|
-
c.adapter :test do |stub|
|
217
|
-
yield(stub) if block_given?
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
221
|
-
end
|
data/spec/helper.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
if ENV['COVERAGE']
|
2
|
-
require 'simplecov'
|
3
|
-
|
4
|
-
SimpleCov.formatter = Class.new do
|
5
|
-
def format(result)
|
6
|
-
SimpleCov::Formatter::HTMLFormatter.new.format(result) unless ENV['CI']
|
7
|
-
File.open('coverage/covered_percent', 'w') do |f|
|
8
|
-
f.printf "%.2f", result.source_files.covered_percent
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
SimpleCov.start do
|
14
|
-
# add_filter 'faraday_middleware.rb'
|
15
|
-
add_filter 'backwards_compatibility.rb'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
require 'rspec'
|
20
|
-
require 'faraday'
|
21
|
-
|
22
|
-
module EnvCompatibility
|
23
|
-
def faraday_env(env)
|
24
|
-
if defined?(Faraday::Env)
|
25
|
-
Faraday::Env.from(env)
|
26
|
-
else
|
27
|
-
env
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
module ResponseMiddlewareExampleGroup
|
33
|
-
def self.included(base)
|
34
|
-
base.let(:options) { Hash.new }
|
35
|
-
base.let(:headers) { Hash.new }
|
36
|
-
base.let(:middleware) {
|
37
|
-
described_class.new(lambda {|env|
|
38
|
-
Faraday::Response.new(env)
|
39
|
-
}, options)
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
def process(body, content_type = nil, options = {})
|
44
|
-
env = {
|
45
|
-
:body => body, :request => options,
|
46
|
-
:response_headers => Faraday::Utils::Headers.new(headers)
|
47
|
-
}
|
48
|
-
env[:response_headers]['content-type'] = content_type if content_type
|
49
|
-
middleware.call(faraday_env(env))
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
RSpec.configure do |config|
|
54
|
-
config.include EnvCompatibility
|
55
|
-
config.include ResponseMiddlewareExampleGroup, :type => :response
|
56
|
-
config.expect_with :rspec do |c|
|
57
|
-
c.syntax = :expect
|
58
|
-
end
|
59
|
-
end
|
data/spec/mashify_spec.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'faraday_middleware/response/mashify'
|
3
|
-
|
4
|
-
describe FaradayMiddleware::Mashify do
|
5
|
-
MyMash = Struct.new(:body)
|
6
|
-
|
7
|
-
context "when used", :type => :response do
|
8
|
-
it "creates a Hashie::Mash from the body" do
|
9
|
-
body = { "name" => "Erik Michaels-Ober", "username" => "sferik" }
|
10
|
-
me = process(body).body
|
11
|
-
expect(me.name).to eq("Erik Michaels-Ober")
|
12
|
-
expect(me.username).to eq("sferik")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "handles strings" do
|
16
|
-
body = "Most amazing string EVER"
|
17
|
-
me = process(body).body
|
18
|
-
expect(me).to eq("Most amazing string EVER")
|
19
|
-
end
|
20
|
-
|
21
|
-
it "handles arrays" do
|
22
|
-
body = [123, 456]
|
23
|
-
values = process(body).body
|
24
|
-
expect(values).to eq([123, 456])
|
25
|
-
end
|
26
|
-
|
27
|
-
it "handles arrays of hashes" do
|
28
|
-
body = [{ "username" => "sferik" }, { "username" => "pengwynn" }]
|
29
|
-
us = process(body).body
|
30
|
-
expect(us.first.username).to eq('sferik')
|
31
|
-
expect(us.last.username).to eq('pengwynn')
|
32
|
-
end
|
33
|
-
|
34
|
-
it "handles nested arrays of hashes" do
|
35
|
-
body = [[{ "username" => "sferik" }, { "username" => "pengwynn" }]]
|
36
|
-
us = process(body).body.first
|
37
|
-
expect(us.first.username).to eq('sferik')
|
38
|
-
expect(us.last.username).to eq('pengwynn')
|
39
|
-
end
|
40
|
-
|
41
|
-
it "handles mixed arrays" do
|
42
|
-
body = [123, { "username" => "sferik" }, 456]
|
43
|
-
values = process(body).body
|
44
|
-
expect(values.first).to eq(123)
|
45
|
-
expect(values.last).to eq(456)
|
46
|
-
expect(values[1].username).to eq('sferik')
|
47
|
-
end
|
48
|
-
|
49
|
-
it "allows for use of custom Mash subclasses at the class level" do
|
50
|
-
original_class = described_class.mash_class
|
51
|
-
described_class.mash_class = MyMash
|
52
|
-
|
53
|
-
begin
|
54
|
-
me = process({}).body
|
55
|
-
expect(me).to be_instance_of(MyMash)
|
56
|
-
ensure
|
57
|
-
described_class.mash_class = original_class
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
context "custom mash subclass", :type => :response do
|
63
|
-
let(:options) { {:mash_class => MyMash} }
|
64
|
-
|
65
|
-
it "instance level" do
|
66
|
-
me = process({}).body
|
67
|
-
expect(me).to be_instance_of(MyMash)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'faraday_middleware/request/method_override'
|
3
|
-
|
4
|
-
describe FaradayMiddleware::MethodOverride do
|
5
|
-
|
6
|
-
let(:middleware) { described_class.new(lambda {|env| env }, *options) }
|
7
|
-
let(:env) { middleware.call faraday_env(request_env(request_method)) }
|
8
|
-
|
9
|
-
def request_env(method)
|
10
|
-
{ :method => method,
|
11
|
-
:request_headers => Faraday::Utils::Headers.new
|
12
|
-
}
|
13
|
-
end
|
14
|
-
|
15
|
-
shared_examples "overrides method" do |method|
|
16
|
-
it "sets physical method to POST" do
|
17
|
-
expect(env[:method]).to eq(:post)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "sets header to #{method}" do
|
21
|
-
expect(env[:request_headers]['X-Http-Method-Override']).to eq(method)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
shared_examples "doesn't override method" do |method|
|
26
|
-
it "keeps original method" do
|
27
|
-
expect(env[:method]).to eq(method)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "doesn't set header value" do
|
31
|
-
expect(env[:request_headers]).not_to have_key('X-Http-Method-Override')
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
context "with default options" do
|
37
|
-
let(:options) { nil }
|
38
|
-
|
39
|
-
context "GET" do
|
40
|
-
let(:request_method) { :get }
|
41
|
-
include_examples "doesn't override method", :get
|
42
|
-
end
|
43
|
-
|
44
|
-
context "POST" do
|
45
|
-
let(:request_method) { :post }
|
46
|
-
include_examples "doesn't override method", :post
|
47
|
-
end
|
48
|
-
|
49
|
-
context "PUT" do
|
50
|
-
let(:request_method) { :put }
|
51
|
-
include_examples "overrides method", 'PUT'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context "configured to rewrite [:patch, :delete]" do
|
56
|
-
let(:options) { [{ :rewrite => [:patch, :delete] }] }
|
57
|
-
|
58
|
-
context "PUT" do
|
59
|
-
let(:request_method) { :put }
|
60
|
-
include_examples "doesn't override method", :put
|
61
|
-
end
|
62
|
-
|
63
|
-
context "PATCH" do
|
64
|
-
let(:request_method) { :patch }
|
65
|
-
include_examples "overrides method", 'PATCH'
|
66
|
-
end
|
67
|
-
|
68
|
-
context "DELETE" do
|
69
|
-
let(:request_method) { :delete }
|
70
|
-
include_examples "overrides method", 'DELETE'
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context "configured to rewrite ['PATCH']" do
|
75
|
-
let(:options) { [{ :rewrite => %w[PATCH] }] }
|
76
|
-
|
77
|
-
context "PATCH" do
|
78
|
-
let(:request_method) { :patch }
|
79
|
-
include_examples "overrides method", 'PATCH'
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "with invalid option" do
|
84
|
-
let(:options) { [{ :hello => 'world' }] }
|
85
|
-
let(:request_method) { :get }
|
86
|
-
|
87
|
-
it "raises key error" do
|
88
|
-
expect{ env }.to raise_error(IndexError, /key [\s\w]*not found/)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|