prebid.js 9.4.0 → 9.5.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 (363) hide show
  1. package/.eslintrc.js +31 -5
  2. package/.github/workflows/jscpd.yml +2 -2
  3. package/.github/workflows/linter.yml +107 -0
  4. package/creative/crossDomain.js +6 -3
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adagioAnalyticsAdapter.js +1 -1
  10. package/dist/adagioBidAdapter.js +1 -1
  11. package/dist/adagioRtdProvider.js +1 -1
  12. package/dist/adagioUtils.js +1 -1
  13. package/dist/addefendBidAdapter.js +1 -1
  14. package/dist/adgenerationBidAdapter.js +1 -1
  15. package/dist/adkernelAdnBidAdapter.js +1 -1
  16. package/dist/adkernelBidAdapter.js +1 -1
  17. package/dist/adkernelUtils.js +1 -0
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/admixerBidAdapter.js +1 -1
  20. package/dist/adqueryBidAdapter.js +1 -1
  21. package/dist/adrelevantisBidAdapter.js +1 -1
  22. package/dist/adstirBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/advRedAnalyticsAdapter.js +1 -0
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/ajaBidAdapter.js +1 -1
  30. package/dist/akamaiDapRtdProvider.js +1 -1
  31. package/dist/amxBidAdapter.js +1 -1
  32. package/dist/amxIdSystem.js +1 -1
  33. package/dist/anonymisedRtdProvider.js +1 -1
  34. package/dist/apacdexBidAdapter.js +1 -1
  35. package/dist/appierAnalyticsAdapter.js +1 -1
  36. package/dist/appnexusBidAdapter.js +1 -1
  37. package/dist/asoBidAdapter.js +1 -1
  38. package/dist/axonixBidAdapter.js +1 -1
  39. package/dist/azerionedgeRtdProvider.js +1 -1
  40. package/dist/bidglassBidAdapter.js +1 -1
  41. package/dist/big-richmediaBidAdapter.js +1 -1
  42. package/dist/bridBidAdapter.js +1 -1
  43. package/dist/bridgewellBidAdapter.js +1 -1
  44. package/dist/brightMountainMediaBidAdapter.js +1 -1
  45. package/dist/carodaBidAdapter.js +1 -1
  46. package/dist/chtnwBidAdapter.js +1 -1
  47. package/dist/chunk-core.js +1 -1
  48. package/dist/concertBidAdapter.js +1 -1
  49. package/dist/connatixBidAdapter.js +1 -1
  50. package/dist/connectadBidAdapter.js +1 -1
  51. package/dist/consumableBidAdapter.js +1 -1
  52. package/dist/contxtfulRtdProvider.js +1 -1
  53. package/dist/conversantAnalyticsAdapter.js +1 -1
  54. package/dist/conversantBidAdapter.js +1 -1
  55. package/dist/craftBidAdapter.js +1 -1
  56. package/dist/criteoBidAdapter.js +1 -1
  57. package/dist/currencyUtils.js +1 -1
  58. package/dist/cwireBidAdapter.js +1 -1
  59. package/dist/dailymotionBidAdapter.js +1 -1
  60. package/dist/debugging-standalone.js +1 -1
  61. package/dist/dependencies.json +43 -7
  62. package/dist/dfpAdServerVideo.js +1 -1
  63. package/dist/dfpAdpod.js +1 -1
  64. package/dist/dfpUtils.js +1 -1
  65. package/dist/discoveryBidAdapter.js +1 -1
  66. package/dist/dspxBidAdapter.js +1 -1
  67. package/dist/dxkultureBidAdapter.js +1 -1
  68. package/dist/eightPodAnalyticsAdapter.js +1 -1
  69. package/dist/eightPodBidAdapter.js +1 -1
  70. package/dist/eplanningBidAdapter.js +1 -1
  71. package/dist/euidIdSystem.js +1 -1
  72. package/dist/exadsBidAdapter.js +1 -1
  73. package/dist/feedadBidAdapter.js +1 -1
  74. package/dist/finativeBidAdapter.js +1 -1
  75. package/dist/fintezaAnalyticsAdapter.js +1 -1
  76. package/dist/fpdUtils.js +1 -0
  77. package/dist/freewheel-sspBidAdapter.js +1 -1
  78. package/dist/gmosspBidAdapter.js +1 -1
  79. package/dist/goldbachBidAdapter.js +1 -1
  80. package/dist/gptPreAuction.js +1 -1
  81. package/dist/gptUtils.js +1 -1
  82. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  83. package/dist/greenbidsRtdProvider.js +1 -1
  84. package/dist/gridBidAdapter.js +1 -1
  85. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  86. package/dist/growthCodeRtdProvider.js +1 -1
  87. package/dist/gumgumBidAdapter.js +1 -1
  88. package/dist/h12mediaBidAdapter.js +1 -1
  89. package/dist/hypelabBidAdapter.js +1 -1
  90. package/dist/id5AnalyticsAdapter.js +1 -1
  91. package/dist/id5IdSystem.js +1 -1
  92. package/dist/imdsBidAdapter.js +1 -1
  93. package/dist/improvedigitalBidAdapter.js +1 -1
  94. package/dist/insticatorBidAdapter.js +1 -1
  95. package/dist/intentIqAnalyticsAdapter.js +1 -0
  96. package/dist/ixBidAdapter.js +1 -1
  97. package/dist/jixieBidAdapter.js +1 -1
  98. package/dist/justpremiumBidAdapter.js +1 -1
  99. package/dist/jwplayerBidAdapter.js +1 -1
  100. package/dist/jwplayerRtdProvider.js +1 -1
  101. package/dist/kargoBidAdapter.js +1 -1
  102. package/dist/kimberliteBidAdapter.js +1 -1
  103. package/dist/konduitAnalyticsAdapter.js +1 -1
  104. package/dist/kueezBidAdapter.js +1 -1
  105. package/dist/lassoBidAdapter.js +1 -1
  106. package/dist/lifestreetBidAdapter.js +1 -1
  107. package/dist/liveIntentIdSystem.js +1 -1
  108. package/dist/logicadBidAdapter.js +1 -1
  109. package/dist/loglyliftBidAdapter.js +1 -1
  110. package/dist/luceadBidAdapter.js +1 -1
  111. package/dist/mabidderBidAdapter.js +1 -1
  112. package/dist/magniteAnalyticsAdapter.js +1 -1
  113. package/dist/malltvAnalyticsAdapter.js +1 -1
  114. package/dist/marsmediaBidAdapter.js +1 -1
  115. package/dist/mediafuseBidAdapter.js +1 -1
  116. package/dist/mediagoBidAdapter.js +1 -1
  117. package/dist/medianetAnalyticsAdapter.js +1 -1
  118. package/dist/medianetBidAdapter.js +1 -1
  119. package/dist/mediasquareBidAdapter.js +1 -1
  120. package/dist/mgidBidAdapter.js +1 -1
  121. package/dist/minutemediaBidAdapter.js +1 -1
  122. package/dist/missenaBidAdapter.js +1 -1
  123. package/dist/mobianRtdProvider.js +1 -1
  124. package/dist/nextMillenniumBidAdapter.js +1 -1
  125. package/dist/nexx360BidAdapter.js +1 -1
  126. package/dist/nobidAnalyticsAdapter.js +1 -1
  127. package/dist/nobidBidAdapter.js +1 -1
  128. package/dist/not-for-prod/prebid.js +201 -193
  129. package/dist/oguryBidAdapter.js +1 -1
  130. package/dist/onetagBidAdapter.js +1 -1
  131. package/dist/ooloAnalyticsAdapter.js +1 -1
  132. package/dist/openwebBidAdapter.js +1 -1
  133. package/dist/openxBidAdapter.js +1 -1
  134. package/dist/optidigitalBidAdapter.js +1 -1
  135. package/dist/optoutBidAdapter.js +1 -1
  136. package/dist/orbidderBidAdapter.js +1 -1
  137. package/dist/outbrainBidAdapter.js +1 -1
  138. package/dist/paapi.js +1 -1
  139. package/dist/permutiveRtdProvider.js +1 -1
  140. package/dist/pixfutureBidAdapter.js +1 -1
  141. package/dist/playdigoBidAdapter.js +1 -1
  142. package/dist/prebidServerBidAdapter.js +1 -1
  143. package/dist/programmaticaBidAdapter.js +1 -1
  144. package/dist/publinkIdSystem.js +1 -1
  145. package/dist/publirBidAdapter.js +1 -1
  146. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  147. package/dist/pubmaticBidAdapter.js +1 -1
  148. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  149. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  150. package/dist/pxyzBidAdapter.js +1 -1
  151. package/dist/quantcastBidAdapter.js +1 -1
  152. package/dist/readpeakBidAdapter.js +1 -1
  153. package/dist/relaidoBidAdapter.js +1 -1
  154. package/dist/relevatehealthBidAdapter.js +1 -1
  155. package/dist/retailspotBidAdapter.js +1 -1
  156. package/dist/rhythmoneBidAdapter.js +1 -1
  157. package/dist/ringieraxelspringerBidAdapter.js +1 -1
  158. package/dist/riseBidAdapter.js +1 -1
  159. package/dist/rubiconBidAdapter.js +1 -1
  160. package/dist/schainSerializer.js +1 -0
  161. package/dist/seedingAllianceBidAdapter.js +1 -1
  162. package/dist/seedtagBidAdapter.js +1 -1
  163. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  164. package/dist/sharethroughBidAdapter.js +1 -1
  165. package/dist/shinezBidAdapter.js +1 -1
  166. package/dist/sizeMapping.js +1 -1
  167. package/dist/sizeUtils.js +1 -1
  168. package/dist/smaatoBidAdapter.js +1 -1
  169. package/dist/smartadserverBidAdapter.js +1 -1
  170. package/dist/smartxBidAdapter.js +1 -1
  171. package/dist/smilewantedBidAdapter.js +1 -1
  172. package/dist/snigelBidAdapter.js +1 -1
  173. package/dist/sonobiBidAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/stnBidAdapter.js +1 -1
  177. package/dist/stvBidAdapter.js +1 -1
  178. package/dist/sublimeBidAdapter.js +1 -1
  179. package/dist/symitriDapRtdProvider.js +1 -0
  180. package/dist/taboolaBidAdapter.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/targetVideoUtils.js +1 -0
  184. package/dist/teadsBidAdapter.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/themoneytizerBidAdapter.js +1 -1
  187. package/dist/trionBidAdapter.js +1 -1
  188. package/dist/tripleliftBidAdapter.js +1 -1
  189. package/dist/ttdBidAdapter.js +1 -1
  190. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  191. package/dist/uid2IdSystem.js +1 -1
  192. package/dist/underdogmediaBidAdapter.js +1 -1
  193. package/dist/undertoneBidAdapter.js +1 -1
  194. package/dist/unrulyBidAdapter.js +1 -1
  195. package/dist/userAgentUtils.js +1 -0
  196. package/dist/utiqIdSystem.js +1 -1
  197. package/dist/vidazooUtils.js +1 -1
  198. package/dist/videobyteBidAdapter.js +1 -1
  199. package/dist/visxBidAdapter.js +1 -1
  200. package/dist/vuukleBidAdapter.js +1 -1
  201. package/dist/widespaceBidAdapter.js +1 -1
  202. package/dist/winrBidAdapter.js +1 -1
  203. package/dist/yahooAdsBidAdapter.js +1 -1
  204. package/dist/yandexIdSystem.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  208. package/libraries/adkernelUtils/adkernelUtils.js +11 -0
  209. package/libraries/currencyUtils/floor.js +23 -0
  210. package/libraries/dfpUtils/dfpUtils.js +7 -0
  211. package/libraries/fpdUtils/deviceInfo.js +58 -0
  212. package/libraries/fpdUtils/pageInfo.js +73 -0
  213. package/libraries/gptUtils/gptUtils.js +23 -1
  214. package/libraries/schainSerializer/schainSerializer.js +24 -0
  215. package/libraries/sizeUtils/tranformSize.js +43 -0
  216. package/libraries/targetVideoUtils/bidderUtils.js +178 -0
  217. package/libraries/targetVideoUtils/constants.js +23 -0
  218. package/libraries/userAgentUtils/index.js +58 -0
  219. package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
  220. package/modules/.submodules.json +1 -0
  221. package/modules/33acrossAnalyticsAdapter.js +2 -0
  222. package/modules/adagioBidAdapter.js +1 -1
  223. package/modules/adagioRtdProvider.js +18 -4
  224. package/modules/adkernelAdnBidAdapter.js +1 -12
  225. package/modules/adkernelBidAdapter.js +4 -13
  226. package/modules/adlooxAnalyticsAdapter.js +1 -0
  227. package/modules/admixerBidAdapter.js +10 -6
  228. package/modules/admixerBidAdapter.md +7 -10
  229. package/modules/adtrgtmeBidAdapter.js +1 -1
  230. package/modules/advRedAnalyticsAdapter.js +198 -0
  231. package/modules/advRedAnalyticsAdapter.md +30 -0
  232. package/modules/akamaiDapRtdProvider.js +19 -798
  233. package/modules/anonymisedRtdProvider.js +5 -1
  234. package/modules/anonymisedRtdProvider.md +1 -1
  235. package/modules/apacdexBidAdapter.js +1 -1
  236. package/modules/appnexusBidAdapter.js +56 -2
  237. package/modules/automatadAnalyticsAdapter.js +2 -0
  238. package/modules/azerionedgeRtdProvider.js +13 -3
  239. package/modules/azerionedgeRtdProvider.md +0 -17
  240. package/modules/bridBidAdapter.js +47 -47
  241. package/modules/cleanioRtdProvider.js +1 -0
  242. package/modules/concertBidAdapter.js +1 -1
  243. package/modules/connatixBidAdapter.js +36 -8
  244. package/modules/connectIdSystem.js +3 -1
  245. package/modules/contxtfulRtdProvider.js +20 -2
  246. package/modules/contxtfulRtdProvider.md +1 -0
  247. package/modules/craftBidAdapter.js +1 -1
  248. package/modules/criteoBidAdapter.js +1 -1
  249. package/modules/cwireBidAdapter.js +5 -1
  250. package/modules/dailymotionBidAdapter.js +85 -65
  251. package/modules/debugging/debugging.js +3 -0
  252. package/modules/dfpAdServerVideo.js +15 -33
  253. package/modules/dfpAdpod.js +2 -6
  254. package/modules/dgkeywordRtdProvider.js +2 -0
  255. package/modules/discoveryBidAdapter.js +26 -210
  256. package/modules/dspxBidAdapter.js +176 -54
  257. package/modules/eightPodAnalyticsAdapter.js +28 -34
  258. package/modules/eightPodBidAdapter.js +113 -57
  259. package/modules/fintezaAnalyticsAdapter.js +9 -4
  260. package/modules/goldbachBidAdapter.js +1 -1
  261. package/modules/gptPreAuction.js +63 -4
  262. package/modules/growthCodeAnalyticsAdapter.js +1 -1
  263. package/modules/growthCodeRtdProvider.js +1 -1
  264. package/modules/gumgumBidAdapter.js +14 -10
  265. package/modules/improvedigitalBidAdapter.js +1 -1
  266. package/modules/intentIqAnalyticsAdapter.js +234 -0
  267. package/modules/intentIqAnalyticsAdapter.md +27 -0
  268. package/modules/intentIqIdSystem.md +0 -0
  269. package/modules/jwplayerBidAdapter.js +1 -1
  270. package/modules/jwplayerRtdProvider.js +26 -6
  271. package/modules/jwplayerVideoProvider.js +6 -0
  272. package/modules/mediafuseBidAdapter.js +1 -1
  273. package/modules/mediagoBidAdapter.js +7 -176
  274. package/modules/medianetBidAdapter.js +101 -40
  275. package/modules/mgidBidAdapter.js +3 -1
  276. package/modules/mobianRtdProvider.js +16 -2
  277. package/modules/nextMillenniumBidAdapter.js +1 -27
  278. package/modules/nobidBidAdapter.js +1 -1
  279. package/modules/optoutBidAdapter.js +1 -1
  280. package/modules/paapi.js +48 -35
  281. package/modules/permutiveRtdProvider.js +72 -22
  282. package/modules/playdigoBidAdapter.js +4 -2
  283. package/modules/prebidServerBidAdapter/index.js +4 -2
  284. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  285. package/modules/programmaticaBidAdapter.js +1 -1
  286. package/modules/pubmaticBidAdapter.js +12 -0
  287. package/modules/pubxaiAnalyticsAdapter.js +306 -164
  288. package/modules/relevatehealthBidAdapter.js +2 -1
  289. package/modules/richaudienceBidAdapter.js +1 -1
  290. package/modules/rtdModule/index.js +5 -3
  291. package/modules/sirdataRtdProvider.js +2 -0
  292. package/modules/sizeMapping.js +2 -5
  293. package/modules/smaatoBidAdapter.js +18 -1
  294. package/modules/smilewantedBidAdapter.js +26 -22
  295. package/modules/snigelBidAdapter.js +1 -1
  296. package/modules/sonobiBidAdapter.js +5 -10
  297. package/modules/symitriDapRtdProvider.js +812 -0
  298. package/modules/symitriDapRtdProvider.md +49 -0
  299. package/modules/targetVideoBidAdapter.js +120 -152
  300. package/modules/targetVideoBidAdapter.md +20 -3
  301. package/modules/userId/eids.js +3 -0
  302. package/modules/utiqIdSystem.js +12 -10
  303. package/modules/validationFpdModule/index.js +22 -17
  304. package/modules/videojsVideoProvider.js +3 -0
  305. package/modules/visxBidAdapter.js +1 -1
  306. package/modules/winrBidAdapter.js +2 -27
  307. package/modules/yahooAdsBidAdapter.js +1 -1
  308. package/modules/yandexIdSystem.js +1 -1
  309. package/package.json +4 -4
  310. package/plugins/eslint/index.js +73 -45
  311. package/src/adRendering.js +7 -3
  312. package/src/adloader.js +1 -0
  313. package/src/ajax.js +15 -0
  314. package/src/config.js +0 -4
  315. package/src/debugging.js +1 -0
  316. package/src/secureCreatives.js +1 -1
  317. package/src/storageManager.js +62 -73
  318. package/src/targeting.js +26 -20
  319. package/src/utils.js +9 -0
  320. package/test/pages/banner_sync.html +97 -0
  321. package/test/pages/consent_mgt_gdpr.html +1 -1
  322. package/test/spec/ajax_spec.js +11 -0
  323. package/test/spec/creative/crossDomainCreative_spec.js +26 -9
  324. package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
  325. package/test/spec/fpd/gdpr_spec.js +1 -1
  326. package/test/spec/libraries/userAgentUtils_spec.js +109 -0
  327. package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
  328. package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
  329. package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
  330. package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
  331. package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
  332. package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
  333. package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
  334. package/test/spec/modules/consentManagement_spec.js +1 -1
  335. package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
  336. package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
  337. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
  338. package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
  339. package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
  340. package/test/spec/modules/gptPreAuction_spec.js +143 -1
  341. package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
  342. package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
  343. package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
  344. package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
  345. package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
  346. package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
  347. package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
  348. package/test/spec/modules/paapi_spec.js +177 -111
  349. package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
  350. package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
  351. package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
  352. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  353. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
  354. package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
  355. package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
  356. package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
  357. package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
  358. package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
  359. package/test/spec/modules/yandexIdSystem_spec.js +6 -1
  360. package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
  361. package/test/spec/unit/core/storageManager_spec.js +68 -51
  362. package/test/spec/utils_spec.js +19 -0
  363. /package/src/utils/{gpdr.js → gdpr.js} +0 -0
@@ -0,0 +1,600 @@
1
+ import {config} from 'src/config.js';
2
+ import {
3
+ dapUtils,
4
+ generateRealTimeData,
5
+ symitriDapRtdSubmodule,
6
+ storage, DAP_MAX_RETRY_TOKENIZE, DAP_SS_ID, DAP_TOKEN, DAP_MEMBERSHIP, DAP_ENCRYPTED_MEMBERSHIP
7
+ } from 'modules/symitriDapRtdProvider.js';
8
+ import {server} from 'test/mocks/xhr.js';
9
+ import {hook} from '../../../src/hook.js';
10
+ const responseHeader = {'Content-Type': 'application/json'};
11
+
12
+ describe('symitriDapRtdProvider', function() {
13
+ const testReqBidsConfigObj = {
14
+ adUnits: [
15
+ {
16
+ bids: ['bid1', 'bid2']
17
+ }
18
+ ]
19
+ };
20
+
21
+ const onDone = function() { return true };
22
+
23
+ const sampleGdprConsentConfig = {
24
+ 'gdpr': {
25
+ 'consentString': null,
26
+ 'vendorData': {},
27
+ 'gdprApplies': true
28
+ }
29
+ };
30
+
31
+ const sampleUspConsentConfig = {
32
+ 'usp': '1YYY'
33
+ };
34
+
35
+ const sampleIdentity = {
36
+ type: 'dap-signature:1.0.0'
37
+ };
38
+
39
+ const cmoduleConfig = {
40
+ 'name': 'dap',
41
+ 'waitForIt': true,
42
+ 'params': {
43
+ 'apiHostname': 'prebid.dap.akadns.net',
44
+ 'apiVersion': 'x1',
45
+ 'domain': 'prebid.org',
46
+ 'identityType': 'dap-signature:1.0.0',
47
+ 'segtax': 503
48
+ }
49
+ }
50
+
51
+ const emoduleConfig = {
52
+ 'name': 'dap',
53
+ 'waitForIt': true,
54
+ 'params': {
55
+ 'apiHostname': 'prebid.dap.akadns.net',
56
+ 'apiVersion': 'x1',
57
+ 'domain': 'prebid.org',
58
+ 'identityType': 'dap-signature:1.0.0',
59
+ 'segtax': 504
60
+ }
61
+ }
62
+
63
+ const sampleConfig = {
64
+ 'api_hostname': 'prebid.dap.akadns.net',
65
+ 'api_version': 'x1',
66
+ 'domain': 'prebid.org',
67
+ 'segtax': 503,
68
+ 'identity': sampleIdentity
69
+ }
70
+
71
+ const esampleConfig = {
72
+ 'api_hostname': 'prebid.dap.akadns.net',
73
+ 'api_version': 'x1',
74
+ 'domain': 'prebid.org',
75
+ 'segtax': 504,
76
+ 'identity': sampleIdentity
77
+ }
78
+ let cacheExpiry = Math.round(Date.now() / 1000.0) + 300; // in seconds
79
+ const sampleCachedToken = {'expires_at': cacheExpiry, 'token': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..6buzBd2BjtgoyaNbHN8YnQ.l38avCfm3sYNy798-ETYOugz0cOx1cCkjACkAhYszxzrZ0sUJ0AiF-NdDXVTiTyp2Ih3vCWKzS0rKJ8lbS1zhyEVWVu91QwtwseM2fBbwA5ggAgBEo5wV-IXqDLPxVnxsPF0D3hP6cNCiH9Q2c-vULfsLhMhG5zvvZDPBbn4hUY5fKB8LoCBTF9rbuuWGYK1nramnb4AlS5UK82wBsHQea1Ou_Kp5wWCMNZ6TZk5qKIuRBfPIAhQblWvHECaHXkg1wyoM9VASs_yNhne7RR-qkwzbFiPFiMJibNOt9hF3_vPDJO5-06ZBjRTP1BllYGWxI-uQX6InzN18Wtun2WHqg.63sH0SNlIRcsK57v0pMujfB_nhU8Y5CuQbsHqH5MGoM'};
80
+ const cachedEncryptedMembership = {'expires_at': cacheExpiry, 'encryptedSegments': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoic29tZXNlY3JldGludmF1bHQifQ..IvnIUQDqWBVYIS0gbcE9bw.Z4NZGvtogWaWlGH4e-GdYKe_PUc15M2x3Bj85rMWsN1A17mIxQIMOfg2hsQ2tgieLu5LggWPmsFu1Wbph6P0k3kOu1dVReoIhOHzxw50rP0DLHKaEZ5mLMJ7Lcosvwh4miIfFuCHlsX7J0sFgOTAp0zGo1S_UsHLtev1JflhjoSB0AoX95ALbAnyctirPuLJM8gZ1vXTiZ01jpvucGyR1lM4cWjPOeD8jPtgwaPGgSRZXE-3X2Cqy7z4Giam5Uqu74LPWTBuKtUQTGyAXA5QJoP7xwTbsU4O1f69lu3fWNqC92GijeTH1A4Zd_C-WXxWuQlDEURjlkWQoaqTHka2OqlnwukEQIf_v0r5KQQX64CTLhEUH91jeD0-E9ClcIP7pwOLxxqiKoaBmx8Mrnm_6Agj5DtTA1rusy3AL63sI_rsUxrmLrVt0Wft4aCfRkW8QpQxu8clFdOmce0NNCGeBCyCPVw9d9izrILlXJ6rItU2cpFrcbz8uw2otamF5eOFCOY3IzHedWVNNuKHFIUVC_xYSlsYvQ8f2QIP1eiMbmukcuPzmTzjw1h1_7IKaj-jJkXrnrY-TdDgX_4-_Z3rmbpXK2yTR7dBrsg-ubqFbgbKic1b4zlQEO_LbBlgPl3DYdWEuJ8CY2NUt1GfpATQGsufS2FTY1YGw_gkPe3q04l_cgLafDoxHvHh_t_0ZgPjciW82gThB_kN4RP7Mc3krVcXl_P6N1VbV07xyx0hCyVsrrxbLslI8q9wYDiLGci7mNmByM5j7SXV9jPwwPkHtn0HfMJlw2PFbIDPjgG3h7sOyLcBIJTTvuUIgpHPIkRWLIl_4FlIucXbJ7orW2nt5BWleBVHgumzGcnl9ZNcZb3W-dsdYPSOmuj0CY28MRTP2oJ1rzLInbDDpIRffJBtR7SS4nYyy7Vi09PtBigod5YNz1Q0WDSJxr8zeH_aKFaXInw7Bfo_U0IAcLiRgcT0ogsMLeQRjRFy27mr4XNJv3NtHhbdjDAwF2aClCktXyXbQaVdsPH2W71v6m2Q9rB5GQWOktw2s5f-4N1-_EBPGq6TgjF-aJZP22MJVwp1pimT50DfOzoeEqDwi862NNwNNoHmcObH0ZfwAXlhRxsgupNBe20-MNNABj2Phlfv4DUrtQbMdfCnNiypzNCmoTb7G7c_o5_JUwoV_GVkwUtvmi_IUm05P4GeMASSUw8zDKVRAj9h31C2cabM8RjMHGhkbCWpUP2pcz9zlJ7Y76Dh3RLnctfTw7DG9U4w4UlaxNZOgLUiSrGwfyapuSiuGUpuOJkBBLiHmEqAGI5C8oJpcVRccNlHxJAYowgXyFopD5Fr-FkXmv8KMkS0h5C9F6KihmDt5sqDD0qnjM0hHJgq01l7wjVnhEmPpyD-6auFQ-xDnbh1uBOJ_0gCVbRad--FSa5p-dXenggegRxOvZXJ0iAtM6Fal5Og-RCjexIHa9WhVbXhQBJpkSTWwAajZJ64eQ.yih49XB51wE-Xob7COT9OYqBrzBmIMVCQbLFx2UdzkI'};
81
+ const cachedMembership = {'expires_at': cacheExpiry, 'said': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..QwvU5h0NVJYaJbs5EqWCKA.XNaJHSlnsH8P-yBIr3gIEqavLONWDIFyj7QCHFwJVkwXH_EYkxrk0_26b0uMPzfJp5URnqxKZusMH9DzEJsmj8EMrKQv1y3IYYMsW5_0BdP5bcAWfG6fzOqtMOwLiYRkYiQOqn1ZVGzhovheHWEmNr2_oCY0LvAr3iN1eG_K-l-bBKvBWnwvuuGKquUfCqO8NMMq6wtkecEXM9blqFRZ7oNYmW2aIG7qcHUsrUW7HMr9Ev2Ik0sIeEUsOYrgf_X_VA64RgKSTRugS9FupMv1p54JkHokwduF9pOFmW8QLQi8itFogKGbbgvOTNnmahxQUX5FcrjjYLqHwKqC8htLdlHnO5LWU9l4A7vLXrRurvoSnh0cAJy0GsdoyEwTqR9bwVFHoPquxlJjQ4buEd7PIxpBj9Qg9oOPH3b2upbMTu5CQ9oj526eXPhP5G54nwGklm2AZ3Vggd7jCQJn45Jjiq0iIfsXAtpqS2BssCLBN8WhmUTnStK8m5sux6WUBdrpDESQjPj-EEHVS-DB5rA7icRUh6EzRxzen2rndvHvnwVhSG_l6cwPYuJ0HE0KBmYHOoqNpKwzoGiKFHrf4ReA06iWB3V2TEGJucGujhtQ9_18WwHCeJ1XtQiiO1eqa3tp5MwAbFXawVFl3FFOBgadrPyvGmkmUJ6FCLU2MSwHiYZmANMnJsokFX_6DwoAgO3U_QnvEHIVSvefc7ReeJ8fBDdmrH3LtuLrUpXsvLvEIMQdWQ_SXhjKIi7tOODR8CfrhUcdIjsp3PZs1DpuOcDB6YJKbGnKZTluLUJi3TyHgyi-DHXdTm-jSE5i_DYJGW-t2Gf23FoQhexv4q7gdrfsKfcRJNrZLp6Gd6jl4zHhUtY.nprKBsy9taQBk6dCPbA7BFF0CiGhQOEF_MazZ2bedqk', 'cohorts': ['9', '11', '13']};
82
+ const rtdUserObj = {
83
+ name: 'www.dataprovider3.com',
84
+ ext: {
85
+ taxonomyname: 'iab_audience_taxonomy'
86
+ },
87
+ segment: [
88
+ {
89
+ id: '1918'
90
+ },
91
+ {
92
+ id: '1939'
93
+ }
94
+ ]
95
+ };
96
+
97
+ const encRtdUserObj = {
98
+ name: 'www.dataprovider3.com',
99
+ ext: {
100
+ segtax: 504,
101
+ taxonomyname: 'iab_audience_taxonomy'
102
+ },
103
+ segment: []
104
+ };
105
+
106
+ const cachedRtd = {
107
+ rtd: {
108
+ ortb2: {
109
+ user: {
110
+ data: [rtdUserObj]
111
+ }
112
+ }
113
+ }
114
+ };
115
+
116
+ let membership = {
117
+ said: cachedMembership.said,
118
+ cohorts: cachedMembership.cohorts,
119
+ attributes: null
120
+ };
121
+ let encMembership = {
122
+ encryptedSegments: cachedEncryptedMembership.encryptedSegments
123
+ };
124
+ encRtdUserObj.segment.push({ id: encMembership.encryptedSegments });
125
+ const cachedEncRtd = {
126
+ rtd: {
127
+ ortb2: {
128
+ user: {
129
+ data: [encRtdUserObj]
130
+ }
131
+ }
132
+ }
133
+ };
134
+
135
+ before(() => {
136
+ hook.ready();
137
+ });
138
+
139
+ let ortb2, bidConfig;
140
+
141
+ beforeEach(function() {
142
+ bidConfig = {ortb2Fragments: {}};
143
+ ortb2 = bidConfig.ortb2Fragments.global = {};
144
+ config.resetConfig();
145
+ storage.removeDataFromLocalStorage(DAP_TOKEN);
146
+ storage.removeDataFromLocalStorage(DAP_MEMBERSHIP);
147
+ storage.removeDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP);
148
+ storage.removeDataFromLocalStorage(DAP_SS_ID);
149
+ });
150
+
151
+ afterEach(function () {
152
+ });
153
+
154
+ describe('symitriDapRtdSubmodule', function() {
155
+ it('successfully instantiates', function () {
156
+ expect(symitriDapRtdSubmodule.init()).to.equal(true);
157
+ });
158
+ });
159
+
160
+ describe('Get Real-Time Data', function() {
161
+ it('gets rtd from local storage cache', function() {
162
+ let dapGetMembershipFromLocalStorageStub = sinon.stub(dapUtils, 'dapGetMembershipFromLocalStorage').returns(membership)
163
+ let dapGetRtdObjStub = sinon.stub(dapUtils, 'dapGetRtdObj').returns(cachedRtd)
164
+ let dapGetEncryptedMembershipFromLocalStorageStub = sinon.stub(dapUtils, 'dapGetEncryptedMembershipFromLocalStorage').returns(encMembership)
165
+ let dapGetEncryptedRtdObjStub = sinon.stub(dapUtils, 'dapGetEncryptedRtdObj').returns(cachedEncRtd)
166
+ let callDapApisStub = sinon.stub(dapUtils, 'callDapAPIs')
167
+ try {
168
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
169
+ expect(ortb2).to.eql({});
170
+ generateRealTimeData(bidConfig, () => {}, emoduleConfig, {});
171
+
172
+ expect(ortb2.user.data).to.deep.include.members([encRtdUserObj]);
173
+ generateRealTimeData(bidConfig, () => {}, cmoduleConfig, {});
174
+ expect(ortb2.user.data).to.deep.include.members([rtdUserObj]);
175
+ } finally {
176
+ dapGetRtdObjStub.restore()
177
+ dapGetMembershipFromLocalStorageStub.restore()
178
+ dapGetEncryptedRtdObjStub.restore()
179
+ dapGetEncryptedMembershipFromLocalStorageStub.restore()
180
+ callDapApisStub.restore()
181
+ }
182
+ });
183
+ });
184
+
185
+ describe('calling DAP APIs', function() {
186
+ it('Calls callDapAPIs for unencrypted segments flow', function() {
187
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
188
+ let dapExtractExpiryFromTokenStub = sinon.stub(dapUtils, 'dapExtractExpiryFromToken').returns(cacheExpiry)
189
+ try {
190
+ expect(ortb2).to.eql({});
191
+ dapUtils.callDapAPIs(bidConfig, () => {}, cmoduleConfig, {});
192
+ let membership = {'cohorts': ['9', '11', '13'], 'said': 'sample-said'}
193
+ let membershipRequest = server.requests[0];
194
+ membershipRequest.respond(200, responseHeader, JSON.stringify(membership));
195
+ let tokenWithExpiry = 'Sample-token-with-exp'
196
+ let tokenizeRequest = server.requests[1];
197
+ responseHeader['Symitri-DAP-Token'] = tokenWithExpiry;
198
+ tokenizeRequest.respond(200, responseHeader, JSON.stringify(tokenWithExpiry));
199
+ let data = dapUtils.dapGetRtdObj(membership, cmoduleConfig.params.segtax);
200
+ expect(ortb2.user.data).to.deep.include.members(data.rtd.ortb2.user.data);
201
+ } finally {
202
+ dapExtractExpiryFromTokenStub.restore();
203
+ }
204
+ });
205
+
206
+ it('Calls callDapAPIs for encrypted segments flow', function() {
207
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
208
+ let dapExtractExpiryFromTokenStub = sinon.stub(dapUtils, 'dapExtractExpiryFromToken').returns(cacheExpiry)
209
+ try {
210
+ expect(ortb2).to.eql({});
211
+ dapUtils.callDapAPIs(bidConfig, () => {}, emoduleConfig, {});
212
+ let encMembership = 'Sample-enc-token';
213
+ let membershipRequest = server.requests[0];
214
+ responseHeader['Symitri-DAP-Token'] = encMembership;
215
+ membershipRequest.respond(200, responseHeader, JSON.stringify(encMembership));
216
+ let tokenWithExpiry = 'Sample-token-with-exp'
217
+ let tokenizeRequest = server.requests[1];
218
+ responseHeader['Symitri-DAP-Token'] = tokenWithExpiry;
219
+ tokenizeRequest.respond(200, responseHeader, JSON.stringify(tokenWithExpiry));
220
+ let data = dapUtils.dapGetEncryptedRtdObj({'encryptedSegments': encMembership}, emoduleConfig.params.segtax);
221
+ expect(ortb2.user.data).to.deep.include.members(data.rtd.ortb2.user.data);
222
+ } finally {
223
+ dapExtractExpiryFromTokenStub.restore();
224
+ }
225
+ });
226
+ });
227
+
228
+ describe('dapTokenize', function () {
229
+ it('dapTokenize error callback', function () {
230
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
231
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity, onDone,
232
+ function(token, status, xhr, onDone) {
233
+ },
234
+ function(xhr, status, error, onDone) {
235
+ }
236
+ );
237
+ let request = server.requests[0];
238
+ request.respond(400, responseHeader, JSON.stringify('error'));
239
+ expect(submoduleCallback).to.equal(undefined);
240
+ });
241
+
242
+ it('dapTokenize success callback', function () {
243
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
244
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity, onDone,
245
+ function(token, status, xhr, onDone) {
246
+ },
247
+ function(xhr, status, error, onDone) {
248
+ }
249
+ );
250
+ let request = server.requests[0];
251
+ request.respond(200, responseHeader, JSON.stringify('success'));
252
+ expect(submoduleCallback).to.equal(undefined);
253
+ });
254
+ });
255
+
256
+ describe('dapTokenize and dapMembership incorrect params', function () {
257
+ it('Onerror and config are null', function () {
258
+ expect(dapUtils.dapTokenize(null, 'identity', onDone, null, null)).to.be.equal(undefined);
259
+ expect(dapUtils.dapMembership(null, 'identity', onDone, null, null)).to.be.equal(undefined);
260
+ expect(dapUtils.dapEncryptedMembership(null, 'identity', onDone, null, null)).to.be.equal(undefined);
261
+ const config = {
262
+ 'api_hostname': 'prebid.dap.akadns.net',
263
+ 'api_version': 1,
264
+ 'domain': '',
265
+ 'segtax': 503
266
+ };
267
+ const encConfig = {
268
+ 'api_hostname': 'prebid.dap.akadns.net',
269
+ 'api_version': 1,
270
+ 'domain': '',
271
+ 'segtax': 504
272
+ };
273
+ let identity = {
274
+ type: 'dap-signature:1.0.0'
275
+ };
276
+ expect(dapUtils.dapTokenize(config, identity, onDone, null, null)).to.be.equal(undefined);
277
+ expect(dapUtils.dapMembership(config, 'token', onDone, null, null)).to.be.equal(undefined);
278
+ expect(dapUtils.dapEncryptedMembership(encConfig, 'token', onDone, null, null)).to.be.equal(undefined);
279
+ });
280
+ });
281
+
282
+ describe('Getting dapTokenize, dapMembership and dapEncryptedMembership from localstorage', function () {
283
+ it('dapGetTokenFromLocalStorage success', function () {
284
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
285
+ expect(dapUtils.dapGetTokenFromLocalStorage(60)).to.be.equal(sampleCachedToken.token);
286
+ });
287
+
288
+ it('dapGetMembershipFromLocalStorage success', function () {
289
+ storage.setDataInLocalStorage(DAP_MEMBERSHIP, JSON.stringify(cachedMembership));
290
+ expect(JSON.stringify(dapUtils.dapGetMembershipFromLocalStorage())).to.be.equal(JSON.stringify(membership));
291
+ });
292
+
293
+ it('dapGetEncryptedMembershipFromLocalStorage success', function () {
294
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(cachedEncryptedMembership));
295
+ expect(JSON.stringify(dapUtils.dapGetEncryptedMembershipFromLocalStorage())).to.be.equal(JSON.stringify(encMembership));
296
+ });
297
+ });
298
+
299
+ describe('dapMembership', function () {
300
+ it('dapMembership success callback', function () {
301
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
302
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token', onDone,
303
+ function(token, status, xhr, onDone) {
304
+ },
305
+ function(xhr, status, error, onDone) {
306
+ }
307
+ );
308
+ let request = server.requests[0];
309
+ request.respond(200, responseHeader, JSON.stringify('success'));
310
+ expect(submoduleCallback).to.equal(undefined);
311
+ });
312
+
313
+ it('dapMembership error callback', function () {
314
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
315
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token', onDone,
316
+ function(token, status, xhr, onDone) {
317
+ },
318
+ function(xhr, status, error, onDone) {
319
+ }
320
+ );
321
+ let request = server.requests[0];
322
+ request.respond(400, responseHeader, JSON.stringify('error'));
323
+ expect(submoduleCallback).to.equal(undefined);
324
+ });
325
+ });
326
+
327
+ describe('dapEncMembership', function () {
328
+ it('dapEncMembership success callback', function () {
329
+ let configAsync = JSON.parse(JSON.stringify(esampleConfig));
330
+ let submoduleCallback = dapUtils.dapEncryptedMembership(configAsync, 'token', onDone,
331
+ function(token, status, xhr, onDone) {
332
+ },
333
+ function(xhr, status, error, onDone) {
334
+ }
335
+ );
336
+ let request = server.requests[0];
337
+ request.respond(200, responseHeader, JSON.stringify('success'));
338
+ expect(submoduleCallback).to.equal(undefined);
339
+ });
340
+
341
+ it('dapEncMembership error callback', function () {
342
+ let configAsync = JSON.parse(JSON.stringify(esampleConfig));
343
+ let submoduleCallback = dapUtils.dapEncryptedMembership(configAsync, 'token', onDone,
344
+ function(token, status, xhr, onDone) {
345
+ },
346
+ function(xhr, status, error, onDone) {
347
+ }
348
+ );
349
+ let request = server.requests[0];
350
+ request.respond(400, responseHeader, JSON.stringify('error'));
351
+ expect(submoduleCallback).to.equal(undefined);
352
+ });
353
+ });
354
+
355
+ describe('dapMembership', function () {
356
+ it('should invoke the getDapToken and getDapMembership', function () {
357
+ let membership = {
358
+ said: 'item.said1',
359
+ cohorts: 'item.cohorts',
360
+ attributes: null
361
+ };
362
+
363
+ let getDapMembershipStub = sinon.stub(dapUtils, 'dapGetMembershipFromLocalStorage').returns(membership);
364
+ let callDapApisStub = sinon.stub(dapUtils, 'callDapAPIs');
365
+ try {
366
+ generateRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig);
367
+ expect(getDapMembershipStub.calledOnce).to.be.equal(true);
368
+ } finally {
369
+ getDapMembershipStub.restore();
370
+ callDapApisStub.restore();
371
+ }
372
+ });
373
+ });
374
+
375
+ describe('dapEncMembership test', function () {
376
+ it('should invoke the getDapToken and getEncDapMembership', function () {
377
+ let encMembership = {
378
+ encryptedSegments: 'enc.seg',
379
+ };
380
+
381
+ let getDapEncMembershipStub = sinon.stub(dapUtils, 'dapGetEncryptedMembershipFromLocalStorage').returns(encMembership);
382
+ let callDapApisStub = sinon.stub(dapUtils, 'callDapAPIs');
383
+ try {
384
+ generateRealTimeData(testReqBidsConfigObj, onDone, emoduleConfig);
385
+ expect(getDapEncMembershipStub.calledOnce).to.be.equal(true);
386
+ } finally {
387
+ getDapEncMembershipStub.restore();
388
+ callDapApisStub.restore();
389
+ }
390
+ });
391
+ });
392
+
393
+ describe('dapGetRtdObj test', function () {
394
+ it('dapGetRtdObj', function () {
395
+ const config = {
396
+ apiHostname: 'prebid.dap.akadns.net',
397
+ apiVersion: 'x1',
398
+ domain: 'prebid.org',
399
+ segtax: 503
400
+ };
401
+ expect(dapUtils.dapRefreshMembership(ortb2, config, 'token', onDone)).to.equal(undefined)
402
+ const membership = {cohorts: ['1', '5', '7']}
403
+ expect(dapUtils.dapGetRtdObj(membership, config.segtax)).to.not.equal(undefined);
404
+ });
405
+ });
406
+
407
+ describe('checkAndAddRealtimeData test', function () {
408
+ it('add realtime data for segtax 503 and 504', function () {
409
+ dapUtils.checkAndAddRealtimeData(ortb2, cachedEncRtd, 504);
410
+ dapUtils.checkAndAddRealtimeData(ortb2, cachedEncRtd, 504);
411
+ expect(ortb2.user.data).to.deep.include.members([encRtdUserObj]);
412
+ dapUtils.checkAndAddRealtimeData(ortb2, cachedRtd, 503);
413
+ expect(ortb2.user.data).to.deep.include.members([rtdUserObj]);
414
+ });
415
+ });
416
+
417
+ describe('dapExtractExpiryFromToken test', function () {
418
+ it('test dapExtractExpiryFromToken function', function () {
419
+ let tokenWithoutExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..6buzBd2BjtgoyaNbHN8YnQ.l38avCfm3sYNy798-ETYOugz0cOx1cCkjACkAhYszxzrZ0sUJ0AiF-NdDXVTiTyp2Ih3vCWKzS0rKJ8lbS1zhyEVWVu91QwtwseM2fBbwA5ggAgBEo5wV-IXqDLPxVnxsPF0D3hP6cNCiH9Q2c-vULfsLhMhG5zvvZDPBbn4hUY5fKB8LoCBTF9rbuuWGYK1nramnb4AlS5UK82wBsHQea1Ou_Kp5wWCMNZ6TZk5qKIuRBfPIAhQblWvHECaHXkg1wyoM9VASs_yNhne7RR-qkwzbFiPFiMJibNOt9hF3_vPDJO5-06ZBjRTP1BllYGWxI-uQX6InzN18Wtun2WHqg.63sH0SNlIRcsK57v0pMujfB_nhU8Y5CuQbsHqH5MGoM'
420
+ expect(dapUtils.dapExtractExpiryFromToken(tokenWithoutExpiry)).to.equal(undefined);
421
+ let tokenWithExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIiwiZXhwIjoxNjQzODMwMzY5fQ..hTbcSQgmmO0HUJJrQ5fRHw.7zjrQXNNVkb-GD0ZhIVhEPcWbyaDBilHTWv-bp1lFZ9mdkSC0QbcAvUbYteiTD7ya23GUwcL2WOW8WgRSHaWHOJe0B5NDqfdUGTzElWfu7fFodRxRgGmwG8Rq5xxteFKLLGHLf1mFYRJKDtjtgajGNUKIDfn9AEt-c5Qz4KU8VolG_KzrLROx-f6Z7MnoPTcwRCj0WjXD6j2D6RAZ80-mKTNIsMIELdj6xiabHcjDJ1WzwtwCZSE2y2nMs451pSYp8W-bFPfZmDDwrkjN4s9ASLlIXcXgxK-H0GsiEbckQOZ49zsIKyFtasBvZW8339rrXi1js-aBh99M7aS5w9DmXPpUDmppSPpwkeTfKiqF0cQiAUq8tpeEQrGDJuw3Qt2.XI8h9Xw-VZj_NOmKtV19wLM63S4snos7rzkoHf9FXCw'
422
+ expect(dapUtils.dapExtractExpiryFromToken(tokenWithExpiry)).to.equal(1643830369);
423
+ });
424
+ });
425
+
426
+ describe('dapRefreshToken test', function () {
427
+ it('test dapRefreshToken success response', function () {
428
+ dapUtils.dapRefreshToken(ortb2, sampleConfig, true, onDone)
429
+ let request = server.requests[0];
430
+ responseHeader['Symitri-DAP-Token'] = sampleCachedToken.token;
431
+ request.respond(200, responseHeader, JSON.stringify(sampleCachedToken.token));
432
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_TOKEN)).token).to.be.equal(sampleCachedToken.token);
433
+ });
434
+
435
+ it('test dapRefreshToken success response with deviceid 100', function () {
436
+ dapUtils.dapRefreshToken(ortb2, esampleConfig, true, onDone)
437
+ let request = server.requests[0];
438
+ responseHeader['Symitri-DAP-100'] = sampleCachedToken.token;
439
+ request.respond(200, responseHeader, '');
440
+ expect(storage.getDataFromLocalStorage('dap_deviceId100')).to.be.equal(sampleCachedToken.token);
441
+ });
442
+
443
+ it('test dapRefreshToken success response with exp claim', function () {
444
+ dapUtils.dapRefreshToken(ortb2, sampleConfig, true, onDone)
445
+ let request = server.requests[0];
446
+ let tokenWithExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIiwiZXhwIjoxNjQzODMwMzY5fQ..hTbcSQgmmO0HUJJrQ5fRHw.7zjrQXNNVkb-GD0ZhIVhEPcWbyaDBilHTWv-bp1lFZ9mdkSC0QbcAvUbYteiTD7ya23GUwcL2WOW8WgRSHaWHOJe0B5NDqfdUGTzElWfu7fFodRxRgGmwG8Rq5xxteFKLLGHLf1mFYRJKDtjtgajGNUKIDfn9AEt-c5Qz4KU8VolG_KzrLROx-f6Z7MnoPTcwRCj0WjXD6j2D6RAZ80-mKTNIsMIELdj6xiabHcjDJ1WzwtwCZSE2y2nMs451pSYp8W-bFPfZmDDwrkjN4s9ASLlIXcXgxK-H0GsiEbckQOZ49zsIKyFtasBvZW8339rrXi1js-aBh99M7aS5w9DmXPpUDmppSPpwkeTfKiqF0cQiAUq8tpeEQrGDJuw3Qt2.XI8h9Xw-VZj_NOmKtV19wLM63S4snos7rzkoHf9FXCw'
447
+ responseHeader['Symitri-DAP-Token'] = tokenWithExpiry;
448
+ request.respond(200, responseHeader, JSON.stringify(tokenWithExpiry));
449
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_TOKEN)).expires_at).to.be.equal(1643830359);
450
+ });
451
+
452
+ it('test dapRefreshToken error response', function () {
453
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
454
+ dapUtils.dapRefreshToken(ortb2, sampleConfig, false, onDone)
455
+ let request = server.requests[0];
456
+ request.respond(400, responseHeader, 'error');
457
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_TOKEN)).expires_at).to.be.equal(cacheExpiry);// Since the expiry is same, the token is not updated in the cache
458
+ });
459
+ });
460
+
461
+ describe('dapRefreshEncryptedMembership test', function () {
462
+ it('test dapRefreshEncryptedMembership success response', function () {
463
+ let expiry = Math.round(Date.now() / 1000.0) + 3600; // in seconds
464
+ let encMembership = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoic29tZXNlY3JldGludmF1bHQifQ..f8_At4OqeQXyQcSwThOJ_w.69ImVQ3bEZ6QP7ROCRpAJjNcKY49SEPYR6qTp_8l7L8kQdPbpi4wmuOzt78j7iBrX64k2wltzmQFjDmVKSxDhrEguxpgx6t-L1tT8ZA0UosMWpVsgmKEZxOn2e9ES3jw8RNCS4WSWocSPQX33xSb51evXjm9E1s0tGoLnwXl0GsUvzRsSU86wQG6RZnAQTi7s-r-M2TKibdDjUqgIt62vJ-aBZ7RWw91MINgOdmDNs1bFfbBX5Cy1kd4-kjvRDz_aJ6zHX4sK_7EmQhGEY3tW-A3_l2I88mw-RSJaPkb_IWg0QpVwXDaE2F2g8NpY1PzCRvG_NIE8r28eK5q44OMVitykHmKmBXGDj7z2JVgoXkfo5u0I-dypZARn4GP_7niK932avB-9JD7Mz3TrlU4GZ7IpYfJ91PMsRhrs5xNPQwLZbpuhF76A7Dp7iss71UjkGCiPTU6udfRb4foyf_7xEF66m1eQVcVaMdxEbMuu9GBfdr-d04TbtJhPfUV8JfxTenvRYoi13n0j5kH0M5OgaSQD9kQ3Mrd9u-Cms-BGtT0vf-N8AaFZY_wn0Y4rkpv5HEaH7z3iT4RCHINWrXb_D0WtjLTKQi2YmF8zMlzUOewNJGwZRwbRwxc7JoDIKEc5RZkJYevfJXOEEOPGXZ7AGZxOEsJawPqFqd_nOUosCZS4akHhcDPcVowoecVAV0hhhoS6JEY66PhPp1snbt6yqA-fQhch7z8Y-DZT3Scibvffww3Scg_KFANWp0KeEvHG0vyv9R2F4o66viSS8y21MDnM7Yjk8C-j7aNMldUQbjN_7Yq1nkfe0jiBX_hsINBRPgJHUY4zCaXuyXs-JZZfU92nwG0RT3A_3RP2rpY8-fXp9d3C2QJjEpnmHvTMsuAZCQSBe5DVrJwN_UKedxcJEoOt0wLz6MaCMyYZPd8tnQeqYK1cd3RgQDXtzKC0HDw1En489DqJXEst4eSSkaaW1lImLeaF8XCOaIqPqoyGk4_6KVLw5Q7OnpczuXqYKMd9UTMovGeuTuo1k0ddfEqTq9QwxkwZL51AiDRnwTCAeYBU1krV8FCJQx-mH_WPB5ftZj-o_3pbvANeRk27QBVmjcS-tgDllJkWBxX-4axRXzLw8pUUUZUT_NOL0OiqUCWVm0qMBEpgRQ57Se42-hkLMTzLhhGJOnVcaXU1j4ep-N7faNvbgREBjf_LgzvaWS90a2NJ9bB_J9FyXelhCN_AMLfdOS3fHkeWlZ0u0PMbn5DxXRMe0l9jB-2VJZhcPQRlWoYyoCO3l4F5ZmuQP5Xh9CU4tvSWih6jlwMDgdVWuTpdfPD5bx8ccog3JDq87enx-QtPzLU3gMgouNARJGgNwKS_GJSE1uPrt2oiqgZ3Z0u_I5MKvPdQPV3o-4rsaE730eB4OwAOF-mkGWpzy8Pbl-Qe5PR9mHBhuyJgZ-WDSCHl5yvet2kfO9mPXZlqBQ26fzTcUYH94MULAZn36og6w.3iKGv-Le-AvRmi26W1v6ibRLGbwKbCR92vs-a9t55hw';
465
+ dapUtils.dapRefreshEncryptedMembership(ortb2, esampleConfig, sampleCachedToken.token, onDone)
466
+ let request = server.requests[0];
467
+ responseHeader['Symitri-DAP-Token'] = encMembership;
468
+ request.respond(200, responseHeader, encMembership);
469
+ let rtdObj = dapUtils.dapGetEncryptedRtdObj({'encryptedSegments': encMembership}, 504)
470
+ expect(ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
471
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP)).expires_at).to.equal(expiry);
472
+ });
473
+
474
+ it('test dapRefreshEncryptedMembership success response with exp claim', function () {
475
+ let encMembership = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoic29tZXNlY3JldGludmF1bHQiLCJleHAiOjE2NDM4MzA2NDB9..inYoxwht_aqTIWqGhEm_Gw.wDcCUOCwtqgnNUouaD723gKfm7X7bgkHgtiX4mr07P3tWk25PUQunmwTLhWBB5CYzzGIfIvveG_u4glNRLi_eRSQV4ihKKk1AN-BSSJ3d0CLAdY9I1WG5vX1VmopXyKnV90bl9SLNqnhg4Vxe6YU4ogTYxsKHuIN1EeIH4hpl-HbCQWQ1DQt4mB-MQF8V9AWTfU0D7sFMSK8f9qj6NGmf1__oHdHUlws0t5V2UAn_dhJexsuREK_gh65pczCuly5eEcziZ82LeP-nOhKWSRHB_tS_mKXrRU6_At_EVDgtfA3PSBJ6eQylCii6bTL42vZzz4jZhJv_3eLfRdKqpVT5CWNBzcDoQ2VcQgKgIBtPJ45KFfAYTQ6kdl21QMSjqtu8GTsv1lEZtrqHY6zRiG8_Mu28-PmjEw4LDdZmBDOeroue_MJD6wuE_jlE7J2iVdo8CkVnoRgzFwNbKBo7CK4z0WahV9rhuOm0LKAN5H0jF_gj696U-3fVTDTIb8ndNKNI2_xAhvWs00BFGtUtWgr8QGDGRTDCNGsDgnb_Vva9xCqVOyAE9O3Fq1QYl-tMA-KkBt3zzvmFFpOxpOyH-lUubKLKlsrxKc3GSyVEQ9DDLhrXXJgR5H5BSE4tjlK7p3ODF5qz0FHtIj7oDcgLazFO7z2MuFy2LjJmd3hKl6ujcfYEDiQ4D3pMIo7oiU33aFBD1YpzI4-WzNfJlUt1FoK0-DAXpbbV95s8p08GOD4q81rPw5hRADKJEr0QzrbDwplTWCzT2fKXMg_dIIc5AGqGKnVRUS6UyF1DnHpudNIJWxyWZjWIEw_QNjU0cDFmyPSyKxNrnfq9w8WE2bfbS5KTicxei5QHnC-cnL7Nh7IXp7WOW6R1YHbNPT7Ad4OhnlV-jjrXwkSv4wMAbfwAWoSCchGh7uvENNAeJymuponlJbOgw_GcYM73hMs8Z8W9qxRfbyF4WX5fDKXg61mMlaieHkc0EnoC5q7uKyXuZUehHZ76JLDFmewslLkQq5SkVCttzJePBnY1ouPEHw5ZTzUnG5f01QQOVcjIN-AqXNDbG5IOwq0heyS6vVfq7lZKJdLDVQ21qRjazGPaqYwLzugkWkzCOzPTgyFdbXzgjfmJwylHSOM5Jpnul84GzxEQF-1mHP2A8wtIT-M7_iX24It2wwWvc8qLA6GEqruWCtNyoug8CXo44mKdSSCGeEZHtfMbzXdLIBHCy2jSHz5i8S7DU_R7rE_5Ssrb81CqIYbgsAQBHtOYoyvzduTOruWcci4De0QcULloqImIEHUuIe2lnYO889_LIx5p7nE3UlSvLBo0sPexavFUtHqI6jdG6ye9tdseUEoNBDXW0aWD4D-KXX1JLtAgToPVUtEaXCJI7QavwO9ZG6UZM6jbfuJ5co0fvUXp6qYrFxPQo2dYHkar0nT6s1Zg5l2g8yWlLUJrHdHAzAw_NScUp71OpM4TmNsLnYaPVPcOxMvtJXTanbNWr0VKc8gy9q3k_1XxAnQwiduNs7f5bA-6qCVpayHv5dE7mUhFEwyh1_w95jEaURsQF_hnnd2OqRkADfiok4ZiPU2b38kFW1LXjpI39XXES3JU0e08Rq2uuelyLbCLWuJWq_axuKSZbZvpYeqWtIAde8FjCiO7RPlEc0nyzWBst8RBxQ-Bekg9UXPhxBRcm0HwA.Q2cBSFOQAC-QKDwmjrQXnVQd3jNOppMl9oZfd2yuKeY';
476
+ dapUtils.dapRefreshEncryptedMembership(ortb2, esampleConfig, sampleCachedToken.token, onDone)
477
+ let request = server.requests[0];
478
+ responseHeader['Symitri-DAP-Token'] = encMembership;
479
+ request.respond(200, responseHeader, encMembership);
480
+ let rtdObj = dapUtils.dapGetEncryptedRtdObj({'encryptedSegments': encMembership}, 504)
481
+ expect(ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
482
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP)).expires_at).to.equal(1643830630);
483
+ });
484
+
485
+ it('test dapRefreshEncryptedMembership error response', function () {
486
+ dapUtils.dapRefreshEncryptedMembership(ortb2, esampleConfig, sampleCachedToken.token, onDone)
487
+ let request = server.requests[0];
488
+ request.respond(400, responseHeader, 'error');
489
+ expect(ortb2).to.eql({});
490
+ });
491
+
492
+ it('test dapRefreshEncryptedMembership 403 error response', function () {
493
+ dapUtils.dapRefreshEncryptedMembership(ortb2, esampleConfig, sampleCachedToken.token, onDone)
494
+ let request = server.requests[0];
495
+ request.respond(403, responseHeader, 'error');
496
+ let requestTokenize = server.requests[1];
497
+ responseHeader['Symitri-DAP-Token'] = sampleCachedToken.token;
498
+ requestTokenize.respond(200, responseHeader, '');
499
+ let requestMembership = server.requests[2];
500
+ requestMembership.respond(403, responseHeader, 'error');
501
+ expect(server.requests.length).to.be.equal(DAP_MAX_RETRY_TOKENIZE + 2);
502
+ });
503
+ });
504
+
505
+ describe('dapRefreshMembership test', function () {
506
+ it('test dapRefreshMembership success response', function () {
507
+ let membership = {'cohorts': ['9', '11', '13'], 'said': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..17wnrhz6FbWx0Cf6LXpm1A.m9PKVCradk3CZokNKzVHzE06TOqiXYeijgxTQUiQy5Syx-yicnO8DyYX6zQ6rgPcNgUNRt4R4XE5MXuK0laUVQJr9yc9g3vUfQfw69OMYGW_vRlLMPzoNOhF2c4gSyfkRrLr7C0qgALmZO1D11sPflaCTNmO7pmZtRaCOB5buHoWcQhp1bUSJ09DNDb31dX3llimPwjNGSrUhyq_EZl4HopnnjxbM4qVNMY2G_43C_idlVOvbFoTxcDRATd-6MplJoIOIHQLDZEetpIOVcbEYN9gQ_ndBISITwuu5YEgs5C_WPHA25nm6e4BT5R-tawSA8yPyQAupqE8gk4ZWq_2-T0cqyTstIHrMQnZ_vysYN7h6bkzE-KeZRk7GMtySN87_fiu904hLD9QentGegamX6UAbVqQh7Htj7SnMHXkEenjxXAM5mRqQvNCTlw8k-9-VPXs-vTcKLYP8VFf8gMOmuYykgWac1gX-svyAg-24mo8cUbqcsj9relx4Qj5HiXUVyDMBZxK-mHZi-Xz6uv9GlggcsjE13DSszar-j2OetigpdibnJIxRZ-4ew3-vlvZ0Dul3j0LjeWURVBWYWfMjuZ193G7lwR3ohh_NzlNfwOPBK_SYurdAnLh7jJgTW-lVLjH2Dipmi9JwX9s03IQq9opexAn7hlM9oBI6x5asByH8JF8WwZ5GhzDjpDwpSmHPQNGFRSyrx_Sh2CPWNK6C1NJmLkyqAtJ5iw0_al7vPDQyZrKXaLTjBCUnbpJhUZ8dUKtWLzGPjzFXp10muoDIutd1NfyKxk1aWGhx5aerYuLdywv6cT_M8RZTi8924NGj5VA30V5OvEwLLyX93eDhntXZSCbkPHpAfiRZNGXrPY.GhCbWGQz11mIRD4uPKmoAuFXDH7hGnils54zg7N7-TU'}
508
+ dapUtils.dapRefreshMembership(ortb2, sampleConfig, sampleCachedToken.token, onDone);
509
+ let request = server.requests[0];
510
+ request.respond(200, responseHeader, JSON.stringify(membership));
511
+ let rtdObj = dapUtils.dapGetRtdObj(membership, 503);
512
+ expect(ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
513
+ });
514
+
515
+ it('test dapRefreshMembership success response with exp claim', function () {
516
+ let membership = {'cohorts': ['9', '11', '13'], 'said': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIiwiZXhwIjoxNjQ3OTcxNTU4fQ..ptdM5WO-62ypXlKxFXD4FQ.waEo9MHS2NYQCi-zh_p6HgT9BdqGyQbBq4GfGLfsay4nRBgICsTS-VkV6e7xx5U1T8BgpKkRJIZBwTOY5Pkxk9FpK5nnffDSEljRrp1LXLCkNP4qwrlqHInFbZsonNWW4_mW-7aUPlTwIsTbfjTuyHdXHeQa1ALrwFFFWE7QUmPNd2RsHjDwUsxlJPEb5TnHn5W0Mgo_PQZaxvhJInMbxPgtJLoqnJvOqCBEoQY7au7ALZL_nWK8XIwPMF19J7Z3cBg9vQInhr_E3rMdQcAFHEzYfgoNcIYCCR0t1UOqUE3HNtX-E64kZAYKWdlsBb9eW5Gj9hHYyPNL_4Hntjg5eLXGpsocMg0An-qQKGC6hkrxKzeM-GrjpvSaQLNs4iqDpHUtzA02LW_vkLkMNRUiyXVJ3FUZwfyq6uHSRKWZ6UFdAfL0rfJ8q8x8Ll-qJO2Jfyvidlsi9FIs7x1WJrvDCKepfAQM1UXRTonrQljFBAk83PcL2bmWuJDgJZ0lWS4VnZbIf6A7fDourmkDxdVRptvQq5nSjtzCA6whRw0-wGz8ehNJsaJw9H_nG9k4lRKs7A5Lqsyy7TVFrAPjnA_Q1a2H6xF2ULxrtIqoNqdX7k9RjowEZSQlZgZUOAmI4wzjckdcSyC_pUlYBMcBwmlld34mmOJe9EBHAxjdci7Q_9lvj1HTcwGDcQITXnkW9Ux5Jkt9Naw-IGGrnEIADaT2guUAto8W_Gb05TmwHSd6DCmh4zepQCbqeVe6AvPILtVkTgsTTo27Q-NvS7h-XtthJy8425j5kqwxxpZFJ0l0ytc6DUyNCLJXuxi0JFU6-LoSXcROEMVrHa_Achufr9vHIELwacSAIHuwseEvg_OOu1c1WYEwZH8ynBLSjqzy8AnDj24hYgA0YanPAvDqacrYrTUFqURbHmvcQqLBTcYa_gs7uDx4a1EjtP_NvHRlvCgGAaASrjGMhTX8oJxlTqahhQ.pXm-7KqnNK8sbyyczwkVYhcjgiwkpO8LjBBVw4lcyZE'};
517
+ dapUtils.dapRefreshMembership(ortb2, sampleConfig, sampleCachedToken.token, onDone);
518
+ let request = server.requests[0];
519
+ request.respond(200, responseHeader, JSON.stringify(membership));
520
+ let rtdObj = dapUtils.dapGetRtdObj(membership, 503)
521
+ expect(ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
522
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_MEMBERSHIP)).expires_at).to.be.equal(1647971548);
523
+ });
524
+
525
+ it('test dapRefreshMembership 400 error response', function () {
526
+ dapUtils.dapRefreshMembership(ortb2, sampleConfig, sampleCachedToken.token, onDone)
527
+ let request = server.requests[0];
528
+ request.respond(400, responseHeader, 'error');
529
+ expect(ortb2).to.eql({});
530
+ });
531
+
532
+ it('test dapRefreshMembership 403 error response', function () {
533
+ dapUtils.dapRefreshMembership(ortb2, sampleConfig, sampleCachedToken.token, onDone)
534
+ let request = server.requests[0];
535
+ request.respond(403, responseHeader, 'error');
536
+ expect(server.requests.length).to.be.equal(DAP_MAX_RETRY_TOKENIZE);
537
+ });
538
+ });
539
+
540
+ describe('dapGetEncryptedMembershipFromLocalStorage test', function () {
541
+ it('test dapGetEncryptedMembershipFromLocalStorage function with valid cache', function () {
542
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(cachedEncryptedMembership))
543
+ expect(JSON.stringify(dapUtils.dapGetEncryptedMembershipFromLocalStorage())).to.equal(JSON.stringify(encMembership));
544
+ });
545
+
546
+ it('test dapGetEncryptedMembershipFromLocalStorage function with invalid cache', function () {
547
+ let expiry = Math.round(Date.now() / 1000.0) - 100; // in seconds
548
+ let encMembership = {'expiry': expiry, 'encryptedSegments': cachedEncryptedMembership.encryptedSegments}
549
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(encMembership))
550
+ expect(dapUtils.dapGetEncryptedMembershipFromLocalStorage()).to.equal(null);
551
+ });
552
+ });
553
+
554
+ describe('Symitri-DAP-SS-ID test', function () {
555
+ it('Symitri-DAP-SS-ID present in response header', function () {
556
+ let expiry = Math.round(Date.now() / 1000.0) + 300; // in seconds
557
+ dapUtils.dapRefreshToken(ortb2, sampleConfig, false, onDone)
558
+ let request = server.requests[0];
559
+ let sampleSSID = 'Test_SSID_Spec';
560
+ responseHeader['Symitri-DAP-Token'] = sampleCachedToken.token;
561
+ responseHeader['Symitri-DAP-SS-ID'] = sampleSSID;
562
+ request.respond(200, responseHeader, '');
563
+ expect(storage.getDataFromLocalStorage(DAP_SS_ID)).to.be.equal(JSON.stringify(sampleSSID));
564
+ });
565
+
566
+ it('Test if Symitri-DAP-SS-ID is present in request header', function () {
567
+ let expiry = Math.round(Date.now() / 1000.0) + 100; // in seconds
568
+ storage.setDataInLocalStorage(DAP_SS_ID, JSON.stringify('Test_SSID_Spec'))
569
+ dapUtils.dapRefreshToken(ortb2, sampleConfig, false, onDone)
570
+ let request = server.requests[0];
571
+ let ssidHeader = request.requestHeaders['Symitri-DAP-SS-ID'];
572
+ responseHeader['Symitri-DAP-Token'] = sampleCachedToken.token;
573
+ request.respond(200, responseHeader, '');
574
+ expect(ssidHeader).to.be.equal('Test_SSID_Spec');
575
+ });
576
+ });
577
+
578
+ describe('Test gdpr and usp consent handling', function () {
579
+ it('Gdpr applies and gdpr consent string not present', function () {
580
+ expect(symitriDapRtdSubmodule.init(null, sampleGdprConsentConfig)).to.equal(false);
581
+ });
582
+
583
+ it('Gdpr applies and gdpr consent string is present', function () {
584
+ sampleGdprConsentConfig.gdpr.consentString = 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==';
585
+ expect(symitriDapRtdSubmodule.init(null, sampleGdprConsentConfig)).to.equal(true);
586
+ });
587
+
588
+ it('USP consent present and user have opted out', function () {
589
+ expect(symitriDapRtdSubmodule.init(null, sampleUspConsentConfig)).to.equal(false);
590
+ });
591
+
592
+ it('USP consent present and user have not been provided with option to opt out', function () {
593
+ expect(symitriDapRtdSubmodule.init(null, {'usp': '1NYY'})).to.equal(false);
594
+ });
595
+
596
+ it('USP consent present and user have not opted out', function () {
597
+ expect(symitriDapRtdSubmodule.init(null, {'usp': '1YNY'})).to.equal(true);
598
+ });
599
+ });
600
+ });