UNPKG

11.7 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("#event", function () {
18 var _enqueue;
19
20 beforeEach(function () {
21 _enqueue = sinon.stub(ua.Visitor.prototype, "_enqueue", function () {
22 if (arguments.length === 3 && typeof arguments[2] === 'function') {
23 arguments[2]();
24 }
25 return this;
26 });
27 });
28
29 afterEach(function () {
30 _enqueue.restore()
31 });
32
33
34 it("should be available via the #e shortcut", function () {
35 var visitor = ua()
36 visitor.e.should.equal(visitor.event)
37 });
38
39
40 it("should accept arguments (category, action)", function () {
41 var category = Math.random().toString();
42 var action = Math.random().toString();
43
44 var visitor = ua()
45
46 var result = visitor.event(category, action);
47
48 visitor._context = result._context;
49 result.should.eql(visitor, "should return a visitor that is identical except for the context");
50
51 result.should.be.instanceof(ua.Visitor);
52 result._context.should.eql(_enqueue.args[0][1], "the pageview params should be persisted as the context of the visitor clone")
53
54 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
55 _enqueue.args[0][0].should.equal("event");
56 _enqueue.args[0][1].should.have.keys("ec", "ea")
57 _enqueue.args[0][1].ec.should.equal(category);
58 _enqueue.args[0][1].ea.should.equal(action);
59 });
60
61 it("should accept arguments (category, action, fn)", function () {
62 var category = Math.random().toString();
63 var action = Math.random().toString();
64 var fn = sinon.spy()
65
66 ua().event(category, action, fn);
67
68 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
69 _enqueue.args[0][0].should.equal("event");
70 _enqueue.args[0][1].should.have.keys("ec", "ea")
71 _enqueue.args[0][1].ec.should.equal(category);
72 _enqueue.args[0][1].ea.should.equal(action);
73
74 fn.calledOnce.should.equal(true, "callback should have been called once")
75 });
76
77 it("should accept arguments (category, action, label)", function () {
78 var category = Math.random().toString();
79 var action = Math.random().toString();
80 var label = Math.random().toString();
81
82 ua().event(category, action, label);
83
84 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
85 _enqueue.args[0][0].should.equal("event");
86 _enqueue.args[0][1].should.have.keys("ec", "ea", "el")
87 _enqueue.args[0][1].ec.should.equal(category);
88 _enqueue.args[0][1].ea.should.equal(action);
89 _enqueue.args[0][1].el.should.equal(label);
90 });
91
92 it("should accept arguments (category, action, label, fn)", function () {
93 var category = Math.random().toString();
94 var action = Math.random().toString();
95 var label = Math.random().toString();
96 var fn = sinon.spy()
97
98 ua().event(category, action, label, fn);
99
100 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
101 _enqueue.args[0][0].should.equal("event");
102 _enqueue.args[0][1].should.have.keys("ec", "ea", "el")
103 _enqueue.args[0][1].ec.should.equal(category);
104 _enqueue.args[0][1].ea.should.equal(action);
105 _enqueue.args[0][1].el.should.equal(label);
106
107 fn.calledOnce.should.equal(true, "callback should have been called once")
108 });
109
110 it("should accept arguments (category, action, label, value)", function () {
111 var category = Math.random().toString();
112 var action = Math.random().toString();
113 var label = Math.random().toString();
114 var value = Math.random();
115
116 ua().event(category, action, label, value);
117
118 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
119 _enqueue.args[0][0].should.equal("event");
120 _enqueue.args[0][1].should.have.keys("ec", "ea", "el", "ev")
121 _enqueue.args[0][1].ec.should.equal(category);
122 _enqueue.args[0][1].ea.should.equal(action);
123 _enqueue.args[0][1].el.should.equal(label);
124 _enqueue.args[0][1].ev.should.equal(value);
125 });
126
127 it("should accept arguments (category, action, label, value, fn)", function () {
128 var category = Math.random().toString();
129 var action = Math.random().toString();
130 var label = Math.random().toString();
131 var value = Math.random();
132 var fn = sinon.spy()
133
134 ua().event(category, action, label, value, fn);
135
136 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
137 _enqueue.args[0][0].should.equal("event");
138 _enqueue.args[0][1].should.have.keys("ec", "ea", "el", "ev")
139 _enqueue.args[0][1].ec.should.equal(category);
140 _enqueue.args[0][1].ea.should.equal(action);
141 _enqueue.args[0][1].el.should.equal(label);
142 _enqueue.args[0][1].ev.should.equal(value);
143
144 fn.calledOnce.should.equal(true, "callback should have been called once")
145 });
146
147 it("should accept arguments (category, action, label, value, params, fn)", function () {
148 var category = Math.random().toString();
149 var action = Math.random().toString();
150 var label = Math.random().toString();
151 var value = Math.random();
152 var params = {"p": "/" + Math.random()}
153 var fn = sinon.spy()
154
155 ua().event(category, action, label, value, params, fn);
156
157 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
158 _enqueue.args[0][0].should.equal("event");
159 _enqueue.args[0][1].should.have.keys("ec", "ea", "el", "ev", "p")
160 _enqueue.args[0][1].ec.should.equal(category);
161 _enqueue.args[0][1].ea.should.equal(action);
162 _enqueue.args[0][1].el.should.equal(label);
163 _enqueue.args[0][1].ev.should.equal(value);
164 _enqueue.args[0][1].p.should.equal(params.p);
165
166 fn.calledOnce.should.equal(true, "callback should have been called once")
167 });
168
169 it("should accept arguments (params)", function () {
170 var params = {
171 ec: Math.random().toString(),
172 ea: Math.random().toString(),
173 el: Math.random().toString(),
174 ev: Math.random(),
175 "p": "/" + Math.random(),
176 "empty": null
177 }
178 var json = JSON.stringify(params)
179
180 ua().event(params);
181
182 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
183 _enqueue.args[0][0].should.equal("event");
184 _enqueue.args[0][1].should.have.keys("ec", "ea", "el", "ev", "p")
185 _enqueue.args[0][1].ec.should.equal(params.ec);
186 _enqueue.args[0][1].ea.should.equal(params.ea);
187 _enqueue.args[0][1].el.should.equal(params.el);
188 _enqueue.args[0][1].ev.should.equal(params.ev);
189 _enqueue.args[0][1].p.should.equal(params.p);
190
191 JSON.stringify(params).should.equal(json, "params should not have been modified")
192 });
193
194 it("should accept arguments (params, fn)", function () {
195 var params = {
196 ec: Math.random().toString(),
197 ea: Math.random().toString(),
198 el: Math.random().toString(),
199 ev: Math.random(),
200 "p": "/" + Math.random()
201 }
202 var fn = sinon.spy()
203
204 ua().event(params, fn);
205
206 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
207 _enqueue.args[0][0].should.equal("event");
208 _enqueue.args[0][1].should.have.keys("ec", "ea", "el", "ev", "p")
209 _enqueue.args[0][1].ec.should.equal(params.ec);
210 _enqueue.args[0][1].ea.should.equal(params.ea);
211 _enqueue.args[0][1].el.should.equal(params.el);
212 _enqueue.args[0][1].ev.should.equal(params.ev);
213 _enqueue.args[0][1].p.should.equal(params.p);
214
215 fn.calledOnce.should.equal(true, "callback should have been called once")
216 });
217
218 it("should use the dp attribute as p for providing a event path", function () {
219 var params = {
220 ec: Math.random().toString(),
221 ea: Math.random().toString(),
222 "dp": "/" + Math.random(),
223 }
224 var json = JSON.stringify(params)
225
226 ua().event(params);
227
228 _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
229 _enqueue.args[0][0].should.equal("event");
230 _enqueue.args[0][1].should.have.keys("ec", "ea", "p")
231 _enqueue.args[0][1].ec.should.equal(params.ec);
232 _enqueue.args[0][1].ea.should.equal(params.ea);
233 _enqueue.args[0][1].p.should.equal(params.dp);
234
235 JSON.stringify(params).should.equal(json, "params should not have been modified")
236 });
237
238
239 it("should allow daisy-chaining and re-using parameters", function () {
240 var params = {
241 ec: Math.random().toString(),
242 ea: Math.random().toString(),
243 el: Math.random().toString(),
244 ev: Math.random()
245 }
246
247 ua().event(params).event()
248
249 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for each event");
250 _enqueue.args[0][0].should.equal(_enqueue.args[1][0]);
251 _enqueue.args[0][1].ec.should.equal(_enqueue.args[1][1].ec);
252 _enqueue.args[0][1].ea.should.equal(_enqueue.args[1][1].ea);
253 _enqueue.args[0][1].el.should.equal(_enqueue.args[1][1].el);
254 _enqueue.args[0][1].ev.should.equal(_enqueue.args[1][1].ev);
255 });
256
257
258 it("should extend and overwrite params when daisy-chaining", function () {
259 var params = {
260 ec: Math.random().toString(),
261 ea: Math.random().toString(),
262 el: Math.random().toString(),
263 ev: Math.random()
264 }
265 var category = Math.random().toString();
266
267 ua().event(params).event(category)
268
269 _enqueue.calledTwice.should.equal(true, "#_enqueue should have been called twice, once for each event");
270 _enqueue.args[0][0].should.equal(_enqueue.args[1][0]);
271 _enqueue.args[0][1].ea.should.equal(_enqueue.args[1][1].ea);
272 _enqueue.args[0][1].el.should.equal(_enqueue.args[1][1].el);
273 _enqueue.args[0][1].ev.should.equal(_enqueue.args[1][1].ev);
274
275 _enqueue.args[0][1].ec.should.equal(params.ec);
276 _enqueue.args[1][1].ec.should.equal(category);
277 });
278
279 it("should re-use the path when daisy-chained to a pageview", function () {
280 var path = "/" + Math.random()
281 var params = {
282 ec: Math.random().toString(),
283 ea: Math.random().toString(),
284 el: Math.random().toString(),
285 ev: Math.random()
286 }
287
288 ua().pageview(path).event(params).event(params);
289
290 _enqueue.calledThrice.should.equal(true, "#_enqueue should have been called twice, once for the pageview, once for the pageview");
291
292 _enqueue.args[1][1].p.should.equal(path)
293 _enqueue.args[2][1].p.should.equal(path)
294 })
295
296 it("should fail without event category", function () {
297 var fn = sinon.spy()
298 var action = Math.random().toString();
299 var visitor = ua()
300
301 var result = visitor.event(null, action, fn);
302
303 visitor._context = result._context;
304 result.should.eql(visitor, "should return a visitor that is identical except for the context");
305
306 result.should.be.instanceof(ua.Visitor);
307 result._context.should.eql({}, "the transaction params should not be persisted")
308
309 _enqueue.called.should.equal(false, "#_enqueue should have not been called once");
310 fn.calledOnce.should.equal(true, "callback should have been called once");
311 fn.args[0][0].should.be.instanceof(Error);
312 fn.thisValues[0].should.equal(visitor);
313 });
314
315 it("should fail without event action", function () {
316 var fn = sinon.spy()
317 var category = Math.random().toString();
318 var visitor = ua()
319
320 var result = visitor.event(category, null, fn);
321
322 visitor._context = result._context;
323 result.should.eql(visitor, "should return a visitor that is identical except for the context");
324
325 result.should.be.instanceof(ua.Visitor);
326 result._context.should.eql({}, "the transaction params should not be persisted")
327
328 _enqueue.called.should.equal(false, "#_enqueue should have not been called once");
329 fn.calledOnce.should.equal(true, "callback should have been called once");
330 fn.args[0][0].should.be.instanceof(Error);
331 fn.thisValues[0].should.equal(visitor);
332 });
333
334 });
335
336});
337
338
339
340
341
342
343
344
345
346