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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +19 -1
- data/.travis.yml +2 -3
- data/Changelog.md +22 -0
- 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/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/lib/amplitude_api.rb +69 -46
- data/readme.md +7 -6
- 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 +278 -188
- 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,331 +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
|
-
|
381
|
-
|
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:
|
450
|
+
user_ids: ["123"]
|
384
451
|
}
|
385
452
|
|
386
|
-
|
453
|
+
described_class.delete(user_ids: "123")
|
454
|
+
|
455
|
+
expect(connection).to have_received(:post).with(
|
387
456
|
AmplitudeAPI::DELETION_URI_STRING,
|
388
|
-
|
389
|
-
|
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
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
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
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
)
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
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
|
417
|
-
it
|
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
|
-
|
514
|
+
described_class.delete(amplitude_ids: amplitude_ids)
|
515
|
+
|
516
|
+
expect(connection).to have_received(:post).with(
|
424
517
|
AmplitudeAPI::DELETION_URI_STRING,
|
425
|
-
|
426
|
-
|
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
|
-
|
433
|
-
|
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
|
-
|
528
|
+
user_ids: user_ids
|
439
529
|
}
|
440
|
-
userpwd = "#{described_class.api_key}:#{described_class.config.secret_key}"
|
441
530
|
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
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
|
454
|
-
it
|
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:
|
546
|
+
event_type: "test_event",
|
458
547
|
event_properties: {
|
459
548
|
test_property: 1
|
460
549
|
}
|
461
550
|
)
|
462
|
-
|
463
|
-
|
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
|
556
|
+
it "creates an event" do
|
467
557
|
event = AmplitudeAPI::Event.new(
|
468
558
|
user_id: 23,
|
469
|
-
event_type:
|
559
|
+
event_type: "test_event",
|
470
560
|
event_properties: {
|
471
|
-
foo:
|
561
|
+
foo: "bar"
|
472
562
|
},
|
473
563
|
user_properties: {
|
474
|
-
abc:
|
564
|
+
abc: "123"
|
475
565
|
},
|
476
|
-
ip:
|
566
|
+
ip: "8.8.8.8"
|
477
567
|
)
|
478
|
-
|
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:
|
572
|
+
event_type: "test_event",
|
483
573
|
user_id: 23,
|
484
574
|
event_properties: {
|
485
|
-
foo:
|
575
|
+
foo: "bar"
|
486
576
|
},
|
487
577
|
user_properties: {
|
488
|
-
abc:
|
578
|
+
abc: "123"
|
489
579
|
},
|
490
|
-
ip:
|
580
|
+
ip: "8.8.8.8"
|
491
581
|
}
|
492
582
|
]
|
493
|
-
expect(
|
583
|
+
expect(body[:events]).to eq(expected)
|
494
584
|
end
|
495
585
|
end
|
496
586
|
end
|