faraday 0.7.4 → 1.0.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 (119) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +276 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +40 -153
  5. data/Rakefile +4 -139
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday/adapter/em_http.rb +286 -0
  9. data/lib/faraday/adapter/em_http_ssl_patch.rb +62 -0
  10. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +69 -0
  11. data/lib/faraday/adapter/em_synchrony.rb +120 -36
  12. data/lib/faraday/adapter/excon.rb +108 -12
  13. data/lib/faraday/adapter/httpclient.rb +152 -0
  14. data/lib/faraday/adapter/net_http.rb +187 -43
  15. data/lib/faraday/adapter/net_http_persistent.rb +91 -0
  16. data/lib/faraday/adapter/patron.rb +106 -10
  17. data/lib/faraday/adapter/rack.rb +75 -0
  18. data/lib/faraday/adapter/test.rb +160 -61
  19. data/lib/faraday/adapter/typhoeus.rb +7 -46
  20. data/lib/faraday/adapter.rb +105 -33
  21. data/lib/faraday/adapter_registry.rb +30 -0
  22. data/lib/faraday/autoload.rb +95 -0
  23. data/lib/faraday/connection.rb +525 -157
  24. data/lib/faraday/dependency_loader.rb +37 -0
  25. data/lib/faraday/encoders/flat_params_encoder.rb +98 -0
  26. data/lib/faraday/encoders/nested_params_encoder.rb +171 -0
  27. data/lib/faraday/error.rb +122 -30
  28. data/lib/faraday/file_part.rb +128 -0
  29. data/lib/faraday/logging/formatter.rb +105 -0
  30. data/lib/faraday/middleware.rb +14 -22
  31. data/lib/faraday/middleware_registry.rb +129 -0
  32. data/lib/faraday/options/connection_options.rb +22 -0
  33. data/lib/faraday/options/env.rb +181 -0
  34. data/lib/faraday/options/proxy_options.rb +28 -0
  35. data/lib/faraday/options/request_options.rb +22 -0
  36. data/lib/faraday/options/ssl_options.rb +59 -0
  37. data/lib/faraday/options.rb +222 -0
  38. data/lib/faraday/param_part.rb +53 -0
  39. data/lib/faraday/parameters.rb +5 -0
  40. data/lib/faraday/rack_builder.rb +248 -0
  41. data/lib/faraday/request/authorization.rb +55 -0
  42. data/lib/faraday/request/basic_authentication.rb +20 -0
  43. data/lib/faraday/request/instrumentation.rb +54 -0
  44. data/lib/faraday/request/multipart.rb +84 -48
  45. data/lib/faraday/request/retry.rb +239 -0
  46. data/lib/faraday/request/token_authentication.rb +20 -0
  47. data/lib/faraday/request/url_encoded.rb +46 -27
  48. data/lib/faraday/request.rb +112 -50
  49. data/lib/faraday/response/logger.rb +24 -25
  50. data/lib/faraday/response/raise_error.rb +40 -11
  51. data/lib/faraday/response.rb +44 -35
  52. data/lib/faraday/utils/headers.rb +139 -0
  53. data/lib/faraday/utils/params_hash.rb +61 -0
  54. data/lib/faraday/utils.rb +72 -117
  55. data/lib/faraday.rb +142 -64
  56. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  57. data/spec/faraday/adapter/em_http_spec.rb +47 -0
  58. data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
  59. data/spec/faraday/adapter/excon_spec.rb +49 -0
  60. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  61. data/spec/faraday/adapter/net_http_persistent_spec.rb +57 -0
  62. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  63. data/spec/faraday/adapter/patron_spec.rb +18 -0
  64. data/spec/faraday/adapter/rack_spec.rb +8 -0
  65. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  66. data/spec/faraday/adapter_registry_spec.rb +28 -0
  67. data/spec/faraday/adapter_spec.rb +55 -0
  68. data/spec/faraday/composite_read_io_spec.rb +80 -0
  69. data/spec/faraday/connection_spec.rb +691 -0
  70. data/spec/faraday/error_spec.rb +45 -0
  71. data/spec/faraday/middleware_spec.rb +26 -0
  72. data/spec/faraday/options/env_spec.rb +70 -0
  73. data/spec/faraday/options/options_spec.rb +297 -0
  74. data/spec/faraday/options/proxy_options_spec.rb +37 -0
  75. data/spec/faraday/options/request_options_spec.rb +19 -0
  76. data/spec/faraday/params_encoders/flat_spec.rb +34 -0
  77. data/spec/faraday/params_encoders/nested_spec.rb +134 -0
  78. data/spec/faraday/rack_builder_spec.rb +196 -0
  79. data/spec/faraday/request/authorization_spec.rb +88 -0
  80. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  81. data/spec/faraday/request/multipart_spec.rb +274 -0
  82. data/spec/faraday/request/retry_spec.rb +242 -0
  83. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  84. data/spec/faraday/request_spec.rb +109 -0
  85. data/spec/faraday/response/logger_spec.rb +220 -0
  86. data/spec/faraday/response/middleware_spec.rb +68 -0
  87. data/spec/faraday/response/raise_error_spec.rb +106 -0
  88. data/spec/faraday/response_spec.rb +75 -0
  89. data/spec/faraday/utils/headers_spec.rb +82 -0
  90. data/spec/faraday/utils_spec.rb +56 -0
  91. data/spec/faraday_spec.rb +37 -0
  92. data/spec/spec_helper.rb +132 -0
  93. data/spec/support/disabling_stub.rb +14 -0
  94. data/spec/support/fake_safe_buffer.rb +15 -0
  95. data/spec/support/helper_methods.rb +133 -0
  96. data/spec/support/shared_examples/adapter.rb +104 -0
  97. data/spec/support/shared_examples/params_encoder.rb +18 -0
  98. data/spec/support/shared_examples/request_method.rb +234 -0
  99. data/spec/support/streaming_response_checker.rb +35 -0
  100. data/spec/support/webmock_rack_app.rb +68 -0
  101. metadata +126 -126
  102. data/Gemfile +0 -29
  103. data/config.ru +0 -6
  104. data/faraday.gemspec +0 -92
  105. data/lib/faraday/adapter/action_dispatch.rb +0 -29
  106. data/lib/faraday/builder.rb +0 -160
  107. data/lib/faraday/request/json.rb +0 -35
  108. data/lib/faraday/upload_io.rb +0 -23
  109. data/test/adapters/live_test.rb +0 -205
  110. data/test/adapters/logger_test.rb +0 -37
  111. data/test/adapters/net_http_test.rb +0 -33
  112. data/test/adapters/test_middleware_test.rb +0 -70
  113. data/test/connection_test.rb +0 -254
  114. data/test/env_test.rb +0 -158
  115. data/test/helper.rb +0 -41
  116. data/test/live_server.rb +0 -45
  117. data/test/middleware_stack_test.rb +0 -118
  118. data/test/request_middleware_test.rb +0 -116
  119. data/test/response_middleware_test.rb +0 -74
@@ -1,205 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- if !Faraday::TestCase::LIVE_SERVER
4
- warn "warning: test server not specified; skipping live server tests"
5
- else
6
- module Adapters
7
- class LiveTest < Faraday::TestCase
8
- adapters = if ENV['ADAPTER']
9
- ENV['ADAPTER'].split(':').map { |name| Faraday::Adapter.lookup_module name.to_sym }
10
- else
11
- loaded_adapters = Faraday::Adapter.all_loaded_constants
12
- loaded_adapters -= [Faraday::Adapter::ActionDispatch]
13
- loaded_adapters << :default
14
- end
15
-
16
- adapters.each do |adapter|
17
- define_method "test_#{adapter}_GET_retrieves_the_response_body" do
18
- assert_equal 'hello world', create_connection(adapter).get('hello_world').body
19
- end
20
-
21
- define_method "test_#{adapter}_GET_send_url_encoded_params" do
22
- resp = create_connection(adapter).get do |req|
23
- req.url 'hello', 'name' => 'zack'
24
- end
25
- assert_equal('hello zack', resp.body)
26
- end
27
-
28
- define_method "test_#{adapter}_GET_retrieves_the_response_headers" do
29
- response = create_connection(adapter).get('hello_world')
30
- assert_match /text\/html/, response.headers['Content-Type'], 'original case fail'
31
- assert_match /text\/html/, response.headers['content-type'], 'lowercase fail'
32
- end
33
-
34
- # https://github.com/geemus/excon/issues/10
35
- unless %[Faraday::Adapter::Excon] == adapter.to_s
36
- define_method "test_#{adapter}_GET_handles_headers_with_multiple_values" do
37
- response = create_connection(adapter).get('multi')
38
- assert_equal 'one, two', response.headers['set-cookie']
39
- end
40
- end
41
-
42
- define_method "test_#{adapter}_POST_send_url_encoded_params" do
43
- resp = create_connection(adapter).post do |req|
44
- req.url 'echo_name'
45
- req.body = {'name' => 'zack'}
46
- end
47
- assert_equal %("zack"), resp.body
48
- end
49
-
50
- define_method "test_#{adapter}_POST_send_url_encoded_nested_params" do
51
- resp = create_connection(adapter).post do |req|
52
- req.url 'echo_name'
53
- req.body = {'name' => {'first' => 'zack'}}
54
- end
55
- assert_equal %({"first"=>"zack"}), resp.body
56
- end
57
-
58
- define_method "test_#{adapter}_POST_retrieves_the_response_headers" do
59
- assert_match /text\/html/, create_connection(adapter).post('echo_name').headers['content-type']
60
- end
61
-
62
- define_method "test_#{adapter}_POST_sends_files" do
63
- resp = create_connection(adapter).post do |req|
64
- req.url 'file'
65
- req.body = {'uploaded_file' => Faraday::UploadIO.new(__FILE__, 'text/x-ruby')}
66
- end
67
- assert_equal "file live_test.rb text/x-ruby", resp.body
68
- end unless :default == adapter # isn't configured for multipart
69
-
70
- # https://github.com/toland/patron/issues/9
71
- if ENV['FORCE'] || %[Faraday::Adapter::Patron] != adapter.to_s
72
- define_method "test_#{adapter}_PUT_send_url_encoded_params" do
73
- resp = create_connection(adapter).put do |req|
74
- req.url 'echo_name'
75
- req.body = {'name' => 'zack'}
76
- end
77
- assert_equal %("zack"), resp.body
78
- end
79
-
80
- define_method "test_#{adapter}_PUT_send_url_encoded_nested_params" do
81
- resp = create_connection(adapter).put do |req|
82
- req.url 'echo_name'
83
- req.body = {'name' => {'first' => 'zack'}}
84
- end
85
- assert_equal %({"first"=>"zack"}), resp.body
86
- end
87
- end
88
-
89
- # https://github.com/toland/patron/issues/9
90
- # https://github.com/dbalatero/typhoeus/issues/84
91
- if ENV['FORCE'] || !%w[Faraday::Adapter::Patron Faraday::Adapter::Typhoeus].include?(adapter.to_s)
92
- define_method "test_#{adapter}_PUT_retrieves_the_response_headers" do
93
- assert_match /text\/html/, create_connection(adapter).put('echo_name').headers['content-type']
94
- end
95
- end
96
-
97
- # https://github.com/toland/patron/issues/34
98
- unless %w[Faraday::Adapter::Patron Faraday::Adapter::EMSynchrony].include? adapter.to_s
99
- define_method "test_#{adapter}_PATCH_send_url_encoded_params" do
100
- resp = create_connection(adapter).patch('echo_name', 'name' => 'zack')
101
- assert_equal %("zack"), resp.body
102
- end
103
- end
104
-
105
- unless %[Faraday::Adapter::EMSynchrony] == adapter.to_s
106
- define_method "test_#{adapter}_OPTIONS" do
107
- resp = create_connection(adapter).run_request(:options, '/options', nil, {})
108
- assert_equal "hi", resp.body
109
- end
110
- end
111
-
112
- define_method "test_#{adapter}_HEAD_send_url_encoded_params" do
113
- resp = create_connection(adapter).head do |req|
114
- req.url 'hello', 'name' => 'zack'
115
- end
116
- assert_match /text\/html/, resp.headers['content-type']
117
- end
118
-
119
- define_method "test_#{adapter}_HEAD_retrieves_no_response_body" do
120
- assert_equal '', create_connection(adapter).head('hello_world').body.to_s
121
- end
122
-
123
- define_method "test_#{adapter}_HEAD_retrieves_the_response_headers" do
124
- assert_match /text\/html/, create_connection(adapter).head('hello_world').headers['content-type']
125
- end
126
-
127
- define_method "test_#{adapter}_DELETE_retrieves_the_response_headers" do
128
- assert_match /text\/html/, create_connection(adapter).delete('delete_with_json').headers['content-type']
129
- end
130
-
131
- define_method "test_#{adapter}_DELETE_retrieves_the_body" do
132
- assert_match /deleted/, create_connection(adapter).delete('delete_with_json').body
133
- end
134
-
135
- define_method "test_#{adapter}_async_requests_clear_parallel_manager_after_running_a_single_request" do
136
- connection = create_connection(adapter)
137
- assert !connection.in_parallel?
138
- resp = connection.get('hello_world')
139
- assert !connection.in_parallel?
140
- assert_equal 'hello world', connection.get('hello_world').body
141
- end
142
-
143
- define_method "test_#{adapter}_async_requests_uses_parallel_manager_to_run_multiple_json_requests" do
144
- resp1, resp2 = nil, nil
145
-
146
- connection = create_connection(adapter)
147
- adapter = real_adapter_for(adapter)
148
-
149
- connection.in_parallel(adapter.setup_parallel_manager) do
150
- resp1 = connection.get('json')
151
- resp2 = connection.get('json')
152
- if adapter.supports_parallel_requests?
153
- assert connection.in_parallel?
154
- assert_nil resp1.body
155
- assert_nil resp2.body
156
- end
157
- end
158
- assert !connection.in_parallel?
159
- assert_equal '[1,2,3]', resp1.body
160
- assert_equal '[1,2,3]', resp2.body
161
- end
162
-
163
- if adapter.to_s == "Faraday::Adapter::EMSynchrony"
164
- instance_methods.grep(%r{Faraday::Adapter::EMSynchrony}).each do |method|
165
- em = method.to_s.sub %r{^test_}, "test_under_em_"
166
- define_method em do
167
- EM.run do
168
- Fiber.new do
169
- self.send method
170
- EM.stop
171
- end.resume
172
- end
173
- end
174
- end
175
- end
176
- end
177
-
178
- def create_connection(adapter)
179
- if adapter == :default
180
- builder_block = nil
181
- else
182
- builder_block = Proc.new do |b|
183
- b.request :multipart
184
- b.request :url_encoded
185
- b.use adapter
186
- end
187
- end
188
-
189
- Faraday::Connection.new(LIVE_SERVER, &builder_block).tap do |conn|
190
- conn.headers['X-Faraday-Adapter'] = adapter.to_s
191
- adapter_handler = conn.builder.handlers.last
192
- conn.builder.insert_before adapter_handler, Faraday::Response::RaiseError
193
- end
194
- end
195
-
196
- def real_adapter_for(adapter)
197
- if adapter == :default
198
- Faraday::Adapter.lookup_module(Faraday.default_adapter)
199
- else
200
- adapter
201
- end
202
- end
203
- end
204
- end
205
- end
@@ -1,37 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
- require 'stringio'
3
- require 'logger'
4
-
5
- module Adapters
6
- class LoggerTest < Faraday::TestCase
7
- def setup
8
- @io = StringIO.new
9
- @logger = Logger.new(@io)
10
- @logger.level = Logger::DEBUG
11
-
12
- @conn = Faraday.new do |b|
13
- b.response :logger, @logger
14
- b.adapter :test do |stubs|
15
- stubs.get('/hello') { [200, {'Content-Type' => 'text/html'}, 'hello'] }
16
- end
17
- end
18
- @resp = @conn.get '/hello', :accept => 'text/html'
19
- end
20
-
21
- def test_still_returns_output
22
- assert_equal 'hello', @resp.body
23
- end
24
-
25
- def test_logs_method_and_url
26
- assert_match "get /hello", @io.string
27
- end
28
-
29
- def test_logs_request_headers
30
- assert_match %(Accept: "text/html), @io.string
31
- end
32
-
33
- def test_logs_response_headers
34
- assert_match %(Content-Type: "text/html), @io.string
35
- end
36
- end
37
- end
@@ -1,33 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- module Adapters
4
- class NetHttpTest < Faraday::TestCase
5
- def setup
6
- @connection = Faraday.new('http://disney.com') do |b|
7
- b.adapter :net_http
8
- end
9
- end
10
-
11
- def test_handles_compression_transparently_on_get
12
- stub_request(:get, 'disney.com/hello').with { |request|
13
- accept_encoding = request.headers['Accept-Encoding']
14
- if RUBY_VERSION.index('1.8') == 0
15
- # ruby 1.8 doesn't do any gzip/deflate automatically
16
- accept_encoding == nil
17
- else
18
- # test for a value such as "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
19
- accept_encoding =~ /gzip;.+\bdeflate\b/
20
- end
21
- }
22
- @connection.get('/hello')
23
- end
24
-
25
- def test_connect_error_gets_wrapped
26
- stub_request(:get, 'disney.com/hello').to_raise(Errno::ECONNREFUSED)
27
-
28
- assert_raise Faraday::Error::ConnectionFailed do
29
- @connection.get('/hello')
30
- end
31
- end
32
- end
33
- end
@@ -1,70 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
2
-
3
- module Adapters
4
- class TestMiddleware < Faraday::TestCase
5
- def setup
6
- @stubs = Faraday::Adapter::Test::Stubs.new
7
- @conn = Faraday.new do |builder|
8
- builder.adapter :test, @stubs
9
- end
10
- @stubs.get('/hello') { [200, {'Content-Type' => 'text/html'}, 'hello'] }
11
- @resp = @conn.get('/hello')
12
- end
13
-
14
- def test_middleware_with_simple_path_sets_status
15
- assert_equal 200, @resp.status
16
- end
17
-
18
- def test_middleware_with_simple_path_sets_headers
19
- assert_equal 'text/html', @resp.headers['Content-Type']
20
- end
21
-
22
- def test_middleware_with_simple_path_sets_body
23
- assert_equal 'hello', @resp.body
24
- end
25
-
26
- def test_middleware_can_be_called_several_times
27
- assert_equal 'hello', @conn.get("/hello").body
28
- end
29
-
30
- def test_middleware_with_get_params
31
- @stubs.get('/param?a=1') { [200, {}, 'a'] }
32
- assert_equal 'a', @conn.get('/param?a=1').body
33
- end
34
-
35
- def test_middleware_ignores_unspecified_get_params
36
- @stubs.get('/optional?a=1') { [200, {}, 'a'] }
37
- assert_equal 'a', @conn.get('/optional?a=1&b=1').body
38
- assert_equal 'a', @conn.get('/optional?a=1').body
39
- assert_raise Faraday::Adapter::Test::Stubs::NotFound do
40
- @conn.get('/optional')
41
- end
42
- end
43
-
44
- def test_middleware_allow_different_outcomes_for_the_same_request
45
- @stubs.get('/hello') { [200, {'Content-Type' => 'text/html'}, 'hello'] }
46
- @stubs.get('/hello') { [200, {'Content-Type' => 'text/html'}, 'world'] }
47
- assert_equal 'hello', @conn.get("/hello").body
48
- assert_equal 'world', @conn.get("/hello").body
49
- end
50
-
51
- def test_yields_env_to_stubs
52
- @stubs.get '/hello' do |env|
53
- assert_equal '/hello', env[:url].path
54
- assert_equal 'foo.com', env[:url].host
55
- assert_equal '1', env[:params]['a']
56
- assert_equal 'text/plain', env[:request_headers]['Accept']
57
- [200, {}, 'a']
58
- end
59
-
60
- @conn.headers['Accept'] = 'text/plain'
61
- assert_equal 'a', @conn.get('http://foo.com/hello?a=1').body
62
- end
63
-
64
- def test_raises_an_error_if_no_stub_is_found_for_request
65
- assert_raise Faraday::Adapter::Test::Stubs::NotFound do
66
- @conn.get('/invalid'){ [200, {}, []] }
67
- end
68
- end
69
- end
70
- end
@@ -1,254 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
-
3
- class TestConnection < Faraday::TestCase
4
- def test_initialize_parses_host_out_of_given_url
5
- conn = Faraday::Connection.new "http://sushi.com"
6
- assert_equal 'sushi.com', conn.host
7
- end
8
-
9
- def test_initialize_parses_nil_port_out_of_given_url
10
- conn = Faraday::Connection.new "http://sushi.com"
11
- assert_nil conn.port
12
- end
13
-
14
- def test_initialize_parses_scheme_out_of_given_url
15
- conn = Faraday::Connection.new "http://sushi.com"
16
- assert_equal 'http', conn.scheme
17
- end
18
-
19
- def test_initialize_parses_port_out_of_given_url
20
- conn = Faraday::Connection.new "http://sushi.com:815"
21
- assert_equal 815, conn.port
22
- end
23
-
24
- def test_initialize_parses_nil_path_prefix_out_of_given_url
25
- conn = Faraday::Connection.new "http://sushi.com"
26
- assert_equal '/', conn.path_prefix
27
- end
28
-
29
- def test_initialize_parses_path_prefix_out_of_given_url
30
- conn = Faraday::Connection.new "http://sushi.com/fish"
31
- assert_equal '/fish', conn.path_prefix
32
- end
33
-
34
- def test_initialize_parses_path_prefix_out_of_given_url_option
35
- conn = Faraday::Connection.new :url => "http://sushi.com/fish"
36
- assert_equal '/fish', conn.path_prefix
37
- end
38
-
39
- def test_initialize_stores_default_params_from_options
40
- conn = Faraday::Connection.new :params => {:a => 1}
41
- assert_equal({'a' => 1}, conn.params)
42
- end
43
-
44
- def test_initialize_stores_default_params_from_uri
45
- conn = Faraday::Connection.new "http://sushi.com/fish?a=1"
46
- assert_equal({'a' => '1'}, conn.params)
47
- end
48
-
49
- def test_initialize_stores_default_params_from_uri_and_options
50
- conn = Faraday::Connection.new "http://sushi.com/fish?a=1&b=2", :params => {'a' => 3}
51
- assert_equal({'a' => 3, 'b' => '2'}, conn.params)
52
- end
53
-
54
- def test_initialize_stores_default_headers_from_options
55
- conn = Faraday::Connection.new :headers => {:user_agent => 'Faraday'}
56
- assert_equal 'Faraday', conn.headers['User-agent']
57
- end
58
-
59
- def test_basic_auth_sets_authorization_header
60
- conn = Faraday::Connection.new
61
- conn.basic_auth 'Aladdin', 'open sesame'
62
- assert_equal 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==', conn.headers['Authorization']
63
- end
64
-
65
- def test_long_basic_auth_sets_authorization_header_without_new_lines
66
- conn = Faraday::Connection.new
67
- conn.basic_auth "A" * 255, ""
68
- assert_equal "Basic #{'QUFB' * 85}Og==", conn.headers['Authorization']
69
- end
70
-
71
- def test_auto_parses_basic_auth_from_url
72
- conn = Faraday::Connection.new :url => "http://aladdin:opensesame@sushi.com/fish"
73
- assert_equal 'Basic YWxhZGRpbjpvcGVuc2VzYW1l', conn.headers['Authorization']
74
- end
75
-
76
- def test_token_auth_sets_authorization_header
77
- conn = Faraday::Connection.new
78
- conn.token_auth 'abcdef'
79
- assert_equal 'Token token="abcdef"', conn.headers['Authorization']
80
- end
81
-
82
- def test_token_auth_with_options_sets_authorization_header
83
- conn = Faraday::Connection.new
84
- conn.token_auth 'abcdef', :nonce => 'abc'
85
- assert_equal 'Token token="abcdef",
86
- nonce="abc"', conn.headers['Authorization']
87
- end
88
-
89
- def test_build_url_uses_connection_host_as_default_uri_host
90
- conn = Faraday::Connection.new
91
- conn.host = 'sushi.com'
92
- uri = conn.build_url("/sake.html")
93
- assert_equal 'sushi.com', uri.host
94
- end
95
-
96
- def test_build_url_uses_connection_port_as_default_uri_port
97
- conn = Faraday::Connection.new
98
- conn.port = 23
99
- uri = conn.build_url("http://sushi.com")
100
- assert_equal 23, uri.port
101
- end
102
-
103
- def test_build_url_uses_connection_scheme_as_default_uri_scheme
104
- conn = Faraday::Connection.new 'http://sushi.com'
105
- uri = conn.build_url("/sake.html")
106
- assert_equal 'http', uri.scheme
107
- end
108
-
109
- def test_build_url_uses_connection_path_prefix_to_customize_path
110
- conn = Faraday::Connection.new
111
- conn.path_prefix = '/fish'
112
- uri = conn.build_url("sake.html")
113
- assert_equal '/fish/sake.html', uri.path
114
- end
115
-
116
- def test_build_url_uses_root_connection_path_prefix_to_customize_path
117
- conn = Faraday::Connection.new
118
- conn.path_prefix = '/'
119
- uri = conn.build_url("sake.html")
120
- assert_equal '/sake.html', uri.path
121
- end
122
-
123
- def test_build_url_forces_connection_path_prefix_to_be_absolute
124
- conn = Faraday::Connection.new
125
- conn.path_prefix = 'fish'
126
- uri = conn.build_url("sake.html")
127
- assert_equal '/fish/sake.html', uri.path
128
- end
129
-
130
- def test_build_url_ignores_connection_path_prefix_trailing_slash
131
- conn = Faraday::Connection.new
132
- conn.path_prefix = '/fish/'
133
- uri = conn.build_url("sake.html")
134
- assert_equal '/fish/sake.html', uri.path
135
- end
136
-
137
- def test_build_url_allows_absolute_uri_to_ignore_connection_path_prefix
138
- conn = Faraday::Connection.new
139
- conn.path_prefix = '/fish'
140
- uri = conn.build_url("/sake.html")
141
- assert_equal '/sake.html', uri.path
142
- end
143
-
144
- def test_build_url_parses_url_params_into_path
145
- conn = Faraday::Connection.new
146
- uri = conn.build_url("http://sushi.com/sake.html")
147
- assert_equal '/sake.html', uri.path
148
- end
149
-
150
- def test_build_url_doesnt_add_ending_slash
151
- conn = Faraday::Connection.new
152
- conn.url_prefix = "http://sushi.com/nigiri"
153
- uri = conn.build_url(nil)
154
- assert_equal "/nigiri", uri.path
155
- end
156
-
157
- def test_build_url_parses_url_params_into_query
158
- conn = Faraday::Connection.new
159
- uri = conn.build_url("http://sushi.com/sake.html", 'a[b]' => '1 + 2')
160
- assert_equal "a%5Bb%5D=1%20%2B%202", uri.query
161
- end
162
-
163
- def test_build_url_mashes_default_and_given_params_together
164
- conn = Faraday::Connection.new 'http://sushi.com/api?token=abc', :params => {'format' => 'json'}
165
- url = conn.build_url("nigiri?page=1", :limit => 5)
166
- assert_equal %w[format=json limit=5 page=1 token=abc], url.query.split('&').sort
167
- end
168
-
169
- def test_build_url_overrides_default_params_with_given_params
170
- conn = Faraday::Connection.new 'http://sushi.com/api?token=abc', :params => {'format' => 'json'}
171
- url = conn.build_url("nigiri?page=1", :limit => 5, :token => 'def', :format => 'xml')
172
- assert_equal %w[format=xml limit=5 page=1 token=def], url.query.split('&').sort
173
- end
174
-
175
- def test_default_params_hash_has_indifferent_access
176
- conn = Faraday::Connection.new :params => {'format' => 'json'}
177
- assert conn.params.has_key?(:format)
178
- conn.params[:format] = 'xml'
179
- url = conn.build_url("")
180
- assert_equal %w[format=xml], url.query.split('&').sort
181
- end
182
-
183
- def test_build_url_parses_url
184
- conn = Faraday::Connection.new
185
- uri = conn.build_url("http://sushi.com/sake.html")
186
- assert_equal "http", uri.scheme
187
- assert_equal "sushi.com", uri.host
188
- assert_equal '/sake.html', uri.path
189
- assert_nil uri.port
190
- end
191
-
192
- def test_build_url_parses_url_and_changes_scheme
193
- conn = Faraday::Connection.new :url => "http://sushi.com/sushi"
194
- conn.scheme = 'https'
195
- uri = conn.build_url("sake.html")
196
- assert_equal 'https://sushi.com/sushi/sake.html', uri.to_s
197
- end
198
-
199
- def test_proxy_accepts_string
200
- conn = Faraday::Connection.new
201
- conn.proxy 'http://proxy.com'
202
- assert_equal 'proxy.com', conn.proxy[:uri].host
203
- assert_equal [:uri], conn.proxy.keys
204
- end
205
-
206
- def test_proxy_accepts_uri
207
- conn = Faraday::Connection.new
208
- conn.proxy Addressable::URI.parse('http://proxy.com')
209
- assert_equal 'proxy.com', conn.proxy[:uri].host
210
- assert_equal [:uri], conn.proxy.keys
211
- end
212
-
213
- def test_proxy_accepts_hash_with_string_uri
214
- conn = Faraday::Connection.new
215
- conn.proxy :uri => 'http://proxy.com', :user => 'rick'
216
- assert_equal 'proxy.com', conn.proxy[:uri].host
217
- assert_equal 'rick', conn.proxy[:user]
218
- end
219
-
220
- def test_proxy_accepts_hash
221
- conn = Faraday::Connection.new
222
- conn.proxy :uri => Addressable::URI.parse('http://proxy.com'), :user => 'rick'
223
- assert_equal 'proxy.com', conn.proxy[:uri].host
224
- assert_equal 'rick', conn.proxy[:user]
225
- end
226
-
227
- def test_proxy_requires_uri
228
- conn = Faraday::Connection.new
229
- assert_raises ArgumentError do
230
- conn.proxy :uri => :bad_uri, :user => 'rick'
231
- end
232
- end
233
-
234
- def test_params_to_query_converts_hash_of_params_to_uri_escaped_query_string
235
- conn = Faraday::Connection.new
236
- url = conn.build_url('', 'a[b]' => '1 + 2')
237
- assert_equal "a%5Bb%5D=1%20%2B%202", url.query
238
- end
239
-
240
- def test_dups_connection_object
241
- conn = Faraday::Connection.new 'http://sushi.com/foo' do |b|
242
- b.adapter :net_http
243
- end
244
- conn.headers['content-type'] = 'text/plain'
245
- conn.params['a'] = '1'
246
-
247
- duped = conn.dup
248
- assert_equal conn.build_url(''), duped.build_url('')
249
- [:headers, :params, :builder].each do |attr|
250
- assert_equal conn.send(attr), duped.send(attr)
251
- assert_not_equal conn.send(attr).object_id, duped.send(attr).object_id
252
- end
253
- end
254
- end