customerio 2.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'multi_json'
3
+ require 'base64'
4
+
5
+ describe Customerio::BaseClient do
6
+ let(:url) { "https://test.customer.io" }
7
+
8
+ let(:site_id) { "SITE_ID" }
9
+ let(:api_key) { "API_KEY" }
10
+ let(:track_client) { Customerio::BaseClient.new({ site_id: site_id, api_key: api_key }, { url: url }) }
11
+
12
+ let(:app_key) { "APP_KEY" }
13
+ let(:api_client) { Customerio::BaseClient.new({ app_key: app_key }, { url: url }) }
14
+
15
+ def api_uri(path)
16
+ "#{url}#{path}"
17
+ end
18
+
19
+ def track_client_request_headers
20
+ token = Base64.strict_encode64("#{site_id}:#{api_key}")
21
+ { 'Authorization': "Basic #{token}", 'Content-Type': 'application/json' }
22
+ end
23
+
24
+ def api_client_request_headers
25
+ { 'Authorization': "Bearer #{app_key}", 'Content-Type': 'application/json' }
26
+ end
27
+
28
+ describe "with a site ID and API key" do
29
+ it "uses the correct basic auth" do
30
+ stub_request(:put, api_uri('/some/path')).
31
+ with(headers: track_client_request_headers).
32
+ to_return(status: 200, body: "", headers: {})
33
+
34
+ track_client.request(:put, '/some/path', "")
35
+ end
36
+ end
37
+
38
+ describe "with an app key" do
39
+ it "uses the correct bearer token" do
40
+ stub_request(:put, api_uri('/some/path')).
41
+ with(headers: api_client_request_headers).
42
+ to_return(status: 200, body: "", headers: {})
43
+
44
+ api_client.request(:put, '/some/path', "")
45
+ end
46
+ end
47
+
48
+ describe "#verify_response" do
49
+ it "throws an error when the response isn't between 200 and 300" do
50
+ stub_request(:put, api_uri('/some/path')).
51
+ with(headers: api_client_request_headers).
52
+ to_return(status: 400, body: "", headers: {})
53
+
54
+ lambda { api_client.request_and_verify_response(:put, '/some/path', "") }.should(
55
+ raise_error(Customerio::InvalidResponse)
56
+ )
57
+ end
58
+
59
+ it "returns the response when the status is 200" do
60
+ stub_request(:put, api_uri('/some/path')).
61
+ with(headers: api_client_request_headers).
62
+ to_return(status: 200, body: "Test", headers: {})
63
+
64
+ api_client.request_and_verify_response(:put, '/some/path', "").body.should eq("Test")
65
+ end
66
+ end
67
+ end
data/spec/client_spec.rb CHANGED
@@ -1,39 +1,92 @@
1
1
  require 'spec_helper'
2
2
  require 'multi_json'
3
-
3
+ require 'base64'
4
4
 
5
5
  describe Customerio::Client do
6
- let(:client) { Customerio::Client.new("SITE_ID", "API_KEY", :json => false) }
7
- let(:response) { double("Response", :code => 200) }
6
+ let(:site_id) { "SITE_ID" }
7
+ let(:api_key) { "API_KEY" }
8
+
9
+ let(:client) { Customerio::Client.new(site_id, api_key) }
10
+ let(:response) { double("Response", code: 200) }
8
11
 
9
12
  def api_uri(path)
10
- "https://SITE_ID:API_KEY@track.customer.io#{path}"
13
+ "https://track.customer.io#{path}"
14
+ end
15
+
16
+ def request_headers
17
+ token = Base64.strict_encode64("#{site_id}:#{api_key}")
18
+ { 'Authorization': "Basic #{token}", 'Content-Type': 'application/json' }
11
19
  end
12
20
 
13
21
  def json(data)
14
22
  MultiJson.dump(data)
15
23
  end
16
24
 
17
- describe "json option" do
18
- let(:body) { { :id => 5, :name => "Bob" } }
25
+ it "the base client is initialised with the correct values when no region is passed in" do
26
+ site_id = "SITE_ID"
27
+ api_key = "API_KEY"
28
+
29
+ expect(Customerio::BaseClient).to(
30
+ receive(:new)
31
+ .with(
32
+ { site_id: site_id, api_key: api_key },
33
+ {
34
+ region: Customerio::Regions::US,
35
+ url: Customerio::Regions::US.track_url
36
+ }
37
+ )
38
+ )
19
39
 
20
- it "uses json by default" do
21
- client = Customerio::Client.new("SITE_ID", "API_KEY")
40
+ client = Customerio::Client.new(site_id, api_key)
41
+ end
22
42
 
23
- stub_request(:put, api_uri('/api/v1/customers/5')).
24
- with(:body => json(body),
25
- :headers => {'Content-Type'=>'application/json'}).
26
- to_return(:status => 200, :body => "", :headers => {})
43
+ it "raises an error when an incorrect region is passed in" do
44
+ expect {
45
+ Customerio::Client.new("siteid", "apikey", region: :au)
46
+ }.to raise_error /region must be an instance of Customerio::Regions::Region/
47
+ end
27
48
 
28
- client.identify(body)
49
+ [Customerio::Regions::US, Customerio::Regions::EU].each do |region|
50
+ it "the base client is initialised with the correct values when the region \"#{region}\" is passed in" do
51
+ site_id = "SITE_ID"
52
+ api_key = "API_KEY"
53
+
54
+ expect(Customerio::BaseClient).to(
55
+ receive(:new)
56
+ .with(
57
+ { site_id: site_id, api_key: api_key },
58
+ {
59
+ region: region,
60
+ url: region.track_url
61
+ }
62
+ )
63
+ )
64
+
65
+ client = Customerio::Client.new(site_id, api_key, { region: region })
29
66
  end
67
+ end
30
68
 
31
- it "allows disabling json" do
32
- client = Customerio::Client.new("SITE_ID", "API_KEY", :json => false)
69
+ it "uses json by default" do
70
+ body = { id: 5, name: "Bob" }
71
+ client = Customerio::Client.new("SITE_ID", "API_KEY")
33
72
 
34
- stub_request(:put, api_uri('/api/v1/customers/5')).
35
- with(:body => { :id => "5", :name => "Bob" }).
36
- to_return(:status => 200, :body => "", :headers => {})
73
+ stub_request(:put, api_uri('/api/v1/customers/5')).
74
+ with(body: json(body),
75
+ headers: {'Content-Type'=>'application/json'}).
76
+ to_return(status: 200, body: "", headers: {})
77
+
78
+ client.identify(body)
79
+ end
80
+
81
+ describe "headers" do
82
+ let(:body) { { id: 1, token: :test } }
83
+
84
+ it "sends the basic headers, base64 encoded with the request" do
85
+ client = Customerio::Client.new("SITE_ID", "API_KEY")
86
+
87
+ stub_request(:put, api_uri('/api/v1/customers/1')).
88
+ with(body: json(body), headers: request_headers).
89
+ to_return(status: 200, body: "", headers: {})
37
90
 
38
91
  client.identify(body)
39
92
  end
@@ -42,41 +95,54 @@ describe Customerio::Client do
42
95
  describe "#identify" do
43
96
  it "sends a PUT request to customer.io's customer API" do
44
97
  stub_request(:put, api_uri('/api/v1/customers/5')).
45
- with(:body => "id=5").
46
- to_return(:status => 200, :body => "", :headers => {})
98
+ with(body: json(id: "5")).
99
+ to_return(status: 200, body: "", headers: {})
100
+
101
+ client.identify(id: "5")
102
+ end
47
103
 
48
- client.identify(:id => 5)
104
+ it "escapes customer IDs" do
105
+ stub_request(:put, api_uri('/api/v1/customers/5%20')).
106
+ with(body: json({ id: "5 " })).
107
+ to_return(status: 200, body: "", headers: {})
108
+
109
+ client.identify(id: "5 ")
110
+
111
+ stub_request(:put, api_uri('/api/v1/customers/5%2F')).
112
+ with(body: { id: "5/" }).
113
+ to_return(status: 200, body: "", headers: {})
114
+ client.identify(id: "5/")
49
115
  end
50
116
 
51
117
  it "sends a PUT request to customer.io's customer API using json headers" do
52
- client = Customerio::Client.new("SITE_ID", "API_KEY", :json => true)
53
- body = { :id => 5, :name => "Bob" }
118
+ client = Customerio::Client.new("SITE_ID", "API_KEY", json: true)
119
+ body = { id: 5, name: "Bob" }
54
120
 
55
121
  stub_request(:put, api_uri('/api/v1/customers/5')).
56
- with(:body => json(body),
57
- :headers => {'Content-Type'=>'application/json'}).
58
- to_return(:status => 200, :body => "", :headers => {})
122
+ with(body: json(body),
123
+ headers: {'Content-Type'=>'application/json'}).
124
+ to_return(status: 200, body: "", headers: {})
59
125
 
60
126
  client.identify(body)
61
127
  end
62
128
 
63
129
  it "raises an error if PUT doesn't return a 2xx response code" do
64
130
  stub_request(:put, api_uri('/api/v1/customers/5')).
65
- with(:body => "id=5").
66
- to_return(:status => 500, :body => "", :headers => {})
131
+ with(body: json(id: 5)).
132
+ to_return(status: 500, body: "", headers: {})
67
133
 
68
- lambda { client.identify(:id => 5) }.should raise_error(Customerio::Client::InvalidResponse)
134
+ lambda { client.identify(id: 5) }.should raise_error(Customerio::InvalidResponse)
69
135
  end
70
136
 
71
137
  it "includes the HTTP response with raised errors" do
72
138
  stub_request(:put, api_uri('/api/v1/customers/5')).
73
- with(:body => "id=5").
74
- to_return(:status => 500, :body => "whatever", :headers => {})
139
+ with(body: json(id: 5)).
140
+ to_return(status: 500, body: "Server unavailable", headers: {})
75
141
 
76
- lambda { client.identify(:id => 5) }.should raise_error {|error|
77
- error.should be_a Customerio::Client::InvalidResponse
78
- error.response.code.should eq "500"
79
- error.response.body.should eq "whatever"
142
+ lambda { client.identify(id: 5) }.should raise_error {|error|
143
+ error.should be_a Customerio::InvalidResponse
144
+ error.code.should eq "500"
145
+ error.message.should eq "Server unavailable"
80
146
  }
81
147
  end
82
148
 
@@ -84,31 +150,32 @@ describe Customerio::Client do
84
150
  time = Time.now.to_i
85
151
 
86
152
  stub_request(:put, api_uri('/api/v1/customers/5')).with(
87
- :body => {
88
- :id => "5",
89
- :email => "customer@example.com",
90
- :created_at => time.to_s,
91
- :first_name => "Bob",
92
- :plan => "basic"
93
- }).to_return(:status => 200, :body => "", :headers => {})
153
+ body: json({
154
+ id: 5,
155
+ email: "customer@example.com",
156
+ created_at: time,
157
+ first_name: "Bob",
158
+ plan: "basic"
159
+ })).to_return(status: 200, body: "", headers: {})
94
160
 
95
161
  client.identify({
96
- :id => 5,
97
- :email => "customer@example.com",
98
- :created_at => time,
99
- :first_name => "Bob",
100
- :plan => "basic"
162
+ id: 5,
163
+ email: "customer@example.com",
164
+ created_at: time,
165
+ first_name: "Bob",
166
+ plan: "basic"
101
167
  })
102
168
  end
103
169
 
104
170
  it "requires an id attribute" do
105
- lambda { client.identify(:email => "customer@example.com") }.should raise_error(Customerio::Client::MissingIdAttributeError)
171
+ lambda { client.identify(email: "customer@example.com") }.should raise_error(Customerio::Client::MissingIdAttributeError)
172
+ lambda { client.identify(id: "") }.should raise_error(Customerio::Client::MissingIdAttributeError)
106
173
  end
107
174
 
108
175
  it 'should not raise errors when attribute keys are strings' do
109
176
  stub_request(:put, api_uri('/api/v1/customers/5')).
110
- with(:body => "id=5").
111
- to_return(:status => 200, :body => "", :headers => {})
177
+ with(body: json(id: 5)).
178
+ to_return(status: 200, body: "", headers: {})
112
179
 
113
180
  attributes = { "id" => 5 }
114
181
 
@@ -119,183 +186,237 @@ describe Customerio::Client do
119
186
  describe "#delete" do
120
187
  it "sends a DELETE request to the customer.io's event API" do
121
188
  stub_request(:delete, api_uri('/api/v1/customers/5')).
122
- to_return(:status => 200, :body => "", :headers => {})
189
+ to_return(status: 200, body: "", headers: {})
123
190
 
124
191
  client.delete(5)
125
192
  end
193
+
194
+ it "throws an error when customer_id is missing" do
195
+ stub_request(:put, /track.customer.io/)
196
+ .to_return(status: 200, body: "", headers: {})
197
+
198
+ lambda { client.delete(" ") }.should raise_error(Customerio::Client::ParamError, "customer_id must be a non-empty string")
199
+ end
200
+
201
+ it "escapes customer IDs" do
202
+ stub_request(:delete, api_uri('/api/v1/customers/5%20')).
203
+ to_return(status: 200, body: "", headers: {})
204
+
205
+ client.delete("5 ")
206
+ end
207
+ end
208
+
209
+ describe "#suppress" do
210
+ it "sends a POST request to the customer.io's suppress API" do
211
+ stub_request(:post, api_uri('/api/v1/customers/5/suppress')).
212
+ to_return(status: 200, body: "", headers: {})
213
+
214
+ client.suppress(5)
215
+ end
216
+
217
+ it "throws an error when customer_id is missing" do
218
+ stub_request(:put, /track.customer.io/)
219
+ .to_return(status: 200, body: "", headers: {})
220
+
221
+ lambda { client.suppress(" ") }.should raise_error(Customerio::Client::ParamError, "customer_id must be a non-empty string")
222
+ end
223
+ end
224
+
225
+ describe "#unsuppress" do
226
+ it "sends a POST request to the customer.io's unsuppress API" do
227
+ stub_request(:post, api_uri('/api/v1/customers/5/unsuppress')).
228
+ to_return(status: 200, body: "", headers: {})
229
+
230
+ client.unsuppress(5)
231
+ end
232
+
233
+ it "throws an error when customer_id is missing" do
234
+ stub_request(:put, /track.customer.io/)
235
+ .to_return(status: 200, body: "", headers: {})
236
+
237
+ lambda { client.suppress(" ") }.should raise_error(Customerio::Client::ParamError, "customer_id must be a non-empty string")
238
+ end
126
239
  end
127
240
 
128
241
  describe "#track" do
129
242
  it "raises an error if POST doesn't return a 2xx response code" do
130
243
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
131
- with(:body => "name=purchase").
132
- to_return(:status => 500, :body => "", :headers => {})
244
+ with(body: json(name: "purchase", data: {})).
245
+ to_return(status: 500, body: "", headers: {})
246
+
247
+ lambda { client.track(5, "purchase") }.should raise_error(Customerio::InvalidResponse)
248
+ end
249
+
250
+ it "throws an error when customer_id or event_name is missing" do
251
+ stub_request(:put, /track.customer.io/)
252
+ .to_return(status: 200, body: "", headers: {})
133
253
 
134
- lambda { client.track(5, "purchase") }.should raise_error(Customerio::Client::InvalidResponse)
254
+ lambda { client.track(" ", "test_event") }.should raise_error(Customerio::Client::ParamError, "customer_id must be a non-empty string")
255
+ lambda { client.track(5, " ") }.should raise_error(Customerio::Client::ParamError, "event_name must be a non-empty string")
135
256
  end
136
257
 
137
258
  it "uses the site_id and api key for basic auth and sends the event name" do
138
259
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
139
- with(:body => "name=purchase").
140
- to_return(:status => 200, :body => "", :headers => {})
260
+ with(body: json(name: "purchase", data: {})).
261
+ to_return(status: 200, body: "", headers: {})
141
262
 
142
263
  client.track(5, "purchase")
143
264
  end
144
265
 
145
266
  it "sends any optional event attributes" do
146
267
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
147
- with(:body => {
148
- :name => "purchase",
149
- :data => {
150
- :type => "socks",
151
- :price => "13.99"
268
+ with(body: json({
269
+ name: "purchase",
270
+ data: {
271
+ type: "socks",
272
+ price: "13.99"
152
273
  }
153
- }).
154
- to_return(:status => 200, :body => "", :headers => {})
274
+ })).
275
+ to_return(status: 200, body: "", headers: {})
155
276
 
156
- client.track(5, "purchase", :type => "socks", :price => "13.99")
277
+ client.track(5, "purchase", type: "socks", price: "13.99")
157
278
  end
158
279
 
159
280
  it "copes with arrays" do
160
281
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
161
- with(:body => {
162
- :name => "event",
163
- :data => {
164
- :things => ["a", "b", "c"]
282
+ with(body: {
283
+ name: "event",
284
+ data: {
285
+ things: ["a", "b", "c"]
165
286
  }
166
287
  }).
167
- to_return(:status => 200, :body => "", :headers => {})
288
+ to_return(status: 200, body: "", headers: {})
168
289
 
169
- client.track(5, "event", :things => ["a", "b", "c"])
290
+ client.track(5, "event", things: ["a", "b", "c"])
170
291
  end
171
292
 
172
293
  it "copes with hashes" do
173
294
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
174
- with(:body => {
175
- :name => "event",
176
- :data => {
177
- :stuff => { :a => "b" }
295
+ with(body: {
296
+ name: "event",
297
+ data: {
298
+ stuff: { a: "b" }
178
299
  }
179
300
  }).
180
- to_return(:status => 200, :body => "", :headers => {})
301
+ to_return(status: 200, body: "", headers: {})
181
302
 
182
- client.track(5, "event", :stuff => { :a => "b" })
303
+ client.track(5, "event", stuff: { a: "b" })
183
304
  end
184
305
 
185
306
  it "sends a POST request as json using json headers" do
186
- client = Customerio::Client.new("SITE_ID", "API_KEY", :json => true)
187
- data = { :type => "socks", :price => "13.99" }
188
- body = { :name => "purchase", :data => data }
307
+ client = Customerio::Client.new("SITE_ID", "API_KEY", json: true)
308
+ data = { type: "socks", price: "13.99" }
309
+ body = { name: "purchase", data: data }
189
310
 
190
311
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
191
- with(:body => json(body),
192
- :headers => {'Content-Type'=>'application/json'}).
193
- to_return(:status => 200, :body => "", :headers => {})
312
+ with(body: json(body),
313
+ headers: {'Content-Type'=>'application/json'}).
314
+ to_return(status: 200, body: "", headers: {})
194
315
 
195
316
  client.track(5, "purchase", data)
196
317
  end
197
318
 
198
319
  it "allows sending of a timestamp" do
199
320
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
200
- with(:body => {
201
- :name => "purchase",
202
- :data => {
203
- :type => "socks",
204
- :price => "13.99",
205
- :timestamp => "1561231234"
321
+ with(body: json({
322
+ name: "purchase",
323
+ data: {
324
+ type: "socks",
325
+ price: "13.99",
326
+ timestamp: 1561231234
206
327
  },
207
- :timestamp => "1561231234"
208
- }).
209
- to_return(:status => 200, :body => "", :headers => {})
328
+ timestamp: 1561231234
329
+ })).
330
+ to_return(status: 200, body: "", headers: {})
210
331
 
211
- client.track(5, "purchase", :type => "socks", :price => "13.99", :timestamp => 1561231234)
332
+ client.track(5, "purchase", type: "socks", price: "13.99", timestamp: 1561231234)
212
333
  end
213
334
 
214
335
  it "doesn't send timestamp if timestamp is in milliseconds" do
215
336
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
216
- with(:body => {
217
- :name => "purchase",
218
- :data => {
219
- :type => "socks",
220
- :price => "13.99",
221
- :timestamp => "1561231234000"
337
+ with(body: json({
338
+ name: "purchase",
339
+ data: {
340
+ type: "socks",
341
+ price: "13.99",
342
+ timestamp: 1561231234000
222
343
  }
223
- }).
224
- to_return(:status => 200, :body => "", :headers => {})
344
+ })).
345
+ to_return(status: 200, body: "", headers: {})
225
346
 
226
- client.track(5, "purchase", :type => "socks", :price => "13.99", :timestamp => 1561231234000)
347
+ client.track(5, "purchase", type: "socks", price: "13.99", timestamp: 1561231234000)
227
348
  end
228
349
 
229
350
  it "doesn't send timestamp if timestamp is a date" do
230
351
  date = Time.now
231
352
 
232
353
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
233
- with(:body => {
234
- :name => "purchase",
235
- :data => {
236
- :type => "socks",
237
- :price => "13.99",
238
- :timestamp => Time.now.to_s
354
+ with(body: {
355
+ name: "purchase",
356
+ data: {
357
+ type: "socks",
358
+ price: "13.99",
359
+ timestamp: Time.now.to_s
239
360
  }
240
361
  }).
241
- to_return(:status => 200, :body => "", :headers => {})
362
+ to_return(status: 200, body: "", headers: {})
242
363
 
243
- client.track(5, "purchase", :type => "socks", :price => "13.99", :timestamp => date)
364
+ client.track(5, "purchase", type: "socks", price: "13.99", timestamp: date)
244
365
  end
245
366
 
246
367
  it "doesn't send timestamp if timestamp isn't an integer" do
247
368
  stub_request(:post, api_uri('/api/v1/customers/5/events')).
248
- with(:body => {
249
- :name => "purchase",
250
- :data => {
251
- :type => "socks",
252
- :price => "13.99",
253
- :timestamp => "Hello world"
369
+ with(body: json({
370
+ name: "purchase",
371
+ data: {
372
+ type: "socks",
373
+ price: "13.99",
374
+ timestamp: "Hello world"
254
375
  }
255
- }).
376
+ })).
256
377
 
257
- to_return(:status => 200, :body => "", :headers => {})
378
+ to_return(status: 200, body: "", headers: {})
258
379
 
259
- client.track(5, "purchase", :type => "socks", :price => "13.99", :timestamp => "Hello world")
380
+ client.track(5, "purchase", type: "socks", price: "13.99", timestamp: "Hello world")
260
381
  end
261
382
 
262
383
  context "tracking an anonymous event" do
263
384
  it "sends a POST request to the customer.io's anonymous event API" do
264
385
  stub_request(:post, api_uri('/api/v1/events')).
265
- with(:body => "name=purchase").
266
- to_return(:status => 200, :body => "", :headers => {})
386
+ with(body: json({ name: "purchase", data: {} })).
387
+ to_return(status: 200, body: "", headers: {})
267
388
 
268
- client.track("purchase")
389
+ client.anonymous_track("purchase")
269
390
  end
270
391
 
271
392
  it "sends any optional event attributes" do
272
393
  stub_request(:post, api_uri('/api/v1/events')).
273
- with(:body => {
274
- :name => "purchase",
275
- :data => {
276
- :type => "socks",
277
- :price => "13.99"
394
+ with(body: json({
395
+ name: "purchase",
396
+ data: {
397
+ type: "socks",
398
+ price: "13.99"
278
399
  }
279
- }).
280
- to_return(:status => 200, :body => "", :headers => {})
400
+ })).
401
+ to_return(status: 200, body: "", headers: {})
281
402
 
282
- client.track("purchase", :type => "socks", :price => "13.99")
403
+ client.anonymous_track("purchase", type: "socks", price: "13.99")
283
404
  end
284
405
 
285
406
  it "allows sending of a timestamp" do
286
407
  stub_request(:post, api_uri('/api/v1/events')).
287
- with(:body => {
288
- :name => "purchase",
289
- :data => {
290
- :type => "socks",
291
- :price => "13.99",
292
- :timestamp => "1561231234"
408
+ with(body: json({
409
+ name: "purchase",
410
+ data: {
411
+ type: "socks",
412
+ price: "13.99",
413
+ timestamp: 1561231234
293
414
  },
294
- :timestamp => "1561231234"
295
- }).
296
- to_return(:status => 200, :body => "", :headers => {})
415
+ timestamp: 1561231234
416
+ })).
417
+ to_return(status: 200, body: "", headers: {})
297
418
 
298
- client.track("purchase", :type => "socks", :price => "13.99", :timestamp => 1561231234)
419
+ client.anonymous_track("purchase", type: "socks", price: "13.99", timestamp: 1561231234)
299
420
  end
300
421
  end
301
422
  end
@@ -303,55 +424,62 @@ describe Customerio::Client do
303
424
  describe "#anonymous_track" do
304
425
  it "raises an error if POST doesn't return a 2xx response code" do
305
426
  stub_request(:post, api_uri('/api/v1/events')).
306
- with(:body => "name=purchase").
307
- to_return(:status => 500, :body => "", :headers => {})
427
+ with(body: json(name: "purchase", data: {})).
428
+ to_return(status: 500, body: "", headers: {})
308
429
 
309
- lambda { client.anonymous_track("purchase") }.should raise_error(Customerio::Client::InvalidResponse)
430
+ lambda { client.anonymous_track("purchase") }.should raise_error(Customerio::InvalidResponse)
431
+ end
432
+
433
+ it "throws an error when event_name is missing" do
434
+ stub_request(:put, /track.customer.io/)
435
+ .to_return(status: 200, body: "", headers: {})
436
+
437
+ lambda { client.anonymous_track(" ") }.should raise_error(Customerio::Client::ParamError, "event_name must be a non-empty string")
310
438
  end
311
439
 
312
440
  it "uses the site_id and api key for basic auth and sends the event name" do
313
441
  stub_request(:post, api_uri('/api/v1/events')).
314
- with(:body => "name=purchase").
315
- to_return(:status => 200, :body => "", :headers => {})
442
+ with(body: json(name: "purchase", data: {})).
443
+ to_return(status: 200, body: "", headers: {})
316
444
 
317
445
  client.anonymous_track("purchase")
318
446
  end
319
447
 
320
448
  it "sends any optional event attributes" do
321
449
  stub_request(:post, api_uri('/api/v1/events')).
322
- with(:body => {
323
- :name => "purchase",
324
- :data => {
325
- :type => "socks",
326
- :price => "27.99"
450
+ with(body: {
451
+ name: "purchase",
452
+ data: {
453
+ type: "socks",
454
+ price: "27.99"
327
455
  },
328
456
  }).
329
457
 
330
- to_return(:status => 200, :body => "", :headers => {})
458
+ to_return(status: 200, body: "", headers: {})
331
459
 
332
- client.anonymous_track("purchase", :type => "socks", :price => "27.99")
460
+ client.anonymous_track("purchase", type: "socks", price: "27.99")
333
461
  end
334
462
 
335
463
  it "allows sending of a timestamp" do
336
464
  stub_request(:post, api_uri('/api/v1/events')).
337
- with(:body => {
338
- :name => "purchase",
339
- :data => {
340
- :type => "socks",
341
- :price => "27.99",
342
- :timestamp => "1561235678"
465
+ with(body: json({
466
+ name: "purchase",
467
+ data: {
468
+ type: "socks",
469
+ price: "27.99",
470
+ timestamp: 1561235678
343
471
  },
344
- :timestamp => "1561235678"
345
- }).
472
+ timestamp: 1561235678
473
+ })).
346
474
 
347
- to_return(:status => 200, :body => "", :headers => {})
475
+ to_return(status: 200, body: "", headers: {})
348
476
 
349
- client.anonymous_track("purchase", :type => "socks", :price => "27.99", :timestamp => 1561235678)
477
+ client.anonymous_track("purchase", type: "socks", price: "27.99", timestamp: 1561235678)
350
478
  end
351
479
 
352
480
  context "too many arguments are passed" do
353
481
  it "throws an error" do
354
- lambda { client.anonymous_track("purchase", "text", :type => "socks", :price => "27.99") }.should raise_error(ArgumentError)
482
+ lambda { client.anonymous_track("purchase", "text", type: "socks", price: "27.99") }.should raise_error(ArgumentError)
355
483
  end
356
484
  end
357
485
  end
@@ -359,60 +487,60 @@ describe Customerio::Client do
359
487
  describe "#devices" do
360
488
  it "allows for the creation of a new device" do
361
489
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
362
- to_return(:status => 200, :body => "", :headers => {})
490
+ to_return(status: 200, body: "", headers: {})
363
491
 
364
- client.add_device(5, "androidDeviceID", "ios", {:last_used=>1561235678})
492
+ client.add_device(5, "androidDeviceID", "ios", {last_used: 1561235678})
365
493
  client.add_device(5, "iosDeviceID", "android")
366
494
  end
367
495
  it "requires a valid customer_id when creating" do
368
496
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
369
- to_return(:status => 200, :body => "", :headers => {})
497
+ to_return(status: 200, body: "", headers: {})
370
498
 
371
499
  lambda { client.add_device("", "ios", "myDeviceID") }.should raise_error(Customerio::Client::ParamError)
372
- lambda { client.add_device(nil, "ios", "myDeviceID", {:last_used=>1561235678}) }.should raise_error(Customerio::Client::ParamError)
500
+ lambda { client.add_device(nil, "ios", "myDeviceID", {last_used: 1561235678}) }.should raise_error(Customerio::Client::ParamError)
373
501
  end
374
502
  it "requires a valid token when creating" do
375
503
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
376
- to_return(:status => 200, :body => "", :headers => {})
504
+ to_return(status: 200, body: "", headers: {})
377
505
 
378
506
  lambda { client.add_device(5, "", "ios") }.should raise_error(Customerio::Client::ParamError)
379
- lambda { client.add_device(5, nil, "ios", {:last_used=>1561235678}) }.should raise_error(Customerio::Client::ParamError)
507
+ lambda { client.add_device(5, nil, "ios", {last_used: 1561235678}) }.should raise_error(Customerio::Client::ParamError)
380
508
  end
381
509
  it "requires a valid platform when creating" do
382
510
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
383
- to_return(:status => 200, :body => "", :headers => {})
511
+ to_return(status: 200, body: "", headers: {})
384
512
 
385
513
  lambda { client.add_device(5, "token", "") }.should raise_error(Customerio::Client::ParamError)
386
- lambda { client.add_device(5, "toke", nil, {:last_used=>1561235678}) }.should raise_error(Customerio::Client::ParamError)
514
+ lambda { client.add_device(5, "toke", nil, {last_used: 1561235678}) }.should raise_error(Customerio::Client::ParamError)
387
515
  end
388
516
  it "accepts a nil data param" do
389
517
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
390
- to_return(:status => 200, :body => "", :headers => {})
518
+ to_return(status: 200, body: "", headers: {})
391
519
 
392
520
  client.add_device(5, "ios", "myDeviceID", nil)
393
521
  end
394
522
  it "fails on invalid data param" do
395
523
  stub_request(:put, api_uri('/api/v1/customers/5/devices')).
396
- to_return(:status => 200, :body => "", :headers => {})
524
+ to_return(status: 200, body: "", headers: {})
397
525
 
398
526
  lambda { client.add_device(5, "ios", "myDeviceID", 1000) }.should raise_error(Customerio::Client::ParamError)
399
527
  end
400
528
  it "supports deletion of devices by token" do
401
529
  stub_request(:delete, api_uri('/api/v1/customers/5/devices/myDeviceID')).
402
- to_return(:status => 200, :body => "", :headers => {})
530
+ to_return(status: 200, body: "", headers: {})
403
531
 
404
532
  client.delete_device(5, "myDeviceID")
405
533
  end
406
534
  it "requires a valid customer_id when deleting" do
407
535
  stub_request(:delete, api_uri('/api/v1/customers/5/devices/myDeviceID')).
408
- to_return(:status => 200, :body => "", :headers => {})
536
+ to_return(status: 200, body: "", headers: {})
409
537
 
410
538
  lambda { client.delete_device("", "myDeviceID") }.should raise_error(Customerio::Client::ParamError)
411
539
  lambda { client.delete_device(nil, "myDeviceID") }.should raise_error(Customerio::Client::ParamError)
412
540
  end
413
541
  it "requires a valid device_id when deleting" do
414
542
  stub_request(:delete, api_uri('/api/v1/customers/5/devices/myDeviceID')).
415
- to_return(:status => 200, :body => "", :headers => {})
543
+ to_return(status: 200, body: "", headers: {})
416
544
 
417
545
  lambda { client.delete_device(5, "") }.should raise_error(Customerio::Client::ParamError)
418
546
  lambda { client.delete_device(5, nil) }.should raise_error(Customerio::Client::ParamError)