UNPKG

22.3 kBJavaScriptView Raw
1
2var request = require("request");
3var qs = require("querystring");
4var uuid = require("uuid");
5var should = require("should");
6var sinon = require("sinon");
7var url = require("url");
8
9var ua = require("../lib/index.js");
10var utils = require("../lib/utils.js")
11var config = require("../lib/config.js")
12
13
14describe("ua", function () {
15
16
17 describe("#item", function () {
18 var _enqueue;
19
20 beforeEach(function () {
21 _enqueue = sinon.stub(ua.Visitor.prototype, "_enqueue", function (type, params, fn) {
22 if (fn) {
23 (typeof fn).should.equal('function', "#_enqueue should receive a callback")
24 fn();
25 }
26 return this;
27 });
28 });
29
30 afterEach(function () {
31 _enqueue.restore()
32 });
33
34
35 it("should be available via the #i shortcut", function () {
36 var visitor = ua()
37 visitor.i.should.equal(visitor.item)
38 });
39
40
41 it("should accept arguments (price) when chained to transaction", function () {
42 var transaction = Math.random().toString();
43 var price = Math.random();
44
45 var visitor = ua().transaction(transaction);
46
47 var result = visitor.item(price);
48
49 visitor._context = result._context;
50 result.should.eql(visitor, "should return a visitor that is identical except for the context");
51 result.should.be.instanceof(ua.Visitor);
52 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
53
54 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
55 _enqueue.args[0][0].should.equal("transaction");
56 _enqueue.args[1][0].should.equal("item");
57 _enqueue.args[1][1].should.have.keys("ti", "ip")
58 _enqueue.args[1][1].ti.should.equal(transaction);
59 _enqueue.args[1][1].ip.should.equal(price);
60 });
61
62
63 it("should accept arguments (price, fn) when chained to transaction", function () {
64 var transaction = Math.random().toString();
65 var price = Math.random();
66 var fn = sinon.spy()
67
68 var visitor = ua().transaction(transaction);
69
70 var result = visitor.item(price, fn);
71
72 visitor._context = result._context;
73 result.should.eql(visitor, "should return a visitor that is identical except for the context");
74 result.should.be.instanceof(ua.Visitor);
75 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
76
77 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
78 _enqueue.args[0][0].should.equal("transaction");
79 _enqueue.args[1][0].should.equal("item");
80 _enqueue.args[1][1].should.have.keys("ti", "ip")
81 _enqueue.args[1][1].ti.should.equal(transaction);
82 _enqueue.args[1][1].ip.should.equal(price);
83
84 fn.calledOnce.should.equal(true, "callback should have been called once")
85 });
86
87
88 it("should accept arguments (price, quantity) when chained to transaction", function () {
89 var transaction = Math.random().toString();
90 var price = Math.random();
91 var quantity = Math.random();
92
93 var visitor = ua().transaction(transaction);
94
95 var result = visitor.item(price, quantity);
96
97 visitor._context = result._context;
98 result.should.eql(visitor, "should return a visitor that is identical except for the context");
99 result.should.be.instanceof(ua.Visitor);
100 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
101
102 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
103 _enqueue.args[0][0].should.equal("transaction");
104 _enqueue.args[1][0].should.equal("item");
105 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq")
106 _enqueue.args[1][1].ti.should.equal(transaction);
107 _enqueue.args[1][1].ip.should.equal(price);
108 _enqueue.args[1][1].iq.should.equal(quantity);
109 });
110
111
112 it("should accept arguments (price, quantity, fn) when chained to transaction", function () {
113 var transaction = Math.random().toString();
114 var price = Math.random();
115 var quantity = Math.random();
116 var fn = sinon.spy()
117
118 var visitor = ua().transaction(transaction);
119
120 var result = visitor.item(price, quantity, fn);
121
122 visitor._context = result._context;
123 result.should.eql(visitor, "should return a visitor that is identical except for the context");
124 result.should.be.instanceof(ua.Visitor);
125 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
126
127 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
128 _enqueue.args[0][0].should.equal("transaction");
129 _enqueue.args[1][0].should.equal("item");
130 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq")
131 _enqueue.args[1][1].ti.should.equal(transaction);
132 _enqueue.args[1][1].ip.should.equal(price);
133 _enqueue.args[1][1].iq.should.equal(quantity);
134
135 fn.calledOnce.should.equal(true, "callback should have been called once")
136 });
137
138
139 it("should accept arguments (price, quantity, sku) when chained to transaction", function () {
140 var transaction = Math.random().toString();
141 var price = Math.random();
142 var quantity = Math.random();
143 var sku = Math.random().toString();
144
145 var visitor = ua().transaction(transaction);
146
147 var result = visitor.item(price, quantity, sku);
148
149 visitor._context = result._context;
150 result.should.eql(visitor, "should return a visitor that is identical except for the context");
151 result.should.be.instanceof(ua.Visitor);
152 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
153
154 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
155 _enqueue.args[0][0].should.equal("transaction");
156 _enqueue.args[1][0].should.equal("item");
157 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic")
158 _enqueue.args[1][1].ti.should.equal(transaction);
159 _enqueue.args[1][1].ip.should.equal(price);
160 _enqueue.args[1][1].iq.should.equal(quantity);
161 _enqueue.args[1][1].ic.should.equal(sku);
162 });
163
164
165 it("should accept arguments (price, quantity, sku, fn) when chained to transaction", function () {
166 var transaction = Math.random().toString();
167 var price = Math.random();
168 var quantity = Math.random();
169 var sku = Math.random().toString();
170 var fn = sinon.spy()
171
172 var visitor = ua().transaction(transaction);
173
174 var result = visitor.item(price, quantity, sku, fn);
175
176 visitor._context = result._context;
177 result.should.eql(visitor, "should return a visitor that is identical except for the context");
178 result.should.be.instanceof(ua.Visitor);
179 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
180
181 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
182 _enqueue.args[0][0].should.equal("transaction");
183 _enqueue.args[1][0].should.equal("item");
184 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic")
185 _enqueue.args[1][1].ti.should.equal(transaction);
186 _enqueue.args[1][1].ip.should.equal(price);
187 _enqueue.args[1][1].iq.should.equal(quantity);
188 _enqueue.args[1][1].ic.should.equal(sku);
189
190 fn.calledOnce.should.equal(true, "callback should have been called once")
191 });
192
193
194 it("should accept arguments (price, quantity, sku, name) when chained to transaction", function () {
195 var transaction = Math.random().toString();
196 var price = Math.random();
197 var quantity = Math.random();
198 var sku = Math.random().toString();
199 var name = Math.random().toString();
200
201 var visitor = ua().transaction(transaction);
202
203 var result = visitor.item(price, quantity, sku, name);
204
205 visitor._context = result._context;
206 result.should.eql(visitor, "should return a visitor that is identical except for the context");
207 result.should.be.instanceof(ua.Visitor);
208 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
209
210 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
211 _enqueue.args[0][0].should.equal("transaction");
212 _enqueue.args[1][0].should.equal("item");
213 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in")
214 _enqueue.args[1][1].ti.should.equal(transaction);
215 _enqueue.args[1][1].ip.should.equal(price);
216 _enqueue.args[1][1].iq.should.equal(quantity);
217 _enqueue.args[1][1].ic.should.equal(sku);
218 _enqueue.args[1][1].in.should.equal(name);
219 });
220
221
222 it("should accept arguments (price, quantity, sku, name, fn) when chained to transaction", function () {
223 var transaction = Math.random().toString();
224 var price = Math.random();
225 var quantity = Math.random();
226 var sku = Math.random().toString();
227 var name = Math.random().toString();
228 var fn = sinon.spy()
229
230 var visitor = ua().transaction(transaction);
231
232 var result = visitor.item(price, quantity, sku, name, fn);
233
234 visitor._context = result._context;
235 result.should.eql(visitor, "should return a visitor that is identical except for the context");
236 result.should.be.instanceof(ua.Visitor);
237 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
238
239 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
240 _enqueue.args[0][0].should.equal("transaction");
241 _enqueue.args[1][0].should.equal("item");
242 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in")
243 _enqueue.args[1][1].ti.should.equal(transaction);
244 _enqueue.args[1][1].ip.should.equal(price);
245 _enqueue.args[1][1].iq.should.equal(quantity);
246 _enqueue.args[1][1].ic.should.equal(sku);
247 _enqueue.args[1][1].in.should.equal(name);
248
249 fn.calledOnce.should.equal(true, "callback should have been called once")
250 });
251
252
253 it("should accept arguments (price, quantity, sku, name, variation) when chained to transaction", function () {
254 var transaction = Math.random().toString();
255 var price = Math.random();
256 var quantity = Math.random();
257 var sku = Math.random().toString();
258 var name = Math.random().toString();
259 var variation = Math.random().toString();
260
261 var visitor = ua().transaction(transaction);
262
263 var result = visitor.item(price, quantity, sku, name, variation);
264
265 visitor._context = result._context;
266 result.should.eql(visitor, "should return a visitor that is identical except for the context");
267 result.should.be.instanceof(ua.Visitor);
268 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
269
270 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
271 _enqueue.args[0][0].should.equal("transaction");
272 _enqueue.args[1][0].should.equal("item");
273 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv")
274 _enqueue.args[1][1].ti.should.equal(transaction);
275 _enqueue.args[1][1].ip.should.equal(price);
276 _enqueue.args[1][1].iq.should.equal(quantity);
277 _enqueue.args[1][1].ic.should.equal(sku);
278 _enqueue.args[1][1].in.should.equal(name);
279 _enqueue.args[1][1].iv.should.equal(variation);
280 });
281
282
283 it("should accept arguments (price, quantity, sku, name, variation, fn) when chained to transaction", function () {
284 var transaction = Math.random().toString();
285 var price = Math.random();
286 var quantity = Math.random();
287 var sku = Math.random().toString();
288 var name = Math.random().toString();
289 var variation = Math.random().toString();
290 var fn = sinon.spy()
291
292 var visitor = ua().transaction(transaction);
293
294 var result = visitor.item(price, quantity, sku, name, variation, fn);
295
296 visitor._context = result._context;
297 result.should.eql(visitor, "should return a visitor that is identical except for the context");
298 result.should.be.instanceof(ua.Visitor);
299 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
300
301 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
302 _enqueue.args[0][0].should.equal("transaction");
303 _enqueue.args[1][0].should.equal("item");
304 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv")
305 _enqueue.args[1][1].ti.should.equal(transaction);
306 _enqueue.args[1][1].ip.should.equal(price);
307 _enqueue.args[1][1].iq.should.equal(quantity);
308 _enqueue.args[1][1].ic.should.equal(sku);
309 _enqueue.args[1][1].in.should.equal(name);
310 _enqueue.args[1][1].iv.should.equal(variation);
311
312 fn.calledOnce.should.equal(true, "callback should have been called once")
313 });
314
315
316 it("should accept arguments (price, quantity, sku, name, variation, params) when chained to transaction", function () {
317 var transaction = Math.random().toString();
318 var price = Math.random();
319 var quantity = Math.random();
320 var sku = Math.random().toString();
321 var name = Math.random().toString();
322 var variation = Math.random().toString();
323 var params = {foo: Math.random().toString()};
324
325 var visitor = ua().transaction(transaction);
326
327 var result = visitor.item(price, quantity, sku, name, variation, params);
328
329 visitor._context = result._context;
330 result.should.eql(visitor, "should return a visitor that is identical except for the context");
331 result.should.be.instanceof(ua.Visitor);
332 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
333
334 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
335 _enqueue.args[0][0].should.equal("transaction");
336 _enqueue.args[1][0].should.equal("item");
337 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv", "foo")
338 _enqueue.args[1][1].ti.should.equal(transaction);
339 _enqueue.args[1][1].ip.should.equal(price);
340 _enqueue.args[1][1].iq.should.equal(quantity);
341 _enqueue.args[1][1].ic.should.equal(sku);
342 _enqueue.args[1][1].in.should.equal(name);
343 _enqueue.args[1][1].iv.should.equal(variation);
344 _enqueue.args[1][1].foo.should.equal(params.foo);
345 });
346
347
348 it("should accept arguments (price, quantity, sku, name, variation, params, fn) when chained to transaction", function () {
349 var transaction = Math.random().toString();
350 var price = Math.random();
351 var quantity = Math.random();
352 var sku = Math.random().toString();
353 var name = Math.random().toString();
354 var variation = Math.random().toString();
355 var params = {foo: Math.random().toString()};
356 var fn = sinon.spy()
357
358 var visitor = ua().transaction(transaction);
359
360 var result = visitor.item(price, quantity, sku, name, variation, params, fn);
361
362 visitor._context = result._context;
363 result.should.eql(visitor, "should return a visitor that is identical except for the context");
364 result.should.be.instanceof(ua.Visitor);
365 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
366
367 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction before");
368 _enqueue.args[0][0].should.equal("transaction");
369 _enqueue.args[1][0].should.equal("item");
370 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv", "foo")
371 _enqueue.args[1][1].ti.should.equal(transaction);
372 _enqueue.args[1][1].ip.should.equal(price);
373 _enqueue.args[1][1].iq.should.equal(quantity);
374 _enqueue.args[1][1].ic.should.equal(sku);
375 _enqueue.args[1][1].in.should.equal(name);
376 _enqueue.args[1][1].iv.should.equal(variation);
377 _enqueue.args[1][1].foo.should.equal(params.foo);
378
379 fn.calledOnce.should.equal(true, "callback should have been called once")
380 });
381
382
383 it("should accept arguments (price, quantity, sku, name, variation, params, fn) when params include transaction", function () {
384 var price = Math.random();
385 var quantity = Math.random();
386 var sku = Math.random().toString();
387 var name = Math.random().toString();
388 var variation = Math.random().toString();
389 var params = {ti: Math.random()};
390 var fn = sinon.spy()
391
392 var visitor = ua();
393
394 var result = visitor.item(price, quantity, sku, name, variation, params, fn);
395
396 visitor._context = result._context;
397 result.should.eql(visitor, "should return a visitor that is identical except for the context");
398 result.should.be.instanceof(ua.Visitor);
399 result._context.should.eql(_enqueue.args[0][1], "the transaction params should be persisted as the context of the visitor clone")
400
401 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
402 _enqueue.args[0][0].should.equal("item");
403 _enqueue.args[0][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv")
404 _enqueue.args[0][1].ip.should.equal(price);
405 _enqueue.args[0][1].iq.should.equal(quantity);
406 _enqueue.args[0][1].ic.should.equal(sku);
407 _enqueue.args[0][1].in.should.equal(name);
408 _enqueue.args[0][1].iv.should.equal(variation);
409 _enqueue.args[0][1].ti.should.equal(params.ti);
410
411 fn.calledOnce.should.equal(true, "callback should have been called once")
412 });
413
414
415 it("should accept arguments (params, fn) when params include transaction", function () {
416 var params = {
417 ip: Math.random(),
418 iq: Math.random(),
419 ic: Math.random().toString(),
420 in: Math.random().toString(),
421 iv: Math.random().toString(),
422 ti: Math.random()
423 };
424 var fn = sinon.spy()
425
426 var visitor = ua();
427
428 var result = visitor.item(params, fn);
429
430 visitor._context = result._context;
431 result.should.eql(visitor, "should return a visitor that is identical except for the context");
432 result.should.be.instanceof(ua.Visitor);
433 result._context.should.eql(_enqueue.args[0][1], "the transaction params should be persisted as the context of the visitor clone")
434
435 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
436 _enqueue.args[0][0].should.equal("item");
437 _enqueue.args[0][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv")
438 _enqueue.args[0][1].ip.should.equal(params.ip);
439 _enqueue.args[0][1].iq.should.equal(params.iq);
440 _enqueue.args[0][1].ic.should.equal(params.ic);
441 _enqueue.args[0][1].in.should.equal(params.in);
442 _enqueue.args[0][1].iv.should.equal(params.iv);
443 _enqueue.args[0][1].ti.should.equal(params.ti);
444
445 fn.calledOnce.should.equal(true, "callback should have been called once")
446 });
447
448
449 it("should accept arguments (params, fn) when chained to a transaction", function () {
450 var transaction = Math.random().toString();
451 var params = {
452 ip: Math.random(),
453 iq: Math.random(),
454 ic: Math.random().toString(),
455 in: Math.random().toString(),
456 iv: Math.random().toString()
457 };
458 var fn = sinon.spy()
459
460 var visitor = ua().transaction(transaction);
461
462 var result = visitor.item(params, fn);
463
464 visitor._context = result._context;
465 result.should.eql(visitor, "should return a visitor that is identical except for the context");
466 result.should.be.instanceof(ua.Visitor);
467 result._context.should.eql(_enqueue.args[1][1], "the transaction params should be persisted as the context of the visitor clone")
468
469 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for the transaction");
470 _enqueue.args[1][0].should.equal("item");
471 _enqueue.args[1][1].should.have.keys("ti", "ip", "iq", "ic", "in", "iv")
472 _enqueue.args[1][1].ip.should.equal(params.ip);
473 _enqueue.args[1][1].iq.should.equal(params.iq);
474 _enqueue.args[1][1].ic.should.equal(params.ic);
475 _enqueue.args[1][1].in.should.equal(params.in);
476 _enqueue.args[1][1].iv.should.equal(params.iv);
477 _enqueue.args[1][1].ti.should.equal(transaction);
478
479 fn.calledOnce.should.equal(true, "callback should have been called once")
480 });
481
482
483 it("should allow daisy-chaining to re-use arguments", function () {
484 var transaction = Math.random().toString();
485 var price = Math.random();
486 var quantity = Math.random();
487 var sku = Math.random().toString();
488 var name = Math.random().toString();
489 var name2 = Math.random().toString();
490 var variation = Math.random().toString();
491 var fn = sinon.spy()
492
493 var visitor = ua().transaction(transaction);
494
495 var result = visitor.item(price, quantity, sku, name, variation).item({in: name2}, fn);
496
497 _enqueue.calledThrice.should.equal(true, "#_enqueue should have been called thrice, once for the transaction before");
498 _enqueue.args[0][0].should.equal("transaction");
499
500 _enqueue.args[1][0].should.equal(_enqueue.args[2][0]);
501 _enqueue.args[1][1].ti.should.equal(_enqueue.args[2][1].ti, "ti should be equal on both");
502 _enqueue.args[1][1].ip.should.equal(_enqueue.args[2][1].ip, "ip should be equal on both");
503 _enqueue.args[1][1].iq.should.equal(_enqueue.args[2][1].iq, "iq should be equal on both");
504 _enqueue.args[1][1].ic.should.equal(_enqueue.args[2][1].ic, "ic should be equal on both");
505 _enqueue.args[1][1].iv.should.equal(_enqueue.args[2][1].iv, "iv should be equal on both");
506 _enqueue.args[2][1].in.should.equal(name2, "name should have changed on second item");
507
508 fn.calledOnce.should.equal(true, "callback should have been called once")
509 });
510
511
512 it("should fail without transaction ID", function () {
513 var params = {
514 ip: Math.random(),
515 iq: Math.random(),
516 ic: Math.random().toString(),
517 in: Math.random().toString(),
518 iv: Math.random().toString()
519 };
520 var fn = sinon.spy()
521
522 var visitor = ua();
523
524 var result = visitor.item(params, fn);
525
526 visitor._context = result._context;
527 result.should.eql(visitor, "should return a visitor that is identical except for the context");
528
529 result.should.be.instanceof(ua.Visitor);
530 result._context.should.eql({}, "the transaction params should not be persisted")
531
532 _enqueue.called.should.equal(false, "#_enqueue should have not been called once");
533 fn.calledOnce.should.equal(true, "callback should have been called once");
534 fn.args[0][0].should.be.instanceof(Error);
535 fn.thisValues[0].should.equal(visitor);
536 });
537
538 });
539
540});
541
542
543
544
545
546
547
548
549
550