4me-sdk 1.2.0 → 2.0.0.pre.rc.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.
@@ -1,8 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'ca-bundle.crt' do
4
-
5
- it 'should be able to connect to the 4me API' do
4
+ it 'should be able to connect to the 4me REST API' do
6
5
  WebMock.allow_net_connect!
7
6
  client = Sdk4me::Client.new(api_token: 'invalid', max_retry_time: -1)
8
7
  result = {}
@@ -16,7 +15,7 @@ describe 'ca-bundle.crt' do
16
15
  expect(response.message).to eq('401: Bad credentials')
17
16
  end
18
17
 
19
- it 'should be able to connect to the 4me API (access token)' do
18
+ it 'should be able to connect to the 4me REST API (access token)' do
20
19
  WebMock.allow_net_connect!
21
20
  client = Sdk4me::Client.new(access_token: 'invalid', max_retry_time: -1)
22
21
  result = {}
@@ -37,6 +36,6 @@ describe 'ca-bundle.crt' do
37
36
  http.use_ssl = true
38
37
 
39
38
  # no SSL error please
40
- expect{ http.start{ |_http| _http.request(Net::HTTP::Get.new('/exports/20141107/')) } }.to never_raise(OpenSSL::SSL::SSLError)
39
+ expect { http.start { |transport| transport.request(Net::HTTP::Get.new('/exports/20141107/')) } }.to never_raise(OpenSSL::SSL::SSLError)
41
40
  end
42
41
  end
@@ -1,30 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Sdk4me::Client do
4
-
5
4
  def client(authentication, options = {})
6
- (@client ||= {})["#{authentication}-#{options.to_s}"] ||= begin
7
- options = {max_retry_time: -1}.merge(options)
8
- if authentication == :api_token
9
- options = {api_token: 'secret'}.merge(options)
10
- else
11
- options = {access_token: 'secret'}.merge(options)
12
- end
5
+ (@client ||= {})["#{authentication}-#{options}"] ||= begin
6
+ options = { max_retry_time: -1 }.merge(options)
7
+ options = if authentication == :api_token
8
+ { api_token: 'secret' }.merge(options)
9
+ else
10
+ { access_token: 'secret' }.merge(options)
11
+ end
13
12
  Sdk4me::Client.new(options)
14
13
  end
15
14
  end
16
15
 
17
16
  def credentials(authentication)
18
17
  if authentication == :api_token
19
- { basic_auth: ['secret', 'x'] }
18
+ { basic_auth: %w[secret x] }
20
19
  else
21
- { headers: {'Authorization' => 'Bearer secret'} }
20
+ { headers: { 'Authorization' => 'Bearer secret' } }
22
21
  end
23
22
  end
24
23
 
25
- [:api_token, :access_token].each do |authentication|
26
-
27
-
24
+ %i[api_token access_token].each do |authentication|
28
25
  context 'Sdk4me.config' do
29
26
  before(:each) do
30
27
  Sdk4me.configure do |config|
@@ -45,23 +42,23 @@ describe Sdk4me::Client do
45
42
  client = Sdk4me::Client.new
46
43
  expect(client.option(:host)).to eq('https://api.4me.com') # default value
47
44
  if authentication == :api_token
48
- expect(client.option(:api_token)).to eq('secret') # value set using Sdk4me.config
45
+ expect(client.option(:api_token)).to eq('secret') # value set using Sdk4me.config
49
46
  else
50
- expect(client.option(:access_token)).to eq('secret') # value set using Sdk4me.config
47
+ expect(client.option(:access_token)).to eq('secret') # value set using Sdk4me.config
51
48
  end
52
- expect(client.option(:max_retry_time)).to eq(120) # value overridden in Sdk4me.config
49
+ expect(client.option(:max_retry_time)).to eq(120) # value overridden in Sdk4me.config
53
50
  end
54
51
 
55
52
  it 'should override the Sdk4me configuration' do
56
53
  client = Sdk4me::Client.new(host: 'https://demo.4me.com', api_token: 'unknown', block_at_rate_limit: true)
57
- expect(client.option(:read_timeout)).to eq(25) # default value
54
+ expect(client.option(:read_timeout)).to eq(25) # default value
58
55
  expect(client.option(:host)).to eq('https://demo.4me.com') # default value overridden in Client.new
59
56
  expect(client.option(:api_token)).to eq('unknown') # value set using Sdk4me.config and overridden in Client.new
60
57
  expect(client.option(:max_retry_time)).to eq(120) # value overridden in Sdk4me.config
61
58
  expect(client.option(:block_at_rate_limit)).to eq(true) # value overridden in Client.new
62
59
  end
63
60
 
64
- [:host, :api_version].each do |required_option|
61
+ %i[host api_version].each do |required_option|
65
62
  it "should require option #{required_option}" do
66
63
  expect { Sdk4me::Client.new(required_option => '') }.to raise_error("Missing required configuration option #{required_option}")
67
64
  end
@@ -71,11 +68,10 @@ describe Sdk4me::Client do
71
68
  expect { Sdk4me::Client.new(access_token: '', api_token: '') }.to raise_error('Missing required configuration option access_token')
72
69
  end
73
70
 
74
- [ ['https://api.4me.com', true, 'api.4me.com', 443],
75
- ['https://api.example.com:777', true, 'api.example.com', 777],
76
- ['http://sdk4me.example.com', false, 'sdk4me.example.com', 80],
77
- ['http://sdk4me.example.com:777', false, 'sdk4me.example.com', 777]
78
- ].each do |host, ssl, domain, port|
71
+ [['https://api.4me.com', true, 'api.4me.com', 443],
72
+ ['https://api.example.com:777', true, 'api.example.com', 777],
73
+ ['http://sdk4me.example.com', false, 'sdk4me.example.com', 80],
74
+ ['http://sdk4me.example.com:777', false, 'sdk4me.example.com', 777]].each do |host, ssl, domain, port|
79
75
  it 'should parse ssl, host and port' do
80
76
  client = Sdk4me::Client.new(host: host)
81
77
  expect(client.instance_variable_get(:@ssl)).to eq(ssl)
@@ -91,45 +87,65 @@ describe Sdk4me::Client do
91
87
 
92
88
  on_disk = `ls #{http.ca_file}`
93
89
  expect(on_disk).not_to match(/cannot access/)
94
- expect(on_disk).to match(/\/ca-bundle.crt$/)
90
+ expect(on_disk).to match(%r{/ca-bundle.crt$})
95
91
  end
96
92
 
97
93
  describe 'headers' do
98
94
  it 'should set the content type header' do
99
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: {'Content-Type' => 'application/json'}).to_return(body: {name: 'my name'}.to_json)
95
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'Content-Type' => 'application/json' }).to_return(body: { name: 'my name' }.to_json)
100
96
  client(authentication).get('me')
101
97
  expect(stub).to have_been_requested
102
98
  end
103
99
 
104
100
  it 'should add the X-4me-Account header' do
105
101
  client = client(authentication, account: 'test')
106
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: {'X-4me-Account' => 'test'}).to_return(body: {name: 'my name'}.to_json)
102
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'X-4me-Account' => 'test' }).to_return(body: { name: 'my name' }.to_json)
107
103
  client.get('me')
108
104
  expect(stub).to have_been_requested
109
105
  end
110
106
 
111
107
  it 'should add the X-4me-Source header' do
112
108
  client = client(authentication, source: 'myapp')
113
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: {'X-4me-Source' => 'myapp'}).to_return(body: {name: 'my name'}.to_json)
109
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'X-4me-Source' => 'myapp' }).to_return(body: { name: 'my name' }.to_json)
110
+ client.get('me')
111
+ expect(stub).to have_been_requested
112
+ end
113
+
114
+ it 'should add a default User-Agent header' do
115
+ client = client(authentication)
116
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'User-Agent' => "4me-sdk-ruby/#{Sdk4me::Client::VERSION}" }).to_return(body: { name: 'my name' }.to_json)
114
117
  client.get('me')
115
118
  expect(stub).to have_been_requested
116
119
  end
117
120
 
118
- it 'should be able to override headers' do
119
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: {'Content-Type' => 'application/x-www-form-urlencoded'}).to_return(body: {name: 'my name'}.to_json)
120
- client(authentication).get('me', {}, {'Content-Type' => 'application/x-www-form-urlencoded'})
121
+ it 'should override the default User-Agent header' do
122
+ client = client(authentication, user_agent: 'Foo/1.0')
123
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'User-Agent' => 'Foo/1.0' }).to_return(body: { name: 'my name' }.to_json)
124
+ client.get('me')
125
+ expect(stub).to have_been_requested
126
+ end
127
+
128
+ it 'should be able to override default headers' do
129
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'Content-Type' => 'application/x-www-form-urlencoded' }).to_return(body: { name: 'my name' }.to_json)
130
+ client(authentication).get('me', {}, { 'Content-Type' => 'application/x-www-form-urlencoded' })
131
+ expect(stub).to have_been_requested
132
+ end
133
+
134
+ it 'should be able to override option headers' do
135
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'X-4me-Source' => 'foo' }).to_return(body: { name: 'my name' }.to_json)
136
+ client(authentication, source: 'myapp').get('me', {}, { 'X-4me-Source' => 'foo' })
121
137
  expect(stub).to have_been_requested
122
138
  end
123
139
 
124
140
  it 'should set the other headers' do
125
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: {'X-4me-Other' => 'value'}).to_return(body: {name: 'my name'}.to_json)
126
- client(authentication).get('me', {}, {'X-4me-Other' => 'value'})
141
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).with(headers: { 'X-4me-Other' => 'value' }).to_return(body: { name: 'my name' }.to_json)
142
+ client(authentication).get('me', {}, { 'X-4me-Other' => 'value' })
127
143
  expect(stub).to have_been_requested
128
144
  end
129
145
 
130
146
  it 'should accept headers in the each call' do
131
- stub = stub_request(:get, 'https://api.4me.com/v1/requests?fields=subject&page=1&per_page=100').with(credentials(authentication)).with(headers: {'X-4me-Secret' => 'special'}).to_return(body: [{id: 1, subject: 'Subject 1'}, {id: 2, subject: 'Subject 2'}, {id: 3, subject: 'Subject 3'}].to_json)
132
- client(authentication).each('requests', {fields: 'subject'}, {'X-4me-Secret' => 'special'}) do |request|
147
+ stub = stub_request(:get, 'https://api.4me.com/v1/requests?fields=subject&page=1&per_page=100').with(credentials(authentication)).with(headers: { 'X-4me-Secret' => 'special' }).to_return(body: [{ id: 1, subject: 'Subject 1' }, { id: 2, subject: 'Subject 2' }, { id: 3, subject: 'Subject 3' }].to_json)
148
+ client(authentication).each('requests', { fields: 'subject' }, { 'X-4me-Secret' => 'special' }) do |request|
133
149
  expect(request[:subject]).to eq("Subject #{request[:id]}")
134
150
  end
135
151
  expect(stub).to have_been_requested
@@ -138,88 +154,87 @@ describe Sdk4me::Client do
138
154
 
139
155
  context 'each' do
140
156
  it 'should yield each result' do
141
- stub_request(:get, 'https://api.4me.com/v1/requests?fields=subject&page=1&per_page=100').with(credentials(authentication)).to_return(body: [{id: 1, subject: 'Subject 1'}, {id: 2, subject: 'Subject 2'}, {id: 3, subject: 'Subject 3'}].to_json)
142
- nr_of_requests = client(authentication).each('requests', {fields: 'subject'}) do |request|
157
+ stub_request(:get, 'https://api.4me.com/v1/requests?fields=subject&page=1&per_page=100').with(credentials(authentication)).to_return(body: [{ id: 1, subject: 'Subject 1' }, { id: 2, subject: 'Subject 2' }, { id: 3, subject: 'Subject 3' }].to_json)
158
+ nr_of_requests = client(authentication).each('requests', { fields: 'subject' }) do |request|
143
159
  expect(request[:subject]).to eq("Subject #{request[:id]}")
144
160
  end
145
161
  expect(nr_of_requests).to eq(3)
146
162
  end
147
163
 
148
164
  it 'should retrieve multiple pages' do
149
- stub_page1 = stub_request(:get, 'https://api.4me.com/v1/requests?page=1&per_page=2').with(credentials(authentication)).to_return(body: [{id: 1, subject: 'Subject 1'}, {id: 2, subject: 'Subject 2'}].to_json, headers: {'Link' => '<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="first",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="next",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="last"'})
150
- stub_page2 = stub_request(:get, 'https://api.4me.com/v1/requests?page=2&per_page=2').with(credentials(authentication)).to_return(body: [{id: 3, subject: 'Subject 3'}].to_json, headers: {'Link' => '<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="first",<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="prev",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="last"'})
151
- nr_of_requests = client(authentication).each('requests', {per_page: 2}) do |request|
165
+ stub_page1 = stub_request(:get, 'https://api.4me.com/v1/requests?page=1&per_page=2').with(credentials(authentication)).to_return(body: [{ id: 1, subject: 'Subject 1' }, { id: 2, subject: 'Subject 2' }].to_json, headers: { 'Link' => '<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="first",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="next",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="last"' })
166
+ stub_page2 = stub_request(:get, 'https://api.4me.com/v1/requests?page=2&per_page=2').with(credentials(authentication)).to_return(body: [{ id: 3, subject: 'Subject 3' }].to_json, headers: { 'Link' => '<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="first",<https://api.4me.com/v1/requests?page=1&per_page=2>; rel="prev",<https://api.4me.com/v1/requests?page=2&per_page=2>; rel="last"' })
167
+ nr_of_requests = client(authentication).each('requests', { per_page: 2 }) do |request|
152
168
  expect(request[:subject]).to eq("Subject #{request[:id]}")
153
169
  end
154
170
  expect(nr_of_requests).to eq(3)
171
+ expect(stub_page1).to have_been_requested
155
172
  expect(stub_page2).to have_been_requested
156
173
  end
157
174
  end
158
175
 
159
176
  context 'get' do
160
177
  it 'should return a response' do
161
- stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: {name: 'my name'}.to_json)
178
+ stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: { name: 'my name' }.to_json)
162
179
  response = client(authentication).get('me')
163
180
  expect(response[:name]).to eq('my name')
164
181
  end
165
182
 
166
183
  describe 'parameters' do
167
-
168
184
  [[nil, ''],
169
- [ 'normal', 'normal'],
170
- [ 'hello;<', 'hello%3B%3C'],
171
- [ true, 'true'],
172
- [ false, 'false'],
173
- [ DateTime.now, DateTime.now.new_offset(0).iso8601.gsub('+', '%2B')],
174
- [ Date.new, Date.new.strftime('%Y-%m-%d')],
175
- [ Time.now, Time.now.strftime('%H:%M')],
176
- [ ['first', 'second;<', true], 'first,second%3B%3C,true']
177
- ].each do |param_value, url_value|
185
+ %w[normal normal],
186
+ ['hello;<', 'hello%3B%3C'],
187
+ [true, 'true'],
188
+ [false, 'false'],
189
+ [DateTime.now, DateTime.now.new_offset(0).iso8601.gsub('+', '%2B')],
190
+ [Date.new, Date.new.strftime('%Y-%m-%d')],
191
+ [Time.now, Time.now.strftime('%H:%M')],
192
+ [['first', 'second;<', true], 'first,second%3B%3C,true']].each do |param_value, url_value|
178
193
  it "should cast #{param_value.class.name}: '#{param_value}' to '#{url_value}'" do
179
- stub = stub_request(:get, "https://api.4me.com/v1/me?value=#{url_value}").with(credentials(authentication)).to_return(body: {name: 'my name'}.to_json)
180
- client(authentication).get('me', {value: param_value})
194
+ stub = stub_request(:get, "https://api.4me.com/v1/me?value=#{url_value}").with(credentials(authentication)).to_return(body: { name: 'my name' }.to_json)
195
+ client(authentication).get('me', { value: param_value })
181
196
  expect(stub).to have_been_requested
182
197
  end
183
198
  end
184
199
 
185
200
  it 'should not cast arrays in post and put calls' do
186
- stub = stub_request(:post, 'https://api.4me.com/v1/people').with(credentials(authentication)).with(body: {user_ids: [1, 2, 3]}, headers: {'X-4me-Custom' => 'custom'}).to_return(body: {id: 101}.to_json)
187
- client(authentication).post('people', {user_ids: [1, 2, 3]}, {'X-4me-Custom' => 'custom'})
201
+ stub = stub_request(:post, 'https://api.4me.com/v1/people').with(credentials(authentication)).with(body: { user_ids: [1, 2, 3] }, headers: { 'X-4me-Custom' => 'custom' }).to_return(body: { id: 101 }.to_json)
202
+ client(authentication).post('people', { user_ids: [1, 2, 3] }, { 'X-4me-Custom' => 'custom' })
188
203
  expect(stub).to have_been_requested
189
204
  end
190
205
 
191
206
  it 'should not cast hashes in post and put calls' do
192
- stub = stub_request(:patch, 'https://api.4me.com/v1/people/55').with(credentials(authentication)).with(body: '{"contacts_attributes":{"0":{"protocol":"email","label":"work","uri":"work@example.com"}}}', headers: {'X-4me-Custom' => 'custom'}).to_return(body: {id: 101}.to_json)
193
- client(authentication).put('people/55', {contacts_attributes: {0 => {protocol: :email, label: :work, uri: 'work@example.com'}}}, {'X-4me-Custom' => 'custom'})
207
+ stub = stub_request(:patch, 'https://api.4me.com/v1/people/55').with(credentials(authentication)).with(body: '{"contacts_attributes":{"0":{"protocol":"email","label":"work","uri":"work@example.com"}}}', headers: { 'X-4me-Custom' => 'custom' }).to_return(body: { id: 101 }.to_json)
208
+ client(authentication).put('people/55', { contacts_attributes: { 0 => { protocol: :email, label: :work, uri: 'work@example.com' } } }, { 'X-4me-Custom' => 'custom' })
194
209
  expect(stub).to have_been_requested
195
210
  end
196
211
 
197
212
  it 'should not double escape symbols' do
198
- stub = stub_request(:patch, 'https://api.4me.com/v1/people/55').with(credentials(authentication)).with(body: '{"status":"waiting_for"}').to_return(body: {id: 101}.to_json)
199
- client(authentication).put('people/55', {status: :waiting_for})
213
+ stub = stub_request(:patch, 'https://api.4me.com/v1/people/55').with(credentials(authentication)).with(body: '{"status":"waiting_for"}').to_return(body: { id: 101 }.to_json)
214
+ client(authentication).put('people/55', { status: :waiting_for })
200
215
  expect(stub).to have_been_requested
201
216
  end
202
217
 
203
218
  it 'should handle fancy filter operations' do
204
219
  now = DateTime.now
205
- stub = stub_request(:get, "https://api.4me.com/v1/people?created_at=>#{now.new_offset(0).iso8601.gsub('+', '%2B')}&id!=15").with(credentials(authentication)).to_return(body: {name: 'my name'}.to_json)
206
- client(authentication).get('people', {'created_at=>' => now, 'id!=' => 15})
220
+ stub = stub_request(:get, "https://api.4me.com/v1/people?created_at=>#{now.new_offset(0).iso8601.gsub('+', '%2B')}&id!=15").with(credentials(authentication)).to_return(body: { name: 'my name' }.to_json)
221
+ client(authentication).get('people', { 'created_at=>' => now, 'id!=' => 15 })
207
222
  expect(stub).to have_been_requested
208
223
  end
209
224
 
210
225
  it 'should append parameters' do
211
- stub = stub_request(:get, 'https://api.4me.com/v1/people?id!=15&primary_email=me@example.com').with(credentials(authentication)).to_return(body: {name: 'my name'}.to_json)
212
- client(authentication).get('people?id!=15', {primary_email: 'me@example.com'})
226
+ stub = stub_request(:get, 'https://api.4me.com/v1/people?id!=15&primary_email=me@example.com').with(credentials(authentication)).to_return(body: { name: 'my name' }.to_json)
227
+ client(authentication).get('people?id!=15', { primary_email: 'me@example.com' })
213
228
  expect(stub).to have_been_requested
214
229
  end
215
230
  end
216
231
  end
217
232
 
218
233
  context 'patch' do
219
- [:put, :patch].each do |method|
220
- it 'should send patch requests with parameters and headers for #{method} calls' do
221
- stub = stub_request(:patch, 'https://api.4me.com/v1/people/1').with(credentials(authentication)).with(body: {name: 'New Name'}, headers: {'X-4me-Custom' => 'custom'}).to_return(body: {id: 1}.to_json)
222
- client(authentication).send(method, 'people/1', {name: 'New Name'}, {'X-4me-Custom' => 'custom'})
234
+ %i[put patch].each do |method|
235
+ it "should send patch requests with parameters and headers for #{method} calls" do
236
+ stub = stub_request(:patch, 'https://api.4me.com/v1/people/1').with(credentials(authentication)).with(body: { name: 'New Name' }, headers: { 'X-4me-Custom' => 'custom' }).to_return(body: { id: 1 }.to_json)
237
+ client(authentication).send(method, 'people/1', { name: 'New Name' }, { 'X-4me-Custom' => 'custom' })
223
238
  expect(stub).to have_been_requested
224
239
  end
225
240
  end
@@ -227,16 +242,16 @@ describe Sdk4me::Client do
227
242
 
228
243
  context 'post' do
229
244
  it 'should send post requests with parameters and headers' do
230
- stub = stub_request(:post, 'https://api.4me.com/v1/people').with(credentials(authentication)).with(body: {name: 'New Name'}, headers: {'X-4me-Custom' => 'custom'}).to_return(body: {id: 101}.to_json)
231
- client(authentication).post('people', {name: 'New Name'}, {'X-4me-Custom' => 'custom'})
245
+ stub = stub_request(:post, 'https://api.4me.com/v1/people').with(credentials(authentication)).with(body: { name: 'New Name' }, headers: { 'X-4me-Custom' => 'custom' }).to_return(body: { id: 101 }.to_json)
246
+ client(authentication).post('people', { name: 'New Name' }, { 'X-4me-Custom' => 'custom' })
232
247
  expect(stub).to have_been_requested
233
248
  end
234
249
  end
235
250
 
236
251
  context 'delete' do
237
252
  it 'should send delete requests with parameters and headers' do
238
- stub = stub_request(:delete, 'https://api.4me.com/v1/people?id=value').with(credentials(authentication)).with(headers: {'X-4me-Custom' => 'custom'}).to_return(body: '', status: 204)
239
- response = client(authentication).delete('people', {id: 'value'}, {'X-4me-Custom' => 'custom'})
253
+ stub = stub_request(:delete, 'https://api.4me.com/v1/people?id=value').with(credentials(authentication)).with(headers: { 'X-4me-Custom' => 'custom' }).to_return(body: '', status: 204)
254
+ response = client(authentication).delete('people', { id: 'value' }, { 'X-4me-Custom' => 'custom' })
240
255
  expect(stub).to have_been_requested
241
256
  expect(response.valid?).to be_truthy
242
257
  expect(response.json).to eq({})
@@ -255,7 +270,7 @@ describe Sdk4me::Client do
255
270
  end
256
271
 
257
272
  it 'should not log an error for redirects' do
258
- stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: '', status: 303, headers: {'Location' => 'http://redirect.example.com/to/here'})
273
+ stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: '', status: 303, headers: { 'Location' => 'http://redirect.example.com/to/here' })
259
274
  expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
260
275
  expect_log('Redirect: http://redirect.example.com/to/here', :debug)
261
276
  response = client(authentication).get('me')
@@ -263,51 +278,48 @@ describe Sdk4me::Client do
263
278
  expect(response.raw.body).to eq('')
264
279
  end
265
280
 
266
- it "should not parse attachments for get requests" do
281
+ it 'should not parse attachments for get requests' do
267
282
  expect(Sdk4me::Attachments).not_to receive(:new)
268
- stub_request(:get, 'https://api.4me.com/v1/requests/777?attachments=/tmp/first.png,/tmp/second.zip&note=note').with(credentials(authentication)).to_return(body: {id: 777, upload_called: false}.to_json)
283
+ stub_request(:get, 'https://api.4me.com/v1/requests/777?note_attachments=/tmp/first.png,/tmp/second.zip&note=note%20%5Battachment:/tmp/third.gif%5D').with(credentials(authentication)).to_return(body: { id: 777, upload_called: false }.to_json)
269
284
 
270
- response = client(authentication).get('/requests/777', {note: 'note', attachments: ['/tmp/first.png', '/tmp/second.zip'] })
285
+ response = client(authentication).get('/requests/777', { note: 'note [attachment:/tmp/third.gif]', note_attachments: ['/tmp/first.png', '/tmp/second.zip'] })
271
286
  expect(response.valid?).to be_truthy
272
287
  expect(response[:upload_called]).to be_falsey
273
288
  end
274
289
 
275
- [:post, :patch].each do |method|
290
+ %i[post patch].each do |method|
276
291
  it "should parse attachments for #{method} requests" do
277
292
  attachments = double('Sdk4me::Attachments')
278
- expect(attachments).to receive(:upload_attachments!) do |path, data|
279
- expect(path).to eq '/requests/777'
280
- expect(data[:attachments]).to eq ['/tmp/first.png', '/tmp/second.zip']
281
- data.delete(:attachments)
293
+ expect(attachments).to receive(:upload_attachments!) do |data|
294
+ expect(data[:note_attachments]).to eq(['/tmp/first.png', '/tmp/second.zip'])
282
295
  data[:note_attachments] = 'processed'
283
296
  end
284
- expect(Sdk4me::Attachments).to receive(:new).with(client(authentication)){ attachments }
285
- stub_request(method, 'https://api.4me.com/v1/requests/777').with(credentials(authentication)).with(body: {note: 'note', note_attachments: 'processed' }).to_return(body: {id: 777, upload_called: true}.to_json)
297
+ expect(Sdk4me::Attachments).to receive(:new).with(client(authentication), '/requests/777') { attachments }
298
+ stub_request(method, 'https://api.4me.com/v1/requests/777').with(credentials(authentication)).with(body: { note: 'note', note_attachments: 'processed' }).to_return(body: { id: 777, upload_called: true }.to_json)
286
299
 
287
- response = client(authentication).send(method, '/requests/777', {note: 'note', attachments: ['/tmp/first.png', '/tmp/second.zip'] })
300
+ response = client(authentication).send(method, '/requests/777', { note: 'note', note_attachments: ['/tmp/first.png', '/tmp/second.zip'] })
288
301
  expect(response.valid?).to be_truthy
289
302
  expect(response[:upload_called]).to be_truthy
290
303
  end
291
304
  end
292
-
293
305
  end
294
306
 
295
307
  context 'import' do
296
308
  before(:each) do
297
- csv_mime_type = ['text/csv', 'text/comma-separated-values'].detect{|t| MIME::Types[t].any?} # which mime type is used depends on version of mime-types gem
309
+ csv_mime_type = ['text/csv', 'text/comma-separated-values'].detect { |t| MIME::Types[t].any? } # which mime type is used depends on version of mime-types gem
298
310
  @multi_part_body = "--0123456789ABLEWASIEREISAWELBA9876543210\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\npeople\r\n--0123456789ABLEWASIEREISAWELBA9876543210\r\nContent-Disposition: form-data; name=\"file\"; filename=\"#{@fixture_dir}/people.csv\"\r\nContent-Type: #{csv_mime_type}\r\n\r\nPrimary Email,Name\nchess.cole@example.com,Chess Cole\ned.turner@example.com,Ed Turner\r\n--0123456789ABLEWASIEREISAWELBA9876543210--"
299
- @multi_part_headers = {'Accept'=>'*/*', 'Content-Type'=>'multipart/form-data; boundary=0123456789ABLEWASIEREISAWELBA9876543210', 'User-Agent'=>'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6'}
311
+ @multi_part_headers = { 'Accept' => '*/*', 'Content-Type' => 'multipart/form-data; boundary=0123456789ABLEWASIEREISAWELBA9876543210', 'User-Agent' => "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/523.10.6 (KHTML, like Gecko) Version/3.0.4 Safari/523.10.6 4me/#{Sdk4me::Client::VERSION}" }
300
312
 
301
- @import_queued_response = {body: {state: 'queued'}.to_json}
302
- @import_processing_response = {body: {state: 'processing'}.to_json}
303
- @import_done_response = {body: {state: 'done', results: {errors: 0, updated: 1, created: 1, failures: 0, unchanged: 0, deleted: 0}}.to_json}
304
- @import_failed_response = {body: {state: 'error', message: 'Invalid byte sequence in UTF-8 on line 2', results: {errors: 1, updated: 1, created: 0, failures: 1, unchanged: 0, deleted: 0}}.to_json}
313
+ @import_queued_response = { body: { state: 'queued' }.to_json }
314
+ @import_processing_response = { body: { state: 'processing' }.to_json }
315
+ @import_done_response = { body: { state: 'done', results: { errors: 0, updated: 1, created: 1, failures: 0, unchanged: 0, deleted: 0 } }.to_json }
316
+ @import_failed_response = { body: { state: 'error', message: 'Invalid byte sequence in UTF-8 on line 2', results: { errors: 1, updated: 1, created: 0, failures: 1, unchanged: 0, deleted: 0 } }.to_json }
305
317
  allow(client(authentication)).to receive(:sleep)
306
318
  WebMock.disable_net_connect!
307
319
  end
308
320
 
309
321
  it 'should import a CSV file' do
310
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
322
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
311
323
  expect_log("Import file '#{@fixture_dir}/people.csv' successfully uploaded with token '68ef5ef0f64c0'.")
312
324
 
313
325
  response = client(authentication).import(File.new("#{@fixture_dir}/people.csv"), 'people')
@@ -315,17 +327,17 @@ describe Sdk4me::Client do
315
327
  end
316
328
 
317
329
  it 'should import a CSV file by filename' do
318
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
330
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
319
331
  response = client(authentication).import("#{@fixture_dir}/people.csv", 'people')
320
332
  expect(response[:token]).to eq('68ef5ef0f64c0')
321
333
  end
322
334
 
323
335
  it 'should wait for the import to complete' do
324
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
336
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
325
337
  progress_stub = stub_request(:get, 'https://api.4me.com/v1/import/68ef5ef0f64c0').with(credentials(authentication))
326
- .to_return(@import_queued_response, @import_processing_response)
327
- .then.to_raise(StandardError.new('network error'))
328
- .then.to_return(@import_done_response)
338
+ .to_return(@import_queued_response, @import_processing_response)
339
+ .then.to_raise(StandardError.new('network error'))
340
+ .then.to_return(@import_done_response)
329
341
 
330
342
  # verify the correct log statement are made
331
343
  expect_log('Sending POST request to api.4me.com:443/v1/import', :debug)
@@ -349,73 +361,70 @@ describe Sdk4me::Client do
349
361
  end
350
362
 
351
363
  it 'should wait for the import to fail' do
352
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
364
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
353
365
  progress_stub = stub_request(:get, 'https://api.4me.com/v1/import/68ef5ef0f64c0').with(credentials(authentication)).to_return(@import_queued_response, @import_processing_response, @import_failed_response)
354
366
 
355
- expect{ client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::Exception, "Unable to monitor progress for people import. Invalid byte sequence in UTF-8 on line 2")
367
+ expect { client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::Exception, 'Unable to monitor progress for people import. Invalid byte sequence in UTF-8 on line 2')
356
368
  expect(progress_stub).to have_been_requested.times(4)
357
369
  end
358
370
 
359
371
  it 'should not continue when there is an error connecting to 4me' do
360
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
372
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
361
373
  progress_stub = stub_request(:get, 'https://api.4me.com/v1/import/68ef5ef0f64c0').with(credentials(authentication))
362
- .to_return(@import_queued_response, @import_processing_response)
363
- .then.to_raise(StandardError.new('network error')) # twice
374
+ .to_return(@import_queued_response, @import_processing_response)
375
+ .then.to_raise(StandardError.new('network error')) # twice
364
376
 
365
- expect{ client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::Exception, "Unable to monitor progress for people import. 500: No Response from Server - network error for 'api.4me.com:443/v1/import/68ef5ef0f64c0'")
377
+ expect { client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::Exception, "Unable to monitor progress for people import. 500: No Response from Server - network error for 'api.4me.com:443/v1/import/68ef5ef0f64c0'")
366
378
  expect(progress_stub).to have_been_requested.times(4)
367
379
  end
368
380
 
369
381
  it 'should return an invalid response in case waiting for progress is false' do
370
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {message: 'oops!'}.to_json)
382
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { message: 'oops!' }.to_json)
371
383
  response = client(authentication).import("#{@fixture_dir}/people.csv", 'people', false)
372
384
  expect(response.valid?).to be_falsey
373
385
  expect(response.message).to eq('oops!')
374
386
  end
375
387
 
376
388
  it 'should raise an UploadFailed exception in case waiting for progress is true' do
377
- stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: {message: 'oops!'}.to_json)
378
- expect{ client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::UploadFailed, 'Failed to queue people import. oops!')
389
+ stub_request(:post, 'https://api.4me.com/v1/import').with(credentials(authentication)).with(body: @multi_part_body, headers: @multi_part_headers).to_return(body: { message: 'oops!' }.to_json)
390
+ expect { client(authentication).import("#{@fixture_dir}/people.csv", 'people', true) }.to raise_error(Sdk4me::UploadFailed, 'Failed to queue people import. oops!')
379
391
  end
380
-
381
392
  end
382
393
 
383
-
384
394
  context 'export' do
385
395
  before(:each) do
386
-
387
- @export_queued_response = {body: {state: 'queued'}.to_json}
388
- @export_processing_response = {body: {state: 'processing'}.to_json}
389
- @export_done_response = {body: {state: 'done', url: 'https://download.example.com/export.zip?AWSAccessKeyId=12345'}.to_json}
396
+ @export_queued_response = { body: { state: 'queued' }.to_json }
397
+ @export_processing_response = { body: { state: 'processing' }.to_json }
398
+ @export_done_response = { body: { state: 'done', url: 'https://download.example.com/export.zip?AWSAccessKeyId=12345' }.to_json }
390
399
  allow(client(authentication)).to receive(:sleep)
391
400
  end
392
401
 
393
402
  it 'should export multiple types' do
394
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people,people_contact_details'}).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
403
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people,people_contact_details' }).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
395
404
  expect_log("Export for 'people,people_contact_details' successfully queued with token '68ef5ef0f64c0'.")
396
405
 
397
- response = client(authentication).export(['people', 'people_contact_details'])
406
+ response = client(authentication).export(%w[people people_contact_details])
398
407
  expect(response[:token]).to eq('68ef5ef0f64c0')
399
408
  end
400
409
 
401
410
  it 'should indicate when nothing is exported' do
402
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people', from: '2012-03-30T23:00:00+00:00'}).to_return(status: 204)
411
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people', from: '2012-03-30T23:00:00+00:00' }).to_return(status: 204)
403
412
  expect_log("No changed records for 'people' since 2012-03-30T23:00:00+00:00.")
404
413
 
405
- response = client(authentication).export('people', DateTime.new(2012,03,30,23,00,00))
414
+ response = client(authentication).export('people', DateTime.new(2012, 0o3, 30, 23, 0o0, 0o0))
406
415
  expect(response[:token]).to be_nil
407
416
  end
408
417
 
409
418
  it 'should export since a certain time' do
410
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people', from: '2012-03-30T23:00:00+00:00'}).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
419
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people', from: '2012-03-30T23:00:00+00:00' }).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
411
420
  expect_log("Export for 'people' successfully queued with token '68ef5ef0f64c0'.")
412
421
 
413
- response = client(authentication).export('people', DateTime.new(2012,03,30,23,00,00))
422
+ response = client(authentication).export('people', DateTime.new(2012, 0o3, 30, 23, 0o0, 0o0))
414
423
  expect(response[:token]).to eq('68ef5ef0f64c0')
415
424
  end
416
425
 
417
426
  it 'should export with locale' do
418
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'translations', locale: 'nl'}).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
427
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'translations', locale: 'nl' }).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
419
428
  expect_log("Export for 'translations' successfully queued with token '68ef5ef0f64c0'.")
420
429
 
421
430
  response = client(authentication).export('translations', nil, nil, 'nl')
@@ -423,11 +432,11 @@ describe Sdk4me::Client do
423
432
  end
424
433
 
425
434
  it 'should wait for the export to complete' do
426
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people'}).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
435
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people' }).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
427
436
  progress_stub = stub_request(:get, 'https://api.4me.com/v1/export/68ef5ef0f64c0').with(credentials(authentication))
428
- .to_return(@export_queued_response, @export_processing_response)
429
- .then.to_raise(StandardError.new('network error'))
430
- .then.to_return(@export_done_response)
437
+ .to_return(@export_queued_response, @export_processing_response)
438
+ .then.to_raise(StandardError.new('network error'))
439
+ .then.to_return(@export_done_response)
431
440
 
432
441
  # verify the correct log statement are made
433
442
  expect_log('Sending POST request to api.4me.com:443/v1/export', :debug)
@@ -451,33 +460,32 @@ describe Sdk4me::Client do
451
460
  end
452
461
 
453
462
  it 'should not continue when there is an error connecting to 4me' do
454
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people'}).to_return(body: {token: '68ef5ef0f64c0'}.to_json)
463
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people' }).to_return(body: { token: '68ef5ef0f64c0' }.to_json)
455
464
  progress_stub = stub_request(:get, 'https://api.4me.com/v1/export/68ef5ef0f64c0').with(credentials(authentication))
456
- .to_return(@export_queued_response, @export_processing_response)
457
- .then.to_raise(StandardError.new('network error')) # twice
465
+ .to_return(@export_queued_response, @export_processing_response)
466
+ .then.to_raise(StandardError.new('network error')) # twice
458
467
 
459
- expect{ client(authentication).export('people', nil, true) }.to raise_error(Sdk4me::Exception, "Unable to monitor progress for 'people' export. 500: No Response from Server - network error for 'api.4me.com:443/v1/export/68ef5ef0f64c0'")
468
+ expect { client(authentication).export('people', nil, true) }.to raise_error(Sdk4me::Exception, "Unable to monitor progress for 'people' export. 500: No Response from Server - network error for 'api.4me.com:443/v1/export/68ef5ef0f64c0'")
460
469
  expect(progress_stub).to have_been_requested.times(4)
461
470
  end
462
471
 
463
472
  it 'should return an invalid response in case waiting for progress is false' do
464
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people'}).to_return(body: {message: 'oops!'}.to_json)
473
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people' }).to_return(body: { message: 'oops!' }.to_json)
465
474
  response = client(authentication).export('people')
466
475
  expect(response.valid?).to be_falsey
467
476
  expect(response.message).to eq('oops!')
468
477
  end
469
478
 
470
479
  it 'should raise an UploadFailed exception in case waiting for progress is true' do
471
- stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: {type: 'people'}).to_return(body: {message: 'oops!'}.to_json)
472
- expect{ client(authentication).export('people', nil, true) }.to raise_error(Sdk4me::UploadFailed, "Failed to queue 'people' export. oops!")
480
+ stub_request(:post, 'https://api.4me.com/v1/export').with(credentials(authentication)).with(body: { type: 'people' }).to_return(body: { message: 'oops!' }.to_json)
481
+ expect { client(authentication).export('people', nil, true) }.to raise_error(Sdk4me::UploadFailed, "Failed to queue 'people' export. oops!")
473
482
  end
474
-
475
483
  end
476
484
 
477
485
  context 'retry' do
478
486
  it 'should not retry when max_retry_time = -1' do
479
487
  stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_raise(StandardError.new('network error'))
480
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
488
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
481
489
  expect_log("GET request to api.4me.com:443/v1/me failed: 500: No Response from Server - network error for 'api.4me.com:443/v1/me'", :error)
482
490
 
483
491
  response = client(authentication).get('me')
@@ -488,11 +496,11 @@ describe Sdk4me::Client do
488
496
 
489
497
  it 'should not retry 4 times when max_retry_time = 16' do
490
498
  stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_raise(StandardError.new('network error'))
491
- [2,4,8].each_with_index do |secs, i|
492
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
493
- expect_log("Request failed, retry ##{i+1} in #{secs} seconds: 500: No Response from Server - network error for 'api.4me.com:443/v1/me'", :warn)
499
+ [2, 4, 8].each_with_index do |secs, i|
500
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
501
+ expect_log("Request failed, retry ##{i + 1} in #{secs} seconds: 500: No Response from Server - network error for 'api.4me.com:443/v1/me'", :warn)
494
502
  end
495
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
503
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
496
504
 
497
505
  retry_client = client(authentication, max_retry_time: 16)
498
506
  allow(retry_client).to receive(:sleep)
@@ -503,11 +511,11 @@ describe Sdk4me::Client do
503
511
  end
504
512
 
505
513
  it 'should return the response after retry succeeds' do
506
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_raise(StandardError.new('network error')).then.to_return(body: {name: 'my name'}.to_json)
507
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
514
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_raise(StandardError.new('network error')).then.to_return(body: { name: 'my name' }.to_json)
515
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
508
516
  expect_log("Request failed, retry #1 in 2 seconds: 500: No Response from Server - network error for 'api.4me.com:443/v1/me'", :warn)
509
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
510
- expect_log(%(Response:\n{\n "name": "my name"\n}), :debug )
517
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
518
+ expect_log(%(Response:\n{\n "name": "my name"\n}), :debug)
511
519
 
512
520
  retry_client = client(authentication, max_retry_time: 16)
513
521
  allow(retry_client).to receive(:sleep)
@@ -520,9 +528,9 @@ describe Sdk4me::Client do
520
528
 
521
529
  context 'rate limiting' do
522
530
  it 'should not block on rate limit when block_at_rate_limit is false' do
523
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: {message: 'Too Many Requests'}.to_json)
524
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
525
- expect_log("GET request to api.4me.com:443/v1/me failed: 429: Too Many Requests", :error)
531
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: { message: 'Too Many Requests' }.to_json)
532
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
533
+ expect_log('GET request to api.4me.com:443/v1/me failed: 429: Too Many Requests', :error)
526
534
 
527
535
  response = client(authentication, block_at_rate_limit: false).get('me')
528
536
  expect(stub).to have_been_requested.times(1)
@@ -531,11 +539,11 @@ describe Sdk4me::Client do
531
539
  end
532
540
 
533
541
  it 'should block on rate limit when block_at_rate_limit is true' do
534
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: {message: 'Too Many Requests'}.to_json).then.to_return(body: {name: 'my name'}.to_json)
535
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
542
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: { message: 'Too Many Requests' }.to_json).then.to_return(body: { name: 'my name' }.to_json)
543
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
536
544
  expect_log('Request throttled, trying again in 300 seconds: 429: Too Many Requests', :warn)
537
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
538
- expect_log(%(Response:\n{\n "name": "my name"\n}), :debug )
545
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
546
+ expect_log(%(Response:\n{\n "name": "my name"\n}), :debug)
539
547
 
540
548
  block_client = client(authentication, block_at_rate_limit: true, max_retry_time: 500)
541
549
  allow(block_client).to receive(:sleep)
@@ -546,11 +554,11 @@ describe Sdk4me::Client do
546
554
  end
547
555
 
548
556
  it 'should block on rate limit using Retry-After when block_at_rate_limit is true' do
549
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: {message: 'Too Many Requests'}.to_json, headers: {'Retry-After' => '20'}).then.to_return(body: {name: 'my name'}.to_json)
550
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
557
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: { message: 'Too Many Requests' }.to_json, headers: { 'Retry-After' => '20' }).then.to_return(body: { name: 'my name' }.to_json)
558
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
551
559
  expect_log('Request throttled, trying again in 20 seconds: 429: Too Many Requests', :warn)
552
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
553
- expect_log(%(Response:\n{\n "name": "my name"\n}), :debug )
560
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
561
+ expect_log(%(Response:\n{\n "name": "my name"\n}), :debug)
554
562
 
555
563
  block_client = client(authentication, block_at_rate_limit: true)
556
564
  allow(block_client).to receive(:sleep)
@@ -561,11 +569,11 @@ describe Sdk4me::Client do
561
569
  end
562
570
 
563
571
  it 'should block on rate limit using Retry-After with minimum of 2 seconds when block_at_rate_limit is true' do
564
- stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: {message: 'Too Many Requests'}.to_json, headers: {'Retry-After' => '1'}).then.to_return(body: {name: 'my name'}.to_json)
565
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
572
+ stub = stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(status: 429, body: { message: 'Too Many Requests' }.to_json, headers: { 'Retry-After' => '1' }).then.to_return(body: { name: 'my name' }.to_json)
573
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
566
574
  expect_log('Request throttled, trying again in 2 seconds: 429: Too Many Requests', :warn)
567
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug )
568
- expect_log(%(Response:\n{\n "name": "my name"\n}), :debug )
575
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug)
576
+ expect_log(%(Response:\n{\n "name": "my name"\n}), :debug)
569
577
 
570
578
  block_client = client(authentication, block_at_rate_limit: true)
571
579
  allow(block_client).to receive(:sleep)
@@ -578,11 +586,11 @@ describe Sdk4me::Client do
578
586
 
579
587
  context 'logger' do
580
588
  it 'should be possible to override the default logger' do
581
- logger = Logger.new(STDOUT)
589
+ logger = Logger.new($stdout)
582
590
  logger_client = client(authentication, max_retry_time: -1, logger: logger)
583
- stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: {name: 'my name'}.to_json)
584
- expect_log('Sending GET request to api.4me.com:443/v1/me', :debug, logger )
585
- expect_log(%(Response:\n{\n "name": "my name"\n}), :debug, logger )
591
+ stub_request(:get, 'https://api.4me.com/v1/me').with(credentials(authentication)).to_return(body: { name: 'my name' }.to_json)
592
+ expect_log('Sending GET request to api.4me.com:443/v1/me', :debug, logger)
593
+ expect_log(%(Response:\n{\n "name": "my name"\n}), :debug, logger)
586
594
  logger_client.get('me')
587
595
  end
588
596
  end