amplitude-api 0.1.1 → 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +19 -1
- data/.travis.yml +2 -4
- data/Changelog.md +11 -1
- data/Gemfile +9 -7
- data/Gemfile.lock +10 -8
- data/Rakefile +7 -5
- data/amplitude-api.gemspec +17 -15
- data/lib/amplitude-api.rb +3 -4
- data/lib/amplitude_api.rb +48 -37
- data/lib/amplitude_api/config.rb +25 -4
- data/lib/amplitude_api/event.rb +75 -15
- data/lib/amplitude_api/identification.rb +3 -1
- data/lib/amplitude_api/version.rb +3 -1
- data/readme.md +4 -4
- data/spec/lib/amplitude_api/event_spec.rb +193 -112
- data/spec/lib/amplitude_api/identification_spec.rb +19 -17
- data/spec/lib/amplitude_api_spec.rb +265 -213
- data/spec/spec_helper.rb +7 -5
- metadata +8 -8
@@ -1,10 +1,12 @@
|
|
1
|
-
|
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
|
7
|
-
describe
|
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
|
16
|
-
describe
|
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
|
25
|
-
describe
|
26
|
-
it
|
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
|
34
|
-
it
|
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
|
40
|
-
identification = described_class.new(user_id: 123, device_id:
|
41
|
-
expect(identification.to_hash[:device_id]).to eq(
|
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
|
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:
|
49
|
-
last_name:
|
50
|
+
first_name: "John",
|
51
|
+
last_name: "Doe"
|
50
52
|
}
|
51
53
|
)
|
52
|
-
expect(identification.to_hash[:user_properties]).to eq(first_name:
|
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
|
-
|
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) {
|
7
|
+
let(:device_id) { "abcdef" }
|
6
8
|
|
7
|
-
describe
|
8
|
-
context
|
9
|
-
context
|
10
|
-
it
|
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:
|
15
|
+
event_type: "clicked on sign up"
|
14
16
|
)
|
15
|
-
body =
|
17
|
+
body = JSON.generate(
|
16
18
|
api_key: described_class.api_key,
|
17
|
-
|
18
|
-
|
19
|
+
events: [event.to_hash]
|
20
|
+
)
|
21
|
+
headers = { "Content-Type" => "application/json" }
|
19
22
|
|
20
|
-
expect(
|
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
|
27
|
-
it
|
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:
|
33
|
+
event_type: "clicked on sign up"
|
31
34
|
)
|
32
|
-
body =
|
35
|
+
body = JSON.generate(
|
33
36
|
api_key: described_class.api_key,
|
34
|
-
|
35
|
-
|
37
|
+
events: [event.to_hash]
|
38
|
+
)
|
39
|
+
headers = { "Content-Type" => "application/json" }
|
36
40
|
|
37
|
-
expect(
|
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
|
44
|
-
it
|
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:
|
52
|
+
event_type: "clicked on sign up"
|
49
53
|
)
|
50
|
-
body =
|
54
|
+
body = JSON.generate(
|
51
55
|
api_key: described_class.api_key,
|
52
|
-
|
53
|
-
|
56
|
+
events: [event.to_hash]
|
57
|
+
)
|
58
|
+
headers = { "Content-Type" => "application/json" }
|
54
59
|
|
55
|
-
expect(
|
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
|
63
|
-
it
|
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:
|
71
|
+
event_type: "clicked on sign up"
|
67
72
|
)
|
68
73
|
event2 = AmplitudeAPI::Event.new(
|
69
74
|
user_id: 456,
|
70
|
-
event_type:
|
75
|
+
event_type: "liked a widget"
|
71
76
|
)
|
72
|
-
body =
|
77
|
+
body = JSON.generate(
|
73
78
|
api_key: described_class.api_key,
|
74
|
-
|
75
|
-
|
79
|
+
events: [event.to_hash, event2.to_hash]
|
80
|
+
)
|
81
|
+
headers = { "Content-Type" => "application/json" }
|
76
82
|
|
77
|
-
expect(
|
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
|
85
|
-
context
|
86
|
-
context
|
87
|
-
it
|
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:
|
92
|
-
last_name:
|
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(
|
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
|
107
|
-
it
|
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:
|
112
|
-
last_name:
|
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(
|
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
|
127
|
-
it
|
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:
|
133
|
-
last_name:
|
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(
|
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
|
149
|
-
it
|
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:
|
154
|
-
last_name:
|
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:
|
161
|
-
last_name:
|
166
|
+
first_name: "John",
|
167
|
+
last_name: "Doe"
|
162
168
|
}
|
163
169
|
)
|
164
170
|
body = {
|
@@ -166,369 +172,415 @@ describe AmplitudeAPI do
|
|
166
172
|
identification: JSON.generate([identification.to_hash, identification2.to_hash])
|
167
173
|
}
|
168
174
|
|
169
|
-
expect(
|
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
|
182
|
+
describe ".initializer" do
|
177
183
|
let(:attributes) do
|
178
184
|
{
|
179
185
|
user_id: 123,
|
180
|
-
event_type:
|
186
|
+
event_type: "test_event",
|
181
187
|
event_properties: {
|
182
188
|
test_property: 1
|
183
189
|
},
|
184
190
|
user_properties: {},
|
185
|
-
ip:
|
191
|
+
ip: "8.8.8.8"
|
186
192
|
}
|
187
193
|
end
|
188
194
|
|
189
|
-
it
|
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
|
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:
|
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
|
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
|
208
|
-
context
|
209
|
-
it
|
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:
|
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(
|
223
|
+
described_class.send_event("test_event", user, nil, event_properties: { test_property: 1 })
|
218
224
|
end
|
219
225
|
|
220
|
-
context
|
221
|
-
it
|
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:
|
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(
|
235
|
+
described_class.send_event("test_event", nil, nil, event_properties: { test_property: 1 })
|
230
236
|
end
|
231
237
|
end
|
232
238
|
|
233
|
-
context
|
234
|
-
it
|
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:
|
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(
|
248
|
+
described_class.send_event("test_event", user.id, nil, event_properties: { test_property: 1 })
|
243
249
|
end
|
244
250
|
|
245
|
-
it
|
251
|
+
it "sends arbitrary user_properties to AmplitudeAPI" do
|
246
252
|
event = AmplitudeAPI::Event.new(
|
247
253
|
user_id: 123,
|
248
|
-
event_type:
|
254
|
+
event_type: "test_event",
|
249
255
|
event_properties: { test_property: 1 },
|
250
|
-
user_properties: { test_user_property:
|
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
|
-
|
261
|
+
"test_event",
|
256
262
|
user.id,
|
257
263
|
nil,
|
258
264
|
event_properties: { test_property: 1 },
|
259
|
-
user_properties: { test_user_property:
|
265
|
+
user_properties: { test_user_property: "abc" }
|
260
266
|
)
|
261
267
|
end
|
262
268
|
end
|
263
269
|
end
|
264
270
|
|
265
|
-
context
|
266
|
-
context
|
267
|
-
it
|
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:
|
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(
|
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
|
281
|
-
it
|
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:
|
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(
|
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
|
297
|
-
context
|
298
|
-
it
|
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:
|
303
|
-
last_name:
|
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:
|
314
|
+
described_class.send_identify(user, nil, first_name: "John", last_name: "Doe")
|
309
315
|
end
|
310
316
|
|
311
|
-
context
|
312
|
-
it
|
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:
|
317
|
-
last_name:
|
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:
|
328
|
+
described_class.send_identify(nil, nil, first_name: "John", last_name: "Doe")
|
323
329
|
end
|
324
330
|
end
|
325
331
|
|
326
|
-
context
|
327
|
-
it
|
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:
|
332
|
-
last_name:
|
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:
|
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
|
343
|
-
it
|
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:
|
352
|
+
device_id: "abc",
|
347
353
|
user_properties: {
|
348
|
-
first_name:
|
349
|
-
last_name:
|
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,
|
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
|
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
|
364
|
-
expect(
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
described_class.segmentation({ event_type:
|
374
|
-
s: [{ prop:
|
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
|
379
|
-
|
380
|
-
|
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
|
381
449
|
body = {
|
382
|
-
user_ids: [
|
450
|
+
user_ids: ["123"]
|
383
451
|
}
|
384
452
|
|
385
|
-
|
453
|
+
described_class.delete(user_ids: "123")
|
454
|
+
|
455
|
+
expect(connection).to have_received(:post).with(
|
386
456
|
AmplitudeAPI::DELETION_URI_STRING,
|
387
|
-
|
388
|
-
|
389
|
-
headers: { 'Content-Type': 'application/json' }
|
457
|
+
JSON.generate(body),
|
458
|
+
"Content-Type" => "application/json"
|
390
459
|
)
|
391
|
-
described_class.delete(user_ids: '123')
|
392
460
|
end
|
393
|
-
end
|
394
461
|
|
395
|
-
|
396
|
-
it 'sends the deletion to Amplitude' do
|
397
|
-
user_ids = [123, 456, 555]
|
462
|
+
it "sends the amplitude_id to Amplitude" do
|
398
463
|
body = {
|
399
|
-
|
464
|
+
amplitude_ids: ["123"]
|
400
465
|
}
|
401
466
|
|
402
|
-
|
467
|
+
described_class.delete(amplitude_ids: "123")
|
468
|
+
|
469
|
+
expect(connection).to have_received(:post).with(
|
403
470
|
AmplitudeAPI::DELETION_URI_STRING,
|
404
|
-
|
405
|
-
|
406
|
-
headers: { 'Content-Type': 'application/json' }
|
471
|
+
JSON.generate(body),
|
472
|
+
"Content-Type" => "application/json"
|
407
473
|
)
|
408
|
-
described_class.delete(user_ids: user_ids)
|
409
474
|
end
|
410
475
|
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
amplitude_ids: amplitude_ids,
|
417
|
-
user_ids: user_ids
|
418
|
-
}
|
476
|
+
it "sends both user_id and amplitude_id to Amplitude" do
|
477
|
+
body = {
|
478
|
+
amplitude_ids: ["123"],
|
479
|
+
user_ids: ["456"]
|
480
|
+
}
|
419
481
|
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
amplitude_ids: amplitude_ids,
|
428
|
-
user_ids: user_ids
|
429
|
-
)
|
430
|
-
end
|
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
|
+
)
|
431
489
|
end
|
432
490
|
end
|
433
491
|
|
434
|
-
context
|
435
|
-
it
|
436
|
-
|
492
|
+
context "with multiple user_ids" do
|
493
|
+
it "sends the user_ids to Amplitude" do
|
494
|
+
user_ids = [123, 456, 555]
|
437
495
|
body = {
|
438
|
-
|
496
|
+
user_ids: user_ids
|
439
497
|
}
|
440
498
|
|
441
|
-
|
499
|
+
described_class.delete(user_ids: user_ids)
|
500
|
+
|
501
|
+
expect(connection).to have_received(:post).with(
|
442
502
|
AmplitudeAPI::DELETION_URI_STRING,
|
443
|
-
|
444
|
-
|
445
|
-
headers: { 'Content-Type': 'application/json' }
|
503
|
+
JSON.generate(body),
|
504
|
+
"Content-Type" => "application/json"
|
446
505
|
)
|
447
|
-
described_class.delete(amplitude_ids: amplitude_ids)
|
448
506
|
end
|
449
|
-
end
|
450
507
|
|
451
|
-
|
452
|
-
|
508
|
+
it "sends the amplitude_ids to Amplitude" do
|
509
|
+
amplitude_ids = [122, 456]
|
453
510
|
body = {
|
454
|
-
amplitude_ids:
|
511
|
+
amplitude_ids: amplitude_ids
|
455
512
|
}
|
456
513
|
|
457
|
-
|
514
|
+
described_class.delete(amplitude_ids: amplitude_ids)
|
515
|
+
|
516
|
+
expect(connection).to have_received(:post).with(
|
458
517
|
AmplitudeAPI::DELETION_URI_STRING,
|
459
|
-
|
460
|
-
|
461
|
-
headers: { 'Content-Type': 'application/json' }
|
518
|
+
JSON.generate(body),
|
519
|
+
"Content-Type" => "application/json"
|
462
520
|
)
|
463
|
-
described_class.delete(amplitude_ids: 122)
|
464
521
|
end
|
465
|
-
end
|
466
522
|
|
467
|
-
|
468
|
-
|
523
|
+
it "sends both user_ids and amplitude_ids to Amplitude" do
|
524
|
+
user_ids = [123, 456, 555]
|
469
525
|
amplitude_ids = [122, 456]
|
470
|
-
|
471
526
|
body = {
|
472
527
|
amplitude_ids: amplitude_ids,
|
473
|
-
|
528
|
+
user_ids: user_ids
|
474
529
|
}
|
475
|
-
userpwd = "#{described_class.api_key}:#{described_class.config.secret_key}"
|
476
530
|
|
477
|
-
|
531
|
+
described_class.delete(user_ids: user_ids, amplitude_ids: amplitude_ids)
|
532
|
+
|
533
|
+
expect(connection).to have_received(:post).with(
|
478
534
|
AmplitudeAPI::DELETION_URI_STRING,
|
479
|
-
|
480
|
-
|
481
|
-
headers: { 'Content-Type': 'application/json' }
|
482
|
-
)
|
483
|
-
described_class.delete(
|
484
|
-
amplitude_ids: amplitude_ids,
|
485
|
-
requester: 'privacy@gethopscotch.com'
|
535
|
+
JSON.generate(body),
|
536
|
+
"Content-Type" => "application/json"
|
486
537
|
)
|
487
538
|
end
|
488
539
|
end
|
489
540
|
end
|
490
541
|
|
491
|
-
describe
|
492
|
-
it
|
542
|
+
describe "#body" do
|
543
|
+
it "adds an api key" do
|
493
544
|
event = AmplitudeAPI::Event.new(
|
494
545
|
user_id: user,
|
495
|
-
event_type:
|
546
|
+
event_type: "test_event",
|
496
547
|
event_properties: {
|
497
548
|
test_property: 1
|
498
549
|
}
|
499
550
|
)
|
500
|
-
|
501
|
-
|
551
|
+
json_body = described_class.track_body(event)
|
552
|
+
body = JSON.parse(json_body)
|
553
|
+
expect(body["api_key"]).to eq("stub api key")
|
502
554
|
end
|
503
555
|
|
504
|
-
it
|
556
|
+
it "creates an event" do
|
505
557
|
event = AmplitudeAPI::Event.new(
|
506
558
|
user_id: 23,
|
507
|
-
event_type:
|
559
|
+
event_type: "test_event",
|
508
560
|
event_properties: {
|
509
|
-
foo:
|
561
|
+
foo: "bar"
|
510
562
|
},
|
511
563
|
user_properties: {
|
512
|
-
abc:
|
564
|
+
abc: "123"
|
513
565
|
},
|
514
|
-
ip:
|
566
|
+
ip: "8.8.8.8"
|
515
567
|
)
|
516
|
-
|
517
|
-
|
568
|
+
json_body = described_class.track_body(event)
|
569
|
+
body = JSON.parse(json_body, symbolize_names: true)
|
518
570
|
expected = [
|
519
571
|
{
|
520
|
-
event_type:
|
572
|
+
event_type: "test_event",
|
521
573
|
user_id: 23,
|
522
574
|
event_properties: {
|
523
|
-
foo:
|
575
|
+
foo: "bar"
|
524
576
|
},
|
525
577
|
user_properties: {
|
526
|
-
abc:
|
578
|
+
abc: "123"
|
527
579
|
},
|
528
|
-
ip:
|
580
|
+
ip: "8.8.8.8"
|
529
581
|
}
|
530
582
|
]
|
531
|
-
expect(
|
583
|
+
expect(body[:events]).to eq(expected)
|
532
584
|
end
|
533
585
|
end
|
534
586
|
end
|