UNPKG

24.8 kBJavaScriptView Raw
1const Mixpanel = require('../lib/mixpanel-node');
2const Sinon = require('sinon');
3const {create_profile_helpers} = require('../lib/profile_helpers');
4
5// shared test case
6const test_send_request_args = function(test, func, {args, expected, use_modifiers, use_callback} = {}) {
7 let expected_data = {$token: this.token, $distinct_id: this.distinct_id, ...expected};
8 let callback;
9
10 args = [this.distinct_id, ...(args ? args : [])];
11
12 if (use_modifiers) {
13 var modifiers = {
14 '$ignore_alias': true,
15 '$ignore_time': true,
16 '$ip': '1.2.3.4',
17 '$time': 1234567890,
18 '$latitude': 40.7127753,
19 '$longitude': -74.0059728,
20 };
21 Object.assign(expected_data, modifiers);
22 args.push(modifiers);
23 }
24 if (use_callback) {
25 callback = function() {};
26 args.push(callback);
27 }
28
29 this.mixpanel.people[func](...args);
30
31 const expectedSendRequestArgs = [{ method: 'GET', endpoint: this.endpoint, data: expected_data }];
32 test.ok(
33 this.send_request.calledWithMatch(...expectedSendRequestArgs),
34 `people.${func} didn't call send_request with correct arguments
35 Actual arguments: ${JSON.stringify(this.send_request.getCall(0).args)}
36 expected to include: ${JSON.stringify(expectedSendRequestArgs)}`
37 );
38 if (use_callback) {
39 test.ok(
40 this.send_request.args[0][1] === callback,
41 `people.${func} didn't call send_request with a callback`
42 );
43 }
44 test.done();
45};
46
47exports.people = {
48 setUp: function(next) {
49 this.endpoint = '/engage';
50 this.distinct_id = 'user1';
51 this.token = 'token';
52
53 this.send_request = Sinon.stub();
54
55 this.mixpanel = Mixpanel.init(this.token);
56 this.mixpanel.send_request = this.send_request
57
58 this.test_send_request_args = test_send_request_args;
59
60 next();
61 },
62
63 tearDown: function(next) {
64 next();
65 },
66
67 _set: {
68 "handles set_once correctly": function(test){
69 this.test_send_request_args(test, 'set_once', {
70 args: ['key1', 'val1'],
71 expected: {$set_once: {'key1': 'val1'}},
72 });
73 },
74
75 "calls send_request with correct endpoint and data": function(test) {
76 this.test_send_request_args(test, 'set', {
77 args: ['key1', 'val1'],
78 expected: {$set: {'key1': 'val1'}},
79 });
80 },
81
82 "supports being called with a property object": function(test) {
83 this.test_send_request_args(test, 'set', {
84 args: [{'key1': 'val1', 'key2': 'val2'}],
85 expected: {$set: {'key1': 'val1', 'key2': 'val2'}},
86 });
87 },
88
89 "supports being called with a property object (set_once)": function(test) {
90 this.test_send_request_args(test, 'set_once', {
91 args: [{'key1': 'val1', 'key2': 'val2'}],
92 expected: {$set_once: {'key1': 'val1', 'key2': 'val2'}},
93 });
94 },
95
96 "supports being called with a modifiers argument": function(test) {
97 this.test_send_request_args(test, 'set', {
98 args: ['key1', 'val1'],
99 expected: {$set: {'key1': 'val1'}},
100 use_modifiers: true,
101 });
102 },
103
104 "supports being called with a modifiers argument (set_once)": function(test) {
105 this.test_send_request_args(test, 'set_once', {
106 args: ['key1', 'val1'],
107 expected: {$set_once: {'key1': 'val1'}},
108 use_modifiers: true,
109 });
110 },
111
112 "supports being called with a properties object and a modifiers argument": function(test) {
113 this.test_send_request_args(test, 'set', {
114 args: [{'key1': 'val1', 'key2': 'val2'}],
115 expected: {$set: {'key1': 'val1', 'key2': 'val2'}},
116 use_modifiers: true,
117 });
118 },
119
120 "supports being called with a properties object and a modifiers argument (set_once)": function(test) {
121 this.test_send_request_args(test, 'set_once', {
122 args: [{'key1': 'val1', 'key2': 'val2'}],
123 expected: {$set_once: {'key1': 'val1', 'key2': 'val2'}},
124 use_modifiers: true,
125 });
126 },
127
128 "handles the ip property in a property object properly": function(test) {
129 this.test_send_request_args(test, 'set', {
130 args: [{'ip': '1.2.3.4', 'key1': 'val1', 'key2': 'val2'}],
131 expected: {
132 $ip: '1.2.3.4',
133 $set: {'key1': 'val1', 'key2': 'val2'},
134 },
135 });
136 },
137
138 "handles the $ignore_time property in a property object properly": function(test) {
139 this.test_send_request_args(test, 'set', {
140 args: [{'$ignore_time': true, 'key1': 'val1', 'key2': 'val2'}],
141 expected: {
142 $ignore_time: true,
143 $set: {'key1': 'val1', 'key2': 'val2'},
144 },
145 });
146 },
147
148 "supports being called with a callback": function(test) {
149 this.test_send_request_args(test, 'set', {
150 args: ['key1', 'val1'],
151 expected: {$set: {'key1': 'val1'}},
152 use_callback: true,
153 });
154 },
155
156 "supports being called with a callback (set_once)": function(test) {
157 this.test_send_request_args(test, 'set_once', {
158 args: ['key1', 'val1'],
159 expected: {$set_once: {'key1': 'val1'}},
160 use_callback: true,
161 });
162 },
163
164 "supports being called with a properties object and a callback": function(test) {
165 this.test_send_request_args(test, 'set', {
166 args: [{'key1': 'val1', 'key2': 'val2'}],
167 expected: {$set: {'key1': 'val1', 'key2': 'val2'}},
168 use_callback: true,
169 });
170 },
171
172 "supports being called with a properties object and a callback (set_once)": function(test) {
173 this.test_send_request_args(test, 'set_once', {
174 args: [{'key1': 'val1', 'key2': 'val2'}],
175 expected: {$set_once: {'key1': 'val1', 'key2': 'val2'}},
176 use_callback: true,
177 });
178 },
179
180 "supports being called with a modifiers argument and a callback": function(test) {
181 this.test_send_request_args(test, 'set', {
182 args: ['key1', 'val1'],
183 expected: {$set: {'key1': 'val1'}},
184 use_callback: true,
185 use_modifiers: true,
186 });
187 },
188
189 "supports being called with a modifiers argument and a callback (set_once)": function(test) {
190 this.test_send_request_args(test, 'set_once', {
191 args: ['key1', 'val1'],
192 expected: {$set_once: {'key1': 'val1'}},
193 use_callback: true,
194 use_modifiers: true,
195 });
196 },
197
198 "supports being called with a properties object, a modifiers argument and a callback": function(test) {
199 this.test_send_request_args(test, 'set', {
200 args: [{'key1': 'val1', 'key2': 'val2'}],
201 expected: {$set: {'key1': 'val1', 'key2': 'val2'}},
202 use_callback: true,
203 use_modifiers: true,
204 });
205 },
206
207 "supports being called with a properties object, a modifiers argument and a callback (set_once)": function(test) {
208 this.test_send_request_args(test, 'set_once', {
209 args: [{'key1': 'val1', 'key2': 'val2'}],
210 expected: {$set_once: {'key1': 'val1', 'key2': 'val2'}},
211 use_callback: true,
212 use_modifiers: true,
213 });
214 },
215 },
216
217 increment: {
218 "calls send_request with correct endpoint and data": function(test) {
219 this.test_send_request_args(test, 'increment', {
220 args: ['key1'],
221 expected: {$add: {'key1': 1}},
222 });
223 },
224
225 "supports incrementing key by value": function(test) {
226 this.test_send_request_args(test, 'increment', {
227 args: ['key1', 2],
228 expected: {$add: {'key1': 2}},
229 });
230 },
231
232 "supports incrementing key by value and a modifiers argument": function(test) {
233 this.test_send_request_args(test, 'increment', {
234 args: ['key1', 2],
235 expected: {$add: {'key1': 2}},
236 use_modifiers: true,
237 });
238 },
239
240 "supports incrementing multiple keys": function(test) {
241 this.test_send_request_args(test, 'increment', {
242 args: [{'key1': 5, 'key2': -3}],
243 expected: {$add: {'key1': 5, 'key2': -3}},
244 });
245 },
246
247 "supports incrementing multiple keys and a modifiers argument": function(test) {
248 this.test_send_request_args(test, 'increment', {
249 args: [{'key1': 5, 'key2': -3}],
250 expected: {$add: {'key1': 5, 'key2': -3}},
251 use_modifiers: true,
252 });
253 },
254
255 "ignores invalid values": function(test) {
256 this.test_send_request_args(test, 'increment', {
257 args: [{
258 'key1': 'bad',
259 'key2': 3,
260 'key3': undefined,
261 'key4': '5',
262 'key5': new Date(),
263 'key6': function() {},
264 }],
265 expected: {$add: {'key2': 3, 'key4': '5'}},
266 });
267 },
268
269 "supports being called with a callback": function(test) {
270 this.test_send_request_args(test, 'increment', {
271 args: ['key1'],
272 expected: {$add: {'key1': 1}},
273 use_callback: true,
274 });
275 },
276
277 "supports incrementing key by value with a callback": function(test) {
278 this.test_send_request_args(test, 'increment', {
279 args: ['key1', 2],
280 expected: {$add: {'key1': 2}},
281 use_callback: true,
282 });
283 },
284
285 "supports incrementing key by value with a modifiers argument and callback": function(test) {
286 this.test_send_request_args(test, 'increment', {
287 args: ['key1', 2],
288 expected: {$add: {'key1': 2}},
289 use_callback: true,
290 use_modifiers: true,
291 });
292 },
293
294 "supports incrementing multiple keys with a callback": function(test) {
295 this.test_send_request_args(test, 'increment', {
296 args: [{'key1': 5, 'key2': -3}],
297 expected: {$add: {'key1': 5, 'key2': -3}},
298 use_callback: true,
299 });
300 },
301
302 "supports incrementing multiple keys with a modifiers argument and callback": function(test) {
303 this.test_send_request_args(test, 'increment', {
304 args: [{'key1': 5, 'key2': -3}],
305 expected: {$add: {'key1': 5, 'key2': -3}},
306 use_callback: true,
307 use_modifiers: true,
308 });
309 },
310 },
311
312 append: {
313 "calls send_request with correct endpoint and data": function(test) {
314 this.test_send_request_args(test, 'append', {
315 args: ['key1', 'value'],
316 expected: {$append: {'key1': 'value'}},
317 });
318 },
319
320 "supports being called with modifiers": function(test) {
321 this.test_send_request_args(test, 'append', {
322 args: ['key1', 'value'],
323 expected: {$append: {'key1': 'value'}},
324 use_modifiers: true,
325 });
326 },
327
328 "supports being called with a callback": function(test) {
329 this.test_send_request_args(test, 'append', {
330 args: ['key1', 'value'],
331 expected: {$append: {'key1': 'value'}},
332 use_callback: true,
333 });
334 },
335
336 "supports appending multiple keys with values": function(test) {
337 this.test_send_request_args(test, 'append', {
338 args: [{'key1': 'value1', 'key2': 'value2'}],
339 expected: {$append: {'key1': 'value1', 'key2': 'value2'}},
340 });
341 },
342
343 "supports appending multiple keys with values and a modifiers argument": function(test) {
344 this.test_send_request_args(test, 'append', {
345 args: [{'key1': 'value1', 'key2': 'value2'}],
346 expected: {$append: {'key1': 'value1', 'key2': 'value2'}},
347 use_modifiers: true,
348 });
349 },
350
351 "supports appending multiple keys with values and a callback": function(test) {
352 this.test_send_request_args(test, 'append', {
353 args: [{'key1': 'value1', 'key2': 'value2'}],
354 expected: {$append: {'key1': 'value1', 'key2': 'value2'}},
355 use_callback: true,
356 });
357 },
358
359 "supports appending multiple keys with values with a modifiers argument and callback": function(test) {
360 this.test_send_request_args(test, 'append', {
361 args: [{'key1': 'value1', 'key2': 'value2'}],
362 expected: {$append: {'key1': 'value1', 'key2': 'value2'}},
363 use_callback: true,
364 use_modifiers: true,
365 });
366 },
367 },
368
369 track_charge: {
370 "calls send_request with correct endpoint and data": function(test) {
371 this.test_send_request_args(test, 'track_charge', {
372 args: [50],
373 expected: {$append: {$transactions: {$amount: 50}}},
374 });
375 },
376
377 "supports being called with a property object": function(test) {
378 var time = new Date('Feb 1 2012');
379 this.test_send_request_args(test, 'track_charge', {
380 args: [50, {$time: time, isk: 'isk'}],
381 expected: {$append: {$transactions: {
382 $amount: 50,
383 $time: time.toISOString(),
384 isk: 'isk',
385 }}},
386 });
387 },
388
389 "supports being called with a modifiers argument": function(test) {
390 this.test_send_request_args(test, 'track_charge', {
391 args: [50],
392 expected: {$append: {$transactions: {$amount: 50}}},
393 use_modifiers: true,
394 });
395 },
396
397 "supports being called with a property object and a modifiers argument": function(test) {
398 var time = new Date('Feb 1 2012');
399 this.test_send_request_args(test, 'track_charge', {
400 args: [50, {$time: time, isk: 'isk'}],
401 expected: {$append: {$transactions: {
402 $amount: 50,
403 $time: time.toISOString(),
404 isk: 'isk',
405 }}},
406 use_modifiers: true,
407 });
408 },
409
410 "supports being called with a callback": function(test) {
411 this.test_send_request_args(test, 'track_charge', {
412 args: [50],
413 expected: {$append: {$transactions: {$amount: 50}}},
414 use_callback: true,
415 });
416 },
417
418 "supports being called with properties and a callback": function(test) {
419 this.test_send_request_args(test, 'track_charge', {
420 args: [50, {}],
421 expected: {$append: {$transactions: {$amount: 50}}},
422 use_callback: true,
423 });
424 },
425
426 "supports being called with modifiers and a callback": function(test) {
427 this.test_send_request_args(test, 'track_charge', {
428 args: [50],
429 expected: {$append: {$transactions: {$amount: 50}}},
430 use_callback: true,
431 use_modifiers: true,
432 });
433 },
434
435 "supports being called with properties, modifiers and a callback": function(test) {
436 var time = new Date('Feb 1 2012');
437 this.test_send_request_args(test, 'track_charge', {
438 args: [50, {$time: time, isk: 'isk'}],
439 expected: {$append: {$transactions: {
440 $amount: 50,
441 $time: time.toISOString(),
442 isk: 'isk',
443 }}},
444 use_callback: true,
445 use_modifiers: true,
446 });
447 },
448 },
449
450 clear_charges: {
451 "calls send_request with correct endpoint and data": function(test) {
452 this.test_send_request_args(test, 'clear_charges', {
453 expected: {$set: {$transactions: []}},
454 });
455 },
456
457 "supports being called with a modifiers argument": function(test) {
458 this.test_send_request_args(test, 'clear_charges', {
459 expected: {$set: {$transactions: []}},
460 use_modifiers: true,
461 });
462 },
463
464 "supports being called with a callback": function(test) {
465 this.test_send_request_args(test, 'clear_charges', {
466 expected: {$set: {$transactions: []}},
467 use_callback: true,
468 });
469 },
470
471 "supports being called with a modifiers argument and a callback": function(test) {
472 this.test_send_request_args(test, 'clear_charges', {
473 expected: {$set: {$transactions: []}},
474 use_callback: true,
475 use_modifiers: true,
476 });
477 },
478 },
479
480 delete_user: {
481 "calls send_request with correct endpoint and data": function(test) {
482 this.test_send_request_args(test, 'delete_user', {
483 expected: {$delete: ''},
484 });
485 },
486
487 "supports being called with a modifiers argument": function(test) {
488 this.test_send_request_args(test, 'delete_user', {
489 expected: {$delete: ''},
490 use_modifiers: true,
491 });
492 },
493
494 "supports being called with a callback": function(test) {
495 this.test_send_request_args(test, 'delete_user', {
496 expected: {$delete: ''},
497 use_callback: true,
498 });
499 },
500
501 "supports being called with a modifiers argument and a callback": function(test) {
502 this.test_send_request_args(test, 'delete_user', {
503 expected: {$delete: ''},
504 use_callback: true,
505 use_modifiers: true,
506 });
507 },
508 },
509
510 remove: {
511 "calls send_request with correct endpoint and data": function(test) {
512 this.test_send_request_args(test, 'remove', {
513 args: [{'key1': 'value1', 'key2': 'value2'}],
514 expected: {$remove: {'key1': 'value1', 'key2': 'value2'}},
515 });
516 },
517
518 "errors on non-scalar argument types": function(test) {
519 this.mixpanel.people.remove(this.distinct_id, {'key1': ['value1']});
520 this.mixpanel.people.remove(this.distinct_id, {key1: {key: 'val'}});
521 this.mixpanel.people.remove(this.distinct_id, 1231241.123);
522 this.mixpanel.people.remove(this.distinct_id, [5]);
523 this.mixpanel.people.remove(this.distinct_id, {key1: function() {}});
524 this.mixpanel.people.remove(this.distinct_id, {key1: [function() {}]});
525
526 test.ok(
527 !this.mixpanel.send_request.called,
528 "people.remove shouldn't call send_request on invalid arguments"
529 );
530 test.done();
531 },
532
533 "supports being called with a modifiers argument": function(test) {
534 this.test_send_request_args(test, 'remove', {
535 args: [{'key1': 'value1'}],
536 expected: {$remove: {'key1': 'value1'}},
537 use_modifiers: true,
538 });
539 },
540
541 "supports being called with a callback": function(test) {
542 this.test_send_request_args(test, 'remove', {
543 args: [{'key1': 'value1'}],
544 expected: {$remove: {'key1': 'value1'}},
545 use_callback: true,
546 });
547 },
548
549 "supports being called with a modifiers argument and a callback": function(test) {
550 this.test_send_request_args(test, 'remove', {
551 args: [{'key1': 'value1'}],
552 expected: {$remove: {'key1': 'value1'}},
553 use_callback: true,
554 use_modifiers: true,
555 });
556 },
557 },
558
559 union: {
560 "calls send_request with correct endpoint and data": function(test) {
561 this.test_send_request_args(test, 'union', {
562 args: [{'key1': ['value1', 'value2']}],
563 expected: {$union: {'key1': ['value1', 'value2']}},
564 });
565 },
566
567 "supports being called with a scalar value": function(test) {
568 this.test_send_request_args(test, 'union', {
569 args: [{'key1': 'value1'}],
570 expected: {$union: {'key1': ['value1']}},
571 });
572 },
573
574 "errors on other argument types": function(test) {
575 this.mixpanel.people.union(this.distinct_id, {key1: {key: 'val'}});
576 this.mixpanel.people.union(this.distinct_id, 1231241.123);
577 this.mixpanel.people.union(this.distinct_id, [5]);
578 this.mixpanel.people.union(this.distinct_id, {key1: function() {}});
579 this.mixpanel.people.union(this.distinct_id, {key1: [function() {}]});
580
581 test.ok(
582 !this.mixpanel.send_request.called,
583 "people.union shouldn't call send_request on invalid arguments"
584 );
585 test.done();
586 },
587
588 "supports being called with a modifiers argument": function(test) {
589 this.test_send_request_args(test, 'union', {
590 args: [{'key1': ['value1', 'value2']}],
591 expected: {$union: {'key1': ['value1', 'value2']}},
592 use_modifiers: true,
593 });
594 },
595
596 "supports being called with a callback": function(test) {
597 this.test_send_request_args(test, 'union', {
598 args: [{'key1': ['value1', 'value2']}],
599 expected: {$union: {'key1': ['value1', 'value2']}},
600 use_callback: true,
601 });
602 },
603
604 "supports being called with a modifiers argument and a callback": function(test) {
605 this.test_send_request_args(test, 'union', {
606 args: [{'key1': ['value1', 'value2']}],
607 expected: {$union: {'key1': ['value1', 'value2']}},
608 use_callback: true,
609 use_modifiers: true,
610 });
611 },
612 },
613
614 unset: {
615 "calls send_request with correct endpoint and data": function(test) {
616 this.test_send_request_args(test, 'unset', {
617 args: ['key1'],
618 expected: {$unset: ['key1']},
619 });
620 },
621
622 "supports being called with a property array": function(test) {
623 this.test_send_request_args(test, 'unset', {
624 args: [['key1', 'key2']],
625 expected: {$unset: ['key1', 'key2']},
626 });
627 },
628
629 "errors on other argument types": function(test) {
630 this.mixpanel.people.unset(this.distinct_id, { key1:'val1', key2:'val2' });
631 this.mixpanel.people.unset(this.distinct_id, 1231241.123);
632
633 test.ok(
634 !this.mixpanel.send_request.called,
635 "people.unset shouldn't call send_request on invalid arguments"
636 );
637 test.done();
638 },
639
640 "supports being called with a modifiers argument": function(test) {
641 this.test_send_request_args(test, 'unset', {
642 args: ['key1'],
643 expected: {$unset: ['key1']},
644 use_modifiers: true,
645 });
646 },
647
648 "supports being called with a callback": function(test) {
649 this.test_send_request_args(test, 'unset', {
650 args: ['key1'],
651 expected: {$unset: ['key1']},
652 use_callback: true,
653 });
654 },
655
656 "supports being called with a modifiers argument and a callback": function(test) {
657 this.test_send_request_args(test, 'unset', {
658 args: ['key1'],
659 expected: {$unset: ['key1']},
660 use_callback: true,
661 use_modifiers: true,
662 });
663 },
664 },
665};