faraday 1.7.0 → 2.0.0.alpha.pre.1

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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -1
  3. data/README.md +16 -9
  4. data/examples/client_spec.rb +13 -0
  5. data/examples/client_test.rb +42 -3
  6. data/lib/faraday/adapter/test.rb +32 -43
  7. data/lib/faraday/adapter.rb +0 -5
  8. data/lib/faraday/connection.rb +8 -69
  9. data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
  10. data/lib/faraday/error.rb +1 -0
  11. data/lib/faraday/file_part.rb +0 -6
  12. data/lib/faraday/logging/formatter.rb +1 -0
  13. data/lib/faraday/middleware.rb +0 -1
  14. data/lib/faraday/middleware_registry.rb +15 -79
  15. data/lib/faraday/options.rb +3 -3
  16. data/lib/faraday/rack_builder.rb +1 -1
  17. data/lib/faraday/request/authorization.rb +31 -38
  18. data/lib/faraday/request/instrumentation.rb +2 -0
  19. data/lib/faraday/request/json.rb +55 -0
  20. data/lib/faraday/request/multipart.rb +2 -0
  21. data/lib/faraday/request/retry.rb +3 -1
  22. data/lib/faraday/request/url_encoded.rb +2 -0
  23. data/lib/faraday/request.rb +13 -31
  24. data/lib/faraday/response/json.rb +54 -0
  25. data/lib/faraday/response/logger.rb +4 -4
  26. data/lib/faraday/response/raise_error.rb +9 -1
  27. data/lib/faraday/response.rb +8 -19
  28. data/lib/faraday/utils/headers.rb +1 -1
  29. data/lib/faraday/utils.rb +9 -4
  30. data/lib/faraday/version.rb +1 -1
  31. data/lib/faraday.rb +6 -37
  32. data/spec/faraday/adapter/test_spec.rb +32 -0
  33. data/spec/faraday/connection_spec.rb +78 -51
  34. data/spec/faraday/options/env_spec.rb +2 -2
  35. data/spec/faraday/rack_builder_spec.rb +5 -43
  36. data/spec/faraday/request/authorization_spec.rb +15 -29
  37. data/spec/faraday/request/instrumentation_spec.rb +5 -7
  38. data/spec/faraday/request/json_spec.rb +111 -0
  39. data/spec/faraday/request/multipart_spec.rb +5 -5
  40. data/spec/faraday/request/retry_spec.rb +13 -1
  41. data/spec/faraday/request_spec.rb +0 -11
  42. data/spec/faraday/response/json_spec.rb +117 -0
  43. data/spec/faraday/response/raise_error_spec.rb +7 -4
  44. data/spec/faraday/utils_spec.rb +1 -1
  45. data/spec/support/fake_safe_buffer.rb +1 -1
  46. data/spec/support/shared_examples/request_method.rb +5 -5
  47. metadata +11 -134
  48. data/lib/faraday/adapter/typhoeus.rb +0 -15
  49. data/lib/faraday/autoload.rb +0 -87
  50. data/lib/faraday/dependency_loader.rb +0 -37
  51. data/lib/faraday/request/basic_authentication.rb +0 -20
  52. data/lib/faraday/request/token_authentication.rb +0 -20
  53. data/spec/faraday/adapter/em_http_spec.rb +0 -49
  54. data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
  55. data/spec/faraday/adapter/excon_spec.rb +0 -49
  56. data/spec/faraday/adapter/httpclient_spec.rb +0 -73
  57. data/spec/faraday/adapter/net_http_spec.rb +0 -64
  58. data/spec/faraday/adapter/patron_spec.rb +0 -18
  59. data/spec/faraday/adapter/rack_spec.rb +0 -8
  60. data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
  61. data/spec/faraday/response/middleware_spec.rb +0 -68
  62. data/spec/support/webmock_rack_app.rb +0 -68
data/lib/faraday.rb CHANGED
@@ -4,16 +4,10 @@ require 'cgi'
4
4
  require 'date'
5
5
  require 'set'
6
6
  require 'forwardable'
7
- require 'faraday/middleware_registry'
8
- require 'faraday/dependency_loader'
9
-
10
- unless defined?(::Faraday::Timer)
11
- require 'timeout'
12
- ::Faraday::Timer = Timeout
13
- end
14
-
15
7
  require 'faraday/version'
16
8
  require 'faraday/methods'
9
+ require 'faraday/error'
10
+ require 'faraday/middleware_registry'
17
11
  require 'faraday/utils'
18
12
  require 'faraday/options'
19
13
  require 'faraday/connection'
@@ -23,21 +17,9 @@ require 'faraday/middleware'
23
17
  require 'faraday/adapter'
24
18
  require 'faraday/request'
25
19
  require 'faraday/response'
26
- require 'faraday/error'
27
20
  require 'faraday/file_part'
28
21
  require 'faraday/param_part'
29
22
 
30
- unless defined?(JRUBY_VERSION)
31
- require 'faraday/em_http'
32
- require 'faraday/em_synchrony'
33
- end
34
- require 'faraday/excon'
35
- require 'faraday/httpclient'
36
- require 'faraday/net_http'
37
- require 'faraday/net_http_persistent'
38
- require 'faraday/patron'
39
- require 'faraday/rack'
40
-
41
23
  # This is the main namespace for Faraday.
42
24
  #
43
25
  # It provides methods to create {Connection} objects, and HTTP-related
@@ -51,6 +33,8 @@ require 'faraday/rack'
51
33
  # conn.get '/'
52
34
  #
53
35
  module Faraday
36
+ CONTENT_TYPE = 'Content-Type'
37
+
54
38
  class << self
55
39
  # The root path that Faraday is being loaded from.
56
40
  #
@@ -65,7 +49,7 @@ module Faraday
65
49
 
66
50
  # @overload default_adapter
67
51
  # Gets the Symbol key identifying a default Adapter to use
68
- # for the default {Faraday::Connection}. Defaults to `:net_http`.
52
+ # for the default {Faraday::Connection}. Defaults to `:test`.
69
53
  # @return [Symbol] the default adapter
70
54
  # @overload default_adapter=(adapter)
71
55
  # Updates default adapter while resetting {.default_connection}.
@@ -112,19 +96,6 @@ module Faraday
112
96
  Faraday::Connection.new(url, options, &block)
113
97
  end
114
98
 
115
- # @private
116
- # Internal: Requires internal Faraday libraries.
117
- #
118
- # @param libs [Array] one or more relative String names to Faraday classes.
119
- # @return [void]
120
- def require_libs(*libs)
121
- libs.each do |lib|
122
- require "#{lib_path}/#{lib}"
123
- end
124
- end
125
-
126
- alias require_lib require_libs
127
-
128
99
  # Documented elsewhere, see default_adapter reader
129
100
  def default_adapter=(adapter)
130
101
  @default_connection = nil
@@ -179,7 +150,5 @@ module Faraday
179
150
  self.ignore_env_proxy = false
180
151
  self.root_path = File.expand_path __dir__
181
152
  self.lib_path = File.expand_path 'faraday', __dir__
182
- self.default_adapter = :net_http
183
-
184
- require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
153
+ self.default_adapter = :test
185
154
  end
@@ -258,6 +258,38 @@ RSpec.describe Faraday::Adapter::Test do
258
258
  end
259
259
  end
260
260
 
261
+ describe 'for request with non default params encoder' do
262
+ let(:connection) do
263
+ Faraday.new(request: { params_encoder: Faraday::FlatParamsEncoder }) do |builder|
264
+ builder.adapter :test, stubs
265
+ end
266
+ end
267
+ let(:stubs) do
268
+ described_class::Stubs.new do |stubs|
269
+ stubs.get('/path?a=x&a=y&a=z') { [200, {}, 'a'] }
270
+ end
271
+ end
272
+
273
+ context 'when all flat param values are correctly set' do
274
+ subject(:request) { connection.get('/path?a=x&a=y&a=z') }
275
+
276
+ it { expect(request.status).to eq 200 }
277
+ end
278
+
279
+ shared_examples 'raise NotFound when params do not satisfy the flat param values' do |params|
280
+ subject(:request) { connection.get('/path', params) }
281
+
282
+ context "with #{params.inspect}" do
283
+ it { expect { request }.to raise_error described_class::Stubs::NotFound }
284
+ end
285
+ end
286
+
287
+ it_behaves_like 'raise NotFound when params do not satisfy the flat param values', { a: %w[x] }
288
+ it_behaves_like 'raise NotFound when params do not satisfy the flat param values', { a: %w[x y] }
289
+ it_behaves_like 'raise NotFound when params do not satisfy the flat param values', { a: %w[x z y] } # NOTE: The order of the value is also compared.
290
+ it_behaves_like 'raise NotFound when params do not satisfy the flat param values', { b: %w[x y z] }
291
+ end
292
+
261
293
  describe 'strict_mode' do
262
294
  let(:stubs) do
263
295
  described_class::Stubs.new(strict_mode: true) do |stubs|
@@ -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 :net_http
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
- before { stub_request(:get, 'http://example.com') }
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('http://example.com') do |req|
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('http://example.com')
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!(:stubbed) { stub_request(:get, 'http://example.com?a=a&p=3') }
647
+ let(:stubs) { Faraday::Adapter::Test::Stubs.new }
649
648
 
650
- after { expect(stubbed).to have_been_made.once }
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
- stubbed = stub_request(:get, 'http://example.com?a=1&b=2&c=3&limit=5&page=1')
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
- expect(stubbed).to have_been_made.once
688
+ stubs.verify_stubbed_calls
677
689
  end
678
690
 
679
691
  it 'allows to override all params' do
680
- stubbed = stub_request(:get, 'http://example.com?b=b')
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
- expect(stubbed).to have_been_made.once
701
+ stubs.verify_stubbed_calls
689
702
  end
690
703
 
691
704
  it 'allows to set params_encoder for single request' do
692
- encoder = Object.new
693
- def encoder.encode(params)
694
- params.map { |k, v| "#{k.upcase}-#{v.to_s.upcase}" }.join(',')
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
- expect(stubbed).to have_been_made.once
712
+ stubs.verify_stubbed_calls
702
713
  end
703
714
  end
704
715
 
705
716
  context 'with default params encoder' do
706
- let!(:stubbed) { stub_request(:get, 'http://example.com?color%5B%5D=red&color%5B%5D=blue') }
707
- after { expect(stubbed).to have_been_made.once }
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[]=red&color[]=blue')
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 blue])
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!(:stubbed) { stub_request(:get, 'http://example.com?color=blue') }
721
- after { expect(stubbed).to have_been_made.once }
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 blue])
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[]=red&color[]=blue' }
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] = :custom_2
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(:custom_2)
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 Broken < Faraday::Middleware
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 request adapter is added with named arguments' do
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 response adapter is added with named arguments' do
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::Response::Middleware) do
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: 'Token token="bar"') }
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('Token token="bar"')
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) { :basic_auth }
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 'token_auth' do
48
- let(:auth_type) { :token_auth }
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 other values are provided' do
59
- let(:auth_config) { ['baz', { foo: 42 }] }
50
+ context 'when passed a string' do
51
+ let(:auth_config) { ['custom'] }
60
52
 
61
- it { expect(response.body).to match(/^Token /) }
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 two strings' do
73
- let(:auth_config) { ['custom', 'abc def'] }
58
+ context 'when passed a proc' do
59
+ let(:auth_config) { [-> { 'custom_from_proc' }] }
74
60
 
75
- it { expect(response.body).to eq('custom abc def') }
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 a string and a hash' do
81
- let(:auth_config) { ['baz', { foo: 42 }] }
66
+ context 'when passed too many arguments' do
67
+ let(:auth_config) { %w[baz foo] }
82
68
 
83
- it { expect(response.body).to eq('baz foo="42"') }
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
- begin
34
- res = options.instrumenter
35
- rescue NameError => e
36
- expect(e.to_s).to match('ActiveSupport')
37
- else
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