amplitude-api 0.0.8 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  describe AmplitudeAPI::Identification do
4
6
  user = Struct.new(:id)
5
7
 
6
- context 'with a user object' do
7
- describe '#body' do
8
+ context "with a user object" do
9
+ describe "#body" do
8
10
  it "populates with the user's id" do
9
11
  identification = described_class.new(user_id: user.new(123))
10
12
  expect(identification.to_hash[:user_id]).to eq(123)
@@ -12,8 +14,8 @@ describe AmplitudeAPI::Identification do
12
14
  end
13
15
  end
14
16
 
15
- context 'with a user id' do
16
- describe '#body' do
17
+ context "with a user id" do
18
+ describe "#body" do
17
19
  it "populates with the user's id" do
18
20
  identification = described_class.new(user_id: 123)
19
21
  expect(identification.to_hash[:user_id]).to eq(123)
@@ -21,30 +23,35 @@ describe AmplitudeAPI::Identification do
21
23
  end
22
24
  end
23
25
 
24
- context 'without a user' do
25
- describe '#body' do
26
- it 'populates with the unknown user' do
26
+ context "without a user" do
27
+ describe "#body" do
28
+ it "populates with the unknown user" do
27
29
  identification = described_class.new(user_id: nil)
28
30
  expect(identification.to_hash[:user_id]).to eq(AmplitudeAPI::USER_WITH_NO_ACCOUNT)
29
31
  end
30
32
  end
31
33
  end
32
34
 
33
- describe '#body' do
34
- it 'includes the user id' do
35
+ describe "#body" do
36
+ it "includes the user id" do
35
37
  identification = described_class.new(user_id: 123)
36
38
  expect(identification.to_hash[:user_id]).to eq(123)
37
39
  end
38
40
 
39
- it 'includes arbitrary user properties' do
41
+ it "includes the device id" do
42
+ identification = described_class.new(user_id: 123, device_id: "abc")
43
+ expect(identification.to_hash[:device_id]).to eq("abc")
44
+ end
45
+
46
+ it "includes arbitrary user properties" do
40
47
  identification = described_class.new(
41
48
  user_id: 123,
42
49
  user_properties: {
43
- first_name: 'John',
44
- last_name: 'Doe'
50
+ first_name: "John",
51
+ last_name: "Doe"
45
52
  }
46
53
  )
47
- expect(identification.to_hash[:user_properties]).to eq(first_name: 'John', last_name: 'Doe')
54
+ expect(identification.to_hash[:user_properties]).to eq(first_name: "John", last_name: "Doe")
48
55
  end
49
56
  end
50
57
  end
@@ -1,83 +1,170 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  describe AmplitudeAPI do
4
6
  let(:user) { Struct.new(:id).new(123) }
7
+ let(:device_id) { "abcdef" }
8
+
9
+ describe ".track" do
10
+ context "with a single event" do
11
+ context "with only user_id" do
12
+ it "sends the event to Amplitude" do
13
+ event = AmplitudeAPI::Event.new(
14
+ user_id: 123,
15
+ event_type: "clicked on sign up"
16
+ )
17
+ body = JSON.generate(
18
+ api_key: described_class.api_key,
19
+ events: [event.to_hash]
20
+ )
21
+ headers = { "Content-Type" => "application/json" }
22
+
23
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body, headers)
24
+
25
+ described_class.track(event)
26
+ end
27
+ end
5
28
 
6
- describe '.track' do
7
- context 'with a single event' do
8
- it 'sends the event to Amplitude' do
9
- event = AmplitudeAPI::Event.new(
10
- user_id: 123,
11
- event_type: 'clicked on sign up'
12
- )
13
- body = {
14
- api_key: described_class.api_key,
15
- event: JSON.generate([event.to_hash])
16
- }
17
-
18
- expect(Typhoeus).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body: body)
29
+ context "with only device_id" do
30
+ it "sends the event to Amplitude" do
31
+ event = AmplitudeAPI::Event.new(
32
+ device_id: device_id,
33
+ event_type: "clicked on sign up"
34
+ )
35
+ body = JSON.generate(
36
+ api_key: described_class.api_key,
37
+ events: [event.to_hash]
38
+ )
39
+ headers = { "Content-Type" => "application/json" }
40
+
41
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body, headers)
42
+
43
+ described_class.track(event)
44
+ end
45
+ end
19
46
 
20
- described_class.track(event)
47
+ context "with both user_id and device_id" do
48
+ it "sends the event to Amplitude" do
49
+ event = AmplitudeAPI::Event.new(
50
+ user_id: 123,
51
+ device_id: device_id,
52
+ event_type: "clicked on sign up"
53
+ )
54
+ body = JSON.generate(
55
+ api_key: described_class.api_key,
56
+ events: [event.to_hash]
57
+ )
58
+ headers = { "Content-Type" => "application/json" }
59
+
60
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body, headers)
61
+
62
+ described_class.track(event)
63
+ end
21
64
  end
22
65
  end
23
66
 
24
- context 'with multiple events' do
25
- it 'sends all events in a single request' do
67
+ context "with multiple events" do
68
+ it "sends all events in a single request" do
26
69
  event = AmplitudeAPI::Event.new(
27
70
  user_id: 123,
28
- event_type: 'clicked on sign up'
71
+ event_type: "clicked on sign up"
29
72
  )
30
73
  event2 = AmplitudeAPI::Event.new(
31
74
  user_id: 456,
32
- event_type: 'liked a widget'
75
+ event_type: "liked a widget"
33
76
  )
34
- body = {
77
+ body = JSON.generate(
35
78
  api_key: described_class.api_key,
36
- event: JSON.generate([event.to_hash, event2.to_hash])
37
- }
79
+ events: [event.to_hash, event2.to_hash]
80
+ )
81
+ headers = { "Content-Type" => "application/json" }
38
82
 
39
- expect(Typhoeus).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body: body)
83
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::TRACK_URI_STRING, body, headers)
40
84
 
41
85
  described_class.track([event, event2])
42
86
  end
43
87
  end
44
88
  end
45
89
 
46
- describe '.identify' do
47
- context 'with a single identification' do
48
- it 'sends the identification to Amplitude' do
49
- identification = AmplitudeAPI::Identification.new(
50
- user_id: 123,
51
- user_properties: {
52
- first_name: 'John',
53
- last_name: 'Doe'
90
+ describe ".identify" do
91
+ context "with a single identification" do
92
+ context "with only user_id" do
93
+ it "sends the identification to Amplitude" do
94
+ identification = AmplitudeAPI::Identification.new(
95
+ user_id: 123,
96
+ user_properties: {
97
+ first_name: "John",
98
+ last_name: "Doe"
99
+ }
100
+ )
101
+ body = {
102
+ api_key: described_class.api_key,
103
+ identification: JSON.generate([identification.to_hash])
54
104
  }
55
- )
56
- body = {
57
- api_key: described_class.api_key,
58
- identification: JSON.generate([identification.to_hash])
59
- }
60
105
 
61
- expect(Typhoeus).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body: body)
106
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body)
107
+
108
+ described_class.identify(identification)
109
+ end
110
+ end
111
+
112
+ context "with only device_id" do
113
+ it "sends the identification to Amplitude" do
114
+ identification = AmplitudeAPI::Identification.new(
115
+ device_id: device_id,
116
+ user_properties: {
117
+ first_name: "John",
118
+ last_name: "Doe"
119
+ }
120
+ )
121
+ body = {
122
+ api_key: described_class.api_key,
123
+ identification: JSON.generate([identification.to_hash])
124
+ }
125
+
126
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body)
62
127
 
63
- described_class.identify(identification)
128
+ described_class.identify(identification)
129
+ end
130
+ end
131
+
132
+ context "with both user_id and device_id" do
133
+ it "sends the identification to Amplitude" do
134
+ identification = AmplitudeAPI::Identification.new(
135
+ user_id: 123,
136
+ device_id: device_id,
137
+ user_properties: {
138
+ first_name: "John",
139
+ last_name: "Doe"
140
+ }
141
+ )
142
+ body = {
143
+ api_key: described_class.api_key,
144
+ identification: JSON.generate([identification.to_hash])
145
+ }
146
+
147
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body)
148
+
149
+ described_class.identify(identification)
150
+ end
64
151
  end
65
152
  end
66
153
 
67
- context 'with multiple identifications' do
68
- it 'sends all identifications in a single request' do
154
+ context "with multiple identifications" do
155
+ it "sends all identifications in a single request" do
69
156
  identification = AmplitudeAPI::Identification.new(
70
157
  user_id: 123,
71
158
  user_properties: {
72
- first_name: 'Julian',
73
- last_name: 'Ponce'
159
+ first_name: "Julian",
160
+ last_name: "Ponce"
74
161
  }
75
162
  )
76
163
  identification2 = AmplitudeAPI::Identification.new(
77
- user_id: 456,
164
+ device_id: 456,
78
165
  user_properties: {
79
- first_name: 'John',
80
- last_name: 'Doe'
166
+ first_name: "John",
167
+ last_name: "Doe"
81
168
  }
82
169
  )
83
170
  body = {
@@ -85,188 +172,415 @@ describe AmplitudeAPI do
85
172
  identification: JSON.generate([identification.to_hash, identification2.to_hash])
86
173
  }
87
174
 
88
- expect(Typhoeus).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body: body)
175
+ expect(Faraday).to receive(:post).with(AmplitudeAPI::IDENTIFY_URI_STRING, body)
89
176
 
90
177
  described_class.identify([identification, identification2])
91
178
  end
92
179
  end
93
180
  end
94
181
 
95
- describe '.initializer ' do
96
- it 'initializes event without parameter' do
97
- event = AmplitudeAPI::Event.new
98
- expect(event.to_hash).to eq(
99
- event_type: '',
100
- user_id: '',
101
- event_properties: {},
102
- user_properties: {},
103
- ip: ''
104
- )
105
- end
106
-
107
- it 'initializes event with parameter' do
108
- event = AmplitudeAPI::Event.new(
182
+ describe ".initializer" do
183
+ let(:attributes) do
184
+ {
109
185
  user_id: 123,
110
- event_type: 'test_event',
186
+ event_type: "test_event",
111
187
  event_properties: {
112
188
  test_property: 1
113
189
  },
114
- ip: '8.8.8.8'
115
- )
116
- expect(event.to_hash).to eq(
117
- event_type: 'test_event',
118
- user_id: 123,
119
- event_properties: { test_property: 1 },
120
190
  user_properties: {},
121
- ip: '8.8.8.8'
122
- )
191
+ ip: "8.8.8.8"
192
+ }
123
193
  end
124
- end
125
194
 
126
- describe '.send_event' do
127
- it 'sends an event to AmplitudeAPI' do
128
- event = AmplitudeAPI::Event.new(
129
- user_id: user,
130
- event_type: 'test_event',
131
- event_properties: { test_property: 1 }
132
- )
133
- expect(described_class).to receive(:track).with(event)
134
-
135
- described_class.send_event('test_event', user, event_properties: { test_property: 1 })
195
+ it "requires event type" do
196
+ attributes.delete(:event_type)
197
+ expect { AmplitudeAPI::Event.new(attributes) }.to raise_error(ArgumentError)
136
198
  end
137
199
 
138
- context 'the user is nil' do
139
- it 'sends an event with the no account user' do
140
- event = AmplitudeAPI::Event.new(
141
- user_id: nil,
142
- event_type: 'test_event',
143
- event_properties: { test_property: 1 }
144
- )
145
- expect(described_class).to receive(:track).with(event)
200
+ it "requires user id or device id" do
201
+ expect(AmplitudeAPI::Event.new(attributes).to_h).to eq(attributes)
202
+ attributes.merge!(device_id: "abc").delete(:user_id)
203
+ expect(AmplitudeAPI::Event.new(attributes).to_h).to eq(attributes)
204
+ attributes.delete(:device_id)
205
+ expect { AmplitudeAPI::Event.new(attributes) }.to raise_error(ArgumentError)
206
+ end
146
207
 
147
- described_class.send_event('test_event', nil, event_properties: { test_property: 1 })
148
- end
208
+ it "initializes event with parameter" do
209
+ expect(AmplitudeAPI::Event.new(attributes)).to eq(attributes)
149
210
  end
211
+ end
150
212
 
151
- context 'the user is a user_id' do
152
- it 'sends an event to AmplitudeAPI' do
213
+ describe ".send_event" do
214
+ context "with only user_id" do
215
+ it "sends an event to AmplitudeAPI" do
153
216
  event = AmplitudeAPI::Event.new(
154
- user_id: 123,
155
- event_type: 'test_event',
217
+ user_id: user,
218
+ event_type: "test_event",
156
219
  event_properties: { test_property: 1 }
157
220
  )
158
221
  expect(described_class).to receive(:track).with(event)
159
222
 
160
- described_class.send_event('test_event', user.id, event_properties: { test_property: 1 })
223
+ described_class.send_event("test_event", user, nil, event_properties: { test_property: 1 })
161
224
  end
162
225
 
163
- it 'sends arbitrary user_properties to AmplitudeAPI' do
164
- event = AmplitudeAPI::Event.new(
165
- user_id: 123,
166
- event_type: 'test_event',
167
- event_properties: { test_property: 1 },
168
- user_properties: { test_user_property: 'abc' }
169
- )
170
- expect(described_class).to receive(:track).with(event)
226
+ context "the user is nil" do
227
+ it "sends an event with the no account user" do
228
+ event = AmplitudeAPI::Event.new(
229
+ user_id: nil,
230
+ event_type: "test_event",
231
+ event_properties: { test_property: 1 }
232
+ )
233
+ expect(described_class).to receive(:track).with(event)
234
+
235
+ described_class.send_event("test_event", nil, nil, event_properties: { test_property: 1 })
236
+ end
237
+ end
171
238
 
172
- described_class.send_event(
173
- 'test_event',
174
- user.id,
175
- event_properties: { test_property: 1 },
176
- user_properties: { test_user_property: 'abc' }
177
- )
239
+ context "the user is a user_id" do
240
+ it "sends an event to AmplitudeAPI" do
241
+ event = AmplitudeAPI::Event.new(
242
+ user_id: 123,
243
+ event_type: "test_event",
244
+ event_properties: { test_property: 1 }
245
+ )
246
+ expect(described_class).to receive(:track).with(event)
247
+
248
+ described_class.send_event("test_event", user.id, nil, event_properties: { test_property: 1 })
249
+ end
250
+
251
+ it "sends arbitrary user_properties to AmplitudeAPI" do
252
+ event = AmplitudeAPI::Event.new(
253
+ user_id: 123,
254
+ event_type: "test_event",
255
+ event_properties: { test_property: 1 },
256
+ user_properties: { test_user_property: "abc" }
257
+ )
258
+ expect(described_class).to receive(:track).with(event)
259
+
260
+ described_class.send_event(
261
+ "test_event",
262
+ user.id,
263
+ nil,
264
+ event_properties: { test_property: 1 },
265
+ user_properties: { test_user_property: "abc" }
266
+ )
267
+ end
178
268
  end
179
269
  end
180
- end
181
270
 
182
- describe '.send_identify' do
183
- it 'sends an identify to AmplitudeAPI' do
184
- identification = AmplitudeAPI::Identification.new(
185
- user_id: user,
186
- user_properties: {
187
- first_name: 'John',
188
- last_name: 'Doe'
189
- }
190
- )
191
- expect(described_class).to receive(:identify).with(identification)
271
+ context "with device_id" do
272
+ context "the user is not nil" do
273
+ it "sends an event to AmplitudeAPI" do
274
+ event = AmplitudeAPI::Event.new(
275
+ user_id: user,
276
+ device_id: device_id,
277
+ event_type: "test_event",
278
+ event_properties: { test_property: 1 }
279
+ )
280
+ expect(described_class).to receive(:track).with(event)
281
+
282
+ described_class.send_event("test_event", user, device_id, event_properties: { test_property: 1 })
283
+ end
284
+ end
192
285
 
193
- described_class.send_identify(user, first_name: 'John', last_name: 'Doe')
286
+ context "the user is nil" do
287
+ it "sends an event with the no account user" do
288
+ event = AmplitudeAPI::Event.new(
289
+ user_id: nil,
290
+ device_id: device_id,
291
+ event_type: "test_event",
292
+ event_properties: { test_property: 1 }
293
+ )
294
+ expect(described_class).to receive(:track).with(event)
295
+
296
+ described_class.send_event("test_event", nil, device_id, event_properties: { test_property: 1 })
297
+ end
298
+ end
194
299
  end
300
+ end
195
301
 
196
- context 'the user is nil' do
197
- it 'sends an identify with the no account user' do
302
+ describe ".send_identify" do
303
+ context "with no device_id" do
304
+ it "sends an identify to AmplitudeAPI" do
198
305
  identification = AmplitudeAPI::Identification.new(
199
- user_id: nil,
306
+ user_id: user,
200
307
  user_properties: {
201
- first_name: 'John',
202
- last_name: 'Doe'
308
+ first_name: "John",
309
+ last_name: "Doe"
203
310
  }
204
311
  )
205
312
  expect(described_class).to receive(:identify).with(identification)
206
313
 
207
- described_class.send_identify(nil, first_name: 'John', last_name: 'Doe')
314
+ described_class.send_identify(user, nil, first_name: "John", last_name: "Doe")
315
+ end
316
+
317
+ context "the user is nil" do
318
+ it "sends an identify with the no account user" do
319
+ identification = AmplitudeAPI::Identification.new(
320
+ user_id: nil,
321
+ user_properties: {
322
+ first_name: "John",
323
+ last_name: "Doe"
324
+ }
325
+ )
326
+ expect(described_class).to receive(:identify).with(identification)
327
+
328
+ described_class.send_identify(nil, nil, first_name: "John", last_name: "Doe")
329
+ end
330
+ end
331
+
332
+ context "the user is a user_id" do
333
+ it "sends an identify to AmplitudeAPI" do
334
+ identification = AmplitudeAPI::Identification.new(
335
+ user_id: 123,
336
+ user_properties: {
337
+ first_name: "John",
338
+ last_name: "Doe"
339
+ }
340
+ )
341
+ expect(described_class).to receive(:identify).with(identification)
342
+
343
+ described_class.send_identify(user.id, nil, first_name: "John", last_name: "Doe")
344
+ end
208
345
  end
209
346
  end
210
347
 
211
- context 'the user is a user_id' do
212
- it 'sends an identify to AmplitudeAPI' do
348
+ context "with a device_id" do
349
+ it "sends an identify to AmplitudeAPI" do
213
350
  identification = AmplitudeAPI::Identification.new(
214
- user_id: 123,
351
+ user_id: user,
352
+ device_id: "abc",
215
353
  user_properties: {
216
- first_name: 'John',
217
- last_name: 'Doe'
354
+ first_name: "John",
355
+ last_name: "Doe"
218
356
  }
219
357
  )
220
358
  expect(described_class).to receive(:identify).with(identification)
221
359
 
222
- described_class.send_identify(user.id, first_name: 'John', last_name: 'Doe')
360
+ described_class.send_identify(user, "abc", first_name: "John", last_name: "Doe")
223
361
  end
224
362
  end
225
363
  end
226
364
 
227
- describe '#body' do
228
- it 'adds an api key' do
365
+ describe ".segmentation" do
366
+ let(:end_time) { Time.now }
367
+ let(:start_time) { end_time - 60 * 60 * 24 } # -1 day
368
+
369
+ it "sends request to Amplitude" do
370
+ expect(Faraday).to receive(:get).with(AmplitudeAPI::SEGMENTATION_URI_STRING,
371
+ userpwd: "#{described_class.api_key}:#{described_class.secret_key}",
372
+ params: {
373
+ e: { event_type: "my event" }.to_json,
374
+ start: start_time.strftime("%Y%m%d"),
375
+ end: end_time.strftime("%Y%m%d"),
376
+ s: [{ prop: "foo", op: "is", values: %w[bar] }.to_json]
377
+ })
378
+
379
+ described_class.segmentation({ event_type: "my event" }, start_time, end_time,
380
+ s: [{ prop: "foo", op: "is", values: %w[bar] }])
381
+ end
382
+ end
383
+
384
+ describe ".delete" do
385
+ let(:connection) { instance_double("Faraday::Connection", post: nil, basic_auth: nil) }
386
+
387
+ before do
388
+ allow(Faraday).to receive(:new).and_yield(connection).and_return(connection)
389
+ allow(Faraday).to receive(:post)
390
+ end
391
+
392
+ it "sends the authentification" do
393
+ api_key = described_class.config.api_key
394
+ secret_key = described_class.config.secret_key
395
+
396
+ described_class.delete(user_ids: "123")
397
+
398
+ expect(connection).to have_received(:basic_auth).with(api_key, secret_key)
399
+ end
400
+
401
+ it "sends the requester" do
402
+ requester = "privacy@gethopscotch.com"
403
+ body = {
404
+ amplitude_ids: ["123"],
405
+ requester: requester
406
+ }
407
+
408
+ described_class.delete(amplitude_ids: "123", requester: requester)
409
+
410
+ expect(connection).to have_received(:post).with(
411
+ AmplitudeAPI::DELETION_URI_STRING,
412
+ JSON.generate(body),
413
+ "Content-Type" => "application/json"
414
+ )
415
+ end
416
+
417
+ it "sends the ignore_invalid_id flag" do
418
+ body = {
419
+ user_ids: ["123"],
420
+ ignore_invalid_id: "true"
421
+ }
422
+
423
+ described_class.delete(user_ids: "123", ignore_invalid_id: true)
424
+
425
+ expect(connection).to have_received(:post).with(
426
+ AmplitudeAPI::DELETION_URI_STRING,
427
+ JSON.generate(body),
428
+ "Content-Type" => "application/json"
429
+ )
430
+ end
431
+
432
+ it "sends the delete_from_org flag" do
433
+ body = {
434
+ user_ids: ["123"],
435
+ delete_from_org: "true"
436
+ }
437
+
438
+ described_class.delete(user_ids: "123", delete_from_org: true)
439
+
440
+ expect(connection).to have_received(:post).with(
441
+ AmplitudeAPI::DELETION_URI_STRING,
442
+ JSON.generate(body),
443
+ "Content-Type" => "application/json"
444
+ )
445
+ end
446
+
447
+ context "with a single user" do
448
+ it "sends the user_id to Amplitude" do
449
+ body = {
450
+ user_ids: ["123"]
451
+ }
452
+
453
+ described_class.delete(user_ids: "123")
454
+
455
+ expect(connection).to have_received(:post).with(
456
+ AmplitudeAPI::DELETION_URI_STRING,
457
+ JSON.generate(body),
458
+ "Content-Type" => "application/json"
459
+ )
460
+ end
461
+
462
+ it "sends the amplitude_id to Amplitude" do
463
+ body = {
464
+ amplitude_ids: ["123"]
465
+ }
466
+
467
+ described_class.delete(amplitude_ids: "123")
468
+
469
+ expect(connection).to have_received(:post).with(
470
+ AmplitudeAPI::DELETION_URI_STRING,
471
+ JSON.generate(body),
472
+ "Content-Type" => "application/json"
473
+ )
474
+ end
475
+
476
+ it "sends both user_id and amplitude_id to Amplitude" do
477
+ body = {
478
+ amplitude_ids: ["123"],
479
+ user_ids: ["456"]
480
+ }
481
+
482
+ described_class.delete(user_ids: "456", amplitude_ids: "123")
483
+
484
+ expect(connection).to have_received(:post).with(
485
+ AmplitudeAPI::DELETION_URI_STRING,
486
+ JSON.generate(body),
487
+ "Content-Type" => "application/json"
488
+ )
489
+ end
490
+ end
491
+
492
+ context "with multiple user_ids" do
493
+ it "sends the user_ids to Amplitude" do
494
+ user_ids = [123, 456, 555]
495
+ body = {
496
+ user_ids: user_ids
497
+ }
498
+
499
+ described_class.delete(user_ids: user_ids)
500
+
501
+ expect(connection).to have_received(:post).with(
502
+ AmplitudeAPI::DELETION_URI_STRING,
503
+ JSON.generate(body),
504
+ "Content-Type" => "application/json"
505
+ )
506
+ end
507
+
508
+ it "sends the amplitude_ids to Amplitude" do
509
+ amplitude_ids = [122, 456]
510
+ body = {
511
+ amplitude_ids: amplitude_ids
512
+ }
513
+
514
+ described_class.delete(amplitude_ids: amplitude_ids)
515
+
516
+ expect(connection).to have_received(:post).with(
517
+ AmplitudeAPI::DELETION_URI_STRING,
518
+ JSON.generate(body),
519
+ "Content-Type" => "application/json"
520
+ )
521
+ end
522
+
523
+ it "sends both user_ids and amplitude_ids to Amplitude" do
524
+ user_ids = [123, 456, 555]
525
+ amplitude_ids = [122, 456]
526
+ body = {
527
+ amplitude_ids: amplitude_ids,
528
+ user_ids: user_ids
529
+ }
530
+
531
+ described_class.delete(user_ids: user_ids, amplitude_ids: amplitude_ids)
532
+
533
+ expect(connection).to have_received(:post).with(
534
+ AmplitudeAPI::DELETION_URI_STRING,
535
+ JSON.generate(body),
536
+ "Content-Type" => "application/json"
537
+ )
538
+ end
539
+ end
540
+ end
541
+
542
+ describe "#body" do
543
+ it "adds an api key" do
229
544
  event = AmplitudeAPI::Event.new(
230
545
  user_id: user,
231
- event_type: 'test_event',
546
+ event_type: "test_event",
232
547
  event_properties: {
233
548
  test_property: 1
234
549
  }
235
550
  )
236
- body = described_class.track_body(event)
237
- expect(body[:api_key]).to eq('stub api key')
551
+ json_body = described_class.track_body(event)
552
+ body = JSON.parse(json_body)
553
+ expect(body["api_key"]).to eq("stub api key")
238
554
  end
239
555
 
240
- it 'creates an event' do
556
+ it "creates an event" do
241
557
  event = AmplitudeAPI::Event.new(
242
558
  user_id: 23,
243
- event_type: 'test_event',
559
+ event_type: "test_event",
244
560
  event_properties: {
245
- foo: 'bar'
561
+ foo: "bar"
246
562
  },
247
563
  user_properties: {
248
- abc: '123'
564
+ abc: "123"
249
565
  },
250
- ip: '8.8.8.8'
566
+ ip: "8.8.8.8"
251
567
  )
252
- body = described_class.track_body(event)
253
-
254
- expected = JSON.generate(
255
- [
256
- {
257
- event_type: 'test_event',
258
- user_id: 23,
259
- event_properties: {
260
- foo: 'bar'
261
- },
262
- user_properties: {
263
- abc: '123'
264
- },
265
- ip: '8.8.8.8'
266
- }
267
- ]
268
- )
269
- expect(body[:event]).to eq(expected)
568
+ json_body = described_class.track_body(event)
569
+ body = JSON.parse(json_body, symbolize_names: true)
570
+ expected = [
571
+ {
572
+ event_type: "test_event",
573
+ user_id: 23,
574
+ event_properties: {
575
+ foo: "bar"
576
+ },
577
+ user_properties: {
578
+ abc: "123"
579
+ },
580
+ ip: "8.8.8.8"
581
+ }
582
+ ]
583
+ expect(body[:events]).to eq(expected)
270
584
  end
271
585
  end
272
586
  end