prebid.js 8.6.0 → 8.8.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 (222) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/a1MediaRtdProvider.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admaticBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adqueryIdSystem.js +1 -1
  10. package/dist/adrelevantisBidAdapter.js +1 -1
  11. package/dist/adsinteractiveBidAdapter.js +1 -1
  12. package/dist/adtrgtmeBidAdapter.js +1 -1
  13. package/dist/adxcgBidAdapter.js +1 -1
  14. package/dist/adyoulikeBidAdapter.js +1 -1
  15. package/dist/ajaBidAdapter.js +1 -1
  16. package/dist/alkimiBidAdapter.js +1 -1
  17. package/dist/amxBidAdapter.js +1 -1
  18. package/dist/amxIdSystem.js +1 -1
  19. package/dist/appierAnalyticsAdapter.js +1 -1
  20. package/dist/appnexusBidAdapter.js +1 -1
  21. package/dist/asoBidAdapter.js +1 -1
  22. package/dist/automatadAnalyticsAdapter.js +1 -0
  23. package/dist/axonixBidAdapter.js +1 -1
  24. package/dist/bidViewability.js +1 -1
  25. package/dist/bidglassBidAdapter.js +1 -1
  26. package/dist/big-richmediaBidAdapter.js +1 -1
  27. package/dist/brandmetricsRtdProvider.js +1 -1
  28. package/dist/bridBidAdapter.js +1 -1
  29. package/dist/bridgewellBidAdapter.js +1 -1
  30. package/dist/brightMountainMediaBidAdapter.js +1 -1
  31. package/dist/carodaBidAdapter.js +1 -1
  32. package/dist/chtnwBidAdapter.js +1 -1
  33. package/dist/concertBidAdapter.js +1 -1
  34. package/dist/connatixBidAdapter.js +1 -0
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consumableBidAdapter.js +1 -1
  37. package/dist/conversantAnalyticsAdapter.js +1 -1
  38. package/dist/conversantBidAdapter.js +1 -1
  39. package/dist/craftBidAdapter.js +1 -1
  40. package/dist/criteoBidAdapter.js +1 -1
  41. package/dist/cwireBidAdapter.js +1 -1
  42. package/dist/dependencies.json +7 -1
  43. package/dist/dspxBidAdapter.js +1 -1
  44. package/dist/eplanningBidAdapter.js +1 -1
  45. package/dist/euidIdSystem.js +1 -1
  46. package/dist/feedadBidAdapter.js +1 -1
  47. package/dist/finativeBidAdapter.js +1 -1
  48. package/dist/freepassBidAdapter.js +1 -1
  49. package/dist/freewheel-sspBidAdapter.js +1 -1
  50. package/dist/geoedgeRtdProvider.js +1 -1
  51. package/dist/gmosspBidAdapter.js +1 -1
  52. package/dist/goldbachBidAdapter.js +1 -1
  53. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  54. package/dist/greenbidsRtdProvider.js +1 -1
  55. package/dist/gridBidAdapter.js +1 -1
  56. package/dist/gumgumBidAdapter.js +1 -1
  57. package/dist/h12mediaBidAdapter.js +1 -1
  58. package/dist/hypelabBidAdapter.js +1 -1
  59. package/dist/id5IdSystem.js +1 -1
  60. package/dist/imdsBidAdapter.js +1 -1
  61. package/dist/improvedigitalBidAdapter.js +1 -1
  62. package/dist/insticatorBidAdapter.js +1 -1
  63. package/dist/ixBidAdapter.js +1 -1
  64. package/dist/justpremiumBidAdapter.js +1 -1
  65. package/dist/kargoBidAdapter.js +1 -1
  66. package/dist/konduitAnalyticsAdapter.js +1 -1
  67. package/dist/kueezBidAdapter.js +1 -1
  68. package/dist/kueezRtbBidAdapter.js +1 -1
  69. package/dist/kulturemediaBidAdapter.js +1 -1
  70. package/dist/lassoBidAdapter.js +1 -1
  71. package/dist/lifestreetBidAdapter.js +1 -1
  72. package/dist/liveIntentIdSystem.js +1 -1
  73. package/dist/logicadBidAdapter.js +1 -1
  74. package/dist/loglyliftBidAdapter.js +1 -1
  75. package/dist/magniteAnalyticsAdapter.js +1 -1
  76. package/dist/malltvAnalyticsAdapter.js +1 -1
  77. package/dist/marsmediaBidAdapter.js +1 -1
  78. package/dist/mediafuseBidAdapter.js +1 -1
  79. package/dist/medianetBidAdapter.js +1 -1
  80. package/dist/mediasquareBidAdapter.js +1 -1
  81. package/dist/mgidBidAdapter.js +1 -1
  82. package/dist/minutemediaBidAdapter.js +1 -1
  83. package/dist/minutemediaplusBidAdapter.js +1 -1
  84. package/dist/nativoBidAdapter.js +1 -1
  85. package/dist/nexx360BidAdapter.js +1 -1
  86. package/dist/not-for-prod/prebid.js +145 -142
  87. package/dist/oguryBidAdapter.js +1 -1
  88. package/dist/onetagBidAdapter.js +1 -1
  89. package/dist/ooloAnalyticsAdapter.js +1 -1
  90. package/dist/operaadsBidAdapter.js +1 -1
  91. package/dist/operaadsIdSystem.js +1 -0
  92. package/dist/optidigitalBidAdapter.js +1 -1
  93. package/dist/outbrainBidAdapter.js +1 -1
  94. package/dist/oxxionAnalyticsAdapter.js +1 -1
  95. package/dist/parrableIdSystem.js +1 -1
  96. package/dist/pixfutureBidAdapter.js +1 -1
  97. package/dist/prebid-core.js +1 -1
  98. package/dist/publinkIdSystem.js +1 -1
  99. package/dist/pubmaticBidAdapter.js +1 -1
  100. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  101. package/dist/pxyzBidAdapter.js +1 -1
  102. package/dist/quantcastBidAdapter.js +1 -1
  103. package/dist/readpeakBidAdapter.js +1 -1
  104. package/dist/relaidoBidAdapter.js +1 -1
  105. package/dist/retailspotBidAdapter.js +1 -1
  106. package/dist/rhythmoneBidAdapter.js +1 -1
  107. package/dist/riseBidAdapter.js +1 -1
  108. package/dist/rubiconBidAdapter.js +1 -1
  109. package/dist/seedingAllianceBidAdapter.js +1 -1
  110. package/dist/seedtagBidAdapter.js +1 -1
  111. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  112. package/dist/sharethroughBidAdapter.js +1 -1
  113. package/dist/shinezBidAdapter.js +1 -1
  114. package/dist/smaatoBidAdapter.js +1 -1
  115. package/dist/smartadserverBidAdapter.js +1 -1
  116. package/dist/smartxBidAdapter.js +1 -1
  117. package/dist/smartyadsBidAdapter.js +1 -1
  118. package/dist/smilewantedBidAdapter.js +1 -1
  119. package/dist/snigelBidAdapter.js +1 -1
  120. package/dist/sonobiBidAdapter.js +1 -1
  121. package/dist/sovrnAnalyticsAdapter.js +1 -1
  122. package/dist/sovrnBidAdapter.js +1 -1
  123. package/dist/sspBCBidAdapter.js +1 -1
  124. package/dist/stvBidAdapter.js +1 -1
  125. package/dist/sublimeBidAdapter.js +1 -1
  126. package/dist/tappxBidAdapter.js +1 -1
  127. package/dist/targetVideoBidAdapter.js +1 -1
  128. package/dist/teadsBidAdapter.js +1 -1
  129. package/dist/topicsFpdModule.js +1 -1
  130. package/dist/trionBidAdapter.js +1 -1
  131. package/dist/tripleliftBidAdapter.js +1 -1
  132. package/dist/ttdBidAdapter.js +1 -1
  133. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  134. package/dist/uid2IdSystem.js +1 -1
  135. package/dist/underdogmediaBidAdapter.js +1 -1
  136. package/dist/undertoneBidAdapter.js +1 -1
  137. package/dist/vidazooBidAdapter.js +1 -1
  138. package/dist/videobyteBidAdapter.js +1 -1
  139. package/dist/visxBidAdapter.js +1 -1
  140. package/dist/vuukleBidAdapter.js +1 -1
  141. package/dist/widespaceBidAdapter.js +1 -1
  142. package/dist/winrBidAdapter.js +1 -1
  143. package/dist/yahoosspBidAdapter.js +1 -1
  144. package/dist/yieldmoBidAdapter.js +1 -1
  145. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  146. package/integrationExamples/topics/topics-server.js +72 -0
  147. package/modules/.submodules.json +2 -1
  148. package/modules/a1MediaRtdProvider.js +1 -1
  149. package/modules/adagioBidAdapter.js +15 -1
  150. package/modules/adgenerationBidAdapter.js +4 -3
  151. package/modules/admaticBidAdapter.js +5 -0
  152. package/modules/adqueryBidAdapter.js +23 -21
  153. package/modules/adqueryIdSystem.js +45 -30
  154. package/modules/adrelevantisBidAdapter.js +2 -0
  155. package/modules/adsinteractiveBidAdapter.js +2 -0
  156. package/modules/alkimiBidAdapter.js +19 -7
  157. package/modules/automatadAnalyticsAdapter.js +325 -0
  158. package/modules/automatadAnalyticsAdapter.md +23 -0
  159. package/modules/bidViewability.js +7 -0
  160. package/modules/bidViewability.md +9 -8
  161. package/modules/brandmetricsRtdProvider.js +30 -27
  162. package/modules/connatixBidAdapter.js +185 -0
  163. package/modules/connatixBidAdapter.md +37 -0
  164. package/modules/criteoBidAdapter.js +73 -50
  165. package/modules/freepassBidAdapter.js +20 -1
  166. package/modules/freepassBidAdapter.md +4 -1
  167. package/modules/geoedgeRtdProvider.js +43 -13
  168. package/modules/geoedgeRtdProvider.md +2 -1
  169. package/modules/gridBidAdapter.js +1 -8
  170. package/modules/liveIntentIdSystem.js +16 -1
  171. package/modules/medianetBidAdapter.js +7 -4
  172. package/modules/mediasquareBidAdapter.js +3 -0
  173. package/modules/nativoBidAdapter.js +21 -3
  174. package/modules/onetagBidAdapter.js +3 -0
  175. package/modules/operaadsBidAdapter.js +5 -0
  176. package/modules/operaadsBidAdapter.md +5 -5
  177. package/modules/operaadsIdSystem.js +106 -0
  178. package/modules/operaadsIdSystem.md +52 -0
  179. package/modules/optidigitalBidAdapter.js +25 -16
  180. package/modules/oxxionAnalyticsAdapter.js +22 -5
  181. package/modules/rubiconBidAdapter.js +2 -2
  182. package/modules/smartyadsBidAdapter.js +18 -1
  183. package/modules/snigelBidAdapter.js +69 -16
  184. package/modules/snigelBidAdapter.md +9 -3
  185. package/modules/tappxBidAdapter.js +17 -14
  186. package/modules/topicsFpdModule.js +35 -9
  187. package/modules/undertoneBidAdapter.md +1 -1
  188. package/modules/userId/eids.md +7 -0
  189. package/modules/visxBidAdapter.js +51 -1
  190. package/package.json +2 -2
  191. package/src/adloader.js +1 -0
  192. package/src/native.js +2 -2
  193. package/test/spec/modules/adagioBidAdapter_spec.js +89 -0
  194. package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
  195. package/test/spec/modules/admaticBidAdapter_spec.js +5 -0
  196. package/test/spec/modules/adqueryIdSystem_spec.js +13 -24
  197. package/test/spec/modules/alkimiBidAdapter_spec.js +3 -9
  198. package/test/spec/modules/automatadAnalyticsAdapter_spec.js +533 -0
  199. package/test/spec/modules/bidViewability_spec.js +32 -1
  200. package/test/spec/modules/brandmetricsRtdProvider_spec.js +6 -0
  201. package/test/spec/modules/connatixBidAdapter_spec.js +366 -0
  202. package/test/spec/modules/criteoBidAdapter_spec.js +249 -0
  203. package/test/spec/modules/eids_spec.js +48 -0
  204. package/test/spec/modules/freepassBidAdapter_spec.js +44 -0
  205. package/test/spec/modules/geoedgeRtdProvider_spec.js +44 -24
  206. package/test/spec/modules/gridBidAdapter_spec.js +68 -0
  207. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +5 -0
  208. package/test/spec/modules/liveIntentIdSystem_spec.js +5 -0
  209. package/test/spec/modules/medianetBidAdapter_spec.js +18 -18
  210. package/test/spec/modules/mediasquareBidAdapter_spec.js +5 -0
  211. package/test/spec/modules/nativoBidAdapter_spec.js +6 -1
  212. package/test/spec/modules/onetagBidAdapter_spec.js +69 -0
  213. package/test/spec/modules/operaadsIdSystem_spec.js +53 -0
  214. package/test/spec/modules/optidigitalBidAdapter_spec.js +9 -2
  215. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +6 -1
  216. package/test/spec/modules/rubiconBidAdapter_spec.js +24 -0
  217. package/test/spec/modules/smartyadsBidAdapter_spec.js +49 -0
  218. package/test/spec/modules/snigelBidAdapter_spec.js +57 -6
  219. package/test/spec/modules/tappxBidAdapter_spec.js +19 -0
  220. package/test/spec/modules/topicsFpdModule_spec.js +102 -1
  221. package/test/spec/modules/visxBidAdapter_spec.js +151 -1
  222. package/test/spec/native_spec.js +5 -3
@@ -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
+ });
@@ -245,18 +245,31 @@ describe('#bidViewability', function() {
245
245
  let logWinningBidNotFoundSpy;
246
246
  let callBidViewableBidderSpy;
247
247
  let winningBidsArray;
248
+ let callBidBillableBidderSpy;
249
+ let adUnits = [
250
+ {
251
+ 'code': 'abc123',
252
+ 'bids': [
253
+ {
254
+ 'bidder': 'pubmatic'
255
+ }
256
+ ]
257
+ }
258
+ ];
248
259
 
249
260
  beforeEach(function() {
250
261
  sandbox = sinon.sandbox.create();
251
262
  triggerPixelSpy = sandbox.spy(utils, ['triggerPixel']);
252
263
  eventsEmitSpy = sandbox.spy(events, ['emit']);
253
264
  callBidViewableBidderSpy = sandbox.spy(adapterManager, ['callBidViewableBidder']);
265
+ callBidBillableBidderSpy = sandbox.spy(adapterManager, ['callBidBillableBidder']);
254
266
  // mocking winningBidsArray
255
267
  winningBidsArray = [];
256
268
  sandbox.stub(prebidGlobal, 'getGlobal').returns({
257
269
  getAllWinningBids: function (number) {
258
270
  return winningBidsArray;
259
- }
271
+ },
272
+ adUnits
260
273
  });
261
274
  });
262
275
 
@@ -293,5 +306,23 @@ describe('#bidViewability', function() {
293
306
  // CONSTANTS.EVENTS.BID_VIEWABLE is NOT triggered
294
307
  expect(eventsEmitSpy.callCount).to.equal(0);
295
308
  });
309
+
310
+ it('should call the callBidBillableBidder function if the viewable bid is associated with an ad unit with deferBilling set to true', function() {
311
+ let moduleConfig = {};
312
+ const deferredBillingAdUnit = {
313
+ 'code': '/harshad/Jan/2021/',
314
+ 'deferBilling': true,
315
+ 'bids': [
316
+ {
317
+ 'bidder': 'pubmatic'
318
+ }
319
+ ]
320
+ };
321
+ adUnits.push(deferredBillingAdUnit);
322
+ winningBidsArray.push(PBJS_WINNING_BID);
323
+ bidViewability.impressionViewableHandler(moduleConfig, GPT_SLOT, null);
324
+ expect(callBidBillableBidderSpy.callCount).to.equal(1);
325
+ sinon.assert.calledWith(callBidBillableBidderSpy, PBJS_WINNING_BID);
326
+ });
296
327
  });
297
328
  });
@@ -67,6 +67,8 @@ const NO_USP_CONSENT = {
67
67
  usp: '1NYY'
68
68
  };
69
69
 
70
+ const UNDEFINED_USER_CONSENT = {};
71
+
70
72
  function mockSurveyLoaded(surveyConf) {
71
73
  const commands = window._brandmetrics || [];
72
74
  commands.forEach(command => {
@@ -120,6 +122,10 @@ describe('BrandmetricsRTD module', () => {
120
122
  it('should not init when there is no usp- consent', () => {
121
123
  expect(brandmetricsRTD.brandmetricsSubmodule.init(VALID_CONFIG, NO_USP_CONSENT)).to.equal(false);
122
124
  });
125
+
126
+ it('should init if there are no consent- objects defined', () => {
127
+ expect(brandmetricsRTD.brandmetricsSubmodule.init(VALID_CONFIG, UNDEFINED_USER_CONSENT)).to.equal(true);
128
+ });
123
129
  });
124
130
 
125
131
  describe('getBidRequestData', () => {