UNPKG

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