prebid.js 7.10.0 → 7.13.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 (366) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +16 -10
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/workflows/codeql-analysis.yml +73 -0
  4. package/.github/workflows/issue_tracker.yml +1 -1
  5. package/README.md +0 -2
  6. package/babelConfig.js +10 -4
  7. package/dist/33acrossBidAdapter.js +1 -1
  8. package/dist/acuityAdsBidAdapter.js +1 -0
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adbookpspBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adkernelBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adriverBidAdapter.js +1 -1
  15. package/dist/adriverIdSystem.js +1 -1
  16. package/dist/adtelligentBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -0
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/alkimiBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aniviewBidAdapter.js +1 -1
  25. package/dist/aolBidAdapter.js +1 -1
  26. package/dist/appierAnalyticsAdapter.js +1 -1
  27. package/dist/appnexusBidAdapter.js +1 -1
  28. package/dist/asoBidAdapter.js +1 -1
  29. package/dist/audiencerunBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/beopBidAdapter.js +1 -1
  32. package/dist/betweenBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bluebillywigBidAdapter.js +1 -1
  37. package/dist/brandmetricsRtdProvider.js +1 -1
  38. package/dist/bridgewellBidAdapter.js +1 -1
  39. package/dist/brightMountainMediaBidAdapter.js +1 -1
  40. package/dist/browsiRtdProvider.js +1 -1
  41. package/dist/cleanioRtdProvider.js +1 -1
  42. package/dist/concertBidAdapter.js +1 -1
  43. package/dist/connectadBidAdapter.js +1 -1
  44. package/dist/consentManagement.js +1 -1
  45. package/dist/consentManagementUsp.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/conversantBidAdapter.js +1 -1
  48. package/dist/cpmstarBidAdapter.js +1 -1
  49. package/dist/craftBidAdapter.js +1 -1
  50. package/dist/criteoBidAdapter.js +1 -1
  51. package/dist/currency.js +1 -1
  52. package/dist/datawrkzBidAdapter.js +1 -0
  53. package/dist/debugging-standalone.js +1 -1
  54. package/dist/dfpAdServerVideo.js +1 -1
  55. package/dist/dgkeywordRtdProvider.js +1 -1
  56. package/dist/displayioBidAdapter.js +1 -3
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/enrichmentFpdModule.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/glimpseBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/gridBidAdapter.js +1 -1
  65. package/dist/gridNMBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/id5IdSystem.js +1 -1
  69. package/dist/imRtdProvider.js +1 -1
  70. package/dist/impactifyBidAdapter.js +1 -1
  71. package/dist/improvedigitalBidAdapter.js +1 -1
  72. package/dist/inmarBidAdapter.js +1 -1
  73. package/dist/insticatorBidAdapter.js +1 -1
  74. package/dist/ixBidAdapter.js +1 -1
  75. package/dist/jixieBidAdapter.js +1 -1
  76. package/dist/justpremiumBidAdapter.js +1 -1
  77. package/dist/kargoBidAdapter.js +1 -1
  78. package/dist/konduitAnalyticsAdapter.js +1 -1
  79. package/dist/kueezBidAdapter.js +1 -1
  80. package/dist/lassoBidAdapter.js +1 -1
  81. package/dist/lifestreetBidAdapter.js +1 -0
  82. package/dist/limelightDigitalBidAdapter.js +1 -1
  83. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  84. package/dist/logicadBidAdapter.js +1 -1
  85. package/dist/loglyliftBidAdapter.js +1 -1
  86. package/dist/mabidderBidAdapter.js +1 -0
  87. package/dist/malltvAnalyticsAdapter.js +1 -1
  88. package/dist/marsmediaBidAdapter.js +1 -1
  89. package/dist/mediafuseBidAdapter.js +1 -1
  90. package/dist/mediagoBidAdapter.js +1 -0
  91. package/dist/mediakeysBidAdapter.js +1 -1
  92. package/dist/mediasquareBidAdapter.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/nextMillenniumBidAdapter.js +1 -1
  96. package/dist/not-for-prod/prebid.js +153 -147
  97. package/dist/oguryBidAdapter.js +1 -1
  98. package/dist/oneKeyIdSystem.js +1 -0
  99. package/dist/oneKeyRtdProvider.js +1 -0
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/outbrainBidAdapter.js +1 -1
  104. package/dist/parrableIdSystem.js +1 -1
  105. package/dist/permutiveRtdProvider.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +2 -2
  108. package/dist/publinkIdSystem.js +1 -1
  109. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  110. package/dist/pubmaticBidAdapter.js +1 -1
  111. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  112. package/dist/pxyzBidAdapter.js +1 -1
  113. package/dist/quantcastBidAdapter.js +1 -1
  114. package/dist/rasBidAdapter.js +1 -1
  115. package/dist/readpeakBidAdapter.js +1 -1
  116. package/dist/relaidoBidAdapter.js +1 -1
  117. package/dist/rhythmoneBidAdapter.js +1 -1
  118. package/dist/riseBidAdapter.js +1 -1
  119. package/dist/rtbhouseBidAdapter.js +1 -1
  120. package/dist/rubiconAnalyticsAdapter.js +1 -1
  121. package/dist/rubiconBidAdapter.js +1 -1
  122. package/dist/seedingAllianceBidAdapter.js +1 -1
  123. package/dist/seedtagBidAdapter.js +1 -1
  124. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  125. package/dist/sharethroughBidAdapter.js +1 -1
  126. package/dist/shinezBidAdapter.js +1 -1
  127. package/dist/smaatoBidAdapter.js +1 -1
  128. package/dist/smartadserverBidAdapter.js +1 -1
  129. package/dist/smartxBidAdapter.js +1 -1
  130. package/dist/smilewantedBidAdapter.js +1 -1
  131. package/dist/sonobiBidAdapter.js +1 -1
  132. package/dist/sovrnAnalyticsAdapter.js +1 -1
  133. package/dist/sovrnBidAdapter.js +1 -1
  134. package/dist/sspBCBidAdapter.js +1 -1
  135. package/dist/sublimeBidAdapter.js +1 -1
  136. package/dist/synacormediaBidAdapter.js +1 -1
  137. package/dist/tappxBidAdapter.js +1 -1
  138. package/dist/targetVideoBidAdapter.js +1 -1
  139. package/dist/teadsBidAdapter.js +1 -1
  140. package/dist/trionBidAdapter.js +1 -1
  141. package/dist/tripleliftBidAdapter.js +1 -1
  142. package/dist/trustpidSystem.js +1 -1
  143. package/dist/ttdBidAdapter.js +1 -1
  144. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  145. package/dist/underdogmediaBidAdapter.js +1 -1
  146. package/dist/undertoneBidAdapter.js +1 -1
  147. package/dist/userId.js +1 -1
  148. package/dist/vidazooBidAdapter.js +1 -1
  149. package/dist/videobyteBidAdapter.js +1 -1
  150. package/dist/viewability.js +1 -1
  151. package/dist/visxBidAdapter.js +1 -1
  152. package/dist/vuukleBidAdapter.js +1 -1
  153. package/dist/widespaceBidAdapter.js +1 -1
  154. package/dist/winrBidAdapter.js +1 -1
  155. package/dist/yahoosspBidAdapter.js +1 -1
  156. package/dist/yieldmoBidAdapter.js +1 -1
  157. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  158. package/dist/zeta_global_sspBidAdapter.js +1 -1
  159. package/integrationExamples/gpt/permutiveRtdProvider_example.html +1 -1
  160. package/karma.conf.maker.js +2 -13
  161. package/modules/.submodules.json +2 -0
  162. package/modules/acuityAdsBidAdapter.js +207 -0
  163. package/modules/acuityAdsBidAdapter.md +79 -0
  164. package/modules/adagioBidAdapter.js +2 -3
  165. package/modules/adgenerationBidAdapter.js +2 -2
  166. package/modules/adkernelBidAdapter.js +28 -12
  167. package/modules/admixerBidAdapter.js +1 -1
  168. package/modules/adnowBidAdapter.js +1 -1
  169. package/modules/adpod.js +1 -1
  170. package/modules/adrelevantisBidAdapter.js +2 -2
  171. package/modules/adriverBidAdapter.js +5 -12
  172. package/modules/adriverIdSystem.js +2 -1
  173. package/modules/adtargetBidAdapter.js +1 -1
  174. package/modules/adtelligentBidAdapter.js +6 -2
  175. package/modules/adtrgtmeBidAdapter.js +333 -0
  176. package/modules/adtrgtmeBidAdapter.md +69 -0
  177. package/modules/adtrueBidAdapter.js +1 -1
  178. package/modules/adxpremiumAnalyticsAdapter.js +1 -1
  179. package/modules/adyoulikeBidAdapter.js +1 -1
  180. package/modules/alkimiBidAdapter.js +2 -1
  181. package/modules/aniviewBidAdapter.js +1 -1
  182. package/modules/appnexusBidAdapter.js +13 -93
  183. package/modules/apstreamBidAdapter.js +2 -2
  184. package/modules/beopBidAdapter.js +4 -4
  185. package/modules/betweenBidAdapter.js +4 -4
  186. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  187. package/modules/bizzclickBidAdapter.js +1 -1
  188. package/modules/brightMountainMediaBidAdapter.js +1 -1
  189. package/modules/browsiRtdProvider.js +24 -10
  190. package/modules/cleanmedianetBidAdapter.js +1 -1
  191. package/modules/consentManagement.js +1 -1
  192. package/modules/consentManagementUsp.js +1 -1
  193. package/modules/consumableBidAdapter.js +43 -3
  194. package/modules/cpmstarBidAdapter.js +23 -13
  195. package/modules/criteoBidAdapter.js +19 -13
  196. package/modules/currency.js +1 -0
  197. package/modules/cwireBidAdapter.js +1 -1
  198. package/modules/datablocksBidAdapter.js +1 -1
  199. package/modules/datawrkzBidAdapter.js +633 -0
  200. package/modules/datawrkzBidAdapter.md +160 -0
  201. package/modules/dfpAdServerVideo.js +2 -2
  202. package/modules/dgkeywordRtdProvider.js +10 -1
  203. package/modules/displayioBidAdapter.js +92 -97
  204. package/modules/dspxBidAdapter.js +1 -1
  205. package/modules/e_volutionBidAdapter.js +3 -3
  206. package/modules/ebdrBidAdapter.js +1 -1
  207. package/modules/emx_digitalBidAdapter.js +1 -1
  208. package/modules/enrichmentFpdModule.js +11 -0
  209. package/modules/fabrickIdSystem.js +2 -2
  210. package/modules/gamoshiBidAdapter.js +1 -1
  211. package/modules/getintentBidAdapter.js +1 -1
  212. package/modules/gjirafaBidAdapter.js +2 -2
  213. package/modules/goldbachBidAdapter.js +8 -8
  214. package/modules/gothamadsBidAdapter.js +2 -2
  215. package/modules/gumgumBidAdapter.js +3 -3
  216. package/modules/h12mediaBidAdapter.js +1 -1
  217. package/modules/id5AnalyticsAdapter.js +1 -1
  218. package/modules/id5IdSystem.js +160 -111
  219. package/modules/id5IdSystem.md +16 -14
  220. package/modules/imRtdProvider.js +20 -7
  221. package/modules/imRtdProvider.md +3 -1
  222. package/modules/impactifyBidAdapter.js +1 -1
  223. package/modules/improvedigitalBidAdapter.js +50 -28
  224. package/modules/inskinBidAdapter.js +1 -1
  225. package/modules/insticatorBidAdapter.js +1 -1
  226. package/modules/integr8BidAdapter.js +2 -2
  227. package/modules/intentIqIdSystem.js +2 -2
  228. package/modules/interactiveOffersBidAdapter.js +1 -1
  229. package/modules/iqmBidAdapter.js +1 -1
  230. package/modules/ixBidAdapter.js +21 -328
  231. package/modules/ixBidAdapter.md +1 -19
  232. package/modules/kargoBidAdapter.js +4 -5
  233. package/modules/krushmediaBidAdapter.js +2 -2
  234. package/modules/lassoBidAdapter.js +3 -3
  235. package/modules/lifestreetBidAdapter.js +143 -0
  236. package/modules/limelightDigitalBidAdapter.js +2 -1
  237. package/modules/livewrappedAnalyticsAdapter.js +3 -3
  238. package/modules/lkqdBidAdapter.js +3 -3
  239. package/modules/loganBidAdapter.js +2 -2
  240. package/modules/luponmediaBidAdapter.js +3 -3
  241. package/modules/mabidderBidAdapter.js +60 -0
  242. package/modules/mabidderBidAdapter.md +31 -0
  243. package/modules/malltvBidAdapter.js +2 -2
  244. package/modules/mediagoBidAdapter.js +462 -0
  245. package/modules/mediagoBidAdapter.md +34 -0
  246. package/modules/mediakeysBidAdapter.js +2 -2
  247. package/modules/mgidBidAdapter.js +2 -2
  248. package/modules/nextMillenniumBidAdapter.js +25 -6
  249. package/modules/nobidBidAdapter.js +2 -2
  250. package/modules/novatiqIdSystem.js +1 -1
  251. package/modules/oneKeyIdSystem.js +78 -0
  252. package/modules/oneKeyIdSystem.md +109 -0
  253. package/modules/oneKeyRtdProvider.js +98 -0
  254. package/modules/oneKeyRtdProvider.md +127 -0
  255. package/modules/open8BidAdapter.js +1 -1
  256. package/modules/openwebBidAdapter.js +1 -1
  257. package/modules/openxAnalyticsAdapter.js +5 -744
  258. package/modules/openxAnalyticsAdapter.md +4 -0
  259. package/modules/openxBidAdapter.js +3 -3
  260. package/modules/permutiveRtdProvider.js +55 -8
  261. package/modules/pixfutureBidAdapter.js +1 -1
  262. package/modules/prebidmanagerAnalyticsAdapter.js +1 -1
  263. package/modules/priceFloors.js +1 -1
  264. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  265. package/modules/pubmaticBidAdapter.js +19 -1
  266. package/modules/pubwiseAnalyticsAdapter.js +1 -1
  267. package/modules/pubwiseBidAdapter.js +3 -3
  268. package/modules/pubxBidAdapter.js +1 -1
  269. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  270. package/modules/quantcastIdSystem.js +1 -1
  271. package/modules/radsBidAdapter.js +1 -1
  272. package/modules/rasBidAdapter.js +8 -0
  273. package/modules/rasBidAdapter.md +14 -13
  274. package/modules/revcontentBidAdapter.js +1 -1
  275. package/modules/richaudienceBidAdapter.js +1 -1
  276. package/modules/rtbhouseBidAdapter.js +25 -1
  277. package/modules/schain.js +1 -1
  278. package/modules/seedtagBidAdapter.md +25 -56
  279. package/modules/showheroes-bsBidAdapter.js +1 -1
  280. package/modules/sizeMappingV2.js +1 -1
  281. package/modules/smaatoBidAdapter.js +2 -2
  282. package/modules/sonobiAnalyticsAdapter.js +1 -1
  283. package/modules/sonobiBidAdapter.js +4 -3
  284. package/modules/staqAnalyticsAdapter.js +1 -1
  285. package/modules/tappxBidAdapter.js +11 -2
  286. package/modules/targetVideoBidAdapter.js +1 -1
  287. package/modules/theAdxBidAdapter.js +2 -2
  288. package/modules/tpmnBidAdapter.js +1 -1
  289. package/modules/trionBidAdapter.js +2 -2
  290. package/modules/tripleliftBidAdapter.js +20 -1
  291. package/modules/trustpidSystem.js +6 -42
  292. package/modules/trustpidSystem.md +10 -10
  293. package/modules/underdogmediaBidAdapter.js +1 -1
  294. package/modules/userId/eids.js +26 -0
  295. package/modules/userId/userId.md +2 -2
  296. package/modules/vdoaiBidAdapter.js +1 -1
  297. package/modules/vidazooBidAdapter.js +7 -5
  298. package/modules/vidoomyBidAdapter.js +1 -1
  299. package/modules/viewability.js +14 -14
  300. package/modules/winrBidAdapter.js +1 -1
  301. package/modules/yahoosspBidAdapter.js +3 -3
  302. package/modules/yandexBidAdapter.js +1 -1
  303. package/modules/yieldmoBidAdapter.js +3 -3
  304. package/modules/yieldoneBidAdapter.js +2 -2
  305. package/modules/zeta_global_sspBidAdapter.js +24 -21
  306. package/package.json +3 -3
  307. package/src/Renderer.js +1 -1
  308. package/src/adloader.js +2 -1
  309. package/src/adserver.js +0 -56
  310. package/src/auction.js +60 -16
  311. package/src/bidfactory.js +1 -1
  312. package/src/native.js +75 -60
  313. package/src/refererDetection.js +12 -1
  314. package/src/sizeMapping.js +5 -7
  315. package/src/targeting.js +1 -1
  316. package/src/userSync.js +1 -1
  317. package/src/utils/promise.js +3 -1
  318. package/src/utils.js +27 -0
  319. package/src/video.js +5 -4
  320. package/src/videoCache.js +8 -2
  321. package/test/pages/instream.html +2 -2
  322. package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
  323. package/test/spec/modules/adagioBidAdapter_spec.js +2 -0
  324. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  325. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  326. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  327. package/test/spec/modules/adtelligentBidAdapter_spec.js +2 -0
  328. package/test/spec/modules/adtrgtmeBidAdapter_spec.js +802 -0
  329. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  330. package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
  331. package/test/spec/modules/beopBidAdapter_spec.js +11 -0
  332. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  333. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  334. package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
  335. package/test/spec/modules/browsiRtdProvider_spec.js +40 -1
  336. package/test/spec/modules/consumableBidAdapter_spec.js +158 -0
  337. package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
  338. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  339. package/test/spec/modules/currency_spec.js +22 -0
  340. package/test/spec/modules/datawrkzBidAdapter_spec.js +656 -0
  341. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  342. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  343. package/test/spec/modules/enrichmentFpdModule_spec.js +16 -1
  344. package/test/spec/modules/fpdModule_spec.js +2 -1
  345. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  346. package/test/spec/modules/imRtdProvider_spec.js +10 -5
  347. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  348. package/test/spec/modules/ixBidAdapter_spec.js +216 -123
  349. package/test/spec/modules/kargoBidAdapter_spec.js +11 -2
  350. package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
  351. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
  352. package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
  353. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  354. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  355. package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
  356. package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
  357. package/test/spec/modules/openxAnalyticsAdapter_spec.js +6 -638
  358. package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
  359. package/test/spec/modules/pubmaticBidAdapter_spec.js +69 -4
  360. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  361. package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
  362. package/test/spec/modules/trustpidSystem_spec.js +27 -45
  363. package/test/spec/modules/vidazooBidAdapter_spec.js +36 -23
  364. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +59 -0
  365. package/test/spec/native_spec.js +257 -2
  366. package/test/spec/videoCache_spec.js +37 -7
@@ -5,28 +5,36 @@ import {
5
5
  ID5_PRIVACY_STORAGE_NAME,
6
6
  ID5_STORAGE_NAME,
7
7
  id5IdSubmodule,
8
- nbCacheName, storage,
8
+ nbCacheName,
9
+ storage,
9
10
  storeInLocalStorage,
10
11
  storeNbInCache,
11
12
  } from 'modules/id5IdSystem.js';
12
13
  import {coreStorage, init, requestBidsHook, setSubmoduleRegistry} from 'modules/userId/index.js';
13
14
  import {config} from 'src/config.js';
14
- import {server} from 'test/mocks/xhr.js';
15
15
  import * as events from 'src/events.js';
16
16
  import CONSTANTS from 'src/constants.json';
17
17
  import * as utils from 'src/utils.js';
18
+ import {uspDataHandler} from 'src/adapterManager.js';
18
19
  import 'src/prebid.js';
19
20
  import {hook} from '../../../src/hook.js';
20
21
  import {mockGdprConsent} from '../../helpers/consentData.js';
21
22
 
22
23
  let expect = require('chai').expect;
23
24
 
24
- describe('ID5 ID System', function() {
25
+ describe('ID5 ID System', function () {
25
26
  const ID5_MODULE_NAME = 'id5Id';
26
27
  const ID5_EIDS_NAME = ID5_MODULE_NAME.toLowerCase();
27
28
  const ID5_SOURCE = 'id5-sync.com';
28
29
  const ID5_TEST_PARTNER_ID = 173;
29
30
  const ID5_ENDPOINT = `https://id5-sync.com/g/v2/${ID5_TEST_PARTNER_ID}.json`;
31
+ const ID5_API_CONFIG_URL = `https://id5-sync.com/api/config/prebid`;
32
+ const ID5_EXTENSIONS_ENDPOINT = 'https://extensions.id5-sync.com/test';
33
+ const ID5_API_CONFIG = {
34
+ fetchCall: {
35
+ url: ID5_ENDPOINT
36
+ }
37
+ };
30
38
  const ID5_NB_STORAGE_NAME = nbCacheName(ID5_TEST_PARTNER_ID);
31
39
  const ID5_STORED_ID = 'storedid5id';
32
40
  const ID5_STORED_SIGNATURE = '123456';
@@ -58,6 +66,7 @@ describe('ID5 ID System', function() {
58
66
  }
59
67
  }
60
68
  }
69
+
61
70
  function getId5ValueConfig(value) {
62
71
  return {
63
72
  name: ID5_MODULE_NAME,
@@ -68,6 +77,7 @@ describe('ID5 ID System', function() {
68
77
  }
69
78
  }
70
79
  }
80
+
71
81
  function getUserSyncConfig(userIds) {
72
82
  return {
73
83
  userSync: {
@@ -76,12 +86,15 @@ describe('ID5 ID System', function() {
76
86
  }
77
87
  }
78
88
  }
89
+
79
90
  function getFetchLocalStorageConfig() {
80
91
  return getUserSyncConfig([getId5FetchConfig(ID5_STORAGE_NAME, 'html5')]);
81
92
  }
93
+
82
94
  function getValueConfig(value) {
83
95
  return getUserSyncConfig([getId5ValueConfig(value)]);
84
96
  }
97
+
85
98
  function getAdUnitMock(code = 'adUnit-code') {
86
99
  return {
87
100
  code,
@@ -91,15 +104,81 @@ describe('ID5 ID System', function() {
91
104
  };
92
105
  }
93
106
 
107
+ function callSubmoduleGetId(config, consentData, cacheIdObj) {
108
+ return new Promise((resolve) => {
109
+ id5IdSubmodule.getId(config, consentData, cacheIdObj).callback((response) => {
110
+ resolve(response)
111
+ })
112
+ });
113
+ }
114
+
115
+ class XhrServerMock {
116
+ constructor(server) {
117
+ this.currentRequestIdx = 0
118
+ this.server = server
119
+ }
120
+
121
+ expectFirstRequest() {
122
+ return this.#expectRequest(0);
123
+ }
124
+
125
+ expectNextRequest() {
126
+ return this.#expectRequest(++this.currentRequestIdx)
127
+ }
128
+
129
+ expectConfigRequest() {
130
+ return this.expectFirstRequest()
131
+ .then(configRequest => {
132
+ expect(configRequest.url).is.eq(ID5_API_CONFIG_URL);
133
+ expect(configRequest.method).is.eq('POST');
134
+ return configRequest;
135
+ })
136
+ }
137
+
138
+ respondWithConfigAndExpectNext(configRequest, config = ID5_API_CONFIG) {
139
+ configRequest.respond(200, {'Content-Type': 'application/json'}, JSON.stringify(config));
140
+ return this.expectNextRequest()
141
+ }
142
+
143
+ expectFetchRequest() {
144
+ return this.expectConfigRequest()
145
+ .then(configRequest => {
146
+ return this.respondWithConfigAndExpectNext(configRequest, ID5_API_CONFIG);
147
+ }).then(request => {
148
+ expect(request.url).is.eq(ID5_API_CONFIG.fetchCall.url);
149
+ expect(request.method).is.eq('POST');
150
+ return request;
151
+ })
152
+ }
153
+
154
+ #expectRequest(index) {
155
+ let server = this.server
156
+ return new Promise(function (resolve) {
157
+ (function waitForCondition() {
158
+ if (server.requests && server.requests.length > index) return resolve(server.requests[index]);
159
+ setTimeout(waitForCondition, 30);
160
+ })();
161
+ })
162
+ .then(request => {
163
+ return request
164
+ });
165
+ }
166
+
167
+ hasReceivedAnyRequest() {
168
+ let requests = this.server.requests;
169
+ return requests && requests.length > 0;
170
+ }
171
+ }
172
+
94
173
  before(() => {
95
174
  hook.ready();
96
175
  });
97
176
 
98
- describe('Check for valid publisher config', function() {
99
- it('should fail with invalid config', function() {
177
+ describe('Check for valid publisher config', function () {
178
+ it('should fail with invalid config', function () {
100
179
  // no config
101
- expect(id5IdSubmodule.getId()).to.be.eq(undefined);
102
- expect(id5IdSubmodule.getId({ })).to.be.eq(undefined);
180
+ expect(id5IdSubmodule.getId()).is.eq(undefined);
181
+ expect(id5IdSubmodule.getId({})).is.eq(undefined);
103
182
 
104
183
  // valid params, invalid storage
105
184
  expect(id5IdSubmodule.getId({ params: { partner: 123 } })).to.be.eq(undefined);
@@ -113,7 +192,7 @@ describe('ID5 ID System', function() {
113
192
  expect(id5IdSubmodule.getId({ storage: { name: 'name', type: 'html5', }, params: { partner: 'abc' } })).to.be.eq(undefined);
114
193
  });
115
194
 
116
- it('should warn with non-recommended storage params', function() {
195
+ it('should warn with non-recommended storage params', function () {
117
196
  let logWarnStub = sinon.stub(utils, 'logWarn');
118
197
 
119
198
  id5IdSubmodule.getId({ storage: { name: 'name', type: 'html5', }, params: { partner: 123 } });
@@ -126,189 +205,457 @@ describe('ID5 ID System', function() {
126
205
  });
127
206
  });
128
207
 
129
- describe('Xhr Requests from getId()', function() {
130
- const responseHeader = { 'Content-Type': 'application/json' };
131
- let callbackSpy = sinon.spy();
208
+ describe('Xhr Requests from getId()', function () {
209
+ const responseHeader = {'Content-Type': 'application/json'};
132
210
 
133
- beforeEach(function() {
134
- callbackSpy.resetHistory();
211
+ beforeEach(function () {
135
212
  });
136
- afterEach(function () {
137
213
 
214
+ afterEach(function () {
215
+ uspDataHandler.reset()
138
216
  });
139
217
 
140
218
  it('should call the ID5 server and handle a valid response', function () {
141
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, undefined).callback;
142
- submoduleCallback(callbackSpy);
143
-
144
- let request = server.requests[0];
145
- let requestBody = JSON.parse(request.requestBody);
146
- expect(request.url).to.contain(ID5_ENDPOINT);
147
- expect(request.withCredentials).to.be.true;
148
- expect(requestBody.partner).to.eq(ID5_TEST_PARTNER_ID);
149
- expect(requestBody.o).to.eq('pbjs');
150
- expect(requestBody.pd).to.be.undefined;
151
- expect(requestBody.s).to.be.undefined;
152
- expect(requestBody.provider).to.be.undefined
153
- expect(requestBody.v).to.eq('$prebid.version$');
154
- expect(requestBody.gdpr).to.exist;
155
- expect(requestBody.gdpr_consent).to.be.undefined;
156
- expect(requestBody.us_privacy).to.be.undefined;
157
-
158
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
159
- expect(callbackSpy.calledOnce).to.be.true;
160
- expect(callbackSpy.lastCall.lastArg).to.deep.equal(ID5_JSON_RESPONSE);
219
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
220
+ let config = getId5FetchConfig();
221
+ let submoduleResponse = callSubmoduleGetId(config, undefined, undefined);
222
+
223
+ return xhrServerMock.expectFetchRequest()
224
+ .then(fetchRequest => {
225
+ let requestBody = JSON.parse(fetchRequest.requestBody);
226
+ expect(fetchRequest.url).to.contain(ID5_ENDPOINT);
227
+ expect(fetchRequest.withCredentials).is.true;
228
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
229
+ expect(requestBody.o).is.eq('pbjs');
230
+ expect(requestBody.pd).is.undefined;
231
+ expect(requestBody.s).is.undefined;
232
+ expect(requestBody.provider).is.undefined
233
+ expect(requestBody.v).is.eq('$prebid.version$');
234
+ expect(requestBody.gdpr).is.eq(0);
235
+ expect(requestBody.gdpr_consent).is.undefined;
236
+ expect(requestBody.us_privacy).is.undefined;
237
+ expect(requestBody.storage).is.deep.eq(config.storage)
238
+
239
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
240
+ return submoduleResponse
241
+ })
242
+ .then(submoduleResponse => {
243
+ expect(submoduleResponse).is.deep.equal(ID5_JSON_RESPONSE);
244
+ });
245
+ });
246
+
247
+ it('should call the ID5 server with gdpr data ', function () {
248
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
249
+ let consentData = {
250
+ gdprApplies: true,
251
+ consentString: 'consentString'
252
+ }
253
+
254
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), consentData, undefined);
255
+
256
+ return xhrServerMock.expectFetchRequest()
257
+ .then(fetchRequest => {
258
+ let requestBody = JSON.parse(fetchRequest.requestBody);
259
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
260
+ expect(requestBody.gdpr).to.eq(1);
261
+ expect(requestBody.gdpr_consent).is.eq(consentData.consentString);
262
+
263
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
264
+ return submoduleResponse
265
+ })
266
+ .then(submoduleResponse => {
267
+ expect(submoduleResponse).is.deep.equal(ID5_JSON_RESPONSE);
268
+ });
269
+ });
270
+
271
+ it('should call the ID5 server without gdpr data when gdpr not applies ', function () {
272
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
273
+ let consentData = {
274
+ gdprApplies: false,
275
+ consentString: 'consentString'
276
+ }
277
+
278
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), consentData, undefined);
279
+
280
+ return xhrServerMock.expectFetchRequest()
281
+ .then(fetchRequest => {
282
+ let requestBody = JSON.parse(fetchRequest.requestBody);
283
+ expect(requestBody.gdpr).to.eq(0);
284
+ expect(requestBody.gdpr_consent).is.undefined
285
+
286
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
287
+ return submoduleResponse
288
+ })
289
+ .then(submoduleResponse => {
290
+ expect(submoduleResponse).is.deep.equal(ID5_JSON_RESPONSE);
291
+ });
292
+ });
293
+
294
+ it('should call the ID5 server with us privacy consent', function () {
295
+ let usPrivacyString = '1YN-';
296
+ uspDataHandler.setConsentData(usPrivacyString)
297
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
298
+ let consentData = {
299
+ gdprApplies: true,
300
+ consentString: 'consentString'
301
+ }
302
+
303
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), consentData, undefined);
304
+
305
+ return xhrServerMock.expectFetchRequest()
306
+ .then(fetchRequest => {
307
+ let requestBody = JSON.parse(fetchRequest.requestBody);
308
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
309
+ expect(requestBody.us_privacy).to.eq(usPrivacyString);
310
+
311
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
312
+ return submoduleResponse
313
+ })
314
+ .then(submoduleResponse => {
315
+ expect(submoduleResponse).is.deep.equal(ID5_JSON_RESPONSE);
316
+ });
161
317
  });
162
318
 
163
319
  it('should call the ID5 server with no signature field when no stored object', function () {
164
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, undefined).callback;
165
- submoduleCallback(callbackSpy);
320
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
321
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, undefined);
322
+
323
+ return xhrServerMock.expectFetchRequest()
324
+ .then(fetchRequest => {
325
+ let requestBody = JSON.parse(fetchRequest.requestBody);
326
+ expect(requestBody.s).is.undefined;
327
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
328
+ return submoduleResponse
329
+ })
330
+ });
166
331
 
167
- let request = server.requests[0];
168
- let requestBody = JSON.parse(request.requestBody);
169
- expect(requestBody.s).to.be.undefined;
332
+ it('should call the ID5 server for config with submodule config object', function () {
333
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
334
+ let id5FetchConfig = getId5FetchConfig();
335
+ id5FetchConfig.params.extraParam = {
336
+ x: 'X',
337
+ y: {
338
+ a: 1,
339
+ b: '3'
340
+ }
341
+ }
342
+ let submoduleResponse = callSubmoduleGetId(id5FetchConfig, undefined, undefined);
343
+
344
+ return xhrServerMock.expectConfigRequest()
345
+ .then(configRequest => {
346
+ let requestBody = JSON.parse(configRequest.requestBody)
347
+ expect(requestBody).is.deep.eq(id5FetchConfig)
348
+ return xhrServerMock.respondWithConfigAndExpectNext(configRequest)
349
+ })
350
+ .then(fetchRequest => {
351
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
352
+ return submoduleResponse
353
+ })
354
+ });
170
355
 
171
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
356
+ it('should call the ID5 server for config with overridden url', function () {
357
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
358
+ let id5FetchConfig = getId5FetchConfig();
359
+ id5FetchConfig.params.configUrl = 'http://localhost/x/y/z'
360
+
361
+ let submoduleResponse = callSubmoduleGetId(id5FetchConfig, undefined, undefined);
362
+
363
+ return xhrServerMock.expectFirstRequest()
364
+ .then(configRequest => {
365
+ expect(configRequest.url).is.eq('http://localhost/x/y/z')
366
+ return xhrServerMock.respondWithConfigAndExpectNext(configRequest)
367
+ })
368
+ .then(fetchRequest => {
369
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
370
+ return submoduleResponse
371
+ })
172
372
  });
173
373
 
174
- it('should call the ID5 server with signature field from stored object', function () {
175
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, ID5_STORED_OBJ).callback;
176
- submoduleCallback(callbackSpy);
374
+ it('should call the ID5 server with additional data when provided', function () {
375
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
376
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, undefined);
377
+
378
+ return xhrServerMock.expectConfigRequest()
379
+ .then(configRequest => {
380
+ return xhrServerMock.respondWithConfigAndExpectNext(configRequest, {
381
+ fetchCall: {
382
+ url: ID5_ENDPOINT,
383
+ overrides: {
384
+ arg1: '123',
385
+ arg2: {
386
+ x: '1',
387
+ y: 2
388
+ }
389
+ }
390
+ }
391
+ });
392
+ })
393
+ .then(fetchRequest => {
394
+ let requestBody = JSON.parse(fetchRequest.requestBody);
395
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
396
+ expect(requestBody.o).is.eq('pbjs');
397
+ expect(requestBody.v).is.eq('$prebid.version$');
398
+ expect(requestBody.arg1).is.eq('123')
399
+ expect(requestBody.arg2).is.deep.eq({
400
+ x: '1',
401
+ y: 2
402
+ })
403
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
404
+ return submoduleResponse
405
+ })
406
+ });
177
407
 
178
- let request = server.requests[0];
179
- let requestBody = JSON.parse(request.requestBody);
180
- expect(requestBody.s).to.eq(ID5_STORED_SIGNATURE);
408
+ it('should call the ID5 server with extensions', function () {
409
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
410
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, undefined);
411
+
412
+ return xhrServerMock.expectConfigRequest()
413
+ .then(configRequest => {
414
+ return xhrServerMock.respondWithConfigAndExpectNext(configRequest, {
415
+ fetchCall: {
416
+ url: ID5_ENDPOINT
417
+ },
418
+ extensionsCall: {
419
+ url: ID5_EXTENSIONS_ENDPOINT,
420
+ method: 'GET'
421
+ }
422
+ });
423
+ })
424
+ .then(extensionsRequest => {
425
+ expect(extensionsRequest.url).is.eq(ID5_EXTENSIONS_ENDPOINT)
426
+ expect(extensionsRequest.method).is.eq('GET')
427
+ extensionsRequest.respond(200, responseHeader, JSON.stringify({
428
+ lb: 'ex'
429
+ }))
430
+ return xhrServerMock.expectNextRequest();
431
+ })
432
+ .then(fetchRequest => {
433
+ let requestBody = JSON.parse(fetchRequest.requestBody);
434
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
435
+ expect(requestBody.o).is.eq('pbjs');
436
+ expect(requestBody.v).is.eq('$prebid.version$');
437
+ expect(requestBody.extensions).is.deep.eq({
438
+ lb: 'ex'
439
+ })
440
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
441
+ return submoduleResponse
442
+ })
443
+ });
444
+
445
+ it('should call the ID5 server with extensions fetched with POST', function () {
446
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
447
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, undefined);
448
+
449
+ return xhrServerMock.expectConfigRequest()
450
+ .then(configRequest => {
451
+ return xhrServerMock.respondWithConfigAndExpectNext(configRequest, {
452
+ fetchCall: {
453
+ url: ID5_ENDPOINT
454
+ },
455
+ extensionsCall: {
456
+ url: ID5_EXTENSIONS_ENDPOINT,
457
+ method: 'POST',
458
+ body: {
459
+ x: '1',
460
+ y: 2
461
+ }
462
+ }
463
+ });
464
+ })
465
+ .then(extensionsRequest => {
466
+ expect(extensionsRequest.url).is.eq(ID5_EXTENSIONS_ENDPOINT)
467
+ expect(extensionsRequest.method).is.eq('POST')
468
+ let requestBody = JSON.parse(extensionsRequest.requestBody)
469
+ expect(requestBody).is.deep.eq({
470
+ x: '1',
471
+ y: 2
472
+ })
473
+ extensionsRequest.respond(200, responseHeader, JSON.stringify({
474
+ lb: 'post',
475
+ }))
476
+ return xhrServerMock.expectNextRequest();
477
+ })
478
+ .then(fetchRequest => {
479
+ let requestBody = JSON.parse(fetchRequest.requestBody);
480
+ expect(requestBody.partner).is.eq(ID5_TEST_PARTNER_ID);
481
+ expect(requestBody.o).is.eq('pbjs');
482
+ expect(requestBody.v).is.eq('$prebid.version$');
483
+ expect(requestBody.extensions).is.deep.eq({
484
+ lb: 'post'
485
+ })
486
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
487
+ return submoduleResponse
488
+ })
489
+ });
181
490
 
182
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
491
+ it('should call the ID5 server with signature field from stored object', function () {
492
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
493
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, ID5_STORED_OBJ);
494
+
495
+ return xhrServerMock.expectFetchRequest()
496
+ .then(fetchRequest => {
497
+ let requestBody = JSON.parse(fetchRequest.requestBody);
498
+ expect(requestBody.s).is.eq(ID5_STORED_SIGNATURE);
499
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
500
+ return submoduleResponse
501
+ })
183
502
  });
184
503
 
185
504
  it('should call the ID5 server with pd field when pd config is set', function () {
505
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
186
506
  const pubData = 'b50ca08271795a8e7e4012813f23d505193d75c0f2e2bb99baa63aa822f66ed3';
187
507
 
188
508
  let id5Config = getId5FetchConfig();
189
509
  id5Config.params.pd = pubData;
190
510
 
191
- let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
192
- submoduleCallback(callbackSpy);
193
-
194
- let request = server.requests[0];
195
- let requestBody = JSON.parse(request.requestBody);
196
- expect(requestBody.pd).to.eq(pubData);
511
+ let submoduleResponse = callSubmoduleGetId(id5Config, undefined, ID5_STORED_OBJ);
197
512
 
198
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
513
+ return xhrServerMock.expectFetchRequest()
514
+ .then(fetchRequest => {
515
+ let requestBody = JSON.parse(fetchRequest.requestBody);
516
+ expect(requestBody.pd).is.eq(pubData);
517
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
518
+ return submoduleResponse;
519
+ })
199
520
  });
200
521
 
201
522
  it('should call the ID5 server with no pd field when pd config is not set', function () {
523
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
202
524
  let id5Config = getId5FetchConfig();
203
525
  id5Config.params.pd = undefined;
204
526
 
205
- let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
206
- submoduleCallback(callbackSpy);
527
+ let submoduleResponse = callSubmoduleGetId(id5Config, undefined, ID5_STORED_OBJ);
207
528
 
208
- let request = server.requests[0];
209
- let requestBody = JSON.parse(request.requestBody);
210
- expect(requestBody.pd).to.be.undefined;
211
-
212
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
529
+ return xhrServerMock.expectFetchRequest()
530
+ .then(fetchRequest => {
531
+ let requestBody = JSON.parse(fetchRequest.requestBody);
532
+ expect(requestBody.pd).is.undefined;
533
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
534
+ return submoduleResponse;
535
+ })
213
536
  });
214
537
 
215
538
  it('should call the ID5 server with nb=1 when no stored value exists and reset after', function () {
539
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
216
540
  coreStorage.removeDataFromLocalStorage(ID5_NB_STORAGE_NAME);
217
541
 
218
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, ID5_STORED_OBJ).callback;
219
- submoduleCallback(callbackSpy);
220
-
221
- let request = server.requests[0];
222
- let requestBody = JSON.parse(request.requestBody);
223
- expect(requestBody.nbPage).to.eq(1);
224
-
225
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
226
-
227
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(0);
542
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, ID5_STORED_OBJ);
543
+
544
+ return xhrServerMock.expectFetchRequest()
545
+ .then(fetchRequest => {
546
+ let requestBody = JSON.parse(fetchRequest.requestBody);
547
+ expect(requestBody.nbPage).is.eq(1);
548
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
549
+ return submoduleResponse
550
+ })
551
+ .then(() => {
552
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(0);
553
+ })
228
554
  });
229
555
 
230
556
  it('should call the ID5 server with incremented nb when stored value exists and reset after', function () {
557
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
231
558
  storeNbInCache(ID5_TEST_PARTNER_ID, 1);
232
559
 
233
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, ID5_STORED_OBJ).callback;
234
- submoduleCallback(callbackSpy);
235
-
236
- let request = server.requests[0];
237
- let requestBody = JSON.parse(request.requestBody);
238
- expect(requestBody.nbPage).to.eq(2);
239
-
240
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
241
-
242
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(0);
560
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, ID5_STORED_OBJ);
561
+
562
+ return xhrServerMock.expectFetchRequest()
563
+ .then(fetchRequest => {
564
+ let requestBody = JSON.parse(fetchRequest.requestBody);
565
+ expect(requestBody.nbPage).is.eq(2);
566
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
567
+ return submoduleResponse
568
+ })
569
+ .then(() => {
570
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(0);
571
+ })
243
572
  });
244
573
 
245
574
  it('should call the ID5 server with ab_testing object when abTesting is turned on', function () {
575
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
246
576
  let id5Config = getId5FetchConfig();
247
- id5Config.params.abTesting = { enabled: true, controlGroupPct: 0.234 }
248
-
249
- let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
250
- submoduleCallback(callbackSpy);
577
+ id5Config.params.abTesting = {enabled: true, controlGroupPct: 0.234}
251
578
 
252
- let request = server.requests[0];
253
- let requestBody = JSON.parse(request.requestBody);
254
- expect(requestBody.ab_testing.enabled).to.eq(true);
255
- expect(requestBody.ab_testing.control_group_pct).to.eq(0.234);
579
+ let submoduleResponse = callSubmoduleGetId(id5Config, undefined, ID5_STORED_OBJ);
256
580
 
257
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
581
+ return xhrServerMock.expectFetchRequest()
582
+ .then(fetchRequest => {
583
+ let requestBody = JSON.parse(fetchRequest.requestBody);
584
+ expect(requestBody.ab_testing.enabled).is.eq(true);
585
+ expect(requestBody.ab_testing.control_group_pct).is.eq(0.234);
586
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
587
+ return submoduleResponse;
588
+ });
258
589
  });
259
590
 
260
591
  it('should call the ID5 server without ab_testing object when abTesting is turned off', function () {
592
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
261
593
  let id5Config = getId5FetchConfig();
262
- id5Config.params.abTesting = { enabled: false, controlGroupPct: 0.55 }
263
-
264
- let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
265
- submoduleCallback(callbackSpy);
594
+ id5Config.params.abTesting = {enabled: false, controlGroupPct: 0.55}
266
595
 
267
- let request = server.requests[0];
268
- let requestBody = JSON.parse(request.requestBody);
269
- expect(requestBody.ab_testing).to.be.undefined;
596
+ let submoduleResponse = callSubmoduleGetId(id5Config, undefined, ID5_STORED_OBJ);
270
597
 
271
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
598
+ return xhrServerMock.expectFetchRequest()
599
+ .then(fetchRequest => {
600
+ let requestBody = JSON.parse(fetchRequest.requestBody);
601
+ expect(requestBody.ab_testing).is.undefined;
602
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
603
+ return submoduleResponse
604
+ });
272
605
  });
273
606
 
274
607
  it('should call the ID5 server without ab_testing when when abTesting is not set', function () {
608
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
275
609
  let id5Config = getId5FetchConfig();
276
610
 
277
- let submoduleCallback = id5IdSubmodule.getId(id5Config, undefined, ID5_STORED_OBJ).callback;
278
- submoduleCallback(callbackSpy);
279
-
280
- let request = server.requests[0];
281
- let requestBody = JSON.parse(request.requestBody);
282
- expect(requestBody.ab_testing).to.be.undefined;
611
+ let submoduleResponse = callSubmoduleGetId(id5Config, undefined, ID5_STORED_OBJ);
283
612
 
284
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
613
+ return xhrServerMock.expectFetchRequest()
614
+ .then(fetchRequest => {
615
+ let requestBody = JSON.parse(fetchRequest.requestBody);
616
+ expect(requestBody.ab_testing).is.undefined;
617
+ fetchRequest.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
618
+ return submoduleResponse
619
+ });
285
620
  });
286
621
 
287
622
  it('should store the privacy object from the ID5 server response', function () {
288
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, ID5_STORED_OBJ).callback;
289
- submoduleCallback(callbackSpy);
623
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
624
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, ID5_STORED_OBJ);
290
625
 
291
- let request = server.requests[0];
292
-
293
- let responseObject = utils.deepClone(ID5_JSON_RESPONSE);
294
- responseObject.privacy = {
626
+ const privacy = {
295
627
  jurisdiction: 'gdpr',
296
628
  id5_consent: true
297
629
  };
298
- request.respond(200, responseHeader, JSON.stringify(responseObject));
299
- expect(getFromLocalStorage(ID5_PRIVACY_STORAGE_NAME)).to.be.eq(JSON.stringify(responseObject.privacy));
300
- coreStorage.removeDataFromLocalStorage(ID5_PRIVACY_STORAGE_NAME);
630
+
631
+ return xhrServerMock.expectFetchRequest()
632
+ .then(request => {
633
+ let responseObject = utils.deepClone(ID5_JSON_RESPONSE);
634
+ responseObject.privacy = privacy;
635
+ request.respond(200, responseHeader, JSON.stringify(responseObject));
636
+ return submoduleResponse
637
+ })
638
+ .then(() => {
639
+ expect(getFromLocalStorage(ID5_PRIVACY_STORAGE_NAME)).is.eq(JSON.stringify(privacy));
640
+ coreStorage.removeDataFromLocalStorage(ID5_PRIVACY_STORAGE_NAME);
641
+ })
301
642
  });
302
643
 
303
644
  it('should not store a privacy object if not part of ID5 server response', function () {
645
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
304
646
  coreStorage.removeDataFromLocalStorage(ID5_PRIVACY_STORAGE_NAME);
305
- let submoduleCallback = id5IdSubmodule.getId(getId5FetchConfig(), undefined, ID5_STORED_OBJ).callback;
306
- submoduleCallback(callbackSpy);
307
-
308
- let request = server.requests[0];
309
-
310
- request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
311
- expect(getFromLocalStorage(ID5_PRIVACY_STORAGE_NAME)).to.be.null;
647
+ let submoduleResponse = callSubmoduleGetId(getId5FetchConfig(), undefined, ID5_STORED_OBJ);
648
+
649
+ return xhrServerMock.expectFetchRequest()
650
+ .then(request => {
651
+ let responseObject = utils.deepClone(ID5_JSON_RESPONSE);
652
+ responseObject.privacy = undefined;
653
+ request.respond(200, responseHeader, JSON.stringify(responseObject));
654
+ return submoduleResponse
655
+ })
656
+ .then(() => {
657
+ expect(getFromLocalStorage(ID5_PRIVACY_STORAGE_NAME)).is.null;
658
+ });
312
659
  });
313
660
 
314
661
  describe('when legacy cookies are set', () => {
@@ -327,11 +674,11 @@ describe('ID5 ID System', function() {
327
674
  })
328
675
  });
329
676
 
330
- describe('Request Bids Hook', function() {
677
+ describe('Request Bids Hook', function () {
331
678
  let adUnits;
332
679
  let sandbox;
333
680
 
334
- beforeEach(function() {
681
+ beforeEach(function () {
335
682
  sandbox = sinon.sandbox.create();
336
683
  mockGdprConsent(sandbox);
337
684
  sinon.stub(events, 'getEvents').returns([]);
@@ -340,7 +687,7 @@ describe('ID5 ID System', function() {
340
687
  coreStorage.removeDataFromLocalStorage(ID5_NB_STORAGE_NAME);
341
688
  adUnits = [getAdUnitMock()];
342
689
  });
343
- afterEach(function() {
690
+ afterEach(function () {
344
691
  events.getEvents.restore();
345
692
  coreStorage.removeDataFromLocalStorage(ID5_STORAGE_NAME);
346
693
  coreStorage.removeDataFromLocalStorage(`${ID5_STORAGE_NAME}_last`);
@@ -359,8 +706,8 @@ describe('ID5 ID System', function() {
359
706
  adUnits.forEach(unit => {
360
707
  unit.bids.forEach(bid => {
361
708
  expect(bid).to.have.deep.nested.property(`userId.${ID5_EIDS_NAME}`);
362
- expect(bid.userId.id5id.uid).to.equal(ID5_STORED_ID);
363
- expect(bid.userIdAsEids[0]).to.deep.equal({
709
+ expect(bid.userId.id5id.uid).is.equal(ID5_STORED_ID);
710
+ expect(bid.userIdAsEids[0]).is.deep.equal({
364
711
  source: ID5_SOURCE,
365
712
  uids: [{
366
713
  id: ID5_STORED_ID,
@@ -373,7 +720,7 @@ describe('ID5 ID System', function() {
373
720
  });
374
721
  });
375
722
  done();
376
- }, { adUnits });
723
+ }, {adUnits});
377
724
  });
378
725
 
379
726
  it('should add config value ID to bids', function (done) {
@@ -385,15 +732,15 @@ describe('ID5 ID System', function() {
385
732
  adUnits.forEach(unit => {
386
733
  unit.bids.forEach(bid => {
387
734
  expect(bid).to.have.deep.nested.property(`userId.${ID5_EIDS_NAME}`);
388
- expect(bid.userId.id5id.uid).to.equal(ID5_STORED_ID);
389
- expect(bid.userIdAsEids[0]).to.deep.equal({
735
+ expect(bid.userId.id5id.uid).is.equal(ID5_STORED_ID);
736
+ expect(bid.userIdAsEids[0]).is.deep.equal({
390
737
  source: ID5_SOURCE,
391
- uids: [{ id: ID5_STORED_ID, atype: 1 }]
738
+ uids: [{id: ID5_STORED_ID, atype: 1}]
392
739
  });
393
740
  });
394
741
  });
395
742
  done();
396
- }, { adUnits });
743
+ }, {adUnits});
397
744
  });
398
745
 
399
746
  it('should set nb=1 in cache when no stored nb value exists and cached ID', function (done) {
@@ -405,7 +752,7 @@ describe('ID5 ID System', function() {
405
752
  config.setConfig(getFetchLocalStorageConfig());
406
753
 
407
754
  requestBidsHook((adUnitConfig) => {
408
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(1);
755
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(1);
409
756
  done()
410
757
  }, {adUnits});
411
758
  });
@@ -419,19 +766,20 @@ describe('ID5 ID System', function() {
419
766
  config.setConfig(getFetchLocalStorageConfig());
420
767
 
421
768
  requestBidsHook(() => {
422
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(2);
769
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(2);
423
770
  done()
424
771
  }, {adUnits});
425
772
  });
426
773
 
427
774
  it('should call ID5 servers with signature and incremented nb post auction if refresh needed', function () {
428
- storeInLocalStorage(ID5_STORAGE_NAME, JSON.stringify(ID5_STORED_OBJ), 1);
775
+ let xhrServerMock = new XhrServerMock(sinon.createFakeServer())
776
+ let initialLocalStorageValue = JSON.stringify(ID5_STORED_OBJ);
777
+ storeInLocalStorage(ID5_STORAGE_NAME, initialLocalStorageValue, 1);
429
778
  storeInLocalStorage(`${ID5_STORAGE_NAME}_last`, expDaysStr(-1), 1);
430
- storeNbInCache(ID5_TEST_PARTNER_ID, 1);
431
779
 
780
+ storeNbInCache(ID5_TEST_PARTNER_ID, 1);
432
781
  let id5Config = getFetchLocalStorageConfig();
433
782
  id5Config.userSync.userIds[0].storage.refreshInSeconds = 2;
434
-
435
783
  init(config);
436
784
  setSubmoduleRegistry([id5IdSubmodule]);
437
785
  config.setConfig(id5Config);
@@ -441,53 +789,62 @@ describe('ID5 ID System', function() {
441
789
  resolve()
442
790
  }, {adUnits});
443
791
  }).then(() => {
444
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(2);
445
- expect(server.requests).to.be.empty;
792
+ expect(xhrServerMock.hasReceivedAnyRequest()).is.false;
446
793
  events.emit(CONSTANTS.EVENTS.AUCTION_END, {});
447
- return new Promise((resolve) => setTimeout(resolve))
448
- }).then(() => {
449
- let request = server.requests[0];
794
+ return xhrServerMock.expectFetchRequest()
795
+ }).then(request => {
450
796
  let requestBody = JSON.parse(request.requestBody);
451
- expect(request.url).to.contain(ID5_ENDPOINT);
452
- expect(requestBody.s).to.eq(ID5_STORED_SIGNATURE);
453
- expect(requestBody.nbPage).to.eq(2);
454
-
455
- const responseHeader = { 'Content-Type': 'application/json' };
797
+ expect(requestBody.s).is.eq(ID5_STORED_SIGNATURE);
798
+ expect(requestBody.nbPage).is.eq(2);
799
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(2);
800
+ const responseHeader = {'Content-Type': 'application/json'};
456
801
  request.respond(200, responseHeader, JSON.stringify(ID5_JSON_RESPONSE));
457
802
 
458
- expect(decodeURIComponent(getFromLocalStorage(ID5_STORAGE_NAME))).to.be.eq(JSON.stringify(ID5_JSON_RESPONSE));
459
- expect(getNbFromCache(ID5_TEST_PARTNER_ID)).to.be.eq(0);
803
+ return new Promise(function (resolve) {
804
+ (function waitForCondition() {
805
+ if (getFromLocalStorage(ID5_STORAGE_NAME) !== initialLocalStorageValue) return resolve();
806
+ setTimeout(waitForCondition, 30);
807
+ })();
808
+ })
809
+ }).then(() => {
810
+ expect(decodeURIComponent(getFromLocalStorage(ID5_STORAGE_NAME))).is.eq(JSON.stringify(ID5_JSON_RESPONSE));
811
+ expect(getNbFromCache(ID5_TEST_PARTNER_ID)).is.eq(0);
460
812
  })
461
813
  });
462
814
  });
463
815
 
464
- describe('Decode stored object', function() {
465
- const expectedDecodedObject = { id5id: { uid: ID5_STORED_ID, ext: { linkType: ID5_STORED_LINK_TYPE } } };
816
+ describe('Decode stored object', function () {
817
+ const expectedDecodedObject = {id5id: {uid: ID5_STORED_ID, ext: {linkType: ID5_STORED_LINK_TYPE}}};
466
818
 
467
- it('should properly decode from a stored object', function() {
468
- expect(id5IdSubmodule.decode(ID5_STORED_OBJ, getId5FetchConfig())).to.deep.equal(expectedDecodedObject);
819
+ it('should properly decode from a stored object', function () {
820
+ expect(id5IdSubmodule.decode(ID5_STORED_OBJ, getId5FetchConfig())).is.deep.equal(expectedDecodedObject);
469
821
  });
470
- it('should return undefined if passed a string', function() {
471
- expect(id5IdSubmodule.decode('somestring', getId5FetchConfig())).to.eq(undefined);
822
+ it('should return undefined if passed a string', function () {
823
+ expect(id5IdSubmodule.decode('somestring', getId5FetchConfig())).is.eq(undefined);
472
824
  });
473
825
  });
474
826
 
475
- describe('A/B Testing', function() {
476
- const expectedDecodedObjectWithIdAbOff = { id5id: { uid: ID5_STORED_ID, ext: { linkType: ID5_STORED_LINK_TYPE } } };
477
- const expectedDecodedObjectWithIdAbOn = { id5id: { uid: ID5_STORED_ID, ext: { linkType: ID5_STORED_LINK_TYPE, abTestingControlGroup: false } } };
478
- const expectedDecodedObjectWithoutIdAbOn = { id5id: { uid: '', ext: { linkType: 0, abTestingControlGroup: true } } };
827
+ describe('A/B Testing', function () {
828
+ const expectedDecodedObjectWithIdAbOff = {id5id: {uid: ID5_STORED_ID, ext: {linkType: ID5_STORED_LINK_TYPE}}};
829
+ const expectedDecodedObjectWithIdAbOn = {
830
+ id5id: {
831
+ uid: ID5_STORED_ID,
832
+ ext: {linkType: ID5_STORED_LINK_TYPE, abTestingControlGroup: false}
833
+ }
834
+ };
835
+ const expectedDecodedObjectWithoutIdAbOn = {id5id: {uid: '', ext: {linkType: 0, abTestingControlGroup: true}}};
479
836
  let testConfig, storedObject;
480
837
 
481
- beforeEach(function() {
838
+ beforeEach(function () {
482
839
  testConfig = getId5FetchConfig();
483
840
  storedObject = utils.deepClone(ID5_STORED_OBJ);
484
841
  });
485
842
 
486
- describe('A/B Testing Config is Set', function() {
843
+ describe('A/B Testing Config is Set', function () {
487
844
  let randStub;
488
845
 
489
- beforeEach(function() {
490
- randStub = sinon.stub(Math, 'random').callsFake(function() {
846
+ beforeEach(function () {
847
+ randStub = sinon.stub(Math, 'random').callsFake(function () {
491
848
  return 0.25;
492
849
  });
493
850
  });
@@ -495,39 +852,39 @@ describe('ID5 ID System', function() {
495
852
  randStub.restore();
496
853
  });
497
854
 
498
- describe('Decode', function() {
855
+ describe('Decode', function () {
499
856
  let logErrorSpy;
500
857
 
501
- beforeEach(function() {
858
+ beforeEach(function () {
502
859
  logErrorSpy = sinon.spy(utils, 'logError');
503
860
  });
504
- afterEach(function() {
861
+ afterEach(function () {
505
862
  logErrorSpy.restore();
506
863
  });
507
864
 
508
865
  it('should not set abTestingControlGroup extension when A/B testing is off', function () {
509
866
  let decoded = id5IdSubmodule.decode(storedObject, testConfig);
510
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
867
+ expect(decoded).is.deep.equal(expectedDecodedObjectWithIdAbOff);
511
868
  });
512
869
 
513
870
  it('should set abTestingControlGroup to false when A/B testing is on but in normal group', function () {
514
- storedObject.ab_testing = { result: 'normal' };
871
+ storedObject.ab_testing = {result: 'normal'};
515
872
  let decoded = id5IdSubmodule.decode(storedObject, testConfig);
516
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOn);
873
+ expect(decoded).is.deep.equal(expectedDecodedObjectWithIdAbOn);
517
874
  });
518
875
 
519
876
  it('should not expose ID when everyone is in control group', function () {
520
- storedObject.ab_testing = { result: 'control' };
877
+ storedObject.ab_testing = {result: 'control'};
521
878
  storedObject.universal_uid = '';
522
879
  storedObject.link_type = 0;
523
880
  let decoded = id5IdSubmodule.decode(storedObject, testConfig);
524
- expect(decoded).to.deep.equal(expectedDecodedObjectWithoutIdAbOn);
881
+ expect(decoded).is.deep.equal(expectedDecodedObjectWithoutIdAbOn);
525
882
  });
526
883
 
527
884
  it('should log A/B testing errors', function () {
528
- storedObject.ab_testing = { result: 'error' };
885
+ storedObject.ab_testing = {result: 'error'};
529
886
  let decoded = id5IdSubmodule.decode(storedObject, testConfig);
530
- expect(decoded).to.deep.equal(expectedDecodedObjectWithIdAbOff);
887
+ expect(decoded).is.deep.equal(expectedDecodedObjectWithIdAbOff);
531
888
  sinon.assert.calledOnce(logErrorSpy);
532
889
  });
533
890
  });