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