transaction.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. var request = require("request");
  2. var qs = require("querystring");
  3. var uuid = require("uuid");
  4. var should = require("should");
  5. var sinon = require("sinon");
  6. var url = require("url");
  7. var ua = require("../lib/index.js");
  8. var utils = require("../lib/utils.js")
  9. var config = require("../lib/config.js")
  10. describe("ua", function () {
  11. describe("#transaction", function () {
  12. var _enqueue;
  13. beforeEach(function () {
  14. _enqueue = sinon.stub(ua.Visitor.prototype, "_enqueue", function (type, params, fn) {
  15. if (fn) {
  16. (typeof fn).should.equal('function', "#_enqueue should receive a callback")
  17. fn();
  18. }
  19. return this;
  20. });
  21. });
  22. afterEach(function () {
  23. _enqueue.restore()
  24. });
  25. it("should be available via the #t shortcut", function () {
  26. var visitor = ua()
  27. visitor.t.should.equal(visitor.transaction)
  28. });
  29. it("should accept arguments (transaction)", function () {
  30. var transaction = Math.random().toString();
  31. var visitor = ua()
  32. var result = visitor.transaction(transaction);
  33. visitor._context = result._context;
  34. result.should.eql(visitor, "should return a visitor that is identical except for the context");
  35. result.should.be.instanceof(ua.Visitor);
  36. result._context.should.eql(_enqueue.args[0][1], "the transaction params should be persisted as the context of the visitor clone")
  37. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  38. _enqueue.args[0][0].should.equal("transaction");
  39. _enqueue.args[0][1].should.have.keys("ti")
  40. _enqueue.args[0][1].ti.should.equal(transaction);
  41. });
  42. it("should accept arguments (transaction, fn)", function () {
  43. var transaction = Math.random().toString();
  44. var fn = sinon.spy()
  45. ua().transaction(transaction, fn);
  46. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  47. _enqueue.args[0][0].should.equal("transaction");
  48. _enqueue.args[0][1].should.have.keys("ti")
  49. _enqueue.args[0][1].ti.should.equal(transaction);
  50. fn.calledOnce.should.equal(true, "callback should have been called once")
  51. });
  52. it("should accept arguments (transaction, revenue)", function () {
  53. var transaction = Math.random().toString();
  54. var revenue = Math.random();
  55. ua().transaction(transaction, revenue);
  56. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  57. _enqueue.args[0][0].should.equal("transaction");
  58. _enqueue.args[0][1].should.have.keys("ti", "tr")
  59. _enqueue.args[0][1].ti.should.equal(transaction);
  60. _enqueue.args[0][1].tr.should.equal(revenue);
  61. });
  62. it("should accept arguments (transaction, revenue, fn)", function () {
  63. var transaction = Math.random().toString();
  64. var revenue = Math.random();
  65. var fn = sinon.spy()
  66. ua().transaction(transaction, revenue, fn);
  67. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  68. _enqueue.args[0][0].should.equal("transaction");
  69. _enqueue.args[0][1].should.have.keys("ti", "tr")
  70. _enqueue.args[0][1].ti.should.equal(transaction);
  71. _enqueue.args[0][1].tr.should.equal(revenue);
  72. fn.calledOnce.should.equal(true, "callback should have been called once")
  73. });
  74. it("should accept arguments (transaction, revenue, shipping)", function () {
  75. var transaction = Math.random().toString();
  76. var revenue = Math.random();
  77. var shipping = Math.random();
  78. ua().transaction(transaction, revenue, shipping);
  79. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  80. _enqueue.args[0][0].should.equal("transaction");
  81. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts")
  82. _enqueue.args[0][1].ti.should.equal(transaction);
  83. _enqueue.args[0][1].tr.should.equal(revenue);
  84. _enqueue.args[0][1].ts.should.equal(shipping);
  85. });
  86. it("should accept arguments (transaction, revenue, shipping, fn)", function () {
  87. var transaction = Math.random().toString();
  88. var revenue = Math.random();
  89. var shipping = Math.random();
  90. var fn = sinon.spy()
  91. ua().transaction(transaction, revenue, shipping, fn);
  92. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  93. _enqueue.args[0][0].should.equal("transaction");
  94. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts")
  95. _enqueue.args[0][1].ti.should.equal(transaction);
  96. _enqueue.args[0][1].tr.should.equal(revenue);
  97. _enqueue.args[0][1].ts.should.equal(shipping);
  98. fn.calledOnce.should.equal(true, "callback should have been called once")
  99. });
  100. it("should accept arguments (transaction, revenue, shipping, tax)", function () {
  101. var transaction = Math.random().toString();
  102. var revenue = Math.random();
  103. var shipping = Math.random();
  104. var tax = Math.random();
  105. ua().transaction(transaction, revenue, shipping, tax);
  106. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  107. _enqueue.args[0][0].should.equal("transaction");
  108. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt")
  109. _enqueue.args[0][1].ti.should.equal(transaction);
  110. _enqueue.args[0][1].tr.should.equal(revenue);
  111. _enqueue.args[0][1].ts.should.equal(shipping);
  112. _enqueue.args[0][1].tt.should.equal(tax);
  113. });
  114. it("should accept arguments (transaction, revenue, shipping, tax, fn)", function () {
  115. var transaction = Math.random().toString();
  116. var revenue = Math.random();
  117. var shipping = Math.random();
  118. var tax = Math.random();
  119. var fn = sinon.spy()
  120. ua().transaction(transaction, revenue, shipping, tax, fn);
  121. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  122. _enqueue.args[0][0].should.equal("transaction");
  123. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt")
  124. _enqueue.args[0][1].ti.should.equal(transaction);
  125. _enqueue.args[0][1].tr.should.equal(revenue);
  126. _enqueue.args[0][1].ts.should.equal(shipping);
  127. _enqueue.args[0][1].tt.should.equal(tax);
  128. fn.calledOnce.should.equal(true, "callback should have been called once")
  129. });
  130. it("should accept arguments (transaction, revenue, shipping, tax, affiliation)", function () {
  131. var transaction = Math.random().toString();
  132. var revenue = Math.random();
  133. var shipping = Math.random();
  134. var tax = Math.random();
  135. var affiliation = Math.random().toString();
  136. ua().transaction(transaction, revenue, shipping, tax, affiliation);
  137. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  138. _enqueue.args[0][0].should.equal("transaction");
  139. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta")
  140. _enqueue.args[0][1].ti.should.equal(transaction);
  141. _enqueue.args[0][1].tr.should.equal(revenue);
  142. _enqueue.args[0][1].ts.should.equal(shipping);
  143. _enqueue.args[0][1].tt.should.equal(tax);
  144. _enqueue.args[0][1].ta.should.equal(affiliation);
  145. });
  146. it("should accept arguments (transaction, revenue, shipping, tax, affiliation, fn)", function () {
  147. var transaction = Math.random().toString();
  148. var revenue = Math.random();
  149. var shipping = Math.random();
  150. var tax = Math.random();
  151. var affiliation = Math.random().toString();
  152. var fn = sinon.spy()
  153. ua().transaction(transaction, revenue, shipping, tax, affiliation, fn);
  154. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  155. _enqueue.args[0][0].should.equal("transaction");
  156. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta")
  157. _enqueue.args[0][1].ti.should.equal(transaction);
  158. _enqueue.args[0][1].tr.should.equal(revenue);
  159. _enqueue.args[0][1].ts.should.equal(shipping);
  160. _enqueue.args[0][1].tt.should.equal(tax);
  161. _enqueue.args[0][1].ta.should.equal(affiliation);
  162. fn.calledOnce.should.equal(true, "callback should have been called once")
  163. });
  164. it("should accept arguments (transaction, revenue, shipping, tax, affiliation, params)", function () {
  165. var transaction = Math.random().toString();
  166. var revenue = Math.random();
  167. var shipping = Math.random();
  168. var tax = Math.random();
  169. var affiliation = Math.random().toString();
  170. var params = {p: Math.random().toString()}
  171. ua().transaction(transaction, revenue, shipping, tax, affiliation, params);
  172. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  173. _enqueue.args[0][0].should.equal("transaction");
  174. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta", "p")
  175. _enqueue.args[0][1].ti.should.equal(transaction);
  176. _enqueue.args[0][1].tr.should.equal(revenue);
  177. _enqueue.args[0][1].ts.should.equal(shipping);
  178. _enqueue.args[0][1].tt.should.equal(tax);
  179. _enqueue.args[0][1].ta.should.equal(affiliation);
  180. _enqueue.args[0][1].p.should.equal(params.p);
  181. });
  182. it("should accept arguments (transaction, revenue, shipping, tax, affiliation, params, fn)", function () {
  183. var transaction = Math.random().toString();
  184. var revenue = Math.random();
  185. var shipping = Math.random();
  186. var tax = Math.random();
  187. var affiliation = Math.random().toString();
  188. var params = {p: Math.random().toString()}
  189. var fn = sinon.spy()
  190. ua().transaction(transaction, revenue, shipping, tax, affiliation, params, fn);
  191. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  192. _enqueue.args[0][0].should.equal("transaction");
  193. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta", "p")
  194. _enqueue.args[0][1].ti.should.equal(transaction);
  195. _enqueue.args[0][1].tr.should.equal(revenue);
  196. _enqueue.args[0][1].ts.should.equal(shipping);
  197. _enqueue.args[0][1].tt.should.equal(tax);
  198. _enqueue.args[0][1].ta.should.equal(affiliation);
  199. _enqueue.args[0][1].p.should.equal(params.p);
  200. fn.calledOnce.should.equal(true, "callback should have been called once")
  201. });
  202. it("should accept arguments (params)", function () {
  203. var params = {
  204. ti: Math.random().toString(),
  205. tr: Math.random(),
  206. ts: Math.random(),
  207. tt: Math.random(),
  208. ta: Math.random().toString(),
  209. p: Math.random().toString(),
  210. empty: null // Should be removed
  211. };
  212. var json = JSON.stringify(params);
  213. var visitor = ua()
  214. var result = visitor.transaction(params);
  215. visitor._context = result._context;
  216. result.should.eql(visitor, "should return a visitor that is identical except for the context");
  217. result.should.be.instanceof(ua.Visitor);
  218. result._context.should.eql(_enqueue.args[0][1], "the transaction params should be persisted as the context of the visitor clone")
  219. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  220. _enqueue.args[0][0].should.equal("transaction");
  221. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta", "p")
  222. _enqueue.args[0][1].ti.should.equal(params.ti);
  223. _enqueue.args[0][1].tr.should.equal(params.tr);
  224. _enqueue.args[0][1].ts.should.equal(params.ts);
  225. _enqueue.args[0][1].tt.should.equal(params.tt);
  226. _enqueue.args[0][1].ta.should.equal(params.ta);
  227. _enqueue.args[0][1].p.should.equal(params.p);
  228. JSON.stringify(params).should.equal(json, "params should not have changed");
  229. });
  230. it("should accept arguments (params, fn)", function () {
  231. var params = {
  232. ti: Math.random().toString(),
  233. tr: Math.random(),
  234. ts: Math.random(),
  235. tt: Math.random(),
  236. ta: Math.random().toString(),
  237. p: Math.random().toString()
  238. };
  239. var fn = sinon.spy()
  240. var visitor = ua()
  241. var result = visitor.transaction(params, fn);
  242. visitor._context = result._context;
  243. result.should.eql(visitor, "should return a visitor that is identical except for the context");
  244. result.should.be.instanceof(ua.Visitor);
  245. result._context.should.eql(_enqueue.args[0][1], "the transaction params should be persisted as the context of the visitor clone")
  246. _enqueue.calledOnce.should.equal(true, "#_enqueue should have been called once");
  247. _enqueue.args[0][0].should.equal("transaction");
  248. _enqueue.args[0][1].should.have.keys("ti", "tr", "ts", "tt", "ta", "p")
  249. _enqueue.args[0][1].ti.should.equal(params.ti);
  250. _enqueue.args[0][1].tr.should.equal(params.tr);
  251. _enqueue.args[0][1].ts.should.equal(params.ts);
  252. _enqueue.args[0][1].tt.should.equal(params.tt);
  253. _enqueue.args[0][1].ta.should.equal(params.ta);
  254. _enqueue.args[0][1].p.should.equal(params.p);
  255. fn.calledOnce.should.equal(true, "callback should have been called once")
  256. });
  257. it("should fail without transaction ID", function () {
  258. var fn = sinon.spy()
  259. var visitor = ua()
  260. var result = visitor.transaction(null, fn);
  261. visitor._context = result._context;
  262. result.should.eql(visitor, "should return a visitor that is identical except for the context");
  263. result.should.be.instanceof(ua.Visitor);
  264. result._context.should.eql({}, "the transaction params should not be persisted")
  265. _enqueue.called.should.equal(false, "#_enqueue should have not been called once");
  266. fn.calledOnce.should.equal(true, "callback should have been called once");
  267. fn.args[0][0].should.be.instanceof(Error);
  268. fn.thisValues[0].should.equal(visitor);
  269. });
  270. });
  271. });