faraday 1.0.0 → 2.0.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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +221 -1
  3. data/LICENSE.md +1 -1
  4. data/README.md +19 -14
  5. data/examples/client_spec.rb +36 -4
  6. data/examples/client_test.rb +43 -4
  7. data/lib/faraday/adapter/test.rb +61 -43
  8. data/lib/faraday/adapter.rb +3 -16
  9. data/lib/faraday/adapter_registry.rb +3 -1
  10. data/lib/faraday/connection.rb +25 -78
  11. data/lib/faraday/encoders/flat_params_encoder.rb +9 -2
  12. data/lib/faraday/encoders/nested_params_encoder.rb +9 -4
  13. data/lib/faraday/error.rb +23 -8
  14. data/lib/faraday/logging/formatter.rb +1 -0
  15. data/lib/faraday/methods.rb +6 -0
  16. data/lib/faraday/middleware.rb +14 -5
  17. data/lib/faraday/middleware_registry.rb +15 -79
  18. data/lib/faraday/options/proxy_options.rb +4 -0
  19. data/lib/faraday/options.rb +7 -11
  20. data/lib/faraday/rack_builder.rb +34 -30
  21. data/lib/faraday/request/authorization.rb +32 -36
  22. data/lib/faraday/request/instrumentation.rb +2 -0
  23. data/lib/faraday/request/json.rb +55 -0
  24. data/lib/faraday/request/url_encoded.rb +5 -1
  25. data/lib/faraday/request.rb +13 -23
  26. data/lib/faraday/response/json.rb +54 -0
  27. data/lib/faraday/response/logger.rb +4 -4
  28. data/lib/faraday/response/raise_error.rb +20 -1
  29. data/lib/faraday/response.rb +8 -22
  30. data/lib/faraday/utils/headers.rb +3 -3
  31. data/lib/faraday/utils.rb +21 -8
  32. data/lib/faraday/version.rb +5 -0
  33. data/lib/faraday.rb +44 -59
  34. data/spec/faraday/adapter/test_spec.rb +377 -0
  35. data/spec/faraday/connection_spec.rb +147 -51
  36. data/spec/faraday/error_spec.rb +15 -0
  37. data/spec/faraday/middleware_spec.rb +32 -6
  38. data/spec/faraday/options/env_spec.rb +2 -2
  39. data/spec/faraday/options/proxy_options_spec.rb +7 -0
  40. data/spec/faraday/params_encoders/flat_spec.rb +8 -0
  41. data/spec/faraday/params_encoders/nested_spec.rb +8 -0
  42. data/spec/faraday/rack_builder_spec.rb +144 -38
  43. data/spec/faraday/request/authorization_spec.rb +19 -24
  44. data/spec/faraday/request/instrumentation_spec.rb +5 -7
  45. data/spec/faraday/request/json_spec.rb +111 -0
  46. data/spec/faraday/request/url_encoded_spec.rb +13 -1
  47. data/spec/faraday/request_spec.rb +6 -6
  48. data/spec/faraday/response/json_spec.rb +117 -0
  49. data/spec/faraday/response/raise_error_spec.rb +66 -0
  50. data/spec/faraday/utils_spec.rb +62 -1
  51. data/spec/support/fake_safe_buffer.rb +1 -1
  52. data/spec/support/helper_methods.rb +0 -37
  53. data/spec/support/shared_examples/adapter.rb +2 -2
  54. data/spec/support/shared_examples/request_method.rb +43 -28
  55. metadata +16 -48
  56. data/UPGRADING.md +0 -55
  57. data/lib/faraday/adapter/em_http.rb +0 -285
  58. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -62
  59. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -69
  60. data/lib/faraday/adapter/em_synchrony.rb +0 -150
  61. data/lib/faraday/adapter/excon.rb +0 -124
  62. data/lib/faraday/adapter/httpclient.rb +0 -151
  63. data/lib/faraday/adapter/net_http.rb +0 -209
  64. data/lib/faraday/adapter/net_http_persistent.rb +0 -91
  65. data/lib/faraday/adapter/patron.rb +0 -132
  66. data/lib/faraday/adapter/rack.rb +0 -75
  67. data/lib/faraday/adapter/typhoeus.rb +0 -15
  68. data/lib/faraday/autoload.rb +0 -95
  69. data/lib/faraday/dependency_loader.rb +0 -37
  70. data/lib/faraday/file_part.rb +0 -128
  71. data/lib/faraday/param_part.rb +0 -53
  72. data/lib/faraday/request/basic_authentication.rb +0 -20
  73. data/lib/faraday/request/multipart.rb +0 -99
  74. data/lib/faraday/request/retry.rb +0 -239
  75. data/lib/faraday/request/token_authentication.rb +0 -20
  76. data/spec/faraday/adapter/em_http_spec.rb +0 -47
  77. data/spec/faraday/adapter/em_synchrony_spec.rb +0 -16
  78. data/spec/faraday/adapter/excon_spec.rb +0 -49
  79. data/spec/faraday/adapter/httpclient_spec.rb +0 -73
  80. data/spec/faraday/adapter/net_http_persistent_spec.rb +0 -57
  81. data/spec/faraday/adapter/net_http_spec.rb +0 -64
  82. data/spec/faraday/adapter/patron_spec.rb +0 -18
  83. data/spec/faraday/adapter/rack_spec.rb +0 -8
  84. data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
  85. data/spec/faraday/composite_read_io_spec.rb +0 -80
  86. data/spec/faraday/request/multipart_spec.rb +0 -274
  87. data/spec/faraday/request/retry_spec.rb +0 -242
  88. data/spec/faraday/response/middleware_spec.rb +0 -52
  89. 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' }
@@ -18,6 +28,13 @@ shared_examples 'initializer with url' do
18
28
  it { expect(subject.path_prefix).to eq('/fish') }
19
29
  it { expect(subject.params).to eq('a' => '1') }
20
30
  end
31
+
32
+ context 'with IPv6 address' do
33
+ let(:address) { 'http://[::1]:85/' }
34
+
35
+ it { expect(subject.host).to eq('[::1]') }
36
+ it { expect(subject.port).to eq(85) }
37
+ end
21
38
  end
22
39
 
23
40
  shared_examples 'default connection options' do
@@ -96,6 +113,12 @@ RSpec.describe Faraday::Connection do
96
113
  it { expect(subject.params).to eq('a' => 3, 'b' => '2') }
97
114
  end
98
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
+
99
122
  context 'with custom headers' do
100
123
  let(:options) { { headers: { user_agent: 'Faraday' } } }
101
124
 
@@ -117,7 +140,7 @@ RSpec.describe Faraday::Connection do
117
140
  context 'with block' do
118
141
  let(:conn) do
119
142
  Faraday::Connection.new(params: { 'a' => '1' }) do |faraday|
120
- faraday.adapter :net_http
143
+ faraday.adapter :test
121
144
  faraday.url_prefix = 'http://sushi.com/omnom'
122
145
  end
123
146
  end
@@ -128,34 +151,15 @@ RSpec.describe Faraday::Connection do
128
151
  end
129
152
 
130
153
  describe '#close' do
154
+ before { Faraday.default_adapter = :test }
155
+ after { Faraday.default_adapter = nil }
156
+
131
157
  it 'can close underlying app' do
132
158
  expect(conn.app).to receive(:close)
133
159
  conn.close
134
160
  end
135
161
  end
136
162
 
137
- describe 'basic_auth' do
138
- subject { conn }
139
-
140
- context 'calling the #basic_auth method' do
141
- before { subject.basic_auth 'Aladdin', 'open sesame' }
142
-
143
- it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
144
- end
145
-
146
- context 'adding basic auth info to url' do
147
- let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' }
148
-
149
- it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
150
- end
151
- end
152
-
153
- describe '#token_auth' do
154
- before { subject.token_auth('abcdef', nonce: 'abc') }
155
-
156
- it { expect(subject.headers['Authorization']).to eq('Token nonce="abc", token="abcdef"') }
157
- end
158
-
159
163
  describe '#build_exclusive_url' do
160
164
  context 'with relative path' do
161
165
  subject { conn.build_exclusive_url('sake.html') }
@@ -246,6 +250,13 @@ RSpec.describe Faraday::Connection do
246
250
  expect(uri.path).to eq('/sake.html')
247
251
  end
248
252
 
253
+ it 'always returns new URI instance' do
254
+ conn.url_prefix = 'http://sushi.com'
255
+ uri1 = conn.build_exclusive_url(nil)
256
+ uri2 = conn.build_exclusive_url(nil)
257
+ expect(uri1).not_to equal(uri2)
258
+ end
259
+
249
260
  context 'with url_prefixed connection' do
250
261
  let(:url) { 'http://sushi.com/sushi/' }
251
262
 
@@ -270,6 +281,29 @@ RSpec.describe Faraday::Connection do
270
281
  expect(uri.to_s).to eq('http://sushi.com/sake/')
271
282
  end
272
283
  end
284
+
285
+ context 'with colon in path' do
286
+ let(:url) { 'http://service.com' }
287
+
288
+ it 'joins url to base when used absolute path' do
289
+ conn = Faraday.new(url: url)
290
+ uri = conn.build_exclusive_url('/service:search?limit=400')
291
+ expect(uri.to_s).to eq('http://service.com/service:search?limit=400')
292
+ end
293
+
294
+ it 'joins url to base when used relative path' do
295
+ conn = Faraday.new(url: url)
296
+ uri = conn.build_exclusive_url('service:search?limit=400')
297
+ expect(uri.to_s).to eq('http://service.com/service%3Asearch?limit=400')
298
+ end
299
+
300
+ it 'joins url to base when used with path prefix' do
301
+ conn = Faraday.new(url: url)
302
+ conn.path_prefix = '/api'
303
+ uri = conn.build_exclusive_url('service:search?limit=400')
304
+ expect(uri.to_s).to eq('http://service.com/api/service%3Asearch?limit=400')
305
+ end
306
+ end
273
307
  end
274
308
 
275
309
  describe '#build_url' do
@@ -412,6 +446,14 @@ RSpec.describe Faraday::Connection do
412
446
  end
413
447
  end
414
448
 
449
+ it 'allows when url in no proxy list with url_prefix' do
450
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
451
+ conn = Faraday::Connection.new
452
+ conn.url_prefix = 'http://example.com'
453
+ expect(conn.proxy).to be_nil
454
+ end
455
+ end
456
+
415
457
  it 'allows when prefixed url is not in no proxy list' do
416
458
  with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
417
459
  conn = Faraday::Connection.new('http://prefixedexample.com')
@@ -511,26 +553,32 @@ RSpec.describe Faraday::Connection do
511
553
  end
512
554
 
513
555
  context 'performing a request' do
514
- before { stub_request(:get, 'http://example.com') }
556
+ let(:url) { 'http://example.com' }
557
+ let(:conn) do
558
+ Faraday.new do |f|
559
+ f.adapter :test do |stubs|
560
+ stubs.get(url) do
561
+ [200, {}, 'ok']
562
+ end
563
+ end
564
+ end
565
+ end
515
566
 
516
567
  it 'dynamically checks proxy' do
517
568
  with_env 'http_proxy' => 'http://proxy.com:80' do
518
- conn = Faraday.new
519
569
  expect(conn.proxy.uri.host).to eq('proxy.com')
520
570
 
521
- conn.get('http://example.com') do |req|
571
+ conn.get(url) do |req|
522
572
  expect(req.options.proxy.uri.host).to eq('proxy.com')
523
573
  end
524
574
  end
525
575
 
526
- conn.get('http://example.com')
576
+ conn.get(url)
527
577
  expect(conn.instance_variable_get('@temp_proxy')).to be_nil
528
578
  end
529
579
 
530
580
  it 'dynamically check no proxy' do
531
581
  with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
532
- conn = Faraday.new
533
-
534
582
  expect(conn.proxy.uri.host).to eq('proxy.com')
535
583
 
536
584
  conn.get('http://example.com') do |req|
@@ -560,7 +608,6 @@ RSpec.describe Faraday::Connection do
560
608
 
561
609
  context 'after manual changes' do
562
610
  before do
563
- subject.basic_auth('', '')
564
611
  subject.headers['content-length'] = 12
565
612
  subject.params['b'] = '2'
566
613
  subject.options[:open_timeout] = 10
@@ -595,14 +642,42 @@ RSpec.describe Faraday::Connection do
595
642
 
596
643
  it_behaves_like 'default connection options'
597
644
  end
645
+
646
+ context 'preserving a user_agent assigned via default_conncetion_options' do
647
+ around do |example|
648
+ old = Faraday.default_connection_options
649
+ Faraday.default_connection_options = { headers: { user_agent: 'My Agent 1.2' } }
650
+ example.run
651
+ Faraday.default_connection_options = old
652
+ end
653
+
654
+ context 'when url is a Hash' do
655
+ let(:conn) { Faraday.new(url: 'http://example.co', headers: { 'CustomHeader' => 'CustomValue' }) }
656
+
657
+ it { expect(conn.headers).to eq('CustomHeader' => 'CustomValue', 'User-Agent' => 'My Agent 1.2') }
658
+ end
659
+
660
+ context 'when url is a String' do
661
+ let(:conn) { Faraday.new('http://example.co', headers: { 'CustomHeader' => 'CustomValue' }) }
662
+
663
+ it { expect(conn.headers).to eq('CustomHeader' => 'CustomValue', 'User-Agent' => 'My Agent 1.2') }
664
+ end
665
+ end
598
666
  end
599
667
 
600
668
  describe 'request params' do
601
669
  context 'with simple url' do
602
670
  let(:url) { 'http://example.com' }
603
- let!(:stubbed) { stub_request(:get, 'http://example.com?a=a&p=3') }
671
+ let(:stubs) { Faraday::Adapter::Test::Stubs.new }
672
+
673
+ before do
674
+ conn.adapter(:test, stubs)
675
+ stubs.get('http://example.com?a=a&p=3') do
676
+ [200, {}, 'ok']
677
+ end
678
+ end
604
679
 
605
- after { expect(stubbed).to have_been_made.once }
680
+ after { stubs.verify_stubbed_calls }
606
681
 
607
682
  it 'test_overrides_request_params' do
608
683
  conn.get('?p=2&a=a', p: 3)
@@ -624,15 +699,22 @@ RSpec.describe Faraday::Connection do
624
699
  context 'with url and extra params' do
625
700
  let(:url) { 'http://example.com?a=1&b=2' }
626
701
  let(:options) { { params: { c: 3 } } }
702
+ let(:stubs) { Faraday::Adapter::Test::Stubs.new }
703
+
704
+ before do
705
+ conn.adapter(:test, stubs)
706
+ end
627
707
 
628
708
  it 'merges connection and request params' do
629
- stubbed = stub_request(:get, 'http://example.com?a=1&b=2&c=3&limit=5&page=1')
709
+ expected = 'http://example.com?a=1&b=2&c=3&limit=5&page=1'
710
+ stubs.get(expected) { [200, {}, 'ok'] }
630
711
  conn.get('?page=1', limit: 5)
631
- expect(stubbed).to have_been_made.once
712
+ stubs.verify_stubbed_calls
632
713
  end
633
714
 
634
715
  it 'allows to override all params' do
635
- stubbed = stub_request(:get, 'http://example.com?b=b')
716
+ expected = 'http://example.com?b=b'
717
+ stubs.get(expected) { [200, {}, 'ok'] }
636
718
  conn.get('?p=1&a=a', p: 2) do |req|
637
719
  expect(req.params[:a]).to eq('a')
638
720
  expect(req.params['c']).to eq(3)
@@ -640,47 +722,61 @@ RSpec.describe Faraday::Connection do
640
722
  req.params = { b: 'b' }
641
723
  expect(req.params['b']).to eq('b')
642
724
  end
643
- expect(stubbed).to have_been_made.once
725
+ stubs.verify_stubbed_calls
644
726
  end
645
727
 
646
728
  it 'allows to set params_encoder for single request' do
647
- encoder = Object.new
648
- def encoder.encode(params)
649
- params.map { |k, v| "#{k.upcase}-#{v.to_s.upcase}" }.join(',')
650
- end
651
- stubbed = stub_request(:get, 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE')
729
+ encoder = CustomEncoder.new
730
+ expected = 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE'
731
+ stubs.get(expected) { [200, {}, 'ok'] }
652
732
 
653
- conn.get('/', feeling: 'blue') do |req|
733
+ conn.get('/', a: 1, b: 2, c: 3, feeling: 'blue') do |req|
654
734
  req.options.params_encoder = encoder
655
735
  end
656
- expect(stubbed).to have_been_made.once
736
+ stubs.verify_stubbed_calls
657
737
  end
658
738
  end
659
739
 
660
740
  context 'with default params encoder' do
661
- let!(:stubbed) { stub_request(:get, 'http://example.com?color%5B%5D=red&color%5B%5D=blue') }
662
- after { expect(stubbed).to have_been_made.once }
741
+ let(:stubs) { Faraday::Adapter::Test::Stubs.new }
742
+
743
+ before do
744
+ conn.adapter(:test, stubs)
745
+ stubs.get('http://example.com?color%5B%5D=blue&color%5B%5D=red') do
746
+ [200, {}, 'ok']
747
+ end
748
+ end
749
+
750
+ after { stubs.verify_stubbed_calls }
663
751
 
664
752
  it 'supports array params in url' do
665
- conn.get('http://example.com?color[]=red&color[]=blue')
753
+ conn.get('http://example.com?color[]=blue&color[]=red')
666
754
  end
667
755
 
668
756
  it 'supports array params in params' do
669
- conn.get('http://example.com', color: %w[red blue])
757
+ conn.get('http://example.com', color: %w[blue red])
670
758
  end
671
759
  end
672
760
 
673
761
  context 'with flat params encoder' do
674
762
  let(:options) { { request: { params_encoder: Faraday::FlatParamsEncoder } } }
675
- let!(:stubbed) { stub_request(:get, 'http://example.com?color=blue') }
676
- after { expect(stubbed).to have_been_made.once }
763
+ let(:stubs) { Faraday::Adapter::Test::Stubs.new }
764
+
765
+ before do
766
+ conn.adapter(:test, stubs)
767
+ stubs.get('http://example.com?color=blue&color=red') do
768
+ [200, {}, 'ok']
769
+ end
770
+ end
771
+
772
+ after { stubs.verify_stubbed_calls }
677
773
 
678
774
  it 'supports array params in params' do
679
- conn.get('http://example.com', color: %w[red blue])
775
+ conn.get('http://example.com', color: %w[blue red])
680
776
  end
681
777
 
682
778
  context 'with array param in url' do
683
- let(:url) { 'http://example.com?color[]=red&color[]=blue' }
779
+ let(:url) { 'http://example.com?color[]=blue&color[]=red' }
684
780
 
685
781
  it do
686
782
  conn.get('/')
@@ -13,6 +13,7 @@ RSpec.describe Faraday::ClientError do
13
13
  it { expect(subject.message).to eq(exception.message) }
14
14
  it { expect(subject.backtrace).to eq(exception.backtrace) }
15
15
  it { expect(subject.inspect).to eq('#<Faraday::ClientError wrapped=#<RuntimeError: test>>') }
16
+ it { expect(subject.response_status).to be_nil }
16
17
  end
17
18
 
18
19
  context 'with response hash' do
@@ -22,6 +23,7 @@ RSpec.describe Faraday::ClientError do
22
23
  it { expect(subject.response).to eq(exception) }
23
24
  it { expect(subject.message).to eq('the server responded with status 400') }
24
25
  it { expect(subject.inspect).to eq('#<Faraday::ClientError response={:status=>400}>') }
26
+ it { expect(subject.response_status).to eq(400) }
25
27
  end
26
28
 
27
29
  context 'with string' do
@@ -31,6 +33,7 @@ RSpec.describe Faraday::ClientError do
31
33
  it { expect(subject.response).to be_nil }
32
34
  it { expect(subject.message).to eq('custom message') }
33
35
  it { expect(subject.inspect).to eq('#<Faraday::ClientError #<Faraday::ClientError: custom message>>') }
36
+ it { expect(subject.response_status).to be_nil }
34
37
  end
35
38
 
36
39
  context 'with anything else #to_s' do
@@ -40,6 +43,18 @@ RSpec.describe Faraday::ClientError do
40
43
  it { expect(subject.response).to be_nil }
41
44
  it { expect(subject.message).to eq('["error1", "error2"]') }
42
45
  it { expect(subject.inspect).to eq('#<Faraday::ClientError #<Faraday::ClientError: ["error1", "error2"]>>') }
46
+ it { expect(subject.response_status).to be_nil }
47
+ end
48
+
49
+ context 'with exception string and response hash' do
50
+ let(:exception) { 'custom message' }
51
+ let(:response) { { status: 400 } }
52
+
53
+ it { expect(subject.wrapped_exception).to be_nil }
54
+ it { expect(subject.response).to eq(response) }
55
+ it { expect(subject.message).to eq('custom message') }
56
+ it { expect(subject.inspect).to eq('#<Faraday::ClientError response={:status=>400}>') }
57
+ it { expect(subject.response_status).to eq(400) }
43
58
  end
44
59
  end
45
60
  end
@@ -2,23 +2,49 @@
2
2
 
3
3
  RSpec.describe Faraday::Middleware do
4
4
  subject { described_class.new(app) }
5
+ let(:app) { double }
6
+
7
+ describe 'options' do
8
+ context 'when options are passed to the middleware' do
9
+ subject { described_class.new(app, options) }
10
+ let(:options) { { field: 'value' } }
11
+
12
+ it 'accepts options when initialized' do
13
+ expect(subject.options[:field]).to eq('value')
14
+ end
15
+ end
16
+ end
17
+
18
+ describe '#on_request' do
19
+ subject do
20
+ Class.new(described_class) do
21
+ def on_request(env)
22
+ # do nothing
23
+ end
24
+ end.new(app)
25
+ end
26
+
27
+ it 'is called by #call' do
28
+ expect(app).to receive(:call).and_return(app)
29
+ expect(app).to receive(:on_complete)
30
+ is_expected.to receive(:call).and_call_original
31
+ is_expected.to receive(:on_request)
32
+ subject.call(double)
33
+ end
34
+ end
5
35
 
6
36
  describe '#close' do
7
37
  context "with app that doesn't support \#close" do
8
- let(:app) { double }
9
-
10
38
  it 'should issue warning' do
11
- expect(subject).to receive(:warn)
39
+ is_expected.to receive(:warn)
12
40
  subject.close
13
41
  end
14
42
  end
15
43
 
16
44
  context "with app that supports \#close" do
17
- let(:app) { double }
18
-
19
45
  it 'should issue warning' do
20
46
  expect(app).to receive(:close)
21
- expect(subject).to_not receive(:warn)
47
+ is_expected.to_not receive(:warn)
22
48
  subject.close
23
49
  end
24
50
  end
@@ -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
 
@@ -14,6 +14,13 @@ RSpec.describe Faraday::ProxyOptions do
14
14
  expect(options.inspect).to match('#<Faraday::ProxyOptions uri=')
15
15
  end
16
16
 
17
+ it 'defaults to http' do
18
+ options = Faraday::ProxyOptions.from 'example.org'
19
+ expect(options.port).to eq(80)
20
+ expect(options.host).to eq('example.org')
21
+ expect(options.scheme).to eq('http')
22
+ end
23
+
17
24
  it 'works with nil' do
18
25
  options = Faraday::ProxyOptions.from nil
19
26
  expect(options).to be_a_kind_of(Faraday::ProxyOptions)
@@ -31,4 +31,12 @@ RSpec.describe Faraday::FlatParamsEncoder do
31
31
  params = { a: [] }
32
32
  expect(subject.encode(params)).to eq('a=')
33
33
  end
34
+
35
+ it 'encodes unsorted when asked' do
36
+ params = { b: false, a: true }
37
+ expect(subject.encode(params)).to eq('a=true&b=false')
38
+ Faraday::FlatParamsEncoder.sort_params = false
39
+ expect(subject.encode(params)).to eq('b=false&a=true')
40
+ Faraday::FlatParamsEncoder.sort_params = true
41
+ end
34
42
  end
@@ -94,6 +94,14 @@ RSpec.describe Faraday::NestedParamsEncoder do
94
94
  expect(subject.encode(params)).to eq('a%5B%5D=true&a%5B%5D=false')
95
95
  end
96
96
 
97
+ it 'encodes unsorted when asked' do
98
+ params = { b: false, a: true }
99
+ expect(subject.encode(params)).to eq('a=true&b=false')
100
+ Faraday::NestedParamsEncoder.sort_params = false
101
+ expect(subject.encode(params)).to eq('b=false&a=true')
102
+ Faraday::NestedParamsEncoder.sort_params = true
103
+ end
104
+
97
105
  shared_examples 'a wrong decoding' do
98
106
  it do
99
107
  expect { subject.decode(query) }.to raise_error(TypeError) do |e|