prebid.js 8.5.0 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adqueryBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adsinteractiveBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/alkimiBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/automatadAnalyticsAdapter.js +1 -0
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/bidglassBidAdapter.js +1 -1
  22. package/dist/big-richmediaBidAdapter.js +1 -1
  23. package/dist/bridBidAdapter.js +1 -1
  24. package/dist/bridgewellBidAdapter.js +1 -1
  25. package/dist/brightMountainMediaBidAdapter.js +1 -1
  26. package/dist/carodaBidAdapter.js +1 -1
  27. package/dist/chtnwBidAdapter.js +1 -1
  28. package/dist/concertBidAdapter.js +1 -1
  29. package/dist/connatixBidAdapter.js +1 -0
  30. package/dist/connectadBidAdapter.js +1 -1
  31. package/dist/consumableBidAdapter.js +1 -1
  32. package/dist/conversantAnalyticsAdapter.js +1 -1
  33. package/dist/conversantBidAdapter.js +1 -1
  34. package/dist/craftBidAdapter.js +1 -1
  35. package/dist/criteoBidAdapter.js +1 -1
  36. package/dist/cwireBidAdapter.js +1 -1
  37. package/dist/dependencies.json +6 -0
  38. package/dist/dspxBidAdapter.js +1 -1
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/euidIdSystem.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freepassBidAdapter.js +1 -1
  44. package/dist/freewheel-sspBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  48. package/dist/greenbidsRtdProvider.js +1 -1
  49. package/dist/gridBidAdapter.js +1 -1
  50. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  51. package/dist/gumgumBidAdapter.js +1 -1
  52. package/dist/h12mediaBidAdapter.js +1 -1
  53. package/dist/hypelabBidAdapter.js +1 -1
  54. package/dist/id5IdSystem.js +1 -1
  55. package/dist/imdsBidAdapter.js +1 -1
  56. package/dist/improvedigitalBidAdapter.js +1 -1
  57. package/dist/insticatorBidAdapter.js +1 -1
  58. package/dist/ixBidAdapter.js +1 -1
  59. package/dist/justpremiumBidAdapter.js +1 -1
  60. package/dist/kargoBidAdapter.js +1 -1
  61. package/dist/konduitAnalyticsAdapter.js +1 -1
  62. package/dist/kueezBidAdapter.js +1 -1
  63. package/dist/kueezRtbBidAdapter.js +1 -1
  64. package/dist/kulturemediaBidAdapter.js +1 -1
  65. package/dist/lassoBidAdapter.js +1 -1
  66. package/dist/lifestreetBidAdapter.js +1 -1
  67. package/dist/logicadBidAdapter.js +1 -1
  68. package/dist/loglyliftBidAdapter.js +1 -1
  69. package/dist/magniteAnalyticsAdapter.js +1 -1
  70. package/dist/malltvAnalyticsAdapter.js +1 -1
  71. package/dist/marsmediaBidAdapter.js +1 -1
  72. package/dist/mediafuseBidAdapter.js +1 -1
  73. package/dist/medianetBidAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/minutemediaplusBidAdapter.js +1 -1
  78. package/dist/mspa.js +1 -1
  79. package/dist/newspassidBidAdapter.js +1 -1
  80. package/dist/nexx360BidAdapter.js +1 -1
  81. package/dist/not-for-prod/prebid.js +140 -136
  82. package/dist/oguryBidAdapter.js +1 -1
  83. package/dist/onetagBidAdapter.js +1 -1
  84. package/dist/ooloAnalyticsAdapter.js +1 -1
  85. package/dist/optidigitalBidAdapter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/parrableIdSystem.js +1 -1
  88. package/dist/pixfutureBidAdapter.js +1 -1
  89. package/dist/prebid-core.js +1 -1
  90. package/dist/pubCircleBidAdapter.js +1 -0
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/relevadRtdProvider.js +1 -1
  99. package/dist/retailspotBidAdapter.js +1 -1
  100. package/dist/rhythmoneBidAdapter.js +1 -1
  101. package/dist/riseBidAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/seedingAllianceBidAdapter.js +1 -1
  104. package/dist/seedtagBidAdapter.js +1 -1
  105. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  106. package/dist/sharethroughBidAdapter.js +1 -1
  107. package/dist/shinezBidAdapter.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/ssmasBidAdapter.js +1 -1
  116. package/dist/sspBCBidAdapter.js +1 -1
  117. package/dist/stvBidAdapter.js +1 -1
  118. package/dist/sublimeBidAdapter.js +1 -1
  119. package/dist/tappxBidAdapter.js +1 -1
  120. package/dist/targetVideoBidAdapter.js +1 -1
  121. package/dist/teadsBidAdapter.js +1 -1
  122. package/dist/topicsFpdModule.js +1 -1
  123. package/dist/trionBidAdapter.js +1 -1
  124. package/dist/tripleliftBidAdapter.js +1 -1
  125. package/dist/ttdBidAdapter.js +1 -1
  126. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  127. package/dist/uid2IdSystem.js +1 -1
  128. package/dist/underdogmediaBidAdapter.js +1 -1
  129. package/dist/undertoneBidAdapter.js +1 -1
  130. package/dist/viantOrtbBidAdapter.js +1 -0
  131. package/dist/vidazooBidAdapter.js +1 -1
  132. package/dist/videobyteBidAdapter.js +1 -1
  133. package/dist/videojsVideoProvider.js +1 -1
  134. package/dist/visxBidAdapter.js +1 -1
  135. package/dist/vuukleBidAdapter.js +1 -1
  136. package/dist/widespaceBidAdapter.js +1 -1
  137. package/dist/winrBidAdapter.js +1 -1
  138. package/dist/yahoosspBidAdapter.js +1 -1
  139. package/dist/yieldmoBidAdapter.js +1 -1
  140. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  141. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
  142. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +1 -1
  143. package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +137 -0
  144. package/integrationExamples/videoModule/jwplayer/eventListeners.html +1 -1
  145. package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
  146. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
  147. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
  148. package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
  149. package/integrationExamples/videoModule/videojs/bidsBackHandlerOverride.html +164 -0
  150. package/libraries/mspa/activityControls.js +51 -32
  151. package/modules/adagioBidAdapter.js +15 -1
  152. package/modules/adgenerationBidAdapter.js +5 -4
  153. package/modules/adsinteractiveBidAdapter.js +4 -2
  154. package/modules/alkimiBidAdapter.js +19 -7
  155. package/modules/appnexusBidAdapter.js +1 -1
  156. package/modules/automatadAnalyticsAdapter.js +325 -0
  157. package/modules/automatadAnalyticsAdapter.md +23 -0
  158. package/modules/connatixBidAdapter.js +185 -0
  159. package/modules/connatixBidAdapter.md +37 -0
  160. package/modules/criteoBidAdapter.js +18 -0
  161. package/modules/cwireBidAdapter.js +19 -0
  162. package/modules/freepassBidAdapter.js +20 -1
  163. package/modules/freepassBidAdapter.md +4 -1
  164. package/modules/gridBidAdapter.js +1 -8
  165. package/modules/growthCodeAnalyticsAdapter.js +7 -2
  166. package/modules/medianetBidAdapter.js +7 -4
  167. package/modules/mediasquareBidAdapter.js +3 -0
  168. package/modules/newspassid.md +76 -0
  169. package/modules/newspassidBidAdapter.js +44 -18
  170. package/modules/optidigitalBidAdapter.js +25 -16
  171. package/modules/pubCircleBidAdapter.js +231 -0
  172. package/modules/pubCircleBidAdapter.md +79 -0
  173. package/modules/relevadRtdProvider.js +6 -7
  174. package/modules/ssmasBidAdapter.js +2 -2
  175. package/modules/tappxBidAdapter.js +27 -15
  176. package/modules/tappxBidAdapter.md +17 -0
  177. package/modules/topicsFpdModule.js +21 -48
  178. package/modules/undertoneBidAdapter.md +1 -1
  179. package/modules/userId/eids.md +7 -0
  180. package/modules/viantOrtbBidAdapter.js +113 -0
  181. package/modules/viantOrtbBidAdapter.md +54 -0
  182. package/modules/vidazooBidAdapter.js +9 -2
  183. package/modules/videojsVideoProvider.js +9 -2
  184. package/package.json +1 -1
  185. package/test/spec/libraries/mspa/activityControls_spec.js +145 -212
  186. package/test/spec/modules/adagioBidAdapter_spec.js +89 -0
  187. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  188. package/test/spec/modules/alkimiBidAdapter_spec.js +3 -9
  189. package/test/spec/modules/appnexusBidAdapter_spec.js +12 -1
  190. package/test/spec/modules/automatadAnalyticsAdapter_spec.js +533 -0
  191. package/test/spec/modules/connatixBidAdapter_spec.js +366 -0
  192. package/test/spec/modules/criteoBidAdapter_spec.js +52 -3
  193. package/test/spec/modules/cwireBidAdapter_spec.js +47 -0
  194. package/test/spec/modules/freepassBidAdapter_spec.js +44 -0
  195. package/test/spec/modules/gridBidAdapter_spec.js +68 -0
  196. package/test/spec/modules/medianetBidAdapter_spec.js +18 -18
  197. package/test/spec/modules/mediasquareBidAdapter_spec.js +5 -0
  198. package/test/spec/modules/newspassidBidAdapter_spec.js +6 -0
  199. package/test/spec/modules/optidigitalBidAdapter_spec.js +9 -2
  200. package/test/spec/modules/pubCircleBidAdapter_spec.js +399 -0
  201. package/test/spec/modules/tappxBidAdapter_spec.js +19 -0
  202. package/test/spec/modules/topicsFpdModule_spec.js +343 -365
  203. package/test/spec/modules/viantOrtbBidAdapter_spec.js +432 -0
@@ -0,0 +1,533 @@
1
+ import * as events from 'src/events';
2
+ import * as utils from 'src/utils.js';
3
+
4
+ import spec, {self as exports} from 'modules/automatadAnalyticsAdapter.js';
5
+
6
+ import CONSTANTS from 'src/constants.json';
7
+ import { expect } from 'chai';
8
+
9
+ const {
10
+ AUCTION_DEBUG,
11
+ BID_REQUESTED,
12
+ BID_REJECTED,
13
+ AUCTION_INIT,
14
+ BIDDER_DONE,
15
+ BID_RESPONSE,
16
+ BID_TIMEOUT,
17
+ BID_WON,
18
+ NO_BID
19
+ } = CONSTANTS.EVENTS
20
+
21
+ const CONFIG_WITH_DEBUG = {
22
+ provider: 'atmtdAnalyticsAdapter',
23
+ options: {
24
+ publisherID: '230',
25
+ siteID: '421'
26
+ },
27
+ includeEvents: [AUCTION_DEBUG, AUCTION_INIT, BIDDER_DONE, BID_RESPONSE, BID_TIMEOUT, NO_BID, BID_WON, BID_REQUESTED, BID_REJECTED]
28
+ }
29
+
30
+ describe('Automatad Analytics Adapter', () => {
31
+ var sandbox, clock;
32
+
33
+ describe('Adapter Setup Configuration', () => {
34
+ beforeEach(() => {
35
+ sandbox = sinon.createSandbox();
36
+ sandbox.stub(utils, 'logMessage')
37
+ sandbox.stub(events, 'getEvents').returns([]);
38
+ sandbox.stub(utils, 'logError');
39
+ });
40
+ afterEach(() => {
41
+ sandbox.restore();
42
+ });
43
+
44
+ it('Should log error and return false if nothing is passed as the param in the enable analytics call', () => {
45
+ spec.enableAnalytics()
46
+
47
+ expect(utils.logError.called).to.equal(true)
48
+ });
49
+
50
+ it('Should log error and return false if object type is not passed as the param in the enable analytics call', () => {
51
+ spec.enableAnalytics('hello world')
52
+
53
+ expect(utils.logError.called).to.equal(true)
54
+ });
55
+
56
+ it('Should log error and return false if options is not defined in the enable analytics call', () => {
57
+ spec.enableAnalytics({
58
+ provider: 'atmtdAnalyticsAdapter'
59
+ })
60
+
61
+ expect(utils.logError.called).to.equal(true)
62
+ });
63
+ it('Should log error and return false if pub id is not defined in the enable analytics call', () => {
64
+ spec.enableAnalytics({
65
+ provider: 'atmtdAnalyticsAdapter',
66
+ options: {
67
+ siteID: '230'
68
+ }
69
+ })
70
+
71
+ expect(utils.logError.called).to.equal(true)
72
+ });
73
+ it('Should log error and return false if pub id is not defined in the enable analytics call', () => {
74
+ spec.enableAnalytics({
75
+ provider: 'atmtdAnalyticsAdapter',
76
+ options: {
77
+ publisherID: '230'
78
+ }
79
+ })
80
+
81
+ expect(utils.logError.called).to.equal(true)
82
+ });
83
+ it('Should successfully configure the adapter and set global log debug messages flag to false', () => {
84
+ spec.enableAnalytics({
85
+ provider: 'atmtdAnalyticsAdapter',
86
+ options: {
87
+ publisherID: '230',
88
+ siteID: '421',
89
+ logDebug: false
90
+ }
91
+ });
92
+ expect(utils.logError.called).to.equal(false)
93
+ expect(utils.logMessage.called).to.equal(true)
94
+ spec.disableAnalytics();
95
+ });
96
+ it('Should successfully configure the adapter and set global log debug messages flag to true', () => {
97
+ sandbox.stub(exports, 'initializeQueue').callsFake(() => {});
98
+ sandbox.stub(exports, 'addGPTHandlers').callsFake(() => {});
99
+ const config = {
100
+ provider: 'atmtdAnalyticsAdapter',
101
+ options: {
102
+ publisherID: '230',
103
+ siteID: '410',
104
+ logDebug: true
105
+ }
106
+ }
107
+
108
+ spec.enableAnalytics(config)
109
+ expect(utils.logError.called).to.equal(false)
110
+ expect(exports.initializeQueue.called).to.equal(true)
111
+ expect(exports.addGPTHandlers.called).to.equal(true)
112
+ expect(utils.logMessage.called).to.equal(true)
113
+ spec.disableAnalytics();
114
+ });
115
+ });
116
+
117
+ describe('Behaviour of the adapter when the sdk has loaded', () => {
118
+ before(() => {
119
+ spec.enableAnalytics(CONFIG_WITH_DEBUG);
120
+ const obj = {
121
+ auctionInitHandler: (args) => {},
122
+ bidResponseHandler: (args) => {},
123
+ bidderDoneHandler: (args) => {},
124
+ bidWonHandler: (args) => {},
125
+ noBidHandler: (args) => {},
126
+ auctionDebugHandler: (args) => {},
127
+ bidderTimeoutHandler: (args) => {},
128
+ bidRequestedHandler: (args) => {},
129
+ bidRejectedHandler: (args) => {}
130
+ }
131
+
132
+ global.window.atmtdAnalytics = obj
133
+
134
+ Object.keys(obj).forEach((fn) => sandbox.spy(global.window.atmtdAnalytics, fn))
135
+ })
136
+ beforeEach(() => {
137
+ sandbox = sinon.createSandbox();
138
+ sandbox.stub(events, 'getEvents').returns([]);
139
+ sandbox.stub(utils, 'logMessage');
140
+ sandbox.stub(utils, 'logError');
141
+ });
142
+ afterEach(() => {
143
+ sandbox.restore();
144
+ });
145
+ after(() => {
146
+ global.window.atmtdAnalytics = undefined;
147
+ spec.disableAnalytics();
148
+ })
149
+
150
+ it('Should call the auctionInitHandler when the auction init event is fired', () => {
151
+ events.emit(AUCTION_INIT, {type: AUCTION_INIT})
152
+ expect(global.window.atmtdAnalytics.auctionInitHandler.called).to.equal(true)
153
+ });
154
+
155
+ it('Should call the bidRequested when the bidRequested event is fired', () => {
156
+ events.emit(BID_REQUESTED, {type: BID_REQUESTED})
157
+ expect(global.window.atmtdAnalytics.bidRequestedHandler.called).to.equal(true)
158
+ });
159
+
160
+ it('Should call the bidRejected when the bidRejected event is fired', () => {
161
+ events.emit(BID_REJECTED, {type: BID_REJECTED})
162
+ expect(global.window.atmtdAnalytics.bidRejectedHandler.called).to.equal(true)
163
+ });
164
+
165
+ it('Should call the bidResponseHandler when the bidResponse event is fired', () => {
166
+ events.emit(BID_RESPONSE, {type: BID_RESPONSE})
167
+ expect(global.window.atmtdAnalytics.bidResponseHandler.called).to.equal(true)
168
+ });
169
+
170
+ it('Should call the bidderDoneHandler when the bidderDone event is fired', () => {
171
+ events.emit(BIDDER_DONE, {type: BIDDER_DONE})
172
+ expect(global.window.atmtdAnalytics.bidderDoneHandler.called).to.equal(true)
173
+ });
174
+
175
+ it('Should call the bidWonHandler when the bidWon event is fired', () => {
176
+ events.emit(BID_WON, {type: BID_WON})
177
+ expect(global.window.atmtdAnalytics.bidWonHandler.called).to.equal(true)
178
+ });
179
+
180
+ it('Should call the noBidHandler when the noBid event is fired', () => {
181
+ events.emit(NO_BID, {type: NO_BID})
182
+ expect(global.window.atmtdAnalytics.noBidHandler.called).to.equal(true)
183
+ });
184
+
185
+ it('Should call the bidTimeoutHandler when the bidTimeout event is fired', () => {
186
+ events.emit(BID_TIMEOUT, {type: BID_TIMEOUT})
187
+ expect(global.window.atmtdAnalytics.bidderTimeoutHandler.called).to.equal(true)
188
+ });
189
+
190
+ it('Should call the auctionDebugHandler when the auctionDebug event is fired', () => {
191
+ events.emit(AUCTION_DEBUG, {type: AUCTION_DEBUG})
192
+ expect(global.window.atmtdAnalytics.auctionDebugHandler.called).to.equal(true)
193
+ });
194
+ });
195
+
196
+ describe('Behaviour of the adapter when the SDK has not loaded', () => {
197
+ before(() => {
198
+ spec.enableAnalytics(CONFIG_WITH_DEBUG);
199
+ })
200
+ beforeEach(() => {
201
+ sandbox = sinon.createSandbox();
202
+ sandbox.stub(events, 'getEvents').returns([]);
203
+ sandbox.stub(utils, 'logMessage');
204
+ sandbox.stub(utils, 'logError');
205
+
206
+ global.window.atmtdAnalytics = undefined
207
+ exports.__atmtdAnalyticsQueue.length = 0
208
+ sandbox.stub(exports.__atmtdAnalyticsQueue, 'push').callsFake((args) => {
209
+ Array.prototype.push.apply(exports.__atmtdAnalyticsQueue, [args]);
210
+ })
211
+ });
212
+ afterEach(() => {
213
+ sandbox.restore();
214
+ });
215
+ after(() => {
216
+ spec.disableAnalytics();
217
+ })
218
+
219
+ it('Should push to the que when the auctionInit event is fired', () => {
220
+ events.emit(AUCTION_INIT, {type: AUCTION_INIT})
221
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
222
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
223
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
224
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(AUCTION_INIT)
225
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(AUCTION_INIT)
226
+ });
227
+
228
+ it('Should push to the que when the bidResponse event is fired', () => {
229
+ events.emit(BID_RESPONSE, {type: BID_RESPONSE})
230
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
231
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
232
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
233
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BID_RESPONSE)
234
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BID_RESPONSE)
235
+ });
236
+
237
+ it('Should push to the que when the bidRequested event is fired', () => {
238
+ events.emit(BID_REQUESTED, {type: BID_REQUESTED})
239
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
240
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
241
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
242
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BID_REQUESTED)
243
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BID_REQUESTED)
244
+ });
245
+
246
+ it('Should push to the que when the bidRejected event is fired', () => {
247
+ events.emit(BID_REJECTED, {type: BID_REJECTED})
248
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
249
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
250
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
251
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BID_REJECTED)
252
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BID_REJECTED)
253
+ });
254
+
255
+ it('Should push to the que when the bidderDone event is fired', () => {
256
+ events.emit(BIDDER_DONE, {type: BIDDER_DONE})
257
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
258
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
259
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
260
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BIDDER_DONE)
261
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BIDDER_DONE)
262
+ });
263
+
264
+ it('Should push to the que when the bidWon event is fired', () => {
265
+ events.emit(BID_WON, {type: BID_WON})
266
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
267
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
268
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
269
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BID_WON)
270
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BID_WON)
271
+ });
272
+
273
+ it('Should push to the que when the noBid event is fired', () => {
274
+ events.emit(NO_BID, {type: NO_BID})
275
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
276
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
277
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
278
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(NO_BID)
279
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(NO_BID)
280
+ });
281
+
282
+ it('Should push to the que when the auctionDebug is fired', () => {
283
+ events.emit(AUCTION_DEBUG, {type: AUCTION_DEBUG})
284
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
285
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
286
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
287
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(AUCTION_DEBUG)
288
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(AUCTION_DEBUG)
289
+ });
290
+
291
+ it('Should push to the que when the bidderTimeout event is fired', () => {
292
+ events.emit(BID_TIMEOUT, {type: BID_TIMEOUT})
293
+ expect(exports.__atmtdAnalyticsQueue.push.called).to.equal(true)
294
+ expect(exports.__atmtdAnalyticsQueue).to.be.an('array').to.have.lengthOf(1)
295
+ expect(exports.__atmtdAnalyticsQueue[0]).to.have.lengthOf(2)
296
+ expect(exports.__atmtdAnalyticsQueue[0][0]).to.equal(BID_TIMEOUT)
297
+ expect(exports.__atmtdAnalyticsQueue[0][1].type).to.equal(BID_TIMEOUT)
298
+ });
299
+ });
300
+
301
+ describe('Process Events from Que when SDK still has not loaded', () => {
302
+ before(() => {
303
+ spec.enableAnalytics({
304
+ provider: 'atmtdAnalyticsAdapter',
305
+ options: {
306
+ publisherID: '230',
307
+ siteID: '421'
308
+ }
309
+ });
310
+ global.window.atmtdAnalytics = undefined
311
+
312
+ sandbox.stub(exports.__atmtdAnalyticsQueue, 'push').callsFake((args) => {
313
+ Array.prototype.push.apply(exports.__atmtdAnalyticsQueue, [args]);
314
+ })
315
+ })
316
+ beforeEach(() => {
317
+ sandbox = sinon.createSandbox();
318
+ sandbox.stub(events, 'getEvents').returns([]);
319
+ sandbox.spy(exports, 'prettyLog')
320
+ sandbox.spy(exports, 'processEvents')
321
+
322
+ clock = sandbox.useFakeTimers();
323
+ exports.__atmtdAnalyticsQueue.length = 0
324
+ });
325
+ afterEach(() => {
326
+ sandbox.restore();
327
+ exports.queuePointer = 0;
328
+ exports.retryCount = 0;
329
+ exports.__atmtdAnalyticsQueue = []
330
+ spec.disableAnalytics();
331
+ })
332
+
333
+ it('Should retry processing auctionInit in certain intervals', () => {
334
+ expect(exports.queuePointer).to.equal(0)
335
+ expect(exports.retryCount).to.equal(0)
336
+ const que = [[AUCTION_INIT, {type: AUCTION_INIT}]]
337
+ exports.__atmtdAnalyticsQueue.push(que[0])
338
+ exports.processEvents()
339
+ expect(exports.prettyLog.getCall(0).args[0]).to.equal('status')
340
+ expect(exports.prettyLog.getCall(0).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 1`)
341
+ expect(exports.prettyLog.getCall(1).args[0]).to.equal('warn')
342
+ expect(exports.prettyLog.getCall(1).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 1500ms ...`)
343
+ clock.tick(1510)
344
+ expect(exports.prettyLog.getCall(2).args[0]).to.equal('status')
345
+ expect(exports.prettyLog.getCall(2).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 2`)
346
+ expect(exports.prettyLog.getCall(3).args[0]).to.equal('warn')
347
+ expect(exports.prettyLog.getCall(3).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 3000ms ...`)
348
+ clock.tick(3010)
349
+ expect(exports.prettyLog.getCall(4).args[0]).to.equal('status')
350
+ expect(exports.prettyLog.getCall(4).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 3`)
351
+ expect(exports.prettyLog.getCall(5).args[0]).to.equal('warn')
352
+ expect(exports.prettyLog.getCall(5).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 5000ms ...`)
353
+ clock.tick(5010)
354
+ expect(exports.prettyLog.getCall(6).args[0]).to.equal('status')
355
+ expect(exports.prettyLog.getCall(6).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 4`)
356
+ expect(exports.prettyLog.getCall(7).args[0]).to.equal('warn')
357
+ expect(exports.prettyLog.getCall(7).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 10000ms ...`)
358
+ clock.tick(10010)
359
+ expect(exports.prettyLog.getCall(8).args[0]).to.equal('error')
360
+ expect(exports.prettyLog.getCall(8).args[1]).to.equal(`Aggregator still hasn't loaded. Processing que stopped`)
361
+ expect(exports.queuePointer).to.equal(0)
362
+ expect(exports.processEvents.callCount).to.equal(5)
363
+ })
364
+
365
+ it('Should retry processing slotRenderEnded in certain intervals', () => {
366
+ expect(exports.queuePointer).to.equal(0)
367
+ expect(exports.retryCount).to.equal(0)
368
+ const que = [['slotRenderEnded', {type: 'slotRenderEnded'}]]
369
+ exports.__atmtdAnalyticsQueue.push(que[0])
370
+ exports.processEvents()
371
+ expect(exports.prettyLog.getCall(0).args[0]).to.equal('status')
372
+ expect(exports.prettyLog.getCall(0).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 1`)
373
+ expect(exports.prettyLog.getCall(1).args[0]).to.equal('warn')
374
+ expect(exports.prettyLog.getCall(1).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 1500ms ...`)
375
+ clock.tick(1510)
376
+ expect(exports.prettyLog.getCall(2).args[0]).to.equal('status')
377
+ expect(exports.prettyLog.getCall(2).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 2`)
378
+ expect(exports.prettyLog.getCall(3).args[0]).to.equal('warn')
379
+ expect(exports.prettyLog.getCall(3).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 3000ms ...`)
380
+ clock.tick(3010)
381
+ expect(exports.prettyLog.getCall(4).args[0]).to.equal('status')
382
+ expect(exports.prettyLog.getCall(4).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 3`)
383
+ expect(exports.prettyLog.getCall(5).args[0]).to.equal('warn')
384
+ expect(exports.prettyLog.getCall(5).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 5000ms ...`)
385
+ clock.tick(5010)
386
+ expect(exports.prettyLog.getCall(6).args[0]).to.equal('status')
387
+ expect(exports.prettyLog.getCall(6).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 4`)
388
+ expect(exports.prettyLog.getCall(7).args[0]).to.equal('warn')
389
+ expect(exports.prettyLog.getCall(7).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 10000ms ...`)
390
+ clock.tick(10010)
391
+ expect(exports.prettyLog.getCall(8).args[0]).to.equal('error')
392
+ expect(exports.prettyLog.getCall(8).args[1]).to.equal(`Aggregator still hasn't loaded. Processing que stopped`)
393
+ expect(exports.queuePointer).to.equal(0)
394
+ expect(exports.processEvents.callCount).to.equal(5)
395
+ })
396
+
397
+ it('Should retry processing impressionViewable in certain intervals', () => {
398
+ expect(exports.queuePointer).to.equal(0)
399
+ expect(exports.retryCount).to.equal(0)
400
+ const que = [['impressionViewable', {type: 'impressionViewable'}]]
401
+ exports.__atmtdAnalyticsQueue.push(que[0])
402
+ exports.processEvents()
403
+ expect(exports.prettyLog.getCall(0).args[0]).to.equal('status')
404
+ expect(exports.prettyLog.getCall(0).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 1`)
405
+ expect(exports.prettyLog.getCall(1).args[0]).to.equal('warn')
406
+ expect(exports.prettyLog.getCall(1).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 1500ms ...`)
407
+ clock.tick(1510)
408
+ expect(exports.prettyLog.getCall(2).args[0]).to.equal('status')
409
+ expect(exports.prettyLog.getCall(2).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 2`)
410
+ expect(exports.prettyLog.getCall(3).args[0]).to.equal('warn')
411
+ expect(exports.prettyLog.getCall(3).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 3000ms ...`)
412
+ clock.tick(3010)
413
+ expect(exports.prettyLog.getCall(4).args[0]).to.equal('status')
414
+ expect(exports.prettyLog.getCall(4).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 3`)
415
+ expect(exports.prettyLog.getCall(5).args[0]).to.equal('warn')
416
+ expect(exports.prettyLog.getCall(5).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 5000ms ...`)
417
+ clock.tick(5010)
418
+ expect(exports.prettyLog.getCall(6).args[0]).to.equal('status')
419
+ expect(exports.prettyLog.getCall(6).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 4`)
420
+ expect(exports.prettyLog.getCall(7).args[0]).to.equal('warn')
421
+ expect(exports.prettyLog.getCall(7).args[1]).to.equal(`Adapter failed to process event as aggregator has not loaded. Retrying in 10000ms ...`)
422
+ clock.tick(10010)
423
+ expect(exports.prettyLog.getCall(8).args[0]).to.equal('error')
424
+ expect(exports.prettyLog.getCall(8).args[1]).to.equal(`Aggregator still hasn't loaded. Processing que stopped`)
425
+ expect(exports.queuePointer).to.equal(0)
426
+ expect(exports.processEvents.callCount).to.equal(5)
427
+ })
428
+ });
429
+
430
+ describe('Process Events from Que when SDK has loaded', () => {
431
+ before(() => {
432
+ spec.enableAnalytics({
433
+ provider: 'atmtdAnalyticsAdapter',
434
+ options: {
435
+ publisherID: '230',
436
+ siteID: '421'
437
+ }
438
+ });
439
+ sandbox = sinon.createSandbox();
440
+ sandbox.reset()
441
+ const obj = {
442
+ auctionInitHandler: (args) => {},
443
+ bidResponseHandler: (args) => {},
444
+ bidderDoneHandler: (args) => {},
445
+ bidWonHandler: (args) => {},
446
+ noBidHandler: (args) => {},
447
+ auctionDebugHandler: (args) => {},
448
+ bidderTimeoutHandler: (args) => {},
449
+ impressionViewableHandler: (args) => {},
450
+ slotRenderEndedGPTHandler: (args) => {},
451
+ bidRequestedHandler: (args) => {},
452
+ bidRejectedHandler: (args) => {}
453
+ }
454
+
455
+ global.window.atmtdAnalytics = obj;
456
+
457
+ Object.keys(obj).forEach((fn) => sandbox.spy(global.window.atmtdAnalytics, fn))
458
+ sandbox.stub(events, 'getEvents').returns([]);
459
+ sandbox.spy(exports, 'prettyLog')
460
+ exports.retryCount = 0;
461
+ exports.queuePointer = 0;
462
+ exports.__atmtdAnalyticsQueue = [
463
+ [AUCTION_INIT, {type: AUCTION_INIT}],
464
+ [BID_RESPONSE, {type: BID_RESPONSE}],
465
+ [BID_REQUESTED, {type: BID_REQUESTED}],
466
+ [BID_REJECTED, {type: BID_REJECTED}],
467
+ [NO_BID, {type: NO_BID}],
468
+ [BID_WON, {type: BID_WON}],
469
+ [BIDDER_DONE, {type: BIDDER_DONE}],
470
+ [AUCTION_DEBUG, {type: AUCTION_DEBUG}],
471
+ [BID_TIMEOUT, {type: BID_TIMEOUT}],
472
+ ['slotRenderEnded', {type: 'slotRenderEnded'}],
473
+ ['impressionViewable', {type: 'impressionViewable'}]
474
+ ]
475
+ });
476
+ after(() => {
477
+ sandbox.restore();
478
+ spec.disableAnalytics();
479
+ })
480
+
481
+ it('Should make calls to appropriate SDK event handlers', () => {
482
+ exports.processEvents()
483
+ expect(exports.prettyLog.getCall(0).args[0]).to.equal('status')
484
+ expect(exports.prettyLog.getCall(0).args[1]).to.equal(`Que has been inactive for a while. Adapter starting to process que now... Trial Count = 1`)
485
+ expect(exports.retryCount).to.equal(0)
486
+ expect(exports.prettyLog.callCount).to.equal(1)
487
+ expect(exports.queuePointer).to.equal(exports.__atmtdAnalyticsQueue.length)
488
+ expect(global.window.atmtdAnalytics.auctionInitHandler.calledOnce).to.equal(true)
489
+ expect(global.window.atmtdAnalytics.bidResponseHandler.calledOnce).to.equal(true)
490
+ expect(global.window.atmtdAnalytics.bidRejectedHandler.calledOnce).to.equal(true)
491
+ expect(global.window.atmtdAnalytics.bidRequestedHandler.calledOnce).to.equal(true)
492
+ expect(global.window.atmtdAnalytics.noBidHandler.calledOnce).to.equal(true)
493
+ expect(global.window.atmtdAnalytics.bidWonHandler.calledOnce).to.equal(true)
494
+ expect(global.window.atmtdAnalytics.auctionDebugHandler.calledOnce).to.equal(true)
495
+ expect(global.window.atmtdAnalytics.bidderTimeoutHandler.calledOnce).to.equal(true)
496
+ expect(global.window.atmtdAnalytics.bidderDoneHandler.calledOnce).to.equal(true)
497
+ expect(global.window.atmtdAnalytics.slotRenderEndedGPTHandler.calledOnce).to.equal(true)
498
+ expect(global.window.atmtdAnalytics.impressionViewableHandler.calledOnce).to.equal(true)
499
+ })
500
+ });
501
+
502
+ describe('Prettylog fn tests', () => {
503
+ beforeEach(() => {
504
+ sandbox = sinon.createSandbox()
505
+ sandbox.spy(utils, 'logInfo')
506
+ sandbox.spy(utils, 'logError')
507
+ exports.isLoggingEnabled = true
508
+ })
509
+
510
+ afterEach(() => {
511
+ sandbox.restore()
512
+ })
513
+
514
+ it('Should call logMessage once in normal mode', () => {
515
+ exports.prettyLog('status', 'Hello world')
516
+ expect(utils.logInfo.callCount).to.equal(1)
517
+ })
518
+
519
+ it('Should call logMessage twice in group mode and have the cb called', () => {
520
+ const spy = sandbox.spy()
521
+ exports.prettyLog('status', 'Hello world', true, spy)
522
+ expect(utils.logInfo.callCount).to.equal(2)
523
+ expect(spy.called).to.equal(true)
524
+ })
525
+
526
+ it('Should call logMessage twice in group mode and have the cb which throws an error', () => {
527
+ const spy = sandbox.stub().throws()
528
+ exports.prettyLog('status', 'Hello world', true, spy)
529
+ expect(utils.logInfo.callCount).to.equal(2)
530
+ expect(utils.logError.called).to.equal(true)
531
+ })
532
+ });
533
+ });