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