prebid.js 7.18.0 → 7.20.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 (313) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adfBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  10. package/dist/adkernelBidAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adqueryIdSystem.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -1
  18. package/dist/adxcgAnalyticsAdapter.js +1 -1
  19. package/dist/adxcgBidAdapter.js +1 -1
  20. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aolBidAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/byDataAnalyticsAdapter.js +1 -1
  38. package/dist/carodaBidAdapter.js +1 -1
  39. package/dist/categoryTranslation.js +1 -1
  40. package/dist/cleanioRtdProvider.js +1 -1
  41. package/dist/colossussspBidAdapter.js +1 -1
  42. package/dist/concertAnalyticsAdapter.js +1 -1
  43. package/dist/concertBidAdapter.js +1 -1
  44. package/dist/connectIdSystem.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -0
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/currency.js +1 -1
  54. package/dist/datablocksAnalyticsAdapter.js +1 -1
  55. package/dist/dchain.js +1 -1
  56. package/dist/debugging-standalone.js +1 -1
  57. package/dist/debugging.js +1 -1
  58. package/dist/dependencies.json +9 -0
  59. package/dist/dfpAdServerVideo.js +1 -1
  60. package/dist/dgkeywordRtdProvider.js +1 -1
  61. package/dist/dianomiBidAdapter.js +1 -1
  62. package/dist/dspxBidAdapter.js +1 -1
  63. package/dist/enrichmentFpdModule.js +1 -1
  64. package/dist/eplanningAnalyticsAdapter.js +1 -1
  65. package/dist/eplanningBidAdapter.js +1 -1
  66. package/dist/finativeBidAdapter.js +1 -1
  67. package/dist/fintezaAnalyticsAdapter.js +1 -1
  68. package/dist/fpd.js +1 -0
  69. package/dist/ftrackIdSystem.js +1 -1
  70. package/dist/gdprEnforcement.js +1 -1
  71. package/dist/glimpseBidAdapter.js +1 -1
  72. package/dist/gmosspBidAdapter.js +1 -1
  73. package/dist/goldbachBidAdapter.js +1 -1
  74. package/dist/googleAnalyticsAdapter.js +1 -1
  75. package/dist/gridBidAdapter.js +1 -1
  76. package/dist/gridNMBidAdapter.js +1 -1
  77. package/dist/gumgumBidAdapter.js +1 -1
  78. package/dist/h12mediaBidAdapter.js +1 -1
  79. package/dist/hadronAnalyticsAdapter.js +1 -1
  80. package/dist/id5AnalyticsAdapter.js +1 -1
  81. package/dist/id5IdSystem.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/kargoAnalyticsAdapter.js +1 -1
  89. package/dist/kinessoIdSystem.js +1 -1
  90. package/dist/konduitAnalyticsAdapter.js +1 -1
  91. package/dist/kueezBidAdapter.js +1 -1
  92. package/dist/lassoBidAdapter.js +1 -1
  93. package/dist/lifestreetBidAdapter.js +1 -1
  94. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  95. package/dist/liveIntentIdSystem.js +1 -1
  96. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  97. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  98. package/dist/logicadBidAdapter.js +1 -1
  99. package/dist/loglyliftBidAdapter.js +1 -1
  100. package/dist/lotamePanoramaIdSystem.js +1 -1
  101. package/dist/magniteAnalyticsAdapter.js +1 -0
  102. package/dist/malltvAnalyticsAdapter.js +1 -1
  103. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  104. package/dist/marsmediaBidAdapter.js +1 -1
  105. package/dist/mass.js +1 -1
  106. package/dist/mediafuseBidAdapter.js +1 -1
  107. package/dist/mediakeysBidAdapter.js +1 -1
  108. package/dist/medianetAnalyticsAdapter.js +1 -1
  109. package/dist/mediasquareBidAdapter.js +1 -1
  110. package/dist/mgidBidAdapter.js +1 -1
  111. package/dist/minutemediaBidAdapter.js +1 -1
  112. package/dist/multibid.js +1 -1
  113. package/dist/nativoBidAdapter.js +1 -1
  114. package/dist/not-for-prod/prebid.js +198 -194
  115. package/dist/oguryBidAdapter.js +1 -1
  116. package/dist/onetagBidAdapter.js +1 -1
  117. package/dist/ooloAnalyticsAdapter.js +1 -1
  118. package/dist/openxAnalyticsAdapter.js +1 -1
  119. package/dist/optimonAnalyticsAdapter.js +1 -1
  120. package/dist/outbrainBidAdapter.js +1 -1
  121. package/dist/parrableIdSystem.js +1 -1
  122. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  123. package/dist/pixfutureBidAdapter.js +1 -1
  124. package/dist/prebid-core.js +2 -2
  125. package/dist/prebidServerBidAdapter.js +1 -1
  126. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  127. package/dist/priceFloors.js +1 -1
  128. package/dist/publinkIdSystem.js +1 -1
  129. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  130. package/dist/pubmaticBidAdapter.js +1 -1
  131. package/dist/pubperfAnalyticsAdapter.js +1 -1
  132. package/dist/pubstackAnalyticsAdapter.js +1 -1
  133. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  134. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  135. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  136. package/dist/pxyzBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/quantcastIdSystem.js +1 -1
  139. package/dist/readpeakBidAdapter.js +1 -1
  140. package/dist/realvuAnalyticsAdapter.js +1 -1
  141. package/dist/relaidoBidAdapter.js +1 -1
  142. package/dist/relevantAnalyticsAdapter.js +1 -1
  143. package/dist/rhythmoneBidAdapter.js +1 -1
  144. package/dist/riseBidAdapter.js +1 -1
  145. package/dist/rivrAnalyticsAdapter.js +1 -1
  146. package/dist/roxotAnalyticsAdapter.js +1 -1
  147. package/dist/rtdModule.js +1 -1
  148. package/dist/rubiconAnalyticsAdapter.js +1 -1
  149. package/dist/rubiconBidAdapter.js +1 -1
  150. package/dist/s2sTesting.js +1 -1
  151. package/dist/scaleableAnalyticsAdapter.js +1 -1
  152. package/dist/schain.js +1 -1
  153. package/dist/seedingAllianceBidAdapter.js +1 -1
  154. package/dist/seedtagBidAdapter.js +1 -1
  155. package/dist/sharedIdSystem.js +1 -1
  156. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  157. package/dist/sharethroughBidAdapter.js +1 -1
  158. package/dist/shinezBidAdapter.js +1 -1
  159. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  160. package/dist/smaatoBidAdapter.js +1 -1
  161. package/dist/smartadserverBidAdapter.js +1 -1
  162. package/dist/smartxBidAdapter.js +1 -1
  163. package/dist/smilewantedBidAdapter.js +1 -1
  164. package/dist/sonobiAnalyticsAdapter.js +1 -1
  165. package/dist/sonobiBidAdapter.js +1 -1
  166. package/dist/sovrnAnalyticsAdapter.js +1 -1
  167. package/dist/sovrnBidAdapter.js +1 -1
  168. package/dist/sspBCBidAdapter.js +1 -1
  169. package/dist/staqAnalyticsAdapter.js +1 -1
  170. package/dist/sublimeBidAdapter.js +1 -1
  171. package/dist/synacormediaBidAdapter.js +1 -1
  172. package/dist/taboolaBidAdapter.js +1 -1
  173. package/dist/tapadIdSystem.js +1 -1
  174. package/dist/targetVideoBidAdapter.js +1 -1
  175. package/dist/teadsBidAdapter.js +1 -1
  176. package/dist/teadsIdSystem.js +1 -0
  177. package/dist/terceptAnalyticsAdapter.js +1 -1
  178. package/dist/trionBidAdapter.js +1 -1
  179. package/dist/tripleliftBidAdapter.js +1 -1
  180. package/dist/ttdBidAdapter.js +1 -1
  181. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  182. package/dist/underdogmediaBidAdapter.js +1 -1
  183. package/dist/undertoneBidAdapter.js +1 -1
  184. package/dist/userId.js +1 -1
  185. package/dist/vidazooBidAdapter.js +1 -1
  186. package/dist/videobyteBidAdapter.js +1 -1
  187. package/dist/visxBidAdapter.js +1 -1
  188. package/dist/vrtcalBidAdapter.js +1 -1
  189. package/dist/vuukleBidAdapter.js +1 -1
  190. package/dist/weboramaRtdProvider.js +1 -1
  191. package/dist/widespaceBidAdapter.js +1 -1
  192. package/dist/winrBidAdapter.js +1 -1
  193. package/dist/yahoosspBidAdapter.js +1 -1
  194. package/dist/yandexBidAdapter.js +1 -1
  195. package/dist/yieldmoBidAdapter.js +1 -1
  196. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  197. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  198. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  199. package/libraries/fpd/sua.js +98 -0
  200. package/modules/.submodules.json +1 -0
  201. package/modules/adfBidAdapter.js +1 -1
  202. package/modules/adkernelAdnBidAdapter.js +1 -0
  203. package/modules/adkernelBidAdapter.js +2 -2
  204. package/modules/adqueryIdSystem.js +8 -8
  205. package/modules/adxcgBidAdapter.js +1 -1
  206. package/modules/amxBidAdapter.js +1 -1
  207. package/modules/aolBidAdapter.js +25 -2
  208. package/modules/appnexusBidAdapter.js +19 -2
  209. package/modules/{andBeyondMediaBidAdapter.js → beyondmediaBidAdapter.js} +0 -0
  210. package/modules/{andBeyondMediaBidAdapter.md → beyondmediaBidAdapter.md} +1 -1
  211. package/modules/categoryTranslation.js +4 -4
  212. package/modules/cleanioRtdProvider.js +3 -4
  213. package/modules/colossussspBidAdapter.js +2 -1
  214. package/modules/connectIdSystem.js +16 -1
  215. package/modules/conversantAnalyticsAdapter.js +560 -0
  216. package/modules/conversantAnalyticsAdapter.md +47 -0
  217. package/modules/criteoBidAdapter.js +1 -1
  218. package/modules/currency.js +11 -11
  219. package/modules/dchain.js +2 -2
  220. package/modules/debugging/bidInterceptor.js +2 -2
  221. package/modules/debugging/debugging.js +10 -2
  222. package/modules/debugging/legacy.js +2 -2
  223. package/modules/dgkeywordRtdProvider.js +21 -3
  224. package/modules/dianomiBidAdapter.js +1 -1
  225. package/modules/enrichmentFpdModule.js +33 -14
  226. package/modules/eplanningBidAdapter.js +48 -2
  227. package/modules/finativeBidAdapter.js +1 -1
  228. package/modules/gridBidAdapter.js +187 -117
  229. package/modules/improvedigitalBidAdapter.js +2 -2
  230. package/modules/ixBidAdapter.js +94 -23
  231. package/modules/liveIntentIdSystem.js +39 -5
  232. package/modules/lotamePanoramaIdSystem.js +10 -6
  233. package/modules/magniteAnalyticsAdapter.js +902 -0
  234. package/modules/magniteAnalyticsAdapter.md +18 -0
  235. package/modules/mass.js +2 -2
  236. package/modules/mediakeysBidAdapter.js +6 -1
  237. package/modules/mediakeysBidAdapter.md +50 -40
  238. package/modules/multibid/index.js +5 -5
  239. package/modules/nativoBidAdapter.js +1 -1
  240. package/modules/pixfutureBidAdapter.js +46 -15
  241. package/modules/prebidServerBidAdapter/index.js +54 -19
  242. package/modules/priceFloors.js +8 -22
  243. package/modules/readpeakBidAdapter.js +1 -1
  244. package/modules/rubiconAnalyticsAdapter.js +14 -9
  245. package/modules/rubiconBidAdapter.js +2 -3
  246. package/modules/seedingAllianceBidAdapter.js +1 -1
  247. package/modules/sharethroughBidAdapter.js +1 -1
  248. package/modules/taboolaBidAdapter.js +5 -5
  249. package/modules/talkadsBidAdapter.js +1 -0
  250. package/modules/teadsIdSystem.js +234 -0
  251. package/modules/teadsIdSystem.md +22 -0
  252. package/modules/truereachBidAdapter.js +1 -0
  253. package/modules/ttdBidAdapter.js +1 -1
  254. package/modules/userId/index.js +21 -14
  255. package/modules/vrtcalBidAdapter.js +7 -1
  256. package/modules/vuukleBidAdapter.js +34 -3
  257. package/modules/yahoosspBidAdapter.js +4 -2
  258. package/modules/yandexBidAdapter.js +31 -8
  259. package/package.json +2 -2
  260. package/src/adapterManager.js +2 -4
  261. package/src/adapters/bidderFactory.js +13 -11
  262. package/src/auction.js +140 -69
  263. package/src/constants.json +8 -0
  264. package/src/cpmBucketManager.js +22 -3
  265. package/src/native.js +1 -5
  266. package/src/prebid.js +5 -6
  267. package/src/targeting.js +31 -14
  268. package/test/fixtures/fixtures.js +2 -1
  269. package/test/spec/auctionmanager_spec.js +109 -21
  270. package/test/spec/cpmBucketManager_spec.js +239 -177
  271. package/test/spec/fpd/sua_spec.js +244 -0
  272. package/test/spec/modules/adfBidAdapter_spec.js +2 -3
  273. package/test/spec/modules/adqueryIdSystem_spec.js +0 -2
  274. package/test/spec/modules/adxcgBidAdapter_spec.js +2 -3
  275. package/test/spec/modules/amxBidAdapter_spec.js +3 -2
  276. package/test/spec/modules/aolBidAdapter_spec.js +42 -9
  277. package/test/spec/modules/appnexusBidAdapter_spec.js +24 -0
  278. package/test/spec/modules/{andBeyondMediaBidAdapter_spec.js → beyondmediaBidAdapter_spec.js} +1 -1
  279. package/test/spec/modules/colossussspBidAdapter_spec.js +4 -2
  280. package/test/spec/modules/connectIdSystem_spec.js +20 -0
  281. package/test/spec/modules/conversantAnalyticsAdapter_spec.js +963 -0
  282. package/test/spec/modules/currency_spec.js +14 -6
  283. package/test/spec/modules/debugging_mod_spec.js +9 -0
  284. package/test/spec/modules/dgkeywordRtdProvider_spec.js +83 -1
  285. package/test/spec/modules/dianomiBidAdapter_spec.js +2 -3
  286. package/test/spec/modules/enrichmentFpdModule_spec.js +50 -7
  287. package/test/spec/modules/eplanningBidAdapter_spec.js +285 -1
  288. package/test/spec/modules/fpdModule_spec.js +9 -0
  289. package/test/spec/modules/gridBidAdapter_spec.js +87 -31
  290. package/test/spec/modules/ixBidAdapter_spec.js +221 -2
  291. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +62 -8
  292. package/test/spec/modules/liveIntentIdSystem_spec.js +62 -8
  293. package/test/spec/modules/lotamePanoramaIdSystem_spec.js +0 -1
  294. package/test/spec/modules/magniteAnalyticsAdapter_spec.js +1942 -0
  295. package/test/spec/modules/mediakeysBidAdapter_spec.js +20 -3
  296. package/test/spec/modules/nativoBidAdapter_spec.js +13 -2
  297. package/test/spec/modules/prebidServerBidAdapter_spec.js +202 -15
  298. package/test/spec/modules/priceFloors_spec.js +5 -5
  299. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +2 -3
  300. package/test/spec/modules/seedtagBidAdapter_spec.js +15 -18
  301. package/test/spec/modules/sharethroughBidAdapter_spec.js +2 -1
  302. package/test/spec/modules/taboolaBidAdapter_spec.js +112 -13
  303. package/test/spec/modules/teadsIdSystem_spec.js +271 -0
  304. package/test/spec/modules/ttdBidAdapter_spec.js +3 -3
  305. package/test/spec/modules/userId_spec.js +39 -4
  306. package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -1
  307. package/test/spec/modules/vuukleBidAdapter_spec.js +87 -0
  308. package/test/spec/modules/yahoosspBidAdapter_spec.js +48 -1
  309. package/test/spec/modules/yandexBidAdapter_spec.js +8 -5
  310. package/test/spec/native_spec.js +5 -0
  311. package/test/spec/unit/core/bidderFactory_spec.js +66 -11
  312. package/test/spec/unit/core/targeting_spec.js +28 -9
  313. package/test/spec/unit/pbjs_api_spec.js +48 -2
@@ -4,6 +4,8 @@ import {getRefererInfo} from 'src/refererDetection.js';
4
4
  import {processFpd, registerSubmodules, startAuctionHook, reset} from 'modules/fpdModule/index.js';
5
5
  import * as enrichmentModule from 'modules/enrichmentFpdModule.js';
6
6
  import * as validationModule from 'modules/validationFpdModule/index.js';
7
+ import {resetEnrichments} from 'modules/enrichmentFpdModule.js';
8
+ import {GreedyPromise} from '../../../src/utils/promise.js';
7
9
 
8
10
  describe('the first party data module', function () {
9
11
  afterEach(function () {
@@ -57,6 +59,8 @@ describe('the first party data module', function () {
57
59
  let querySelectorStub;
58
60
  let canonical;
59
61
  let keywords;
62
+ let lowEntropySuaStub;
63
+ let highEntropySuaStub;
60
64
 
61
65
  before(function() {
62
66
  reset();
@@ -70,6 +74,7 @@ describe('the first party data module', function () {
70
74
  });
71
75
 
72
76
  beforeEach(function() {
77
+ resetEnrichments();
73
78
  querySelectorStub = sinon.stub(window.top.document, 'querySelector');
74
79
  querySelectorStub.withArgs("link[rel='canonical']").returns(canonical);
75
80
  querySelectorStub.withArgs("meta[name='keywords']").returns(keywords);
@@ -79,6 +84,8 @@ describe('the first party data module', function () {
79
84
  heightStub = sinon.stub(window.top, 'innerHeight').get(function () {
80
85
  return height;
81
86
  });
87
+ lowEntropySuaStub = sinon.stub(enrichmentModule.sua, 'le').callsFake(() => null);
88
+ highEntropySuaStub = sinon.stub(enrichmentModule.sua, 'he').callsFake(() => GreedyPromise.resolve());
82
89
  });
83
90
 
84
91
  afterEach(function() {
@@ -89,6 +96,8 @@ describe('the first party data module', function () {
89
96
  canonical.rel = 'canonical';
90
97
  keywords = document.createElement('meta');
91
98
  keywords.name = 'keywords';
99
+ lowEntropySuaStub.restore();
100
+ highEntropySuaStub.restore();
92
101
  });
93
102
 
94
103
  it('filters ortb2 data that is set', function () {
@@ -126,7 +126,7 @@ describe('TheMediaGrid Adapter', function () {
126
126
  genre: 'Adventure'
127
127
  }
128
128
  };
129
- const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2: {site}});
129
+ const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2: {site}});
130
130
  const payload = parseRequest(request.data);
131
131
  expect(payload.site.cat).to.deep.equal([...site.cat, ...site.pagecat]);
132
132
  expect(payload.site.content.genre).to.deep.equal(site.content.genre);
@@ -137,7 +137,7 @@ describe('TheMediaGrid Adapter', function () {
137
137
  const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake(
138
138
  arg => arg === 'tmguid' ? fpdUserIdVal : null);
139
139
 
140
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
140
+ const [request] = spec.buildRequests([bidRequests[0]], bidderRequest);
141
141
  expect(request.data).to.be.an('string');
142
142
  const payload = parseRequest(request.data);
143
143
  expect(payload).to.deep.equal({
@@ -174,7 +174,7 @@ describe('TheMediaGrid Adapter', function () {
174
174
  const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake(
175
175
  arg => arg === 'tmguid' ? fpdUserIdVal : null);
176
176
 
177
- const request = spec.buildRequests([bidRequests[0], bidRequests[1]], bidderRequest);
177
+ const [request] = spec.buildRequests([bidRequests[0], bidRequests[1]], bidderRequest);
178
178
  expect(request.data).to.be.an('string');
179
179
  const payload = parseRequest(request.data);
180
180
  expect(payload).to.deep.equal({
@@ -220,7 +220,7 @@ describe('TheMediaGrid Adapter', function () {
220
220
  const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake(
221
221
  arg => arg === 'tmguid' ? fpdUserIdVal : null);
222
222
 
223
- const request = spec.buildRequests(bidRequests.slice(0, 3), bidderRequest);
223
+ const [request] = spec.buildRequests(bidRequests.slice(0, 3), bidderRequest);
224
224
  expect(request.data).to.be.an('string');
225
225
  const payload = parseRequest(request.data);
226
226
  expect(payload).to.deep.equal({
@@ -270,12 +270,68 @@ describe('TheMediaGrid Adapter', function () {
270
270
  getDataFromLocalStorageStub.restore();
271
271
  });
272
272
 
273
+ it('should attach valid params to the tags with multiRequest', function () {
274
+ const fpdUserIdVal = '0b0f84a1-1596-4165-9742-2e1a7dfac57f';
275
+ const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake(
276
+ arg => arg === 'tmguid' ? fpdUserIdVal : null);
277
+
278
+ const bidMultiRequests = bidRequests.slice(0, 3).map((bidReq) => ({
279
+ ...bidReq,
280
+ params: { ...bidReq.params, multiRequest: true }
281
+ }));
282
+ bidMultiRequests[1].params.pubid = 'some_pub_id';
283
+ bidMultiRequests[2].params.source = 'jwp';
284
+ const requests = spec.buildRequests(bidMultiRequests, bidderRequest);
285
+ requests.forEach((request, i) => {
286
+ expect(request.data).to.be.an('string');
287
+ const payload = parseRequest(request.data);
288
+ const banner = bidMultiRequests[i].mediaTypes ? bidRequests[i].mediaTypes.banner : { sizes: bidMultiRequests[i].sizes };
289
+ const video = bidMultiRequests[i].mediaTypes && bidMultiRequests[i].mediaTypes.video;
290
+ const source = bidMultiRequests[i].params.source;
291
+ const url = `https://grid.bidswitch.net/hbjson?no_mapping=1${source ? `&sp=${source}` : ''}`;
292
+ expect(request.url).to.equal(url);
293
+ expect(payload).to.deep.equal({
294
+ 'id': bidderRequest.bidderRequestId,
295
+ 'site': {
296
+ 'page': referrer,
297
+ ...(bidMultiRequests[i].params.pubid && { 'publisher': { 'id': bidMultiRequests[i].params.pubid } })
298
+ },
299
+ 'tmax': bidderRequest.timeout,
300
+ 'source': {
301
+ 'tid': bidderRequest.auctionId,
302
+ 'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'}
303
+ },
304
+ 'user': {
305
+ 'id': fpdUserIdVal
306
+ },
307
+ 'imp': [{
308
+ 'id': bidMultiRequests[i].bidId,
309
+ 'tagid': bidMultiRequests[i].params.uid,
310
+ 'ext': {'divid': bidMultiRequests[i].adUnitCode},
311
+ ...(bidMultiRequests[i].params.bidFloor && { 'bidfloor': bidMultiRequests[i].params.bidFloor }),
312
+ ...(banner && { banner: {
313
+ 'w': banner.sizes[0][0],
314
+ 'h': banner.sizes[0][1],
315
+ 'format': banner.sizes.map(([w, h]) => ({ w, h }))
316
+ }}),
317
+ ...(video && { video: {
318
+ 'w': video.playerSize[0][0],
319
+ 'h': video.playerSize[0][1],
320
+ 'mimes': video.mimes
321
+ }})
322
+ }]
323
+ });
324
+ });
325
+
326
+ getDataFromLocalStorageStub.restore();
327
+ });
328
+
273
329
  it('should support mixed mediaTypes', function () {
274
330
  const fpdUserIdVal = '0b0f84a1-1596-4165-9742-2e1a7dfac57f';
275
331
  const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake(
276
332
  arg => arg === 'tmguid' ? fpdUserIdVal : null);
277
333
 
278
- const request = spec.buildRequests(bidRequests, bidderRequest);
334
+ const [request] = spec.buildRequests(bidRequests, bidderRequest);
279
335
  expect(request.data).to.be.an('string');
280
336
  const payload = parseRequest(request.data);
281
337
  expect(payload).to.deep.equal({
@@ -341,7 +397,7 @@ describe('TheMediaGrid Adapter', function () {
341
397
 
342
398
  it('if gdprConsent is present payload must have gdpr params', function () {
343
399
  const gdprBidderRequest = Object.assign({gdprConsent: {consentString: 'AAA', gdprApplies: true}}, bidderRequest);
344
- const request = spec.buildRequests(bidRequests, gdprBidderRequest);
400
+ const [request] = spec.buildRequests(bidRequests, gdprBidderRequest);
345
401
  expect(request.data).to.be.an('string');
346
402
  const payload = parseRequest(request.data);
347
403
  expect(payload).to.have.property('user');
@@ -354,7 +410,7 @@ describe('TheMediaGrid Adapter', function () {
354
410
 
355
411
  it('if usPrivacy is present payload must have us_privacy param', function () {
356
412
  const bidderRequestWithUSP = Object.assign({uspConsent: '1YNN'}, bidderRequest);
357
- const request = spec.buildRequests(bidRequests, bidderRequestWithUSP);
413
+ const [request] = spec.buildRequests(bidRequests, bidderRequestWithUSP);
358
414
  expect(request.data).to.be.an('string');
359
415
  const payload = parseRequest(request.data);
360
416
  expect(payload).to.have.property('regs');
@@ -387,7 +443,7 @@ describe('TheMediaGrid Adapter', function () {
387
443
  userIdAsEids: eids
388
444
  }, bid);
389
445
  });
390
- const request = spec.buildRequests(bidRequestsWithUserIds, bidderRequest);
446
+ const [request] = spec.buildRequests(bidRequestsWithUserIds, bidderRequest);
391
447
  expect(request.data).to.be.an('string');
392
448
  const payload = parseRequest(request.data);
393
449
  expect(payload).to.have.property('user');
@@ -403,7 +459,7 @@ describe('TheMediaGrid Adapter', function () {
403
459
  };
404
460
  const ortb2 = {user: {ext: {device: ortb2UserExtDevice}}};
405
461
 
406
- const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2});
462
+ const [request] = spec.buildRequests(bidRequests, {...bidderRequest, ortb2});
407
463
  expect(request.data).to.be.an('string');
408
464
  const payload = parseRequest(request.data);
409
465
  expect(payload).to.have.property('user');
@@ -427,7 +483,7 @@ describe('TheMediaGrid Adapter', function () {
427
483
  schain: schain
428
484
  }, bid);
429
485
  });
430
- const request = spec.buildRequests(bidRequestsWithSChain, bidderRequest);
486
+ const [request] = spec.buildRequests(bidRequestsWithSChain, bidderRequest);
431
487
  expect(request.data).to.be.an('string');
432
488
  const payload = parseRequest(request.data);
433
489
  expect(payload).to.have.property('source');
@@ -451,7 +507,7 @@ describe('TheMediaGrid Adapter', function () {
451
507
  }
452
508
  }, bid);
453
509
  });
454
- const request = spec.buildRequests(bidRequestsWithJwTargeting, bidderRequest);
510
+ const [request] = spec.buildRequests(bidRequestsWithJwTargeting, bidderRequest);
455
511
  expect(request.data).to.be.an('string');
456
512
  const payload = parseRequest(request.data);
457
513
  expect(payload).to.have.property('user');
@@ -494,7 +550,7 @@ describe('TheMediaGrid Adapter', function () {
494
550
  }
495
551
  };
496
552
  const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } }
497
- const request = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2});
553
+ const [request] = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2});
498
554
  expect(request.data).to.be.an('string');
499
555
  const payload = parseRequest(request.data);
500
556
  expect(payload.ext.keywords).to.deep.equal({
@@ -556,7 +612,7 @@ describe('TheMediaGrid Adapter', function () {
556
612
  }
557
613
  ];
558
614
  const ortb2 = {user: {data: userData}};
559
- const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
615
+ const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
560
616
  const payload = parseRequest(request.data);
561
617
  expect(payload.user.data).to.deep.equal(userData);
562
618
  });
@@ -575,7 +631,7 @@ describe('TheMediaGrid Adapter', function () {
575
631
  }
576
632
  ];
577
633
  const ortb2 = {site: { content: { data: contentData } }};
578
- const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
634
+ const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
579
635
  const payload = parseRequest(request.data);
580
636
  expect(payload.site.content.data).to.deep.equal(contentData);
581
637
  });
@@ -608,7 +664,7 @@ describe('TheMediaGrid Adapter', function () {
608
664
  }
609
665
  }
610
666
  });
611
- const request = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2});
667
+ const [request] = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2});
612
668
  const payload = parseRequest(request.data);
613
669
  expect(payload.user.data).to.deep.equal([{
614
670
  name: 'iow_labs_pub_data',
@@ -622,7 +678,7 @@ describe('TheMediaGrid Adapter', function () {
622
678
  it('should have site.content.id filled from config ortb2.site.content.id', function () {
623
679
  const contentId = 'jw_abc';
624
680
  const ortb2 = {site: {content: {id: contentId}}};
625
- const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
681
+ const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2});
626
682
  const payload = parseRequest(request.data);
627
683
  expect(payload.site.content.id).to.equal(contentId);
628
684
  });
@@ -630,7 +686,7 @@ describe('TheMediaGrid Adapter', function () {
630
686
  it('should be right tmax when timeout in config is less then timeout in bidderRequest', function() {
631
687
  const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
632
688
  arg => arg === 'bidderTimeout' ? 2000 : null);
633
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
689
+ const [request] = spec.buildRequests([bidRequests[0]], bidderRequest);
634
690
  expect(request.data).to.be.an('string');
635
691
  const payload = parseRequest(request.data);
636
692
  expect(payload.tmax).to.equal(2000);
@@ -639,7 +695,7 @@ describe('TheMediaGrid Adapter', function () {
639
695
  it('should be right tmax when timeout in bidderRequest is less then timeout in config', function() {
640
696
  const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
641
697
  arg => arg === 'bidderTimeout' ? 5000 : null);
642
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
698
+ const [request] = spec.buildRequests([bidRequests[0]], bidderRequest);
643
699
  expect(request.data).to.be.an('string');
644
700
  const payload = parseRequest(request.data);
645
701
  expect(payload.tmax).to.equal(3000);
@@ -648,7 +704,7 @@ describe('TheMediaGrid Adapter', function () {
648
704
  it('should contain regs.coppa if coppa is true in config', function () {
649
705
  const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
650
706
  arg => arg === 'coppa' ? true : null);
651
- const request = spec.buildRequests([bidRequests[0]], bidderRequest);
707
+ const [request] = spec.buildRequests([bidRequests[0]], bidderRequest);
652
708
  expect(request.data).to.be.an('string');
653
709
  const payload = parseRequest(request.data);
654
710
  expect(payload).to.have.property('regs');
@@ -680,7 +736,7 @@ describe('TheMediaGrid Adapter', function () {
680
736
  const bidRequestsWithOrtb2Imp = bidRequests.slice(0, 3).map((bid, ind) => {
681
737
  return Object.assign(ortb2Imp[ind] ? { ortb2Imp: ortb2Imp[ind] } : {}, bid);
682
738
  });
683
- const request = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest);
739
+ const [request] = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest);
684
740
  expect(request.data).to.be.an('string');
685
741
  const payload = parseRequest(request.data);
686
742
  expect(payload.imp[0].ext).to.deep.equal({
@@ -716,7 +772,7 @@ describe('TheMediaGrid Adapter', function () {
716
772
  const bidRequestsWithOrtb2Imp = bidRequests.slice(0, 3).map((bid, ind) => {
717
773
  return Object.assign(ortb2Imp[ind] ? { ortb2Imp: ortb2Imp[ind] } : {}, bid);
718
774
  });
719
- const request = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest);
775
+ const [request] = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest);
720
776
  expect(request.data).to.be.an('string');
721
777
  const payload = parseRequest(request.data);
722
778
  expect(payload.imp[0].instl).to.equal(1);
@@ -750,7 +806,7 @@ describe('TheMediaGrid Adapter', function () {
750
806
  timeout: 3000
751
807
  };
752
808
  const parsedReferrer = encodeURIComponent(bidderRequestWithNumId.refererInfo.page);
753
- const request = spec.buildRequests([bidRequestWithNumId], bidderRequestWithNumId);
809
+ const [request] = spec.buildRequests([bidRequestWithNumId], bidderRequestWithNumId);
754
810
  expect(request.data).to.be.an('string');
755
811
  const payload = parseRequest(request.data);
756
812
  expect(payload).to.deep.equal({
@@ -792,7 +848,7 @@ describe('TheMediaGrid Adapter', function () {
792
848
  }
793
849
  }, bidRequests[1]);
794
850
  it('should return the value from getFloor if present', function () {
795
- const request = spec.buildRequests([bidRequest], bidderRequest);
851
+ const [request] = spec.buildRequests([bidRequest], bidderRequest);
796
852
  expect(request.data).to.be.an('string');
797
853
  const payload = parseRequest(request.data);
798
854
  expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor);
@@ -801,7 +857,7 @@ describe('TheMediaGrid Adapter', function () {
801
857
  const bidfloor = 0.80;
802
858
  const bidRequestsWithFloor = { ...bidRequest };
803
859
  bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params);
804
- const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
860
+ const [request] = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
805
861
  expect(request.data).to.be.an('string');
806
862
  const payload = parseRequest(request.data);
807
863
  expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor);
@@ -810,7 +866,7 @@ describe('TheMediaGrid Adapter', function () {
810
866
  const bidfloor = 1.80;
811
867
  const bidRequestsWithFloor = { ...bidRequest };
812
868
  bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params);
813
- const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
869
+ const [request] = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
814
870
  expect(request.data).to.be.an('string');
815
871
  const payload = parseRequest(request.data);
816
872
  expect(payload.imp[0].bidfloor).to.equal(bidfloor);
@@ -844,7 +900,7 @@ describe('TheMediaGrid Adapter', function () {
844
900
  'auctionId': '1cbd2feafe5e8b',
845
901
  }
846
902
  ];
847
- const request = spec.buildRequests(bidRequests);
903
+ const [request] = spec.buildRequests(bidRequests);
848
904
  const expectedResponse = [
849
905
  {
850
906
  'requestId': '659423fff799cb',
@@ -904,7 +960,7 @@ describe('TheMediaGrid Adapter', function () {
904
960
  'auctionId': '1fa09aee5c8c99',
905
961
  }
906
962
  ];
907
- const request = spec.buildRequests(bidRequests);
963
+ const [request] = spec.buildRequests(bidRequests);
908
964
  const expectedResponse = [
909
965
  {
910
966
  'requestId': '659423fff799cb',
@@ -1050,7 +1106,7 @@ describe('TheMediaGrid Adapter', function () {
1050
1106
  {'bid': [{'impid': '112432ab4f34', 'price': 1.80, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"32115432\"><\/Ad>\n<\/VAST>', 'nurl': 'https://wrong_url.com', 'auid': 14, content_type: 'video', 'adomain': ['example.com'], w: 300, h: 600}], 'seat': '2'},
1051
1107
  {'bid': [{'impid': 'a74b342f8cd', 'price': 1.50, 'nurl': '', 'auid': 15, content_type: 'video'}], 'seat': '2'}
1052
1108
  ];
1053
- const request = spec.buildRequests(bidRequests);
1109
+ const [request] = spec.buildRequests(bidRequests);
1054
1110
  const expectedResponse = [
1055
1111
  {
1056
1112
  'requestId': '659423fff799cb',
@@ -1167,7 +1223,7 @@ describe('TheMediaGrid Adapter', function () {
1167
1223
  'auctionId': '1fa09aee5c84d34',
1168
1224
  }
1169
1225
  ];
1170
- const request = spec.buildRequests(bidRequests);
1226
+ const [request] = spec.buildRequests(bidRequests);
1171
1227
  const result = spec.interpretResponse({'body': {'seatbid': responses.slice(2)}}, request);
1172
1228
  expect(result.length).to.equal(0);
1173
1229
  });
@@ -1237,7 +1293,7 @@ describe('TheMediaGrid Adapter', function () {
1237
1293
  'auctionId': '32a1f276cb87cb8',
1238
1294
  }
1239
1295
  ];
1240
- const request = spec.buildRequests(bidRequests);
1296
+ const [request] = spec.buildRequests(bidRequests);
1241
1297
  const expectedResponse = [
1242
1298
  {
1243
1299
  'requestId': '2164be6358b9',
@@ -1344,7 +1400,7 @@ describe('TheMediaGrid Adapter', function () {
1344
1400
  ],
1345
1401
  'seat': '1'
1346
1402
  };
1347
- const request = spec.buildRequests(bidRequests);
1403
+ const [request] = spec.buildRequests(bidRequests);
1348
1404
  const expectedResponse = [
1349
1405
  {
1350
1406
  'requestId': '26d6f897b516',
@@ -2,7 +2,7 @@ import * as utils from 'src/utils.js';
2
2
  import { config } from 'src/config.js';
3
3
  import { expect } from 'chai';
4
4
  import { newBidder } from 'src/adapters/bidderFactory.js';
5
- import { spec, storage, ERROR_CODES } from '../../../modules/ixBidAdapter.js';
5
+ import { spec, storage, ERROR_CODES, FEATURE_TOGGLES, LOCAL_STORAGE_FEATURE_TOGGLES_KEY } from '../../../modules/ixBidAdapter.js';
6
6
  import { createEidsArray } from 'modules/userId/eids.js';
7
7
  import { deepAccess, deepClone } from '../../../src/utils.js';
8
8
 
@@ -1739,6 +1739,7 @@ describe('IndexexchangeAdapter', function () {
1739
1739
  expect(payload.source.ext.schain).to.deep.equal(SAMPLE_SCHAIN);
1740
1740
  expect(payload.imp).to.be.an('array');
1741
1741
  expect(payload.imp).to.have.lengthOf(1);
1742
+ expect(payload.source.tid).to.equal(DEFAULT_BANNER_VALID_BID[0].auctionId);
1742
1743
  });
1743
1744
 
1744
1745
  it('payload should have correct format and value for r.id when bidderRequestId is a number ', function () {
@@ -1767,7 +1768,7 @@ describe('IndexexchangeAdapter', function () {
1767
1768
 
1768
1769
  it('payload should not include schain when not provided', function () {
1769
1770
  const payload = JSON.parse(queryWithoutSchain.r);
1770
- expect(payload.source).to.not.exist; // source object currently only written for schain
1771
+ expect(payload.source.schain).to.not.exist; // source object currently only written for schain
1771
1772
  });
1772
1773
 
1773
1774
  it('impression should have correct format and value', function () {
@@ -3294,6 +3295,224 @@ describe('IndexexchangeAdapter', function () {
3294
3295
  });
3295
3296
  });
3296
3297
 
3298
+ describe('Features', () => {
3299
+ let localStorageValues = {};
3300
+ let sandbox = sinon.sandbox.create();
3301
+ let setDataInLocalStorageStub;
3302
+ let getDataFromLocalStorageStub;
3303
+ let removeDataFromLocalStorageStub;
3304
+ const serverResponse = {
3305
+ body: {
3306
+ ext: {
3307
+ features: {
3308
+ test: {
3309
+ activated: false
3310
+ }
3311
+ }
3312
+ }
3313
+ }
3314
+ };
3315
+
3316
+ beforeEach(() => {
3317
+ localStorageValues = {};
3318
+ sandbox = sinon.sandbox.create();
3319
+ setDataInLocalStorageStub = sandbox.stub(storage, 'setDataInLocalStorage').callsFake((key, value) => localStorageValues[key] = value);
3320
+ getDataFromLocalStorageStub = sandbox.stub(storage, 'getDataFromLocalStorage').callsFake((key) => localStorageValues[key]);
3321
+ removeDataFromLocalStorageStub = sandbox.stub(storage, 'removeDataFromLocalStorage').callsFake((key) => delete localStorageValues[key]);
3322
+ });
3323
+
3324
+ afterEach(() => {
3325
+ setDataInLocalStorageStub.restore();
3326
+ getDataFromLocalStorageStub.restore();
3327
+ removeDataFromLocalStorageStub.restore();
3328
+ serverResponse.body.ext.features = {
3329
+ test: {
3330
+ activated: false
3331
+ }
3332
+ };
3333
+ localStorageValues = {};
3334
+ sandbox.restore();
3335
+ });
3336
+
3337
+ it('should store features in internal cache', () => {
3338
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3339
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.false;
3340
+ });
3341
+
3342
+ it('should retrieve features from internal cache', () => {
3343
+ const feature = {
3344
+ ext: {
3345
+ features: {
3346
+ test: {
3347
+ activated: true
3348
+ }
3349
+ }
3350
+ }
3351
+ }
3352
+ FEATURE_TOGGLES.setFeatureToggles(feature);
3353
+ feature.ext.features.test.activated = false;
3354
+ FEATURE_TOGGLES.featureToggles = {
3355
+ features: feature.ext.features
3356
+ };
3357
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.false;
3358
+ });
3359
+
3360
+ it('should store features in localstorage when enabled', () => {
3361
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3362
+ serverResponse.body.ext.features.test.activated = true;
3363
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3364
+
3365
+ const lsData = JSON.parse(storage.getDataFromLocalStorage(LOCAL_STORAGE_FEATURE_TOGGLES_KEY));
3366
+ expect(lsData.features.test.activated).to.be.true;
3367
+ });
3368
+
3369
+ it('should retrive features from localstorage when enabled', () => {
3370
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3371
+ serverResponse.body.ext.features.test.activated = true;
3372
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3373
+ FEATURE_TOGGLES.featureToggles = {};
3374
+ FEATURE_TOGGLES.getFeatureToggles(LOCAL_STORAGE_FEATURE_TOGGLES_KEY);
3375
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.true;
3376
+ });
3377
+
3378
+ it('should remove features from after expiry', () => {
3379
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3380
+ const expiryTime = new Date();
3381
+ localStorageValues = {
3382
+ expiry: expiryTime.setHours(expiryTime.getHours() - 2),
3383
+ features: {
3384
+ test: {
3385
+ activated: true
3386
+ }
3387
+ }
3388
+ }
3389
+ FEATURE_TOGGLES.getFeatureToggles(LOCAL_STORAGE_FEATURE_TOGGLES_KEY);
3390
+ expect(FEATURE_TOGGLES.isFeatureEnabled('test')).to.be.undefined;
3391
+ expect(FEATURE_TOGGLES.featureToggles).to.deep.equal({});
3392
+ });
3393
+
3394
+ it('should create POST request when pbjs_enable_post feature is active', () => {
3395
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3396
+ serverResponse.body.ext.features.pbjs_enable_post = {
3397
+ activated: true
3398
+ };
3399
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3400
+ const builtRequests = {
3401
+ banner: {
3402
+ request: spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0],
3403
+ siteId: DEFAULT_BANNER_VALID_BID[0].params.siteId
3404
+ },
3405
+ video: {
3406
+ request: spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION)[0],
3407
+ siteId: DEFAULT_VIDEO_VALID_BID[0].params.siteId
3408
+ },
3409
+ native: {
3410
+ request: spec.buildRequests(DEFAULT_NATIVE_VALID_BID, DEFAULT_OPTION)[0],
3411
+ siteId: DEFAULT_NATIVE_VALID_BID[0].params.siteId
3412
+ }
3413
+ };
3414
+
3415
+ Object.keys(builtRequests).forEach((reqType) => {
3416
+ const request = builtRequests[reqType].request;
3417
+ const siteId = builtRequests[reqType].siteId;
3418
+ expect(request.method).to.equal('POST');
3419
+ expect(request.option.contentType).to.equal('text/plain');
3420
+ expect(request.url).to.be.equal(`${IX_SECURE_ENDPOINT}?s=${siteId}`);
3421
+ expect(request.data.r).to.be.undefined;
3422
+ expect(request.data.ac).to.be.undefined;
3423
+ expect(request.data.sd).to.be.undefined;
3424
+ expect(request.data.v).to.be.undefined;
3425
+ expect(request.data.nf).to.be.undefined;
3426
+ });
3427
+ });
3428
+
3429
+ it('should create GET request when pbjs_enable_post feature is disabled', () => {
3430
+ sandbox.stub(storage, 'localStorageIsEnabled').returns(true);
3431
+ serverResponse.body.ext.features.pbjs_enable_post = {
3432
+ activated: false
3433
+ };
3434
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3435
+ const builtRequests = {
3436
+ banner: {
3437
+ request: spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0],
3438
+ siteId: DEFAULT_BANNER_VALID_BID[0].params.siteId
3439
+ },
3440
+ video: {
3441
+ request: spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION)[0],
3442
+ siteId: DEFAULT_VIDEO_VALID_BID[0].params.siteId
3443
+ },
3444
+ native: {
3445
+ request: spec.buildRequests(DEFAULT_NATIVE_VALID_BID, DEFAULT_OPTION)[0],
3446
+ siteId: DEFAULT_NATIVE_VALID_BID[0].params.siteId
3447
+ }
3448
+ };
3449
+
3450
+ Object.keys(builtRequests).forEach((reqType) => {
3451
+ const request = builtRequests[reqType].request;
3452
+ const siteId = builtRequests[reqType].siteId;
3453
+ expect(request.method).to.equal('GET');
3454
+ expect(request.url).to.equal(IX_SECURE_ENDPOINT);
3455
+ expect(request.data.r).to.exist;
3456
+ expect(request.data.ac).to.equal('j');
3457
+ expect(request.data.sd).to.equal(1);
3458
+ expect(request.data.s).to.equal(siteId);
3459
+ if (reqType == 'video') {
3460
+ expect(request.data.nf).to.equal(1);
3461
+ }
3462
+
3463
+ if (reqType === 'native') {
3464
+ expect(request.data.v).to.be.undefined;
3465
+ }
3466
+ });
3467
+ });
3468
+
3469
+ it('should interpertResponse correctly when pbjs_enable_post feature is active', function () {
3470
+ serverResponse.body.ext.features.pbjs_enable_post = {
3471
+ activated: true
3472
+ };
3473
+ FEATURE_TOGGLES.setFeatureToggles(serverResponse);
3474
+ const postBiddderRequestData = {
3475
+ id: '345',
3476
+ imp: [
3477
+ {
3478
+ id: '1a2b3c4e',
3479
+ banner: {
3480
+ w: 300,
3481
+ h: 250,
3482
+ placement: 1
3483
+ }
3484
+ }
3485
+ ],
3486
+ site: {
3487
+ ref: 'https://ref.com/ref.html',
3488
+ page: 'https://page.com'
3489
+ },
3490
+ };
3491
+ const expectedParse = [
3492
+ {
3493
+ requestId: '1a2b3c4d',
3494
+ cpm: 1,
3495
+ creativeId: '12345',
3496
+ width: 300,
3497
+ height: 250,
3498
+ mediaType: 'banner',
3499
+ ad: '<a target="_blank" href="https://www.indexexchange.com"></a>',
3500
+ currency: 'USD',
3501
+ ttl: 300,
3502
+ netRevenue: true,
3503
+ meta: {
3504
+ networkId: 50,
3505
+ brandId: 303325,
3506
+ brandName: 'OECTA',
3507
+ advertiserDomains: ['www.abc.com']
3508
+ }
3509
+ }
3510
+ ];
3511
+ const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE }, { data: postBiddderRequestData, validBidRequests: [] });
3512
+ expect(result[0]).to.deep.equal(expectedParse[0]);
3513
+ });
3514
+ });
3515
+
3297
3516
  describe('LocalStorage error codes', () => {
3298
3517
  let TODAY = new Date().toISOString().slice(0, 10);
3299
3518
  const key = 'ixdiag';