strava-ruby-client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +47 -0
- data/.travis.yml +9 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +125 -0
- data/Dangerfile +2 -0
- data/Gemfile +15 -0
- data/LICENSE.md +22 -0
- data/README.md +231 -0
- data/RELEASING.md +61 -0
- data/Rakefile +17 -0
- data/bin/oauth-token.rb +28 -0
- data/lib/strava-ruby-client.rb +30 -0
- data/lib/strava/api/client.rb +38 -0
- data/lib/strava/api/config.rb +31 -0
- data/lib/strava/errors/fault.rb +13 -0
- data/lib/strava/logger.rb +13 -0
- data/lib/strava/models/activity.rb +57 -0
- data/lib/strava/models/athlete.rb +25 -0
- data/lib/strava/models/map.rb +9 -0
- data/lib/strava/models/model.rb +5 -0
- data/lib/strava/models/token.rb +12 -0
- data/lib/strava/oauth/client.rb +70 -0
- data/lib/strava/oauth/config.rb +33 -0
- data/lib/strava/version.rb +3 -0
- data/lib/strava/web/client.rb +31 -0
- data/lib/strava/web/config.rb +41 -0
- data/lib/strava/web/connection.rb +35 -0
- data/lib/strava/web/raise_error.rb +29 -0
- data/lib/strava/web/request.rb +38 -0
- data/spec/fixtures/strava/client_athlete.yml +59 -0
- data/spec/fixtures/strava/client_athlete_activities.yml +121 -0
- data/spec/fixtures/strava/oauth_token_authorization_code.yml +53 -0
- data/spec/fixtures/strava/oauth_token_invalid_client.yml +50 -0
- data/spec/fixtures/strava/oauth_token_invalid_code.yml +50 -0
- data/spec/fixtures/strava/oauth_token_refresh_token.yml +52 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/strava/api/client_spec.rb +36 -0
- data/spec/strava/api/config_spec.rb +22 -0
- data/spec/strava/oauth/client_spec.rb +120 -0
- data/spec/strava/oauth/config_spec.rb +24 -0
- data/spec/strava/version_spec.rb +7 -0
- data/spec/strava/web/client_spec.rb +9 -0
- data/spec/strava/web/config_spec.rb +4 -0
- data/spec/support/shared/it_behaves_like_web_client.rb +131 -0
- data/spec/support/vcr.rb +12 -0
- data/strava-ruby-client.gemspec +21 -0
- metadata +150 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://www.strava.com/oauth/token
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: client_id=12345&client_secret=client-secret&code=code&grant_type=authorization_code&token
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json; charset=utf-8
|
12
|
+
User-Agent:
|
13
|
+
- Strava Ruby Client/0.1.0
|
14
|
+
Content-Type:
|
15
|
+
- application/x-www-form-urlencoded
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 400
|
21
|
+
message: Bad Request
|
22
|
+
headers:
|
23
|
+
Date:
|
24
|
+
- Thu, 22 Nov 2018 20:26:56 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=UTF-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Cache-Control:
|
32
|
+
- no-cache
|
33
|
+
Via:
|
34
|
+
- 1.1 linkerd
|
35
|
+
Status:
|
36
|
+
- 400 Bad Request
|
37
|
+
X-Request-Id:
|
38
|
+
- d3406a4e-9099-400f-b709-aad0ea2768fe
|
39
|
+
X-Frame-Options:
|
40
|
+
- SAMEORIGIN,DENY
|
41
|
+
X-Content-Type-Options:
|
42
|
+
- nosniff
|
43
|
+
X-Xss-Protection:
|
44
|
+
- 1; mode=block
|
45
|
+
body:
|
46
|
+
encoding: ASCII-8BIT
|
47
|
+
string: '{"message":"Bad Request","errors":[{"resource":"RequestToken","field":"code","code":"invalid"}]}'
|
48
|
+
http_version:
|
49
|
+
recorded_at: Thu, 22 Nov 2018 20:26:56 GMT
|
50
|
+
recorded_with: VCR 4.0.0
|
@@ -0,0 +1,52 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://www.strava.com/oauth/token
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: client_id=24523&client_secret=client-secret&grant_type=refresh_token&refresh_token=refresh-token
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json; charset=utf-8
|
12
|
+
User-Agent:
|
13
|
+
- Strava Ruby Client/0.1.0
|
14
|
+
Content-Type:
|
15
|
+
- application/x-www-form-urlencoded
|
16
|
+
Accept-Encoding:
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Date:
|
24
|
+
- Thu, 22 Nov 2018 22:31:57 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json; charset=UTF-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
Connection:
|
30
|
+
- keep-alive
|
31
|
+
Cache-Control:
|
32
|
+
- max-age=0, private, must-revalidate
|
33
|
+
Via:
|
34
|
+
- 1.1 linkerd
|
35
|
+
Status:
|
36
|
+
- 200 OK
|
37
|
+
X-Request-Id:
|
38
|
+
- df1c7766-41ac-44e5-b2a1-fc96486b2c7c
|
39
|
+
Etag:
|
40
|
+
- W/"0f3eb115bd7d2ef9718c83ece058e3f9"
|
41
|
+
X-Frame-Options:
|
42
|
+
- SAMEORIGIN,DENY
|
43
|
+
X-Content-Type-Options:
|
44
|
+
- nosniff
|
45
|
+
X-Xss-Protection:
|
46
|
+
- 1; mode=block
|
47
|
+
body:
|
48
|
+
encoding: ASCII-8BIT
|
49
|
+
string: '{"token_type":"Bearer","access_token":"new-access-token","expires_at":1542940199,"expires_in":14282,"refresh_token":"new-refresh-token"}'
|
50
|
+
http_version:
|
51
|
+
recorded_at: Thu, 22 Nov 2018 22:31:57 GMT
|
52
|
+
recorded_with: VCR 4.0.0
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Strava::Api::Client do
|
4
|
+
before do
|
5
|
+
Strava::Api::Config.reset
|
6
|
+
end
|
7
|
+
it_behaves_like 'web client'
|
8
|
+
context 'with a token' do
|
9
|
+
let(:client) { Strava::Api::Client.new(access_token: ENV['STRAVA_ACCESS_TOKEN'] || 'access-token') }
|
10
|
+
describe '#athlete', vcr: { cassette_name: 'client_athlete' } do
|
11
|
+
let(:athlete) { client.athlete }
|
12
|
+
it 'returns athlete' do
|
13
|
+
expect(athlete).to be_a Strava::Models::Athlete
|
14
|
+
expect(athlete.id).to eq 26_462_176
|
15
|
+
expect(athlete.created_at).to eq Time.parse('2017-11-28 19:05:35 UTC')
|
16
|
+
expect(athlete.updated_at).to eq Time.parse('2018-11-19 01:44:15 UTC')
|
17
|
+
expect(athlete.firstname).to eq 'Daniel'
|
18
|
+
expect(athlete.lastname).to eq 'Block'
|
19
|
+
expect(athlete.city).to eq 'New York'
|
20
|
+
expect(athlete.email).to eq 'dblock@example.com'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
describe '#athlete_activities', vcr: { cassette_name: 'client_athlete_activities' } do
|
24
|
+
let(:athlete_activities) { client.athlete_activities }
|
25
|
+
it 'returns athlete activities' do
|
26
|
+
expect(athlete_activities).to be_a Enumerable
|
27
|
+
expect(athlete_activities.count).to eq 30
|
28
|
+
activity = athlete_activities.first
|
29
|
+
expect(activity.id).to eq 1_972_463_847
|
30
|
+
expect(activity.athlete).to be_a Strava::Models::Athlete
|
31
|
+
expect(activity.map).to be_a Strava::Models::Map
|
32
|
+
expect(activity.start_date).to be_a Time
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Strava::Api::Config do
|
4
|
+
before do
|
5
|
+
Strava::Api.config.reset
|
6
|
+
end
|
7
|
+
describe '#defaults' do
|
8
|
+
it 'sets endpoint' do
|
9
|
+
expect(Strava::Api.config.endpoint).to eq 'https://www.strava.com/api/v3'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
describe '#configure' do
|
13
|
+
before do
|
14
|
+
Strava::Api.configure do |config|
|
15
|
+
config.endpoint = 'updated'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
it 'sets endpoint' do
|
19
|
+
expect(Strava::Api.config.endpoint).to eq 'updated'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Strava::OAuth::Client do
|
4
|
+
before do
|
5
|
+
Strava::OAuth::Config.reset
|
6
|
+
end
|
7
|
+
it_behaves_like 'web client'
|
8
|
+
context 'with defaults' do
|
9
|
+
let(:client) { Strava::OAuth::Client.new }
|
10
|
+
describe '#initialize' do
|
11
|
+
it 'sets endpoint' do
|
12
|
+
expect(client.endpoint).to eq 'https://www.strava.com/oauth'
|
13
|
+
end
|
14
|
+
Strava::OAuth::Config::ATTRIBUTES.each do |key|
|
15
|
+
it "sets #{key}" do
|
16
|
+
expect(client.send(key)).to eq Strava::OAuth::Config.send(key)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
context '#authorize_url' do
|
20
|
+
it 'requires client id' do
|
21
|
+
expect { client.authorize_url }.to raise_error ArgumentError, 'Missing Strava client id.'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
context 'with custom settings' do
|
27
|
+
describe '#initialize' do
|
28
|
+
Strava::OAuth::Config::ATTRIBUTES.each do |key|
|
29
|
+
context key do
|
30
|
+
let(:client) { Strava::OAuth::Client.new(key => 'custom') }
|
31
|
+
it "sets #{key}" do
|
32
|
+
expect(client.send(key)).to_not eq Strava::OAuth::Config.send(key)
|
33
|
+
expect(client.send(key)).to eq 'custom'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context 'global config' do
|
40
|
+
after do
|
41
|
+
Strava::OAuth::Client.config.reset
|
42
|
+
end
|
43
|
+
let(:client) { Strava::OAuth::Client.new }
|
44
|
+
context 'client id and secret' do
|
45
|
+
before do
|
46
|
+
Strava::OAuth::Client.configure do |config|
|
47
|
+
config.client_id = 'custom client id'
|
48
|
+
config.client_secret = 'custom client secret'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
describe '#initialize' do
|
52
|
+
it 'sets client id and secret' do
|
53
|
+
expect(client.client_id).to eq 'custom client id'
|
54
|
+
expect(client.client_secret).to eq 'custom client secret'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
context 'with a client id and secret' do
|
60
|
+
let(:client) { Strava::OAuth::Client.new(client_id: '12345', client_secret: 'client-secret') }
|
61
|
+
context '#authorize_url' do
|
62
|
+
it 'returns url' do
|
63
|
+
expect(client.authorize_url).to eq 'https://www.strava.com/oauth/authorize?approval_prompt=auto&client_id=12345&redirect_uri=http%3A%2F%2Flocalhost&response_type=code&scope=read'
|
64
|
+
end
|
65
|
+
it 'returns url with custom options' do
|
66
|
+
expect(
|
67
|
+
client.authorize_url(
|
68
|
+
redirect_uri: 'https://example.com/oauth',
|
69
|
+
approval_prompt: 'force',
|
70
|
+
response_type: 'code',
|
71
|
+
scope: 'activity:read_all',
|
72
|
+
state: 'magic'
|
73
|
+
)
|
74
|
+
).to eq 'https://www.strava.com/oauth/authorize?approval_prompt=force&client_id=12345&redirect_uri=https%3A%2F%2Fexample.com%2Foauth&response_type=code&scope=activity%3Aread_all&state=magic'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
context '#oauth_token' do
|
78
|
+
it 'errors with an invalid client id', vcr: { cassette_name: 'oauth_token_invalid_client' } do
|
79
|
+
expect { client.oauth_token(code: 'code') }.to raise_error Strava::Errors::Fault do |e|
|
80
|
+
expect(e.message).to eq 'Bad Request'
|
81
|
+
expect(e.errors).to eq([{ 'code' => 'invalid', 'field' => 'client_id', 'resource' => 'Application' }])
|
82
|
+
end
|
83
|
+
end
|
84
|
+
it 'errors with an invalid code', vcr: { cassette_name: 'oauth_token_invalid_code' } do
|
85
|
+
expect { client.oauth_token(code: 'code') }.to raise_error Faraday::ClientError do |e|
|
86
|
+
expect(e.message).to eq 'Bad Request'
|
87
|
+
expect(e.errors).to eq([{ 'code' => 'invalid', 'field' => 'code', 'resource' => 'RequestToken' }])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
it 'performs the initial token exchange', vcr: { cassette_name: 'oauth_token_authorization_code' } do
|
91
|
+
token = client.oauth_token(code: 'deadbeef585a6edb1f00309d3e1e0fec74973fb0')
|
92
|
+
expect(token).to be_a Strava::Models::Token
|
93
|
+
expect(token.access_token).to eq 'deadbeefd7ab44704fb2a146bd98c7a349a2b43d'
|
94
|
+
expect(token.refresh_token).to eq 'deadbeef9d64b225d0c50db4854a8d6c8757702d'
|
95
|
+
expect(token.token_type).to eq 'Bearer'
|
96
|
+
expect(token.expires_in).to eq 21_600
|
97
|
+
expect(token.expires_at).to eq Time.at(1_542_940_199)
|
98
|
+
athlete = token.athlete
|
99
|
+
expect(athlete).to be_a Strava::Models::Athlete
|
100
|
+
expect(athlete.updated_at).to eq Time.parse('2018-11-19 01:44:15 UTC')
|
101
|
+
expect(athlete.firstname).to eq 'Daniel'
|
102
|
+
expect(athlete.lastname).to eq 'Block'
|
103
|
+
expect(athlete.city).to eq 'New York'
|
104
|
+
end
|
105
|
+
it 'refreshes the token', vcr: { cassette_name: 'oauth_token_refresh_token' } do
|
106
|
+
token = client.oauth_token(
|
107
|
+
refresh_token: '8b15b6bb9d64a225d0c50db4854a8d6c8757702d',
|
108
|
+
grant_type: 'refresh_token'
|
109
|
+
)
|
110
|
+
expect(token).to be_a Strava::Models::Token
|
111
|
+
expect(token.access_token).to eq 'new-access-token'
|
112
|
+
expect(token.refresh_token).to eq 'new-refresh-token'
|
113
|
+
expect(token.token_type).to eq 'Bearer'
|
114
|
+
expect(token.expires_in).to eq 14_282
|
115
|
+
expect(token.expires_at).to eq Time.at(1_542_940_199)
|
116
|
+
expect(token.athlete).to be nil
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Strava::OAuth::Config do
|
4
|
+
describe '#defaults' do
|
5
|
+
it 'sets endpoint' do
|
6
|
+
expect(Strava::OAuth.config.endpoint).to eq 'https://www.strava.com/oauth'
|
7
|
+
expect(Strava::OAuth.config.client_id).to be nil
|
8
|
+
expect(Strava::OAuth.config.client_secret).to be nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
describe '#configure' do
|
12
|
+
before do
|
13
|
+
Strava::OAuth.configure do |config|
|
14
|
+
config.client_id = 'client id'
|
15
|
+
config.client_secret = 'client secret'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
it 'sets client id and secret' do
|
19
|
+
expect(Strava::OAuth.config.endpoint).to eq 'https://www.strava.com/oauth'
|
20
|
+
expect(Strava::OAuth.config.client_id).to eq 'client id'
|
21
|
+
expect(Strava::OAuth.config.client_secret).to eq 'client secret'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.shared_examples 'web client' do
|
4
|
+
before do
|
5
|
+
described_class.config.reset
|
6
|
+
Strava::Web::Config.reset
|
7
|
+
end
|
8
|
+
context 'with defaults' do
|
9
|
+
let(:client) { described_class.new }
|
10
|
+
context '#initialize' do
|
11
|
+
it 'implements endpoint' do
|
12
|
+
expect(client.endpoint).to_not be nil
|
13
|
+
end
|
14
|
+
it 'includes default http configuration' do
|
15
|
+
expect(client.user_agent).to eq 'Strava Ruby Client/0.1.0'
|
16
|
+
end
|
17
|
+
it 'sets user-agent' do
|
18
|
+
expect(client.user_agent).to eq Strava::Web::Config.user_agent
|
19
|
+
expect(client.user_agent).to include Strava::VERSION
|
20
|
+
end
|
21
|
+
(Strava::Web::Config::ATTRIBUTES - [:logger]).each do |key|
|
22
|
+
it "sets #{key}" do
|
23
|
+
expect(client.send(key)).to eq Strava::Web::Config.send(key)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
context 'with custom settings' do
|
29
|
+
context '#initialize' do
|
30
|
+
Strava::Web::Config::ATTRIBUTES.each do |key|
|
31
|
+
context key.to_s do
|
32
|
+
let(:client) { described_class.new(key => 'custom') }
|
33
|
+
it "sets #{key}" do
|
34
|
+
expect(client.send(key)).to_not eq Strava::Web::Config.send(key)
|
35
|
+
expect(client.send(key)).to eq 'custom'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
context 'global config' do
|
42
|
+
let(:client) { described_class.new }
|
43
|
+
context 'user-agent' do
|
44
|
+
before do
|
45
|
+
Strava::Web::Client.configure do |config|
|
46
|
+
config.user_agent = 'custom/user-agent'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
context '#initialize' do
|
50
|
+
it 'sets user-agent' do
|
51
|
+
expect(client.user_agent).to eq 'custom/user-agent'
|
52
|
+
end
|
53
|
+
it 'creates a connection with the custom user-agent' do
|
54
|
+
expect(client.send(:connection).headers).to include(
|
55
|
+
'Accept' => 'application/json; charset=utf-8',
|
56
|
+
'User-Agent' => 'custom/user-agent'
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
context 'proxy' do
|
62
|
+
before do
|
63
|
+
Strava::Web::Client.configure do |config|
|
64
|
+
config.proxy = 'http://localhost:8080'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
context '#initialize' do
|
68
|
+
it 'sets proxy' do
|
69
|
+
expect(client.proxy).to eq 'http://localhost:8080'
|
70
|
+
end
|
71
|
+
it 'creates a connection with the proxy' do
|
72
|
+
expect(client.send(:connection).proxy.uri.to_s).to eq 'http://localhost:8080'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
context 'SSL options' do
|
77
|
+
before do
|
78
|
+
Strava::Web::Client.configure do |config|
|
79
|
+
config.ca_path = '/ca_path'
|
80
|
+
config.ca_file = '/ca_file'
|
81
|
+
end
|
82
|
+
end
|
83
|
+
context '#initialize' do
|
84
|
+
it 'sets ca_path and ca_file' do
|
85
|
+
expect(client.ca_path).to eq '/ca_path'
|
86
|
+
expect(client.ca_file).to eq '/ca_file'
|
87
|
+
end
|
88
|
+
it 'creates a connection with ssl options' do
|
89
|
+
ssl = client.send(:connection).ssl
|
90
|
+
expect(ssl.ca_path).to eq '/ca_path'
|
91
|
+
expect(ssl.ca_file).to eq '/ca_file'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
context 'logger option' do
|
96
|
+
let(:logger) { Logger.new(STDOUT) }
|
97
|
+
before do
|
98
|
+
Strava::Web::Client.configure do |config|
|
99
|
+
config.logger = logger
|
100
|
+
end
|
101
|
+
end
|
102
|
+
context '#initialize' do
|
103
|
+
it 'sets logger' do
|
104
|
+
expect(client.logger).to eq logger
|
105
|
+
end
|
106
|
+
it 'creates a connection with a logger' do
|
107
|
+
expect(client.send(:connection).builder.handlers).to include ::Faraday::Response::Logger
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
context 'timeout options' do
|
112
|
+
before do
|
113
|
+
Strava::Web::Client.configure do |config|
|
114
|
+
config.timeout = 10
|
115
|
+
config.open_timeout = 15
|
116
|
+
end
|
117
|
+
end
|
118
|
+
context '#initialize' do
|
119
|
+
it 'sets timeout and open_timeout' do
|
120
|
+
expect(client.timeout).to eq 10
|
121
|
+
expect(client.open_timeout).to eq 15
|
122
|
+
end
|
123
|
+
it 'creates a connection with timeout options' do
|
124
|
+
conn = client.send(:connection)
|
125
|
+
expect(conn.options.timeout).to eq 10
|
126
|
+
expect(conn.options.open_timeout).to eq 15
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|