faraday 1.7.1 → 2.0.0.alpha.pre.2
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 +4 -4
- data/CHANGELOG.md +117 -1
- data/README.md +16 -9
- data/examples/client_test.rb +1 -1
- data/lib/faraday/adapter/test.rb +2 -0
- data/lib/faraday/adapter.rb +2 -5
- data/lib/faraday/connection.rb +8 -84
- data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
- data/lib/faraday/error.rb +1 -0
- data/lib/faraday/file_part.rb +0 -6
- data/lib/faraday/logging/formatter.rb +1 -0
- data/lib/faraday/middleware.rb +0 -1
- data/lib/faraday/middleware_registry.rb +15 -79
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/rack_builder.rb +1 -1
- data/lib/faraday/request/authorization.rb +31 -38
- data/lib/faraday/request/instrumentation.rb +2 -0
- data/lib/faraday/request/json.rb +55 -0
- data/lib/faraday/request/multipart.rb +2 -0
- data/lib/faraday/request/retry.rb +3 -1
- data/lib/faraday/request/url_encoded.rb +2 -0
- data/lib/faraday/request.rb +13 -31
- data/lib/faraday/response/json.rb +54 -0
- data/lib/faraday/response/logger.rb +4 -4
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +8 -19
- data/lib/faraday/utils/headers.rb +1 -1
- data/lib/faraday/utils.rb +9 -4
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +6 -37
- data/spec/faraday/connection_spec.rb +78 -51
- data/spec/faraday/options/env_spec.rb +2 -2
- data/spec/faraday/rack_builder_spec.rb +5 -43
- data/spec/faraday/request/authorization_spec.rb +15 -29
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/json_spec.rb +111 -0
- data/spec/faraday/request/multipart_spec.rb +5 -5
- data/spec/faraday/request/retry_spec.rb +13 -1
- data/spec/faraday/request_spec.rb +0 -11
- data/spec/faraday/response/json_spec.rb +117 -0
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/utils_spec.rb +1 -1
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/shared_examples/request_method.rb +5 -5
- metadata +11 -134
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -87
- data/lib/faraday/dependency_loader.rb +0 -37
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -49
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
- data/spec/faraday/adapter/excon_spec.rb +0 -49
- data/spec/faraday/adapter/httpclient_spec.rb +0 -73
- data/spec/faraday/adapter/net_http_spec.rb +0 -64
- data/spec/faraday/adapter/patron_spec.rb +0 -18
- data/spec/faraday/adapter/rack_spec.rb +0 -8
- data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
class CustomEncoder
|
|
4
|
+
def encode(params)
|
|
5
|
+
params.map { |k, v| "#{k.upcase}-#{v.to_s.upcase}" }.join(',')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def decode(params)
|
|
9
|
+
params.split(',').map { |pair| pair.split('-') }.to_h
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
3
13
|
shared_examples 'initializer with url' do
|
|
4
14
|
context 'with simple url' do
|
|
5
15
|
let(:address) { 'http://sushi.com' }
|
|
@@ -103,6 +113,12 @@ RSpec.describe Faraday::Connection do
|
|
|
103
113
|
it { expect(subject.params).to eq('a' => 3, 'b' => '2') }
|
|
104
114
|
end
|
|
105
115
|
|
|
116
|
+
context 'with basic_auth in url' do
|
|
117
|
+
let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' }
|
|
118
|
+
|
|
119
|
+
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
120
|
+
end
|
|
121
|
+
|
|
106
122
|
context 'with custom headers' do
|
|
107
123
|
let(:options) { { headers: { user_agent: 'Faraday' } } }
|
|
108
124
|
|
|
@@ -124,7 +140,7 @@ RSpec.describe Faraday::Connection do
|
|
|
124
140
|
context 'with block' do
|
|
125
141
|
let(:conn) do
|
|
126
142
|
Faraday::Connection.new(params: { 'a' => '1' }) do |faraday|
|
|
127
|
-
faraday.adapter :
|
|
143
|
+
faraday.adapter :test
|
|
128
144
|
faraday.url_prefix = 'http://sushi.com/omnom'
|
|
129
145
|
end
|
|
130
146
|
end
|
|
@@ -141,28 +157,6 @@ RSpec.describe Faraday::Connection do
|
|
|
141
157
|
end
|
|
142
158
|
end
|
|
143
159
|
|
|
144
|
-
describe 'basic_auth' do
|
|
145
|
-
subject { conn }
|
|
146
|
-
|
|
147
|
-
context 'calling the #basic_auth method' do
|
|
148
|
-
before { subject.basic_auth 'Aladdin', 'open sesame' }
|
|
149
|
-
|
|
150
|
-
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
context 'adding basic auth info to url' do
|
|
154
|
-
let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' }
|
|
155
|
-
|
|
156
|
-
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
describe '#token_auth' do
|
|
161
|
-
before { subject.token_auth('abcdef', nonce: 'abc') }
|
|
162
|
-
|
|
163
|
-
it { expect(subject.headers['Authorization']).to eq('Token nonce="abc", token="abcdef"') }
|
|
164
|
-
end
|
|
165
|
-
|
|
166
160
|
describe '#build_exclusive_url' do
|
|
167
161
|
context 'with relative path' do
|
|
168
162
|
subject { conn.build_exclusive_url('sake.html') }
|
|
@@ -556,26 +550,32 @@ RSpec.describe Faraday::Connection do
|
|
|
556
550
|
end
|
|
557
551
|
|
|
558
552
|
context 'performing a request' do
|
|
559
|
-
|
|
553
|
+
let(:url) { 'http://example.com' }
|
|
554
|
+
let(:conn) do
|
|
555
|
+
Faraday.new do |f|
|
|
556
|
+
f.adapter :test do |stubs|
|
|
557
|
+
stubs.get(url) do
|
|
558
|
+
[200, {}, 'ok']
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
end
|
|
560
563
|
|
|
561
564
|
it 'dynamically checks proxy' do
|
|
562
565
|
with_env 'http_proxy' => 'http://proxy.com:80' do
|
|
563
|
-
conn = Faraday.new
|
|
564
566
|
expect(conn.proxy.uri.host).to eq('proxy.com')
|
|
565
567
|
|
|
566
|
-
conn.get(
|
|
568
|
+
conn.get(url) do |req|
|
|
567
569
|
expect(req.options.proxy.uri.host).to eq('proxy.com')
|
|
568
570
|
end
|
|
569
571
|
end
|
|
570
572
|
|
|
571
|
-
conn.get(
|
|
573
|
+
conn.get(url)
|
|
572
574
|
expect(conn.instance_variable_get('@temp_proxy')).to be_nil
|
|
573
575
|
end
|
|
574
576
|
|
|
575
577
|
it 'dynamically check no proxy' do
|
|
576
578
|
with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
|
|
577
|
-
conn = Faraday.new
|
|
578
|
-
|
|
579
579
|
expect(conn.proxy.uri.host).to eq('proxy.com')
|
|
580
580
|
|
|
581
581
|
conn.get('http://example.com') do |req|
|
|
@@ -605,7 +605,6 @@ RSpec.describe Faraday::Connection do
|
|
|
605
605
|
|
|
606
606
|
context 'after manual changes' do
|
|
607
607
|
before do
|
|
608
|
-
subject.basic_auth('', '')
|
|
609
608
|
subject.headers['content-length'] = 12
|
|
610
609
|
subject.params['b'] = '2'
|
|
611
610
|
subject.options[:open_timeout] = 10
|
|
@@ -645,9 +644,16 @@ RSpec.describe Faraday::Connection do
|
|
|
645
644
|
describe 'request params' do
|
|
646
645
|
context 'with simple url' do
|
|
647
646
|
let(:url) { 'http://example.com' }
|
|
648
|
-
let
|
|
647
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
649
648
|
|
|
650
|
-
|
|
649
|
+
before do
|
|
650
|
+
conn.adapter(:test, stubs)
|
|
651
|
+
stubs.get('http://example.com?a=a&p=3') do
|
|
652
|
+
[200, {}, 'ok']
|
|
653
|
+
end
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
after { stubs.verify_stubbed_calls }
|
|
651
657
|
|
|
652
658
|
it 'test_overrides_request_params' do
|
|
653
659
|
conn.get('?p=2&a=a', p: 3)
|
|
@@ -669,15 +675,22 @@ RSpec.describe Faraday::Connection do
|
|
|
669
675
|
context 'with url and extra params' do
|
|
670
676
|
let(:url) { 'http://example.com?a=1&b=2' }
|
|
671
677
|
let(:options) { { params: { c: 3 } } }
|
|
678
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
679
|
+
|
|
680
|
+
before do
|
|
681
|
+
conn.adapter(:test, stubs)
|
|
682
|
+
end
|
|
672
683
|
|
|
673
684
|
it 'merges connection and request params' do
|
|
674
|
-
|
|
685
|
+
expected = 'http://example.com?a=1&b=2&c=3&limit=5&page=1'
|
|
686
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
675
687
|
conn.get('?page=1', limit: 5)
|
|
676
|
-
|
|
688
|
+
stubs.verify_stubbed_calls
|
|
677
689
|
end
|
|
678
690
|
|
|
679
691
|
it 'allows to override all params' do
|
|
680
|
-
|
|
692
|
+
expected = 'http://example.com?b=b'
|
|
693
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
681
694
|
conn.get('?p=1&a=a', p: 2) do |req|
|
|
682
695
|
expect(req.params[:a]).to eq('a')
|
|
683
696
|
expect(req.params['c']).to eq(3)
|
|
@@ -685,47 +698,61 @@ RSpec.describe Faraday::Connection do
|
|
|
685
698
|
req.params = { b: 'b' }
|
|
686
699
|
expect(req.params['b']).to eq('b')
|
|
687
700
|
end
|
|
688
|
-
|
|
701
|
+
stubs.verify_stubbed_calls
|
|
689
702
|
end
|
|
690
703
|
|
|
691
704
|
it 'allows to set params_encoder for single request' do
|
|
692
|
-
encoder =
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
end
|
|
696
|
-
stubbed = stub_request(:get, 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE')
|
|
705
|
+
encoder = CustomEncoder.new
|
|
706
|
+
expected = 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE'
|
|
707
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
697
708
|
|
|
698
|
-
conn.get('/', feeling: 'blue') do |req|
|
|
709
|
+
conn.get('/', a: 1, b: 2, c: 3, feeling: 'blue') do |req|
|
|
699
710
|
req.options.params_encoder = encoder
|
|
700
711
|
end
|
|
701
|
-
|
|
712
|
+
stubs.verify_stubbed_calls
|
|
702
713
|
end
|
|
703
714
|
end
|
|
704
715
|
|
|
705
716
|
context 'with default params encoder' do
|
|
706
|
-
let
|
|
707
|
-
|
|
717
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
718
|
+
|
|
719
|
+
before do
|
|
720
|
+
conn.adapter(:test, stubs)
|
|
721
|
+
stubs.get('http://example.com?color%5B%5D=blue&color%5B%5D=red') do
|
|
722
|
+
[200, {}, 'ok']
|
|
723
|
+
end
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
after { stubs.verify_stubbed_calls }
|
|
708
727
|
|
|
709
728
|
it 'supports array params in url' do
|
|
710
|
-
conn.get('http://example.com?color[]=
|
|
729
|
+
conn.get('http://example.com?color[]=blue&color[]=red')
|
|
711
730
|
end
|
|
712
731
|
|
|
713
732
|
it 'supports array params in params' do
|
|
714
|
-
conn.get('http://example.com', color: %w[red
|
|
733
|
+
conn.get('http://example.com', color: %w[blue red])
|
|
715
734
|
end
|
|
716
735
|
end
|
|
717
736
|
|
|
718
737
|
context 'with flat params encoder' do
|
|
719
738
|
let(:options) { { request: { params_encoder: Faraday::FlatParamsEncoder } } }
|
|
720
|
-
let
|
|
721
|
-
|
|
739
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
740
|
+
|
|
741
|
+
before do
|
|
742
|
+
conn.adapter(:test, stubs)
|
|
743
|
+
stubs.get('http://example.com?color=blue&color=red') do
|
|
744
|
+
[200, {}, 'ok']
|
|
745
|
+
end
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
after { stubs.verify_stubbed_calls }
|
|
722
749
|
|
|
723
750
|
it 'supports array params in params' do
|
|
724
|
-
conn.get('http://example.com', color: %w[red
|
|
751
|
+
conn.get('http://example.com', color: %w[blue red])
|
|
725
752
|
end
|
|
726
753
|
|
|
727
754
|
context 'with array param in url' do
|
|
728
|
-
let(:url) { 'http://example.com?color[]=
|
|
755
|
+
let(:url) { 'http://example.com?color[]=blue&color[]=red' }
|
|
729
756
|
|
|
730
757
|
it do
|
|
731
758
|
conn.get('/')
|
|
@@ -29,12 +29,12 @@ RSpec.describe Faraday::Env do
|
|
|
29
29
|
|
|
30
30
|
it 'retains custom members' do
|
|
31
31
|
env[:foo] = 'custom 1'
|
|
32
|
-
env[:bar] = :
|
|
32
|
+
env[:bar] = :custom2
|
|
33
33
|
env2 = Faraday::Env.from(env)
|
|
34
34
|
env2[:baz] = 'custom 3'
|
|
35
35
|
|
|
36
36
|
expect(env2[:foo]).to eq('custom 1')
|
|
37
|
-
expect(env2[:bar]).to eq(:
|
|
37
|
+
expect(env2[:bar]).to eq(:custom2)
|
|
38
38
|
expect(env[:baz]).to be_nil
|
|
39
39
|
end
|
|
40
40
|
|
|
@@ -12,13 +12,11 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
12
12
|
|
|
13
13
|
class Apple < Handler
|
|
14
14
|
end
|
|
15
|
+
|
|
15
16
|
class Orange < Handler
|
|
16
17
|
end
|
|
17
|
-
class Banana < Handler
|
|
18
|
-
end
|
|
19
18
|
|
|
20
|
-
class
|
|
21
|
-
dependency 'zomg/i_dont/exist'
|
|
19
|
+
class Banana < Handler
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
subject { conn.builder }
|
|
@@ -127,24 +125,6 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
127
125
|
subject.use(:apple)
|
|
128
126
|
expect(subject.handlers).to eq([Apple])
|
|
129
127
|
end
|
|
130
|
-
|
|
131
|
-
it 'allows to register with symbol' do
|
|
132
|
-
Faraday::Middleware.register_middleware(apple: :Apple)
|
|
133
|
-
subject.use(:apple)
|
|
134
|
-
expect(subject.handlers).to eq([Apple])
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it 'allows to register with string' do
|
|
138
|
-
Faraday::Middleware.register_middleware(apple: 'Apple')
|
|
139
|
-
subject.use(:apple)
|
|
140
|
-
expect(subject.handlers).to eq([Apple])
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it 'allows to register with Proc' do
|
|
144
|
-
Faraday::Middleware.register_middleware(apple: -> { Apple })
|
|
145
|
-
subject.use(:apple)
|
|
146
|
-
expect(subject.handlers).to eq([Apple])
|
|
147
|
-
end
|
|
148
128
|
end
|
|
149
129
|
|
|
150
130
|
context 'when having two handlers' do
|
|
@@ -176,24 +156,6 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
176
156
|
end
|
|
177
157
|
end
|
|
178
158
|
|
|
179
|
-
context 'when having a handler with broken dependency' do
|
|
180
|
-
let(:conn) do
|
|
181
|
-
Faraday::Connection.new do |builder|
|
|
182
|
-
builder.adapter :test do |stub|
|
|
183
|
-
stub.get('/') { |_| [200, {}, ''] }
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
before { subject.use(Broken) }
|
|
189
|
-
|
|
190
|
-
it 'raises an error while making a request' do
|
|
191
|
-
expect { conn.get('/') }.to raise_error(RuntimeError) do |err|
|
|
192
|
-
expect(err.message).to match(%r{missing dependency for Broken: .+ -- zomg/i_dont/exist})
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
159
|
context 'when middleware is added with named arguments' do
|
|
198
160
|
let(:conn) { Faraday::Connection.new {} }
|
|
199
161
|
|
|
@@ -220,7 +182,7 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
220
182
|
end
|
|
221
183
|
end
|
|
222
184
|
|
|
223
|
-
context 'when a
|
|
185
|
+
context 'when a middleware is added with named arguments' do
|
|
224
186
|
let(:conn) { Faraday::Connection.new {} }
|
|
225
187
|
|
|
226
188
|
let(:cat_request) do
|
|
@@ -247,11 +209,11 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
247
209
|
end
|
|
248
210
|
end
|
|
249
211
|
|
|
250
|
-
context 'when a
|
|
212
|
+
context 'when a middleware is added with named arguments' do
|
|
251
213
|
let(:conn) { Faraday::Connection.new {} }
|
|
252
214
|
|
|
253
215
|
let(:fish_response) do
|
|
254
|
-
Class.new(Faraday::
|
|
216
|
+
Class.new(Faraday::Middleware) do
|
|
255
217
|
attr_accessor :name
|
|
256
218
|
|
|
257
219
|
def initialize(app, name:)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
RSpec.describe Faraday::Request::Authorization do
|
|
4
4
|
let(:conn) do
|
|
5
5
|
Faraday.new do |b|
|
|
6
|
-
b.request auth_type, *auth_config
|
|
6
|
+
b.request :authorization, auth_type, *auth_config
|
|
7
7
|
b.adapter :test do |stub|
|
|
8
8
|
stub.get('/auth-echo') do |env|
|
|
9
9
|
[200, {}, env[:request_headers]['Authorization']]
|
|
@@ -14,10 +14,10 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
14
14
|
|
|
15
15
|
shared_examples 'does not interfere with existing authentication' do
|
|
16
16
|
context 'and request already has an authentication header' do
|
|
17
|
-
let(:response) { conn.get('/auth-echo', nil, authorization: '
|
|
17
|
+
let(:response) { conn.get('/auth-echo', nil, authorization: 'OAuth oauth_token') }
|
|
18
18
|
|
|
19
19
|
it 'does not interfere with existing authorization' do
|
|
20
|
-
expect(response.body).to eq('
|
|
20
|
+
expect(response.body).to eq('OAuth oauth_token')
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -25,7 +25,7 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
25
25
|
let(:response) { conn.get('/auth-echo') }
|
|
26
26
|
|
|
27
27
|
describe 'basic_auth' do
|
|
28
|
-
let(:auth_type) { :
|
|
28
|
+
let(:auth_type) { :basic }
|
|
29
29
|
|
|
30
30
|
context 'when passed correct params' do
|
|
31
31
|
let(:auth_config) { %w[aladdin opensesame] }
|
|
@@ -44,43 +44,29 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
describe '
|
|
48
|
-
let(:auth_type) { :
|
|
49
|
-
|
|
50
|
-
context 'when passed correct params' do
|
|
51
|
-
let(:auth_config) { 'quux' }
|
|
52
|
-
|
|
53
|
-
it { expect(response.body).to eq('Token token="quux"') }
|
|
54
|
-
|
|
55
|
-
include_examples 'does not interfere with existing authentication'
|
|
56
|
-
end
|
|
47
|
+
describe 'authorization' do
|
|
48
|
+
let(:auth_type) { :Bearer }
|
|
57
49
|
|
|
58
|
-
context 'when
|
|
59
|
-
let(:auth_config) { ['
|
|
50
|
+
context 'when passed a string' do
|
|
51
|
+
let(:auth_config) { ['custom'] }
|
|
60
52
|
|
|
61
|
-
it { expect(response.body).to
|
|
62
|
-
it { expect(response.body).to match(/token="baz"/) }
|
|
63
|
-
it { expect(response.body).to match(/foo="42"/) }
|
|
53
|
+
it { expect(response.body).to eq('Bearer custom') }
|
|
64
54
|
|
|
65
55
|
include_examples 'does not interfere with existing authentication'
|
|
66
56
|
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
describe 'authorization' do
|
|
70
|
-
let(:auth_type) { :authorization }
|
|
71
57
|
|
|
72
|
-
context 'when passed
|
|
73
|
-
let(:auth_config) { ['
|
|
58
|
+
context 'when passed a proc' do
|
|
59
|
+
let(:auth_config) { [-> { 'custom_from_proc' }] }
|
|
74
60
|
|
|
75
|
-
it { expect(response.body).to eq('
|
|
61
|
+
it { expect(response.body).to eq('Bearer custom_from_proc') }
|
|
76
62
|
|
|
77
63
|
include_examples 'does not interfere with existing authentication'
|
|
78
64
|
end
|
|
79
65
|
|
|
80
|
-
context 'when passed
|
|
81
|
-
let(:auth_config) { [
|
|
66
|
+
context 'when passed too many arguments' do
|
|
67
|
+
let(:auth_config) { %w[baz foo] }
|
|
82
68
|
|
|
83
|
-
it { expect
|
|
69
|
+
it { expect { response }.to raise_error(ArgumentError) }
|
|
84
70
|
|
|
85
71
|
include_examples 'does not interfere with existing authentication'
|
|
86
72
|
end
|
|
@@ -30,13 +30,11 @@ RSpec.describe Faraday::Request::Instrumentation do
|
|
|
30
30
|
|
|
31
31
|
it { expect(options.name).to eq('request.faraday') }
|
|
32
32
|
it 'defaults to ActiveSupport::Notifications' do
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
expect(res).to eq(ActiveSupport::Notifications)
|
|
39
|
-
end
|
|
33
|
+
res = options.instrumenter
|
|
34
|
+
rescue NameError => e
|
|
35
|
+
expect(e.to_s).to match('ActiveSupport')
|
|
36
|
+
else
|
|
37
|
+
expect(res).to eq(ActiveSupport::Notifications)
|
|
40
38
|
end
|
|
41
39
|
|
|
42
40
|
it 'instruments with default name' do
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.describe Faraday::Request::Json do
|
|
4
|
+
let(:middleware) { described_class.new(->(env) { Faraday::Response.new(env) }) }
|
|
5
|
+
|
|
6
|
+
def process(body, content_type = nil)
|
|
7
|
+
env = { body: body, request_headers: Faraday::Utils::Headers.new }
|
|
8
|
+
env[:request_headers]['content-type'] = content_type if content_type
|
|
9
|
+
middleware.call(Faraday::Env.from(env)).env
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def result_body
|
|
13
|
+
result[:body]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def result_type
|
|
17
|
+
result[:request_headers]['content-type']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'no body' do
|
|
21
|
+
let(:result) { process(nil) }
|
|
22
|
+
|
|
23
|
+
it "doesn't change body" do
|
|
24
|
+
expect(result_body).to be_nil
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "doesn't add content type" do
|
|
28
|
+
expect(result_type).to be_nil
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'empty body' do
|
|
33
|
+
let(:result) { process('') }
|
|
34
|
+
|
|
35
|
+
it "doesn't change body" do
|
|
36
|
+
expect(result_body).to be_empty
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "doesn't add content type" do
|
|
40
|
+
expect(result_type).to be_nil
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context 'string body' do
|
|
45
|
+
let(:result) { process('{"a":1}') }
|
|
46
|
+
|
|
47
|
+
it "doesn't change body" do
|
|
48
|
+
expect(result_body).to eq('{"a":1}')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'adds content type' do
|
|
52
|
+
expect(result_type).to eq('application/json')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'object body' do
|
|
57
|
+
let(:result) { process(a: 1) }
|
|
58
|
+
|
|
59
|
+
it 'encodes body' do
|
|
60
|
+
expect(result_body).to eq('{"a":1}')
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'adds content type' do
|
|
64
|
+
expect(result_type).to eq('application/json')
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
context 'empty object body' do
|
|
69
|
+
let(:result) { process({}) }
|
|
70
|
+
|
|
71
|
+
it 'encodes body' do
|
|
72
|
+
expect(result_body).to eq('{}')
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context 'object body with json type' do
|
|
77
|
+
let(:result) { process({ a: 1 }, 'application/json; charset=utf-8') }
|
|
78
|
+
|
|
79
|
+
it 'encodes body' do
|
|
80
|
+
expect(result_body).to eq('{"a":1}')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "doesn't change content type" do
|
|
84
|
+
expect(result_type).to eq('application/json; charset=utf-8')
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context 'object body with vendor json type' do
|
|
89
|
+
let(:result) { process({ a: 1 }, 'application/vnd.myapp.v1+json; charset=utf-8') }
|
|
90
|
+
|
|
91
|
+
it 'encodes body' do
|
|
92
|
+
expect(result_body).to eq('{"a":1}')
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "doesn't change content type" do
|
|
96
|
+
expect(result_type).to eq('application/vnd.myapp.v1+json; charset=utf-8')
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context 'object body with incompatible type' do
|
|
101
|
+
let(:result) { process({ a: 1 }, 'application/xml; charset=utf-8') }
|
|
102
|
+
|
|
103
|
+
it "doesn't change body" do
|
|
104
|
+
expect(result_body).to eq(a: 1)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "doesn't change content type" do
|
|
108
|
+
expect(result_type).to eq('application/xml; charset=utf-8')
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -157,7 +157,7 @@ RSpec.describe Faraday::Request::Multipart do
|
|
|
157
157
|
{
|
|
158
158
|
a: 1,
|
|
159
159
|
b: {
|
|
160
|
-
c: Faraday::
|
|
160
|
+
c: Faraday::FilePart.new(__FILE__, 'text/x-ruby', nil,
|
|
161
161
|
'Content-Disposition' => 'form-data; foo=1'),
|
|
162
162
|
d: 2
|
|
163
163
|
}
|
|
@@ -207,7 +207,7 @@ RSpec.describe Faraday::Request::Multipart do
|
|
|
207
207
|
let(:payload) do
|
|
208
208
|
{
|
|
209
209
|
json: Faraday::ParamPart.new(json, 'application/json'),
|
|
210
|
-
io: Faraday::
|
|
210
|
+
io: Faraday::FilePart.new(io, 'application/pdf')
|
|
211
211
|
}
|
|
212
212
|
end
|
|
213
213
|
|
|
@@ -239,7 +239,7 @@ RSpec.describe Faraday::Request::Multipart do
|
|
|
239
239
|
{
|
|
240
240
|
a: 1,
|
|
241
241
|
b: [{
|
|
242
|
-
c: Faraday::
|
|
242
|
+
c: Faraday::FilePart.new(__FILE__, 'text/x-ruby'),
|
|
243
243
|
d: 2
|
|
244
244
|
}]
|
|
245
245
|
}
|
|
@@ -284,8 +284,8 @@ RSpec.describe Faraday::Request::Multipart do
|
|
|
284
284
|
{
|
|
285
285
|
a: 1,
|
|
286
286
|
b: [
|
|
287
|
-
Faraday::
|
|
288
|
-
Faraday::
|
|
287
|
+
Faraday::FilePart.new(io, 'application/pdf'),
|
|
288
|
+
Faraday::FilePart.new(io, 'application/pdf')
|
|
289
289
|
]
|
|
290
290
|
}
|
|
291
291
|
end
|
|
@@ -32,6 +32,18 @@ RSpec.describe Faraday::Request::Retry do
|
|
|
32
32
|
|
|
33
33
|
it { expect(times_called).to eq(3) }
|
|
34
34
|
end
|
|
35
|
+
|
|
36
|
+
context 'and this is passed as a string custom exception' do
|
|
37
|
+
let(:options) { [{ exceptions: 'StandardError' }] }
|
|
38
|
+
|
|
39
|
+
it { expect(times_called).to eq(3) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'and a non-existent string custom exception is passed' do
|
|
43
|
+
let(:options) { [{ exceptions: 'WrongStandardErrorNotExisting' }] }
|
|
44
|
+
|
|
45
|
+
it { expect(times_called).to eq(1) }
|
|
46
|
+
end
|
|
35
47
|
end
|
|
36
48
|
|
|
37
49
|
context 'when an expected error happens' do
|
|
@@ -169,7 +181,7 @@ RSpec.describe Faraday::Request::Retry do
|
|
|
169
181
|
|
|
170
182
|
it 'UploadIO: should rewind files on retry' do
|
|
171
183
|
io = StringIO.new('Test data')
|
|
172
|
-
upload_io = Faraday::
|
|
184
|
+
upload_io = Faraday::FilePart.new(io, 'application/octet/stream')
|
|
173
185
|
|
|
174
186
|
rewound = 0
|
|
175
187
|
rewind = -> { rewound += 1 }
|
|
@@ -22,17 +22,6 @@ RSpec.describe Faraday::Request do
|
|
|
22
22
|
it { expect(subject.http_method).to eq(:post) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
describe 'deprecate method for HTTP method' do
|
|
26
|
-
let(:http_method) { :post }
|
|
27
|
-
let(:expected_warning) do
|
|
28
|
-
%r{WARNING: `Faraday::Request#method` is deprecated; use `#http_method` instead. It will be removed in or after version 2.0.\n`Faraday::Request#method` called from .+/spec/faraday/request_spec.rb:\d+.}
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it { expect(subject.method).to eq(:post) }
|
|
32
|
-
|
|
33
|
-
it { expect { subject.method }.to output(expected_warning).to_stderr }
|
|
34
|
-
end
|
|
35
|
-
|
|
36
25
|
context 'when setting the url on setup with a URI' do
|
|
37
26
|
let(:block) { proc { |req| req.url URI.parse('foo.json?a=1') } }
|
|
38
27
|
|