prebid.js 6.26.0 → 6.27.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 (188) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adWMGAnalyticsAdapter.js +1 -1
  3. package/dist/adagioAnalyticsAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  8. package/dist/adlooxAdServerVideo.js +1 -1
  9. package/dist/adlooxAnalyticsAdapter.js +1 -1
  10. package/dist/adlooxRtdProvider.js +1 -1
  11. package/dist/adomikAnalyticsAdapter.js +1 -1
  12. package/dist/adrelevantisBidAdapter.js +1 -1
  13. package/dist/adxcgAnalyticsAdapter.js +1 -1
  14. package/dist/adxcgBidAdapter.js +1 -1
  15. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  16. package/dist/ajaBidAdapter.js +1 -1
  17. package/dist/akamaiDapRtdProvider.js +1 -1
  18. package/dist/amxBidAdapter.js +1 -1
  19. package/dist/amxIdSystem.js +1 -1
  20. package/dist/appierAnalyticsAdapter.js +1 -1
  21. package/dist/appnexusAnalyticsAdapter.js +1 -1
  22. package/dist/appnexusBidAdapter.js +1 -1
  23. package/dist/asoBidAdapter.js +1 -1
  24. package/dist/atsAnalyticsAdapter.js +1 -1
  25. package/dist/axonixBidAdapter.js +1 -1
  26. package/dist/bidglassBidAdapter.js +1 -1
  27. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  28. package/dist/big-richmediaBidAdapter.js +1 -1
  29. package/dist/bridgewellBidAdapter.js +1 -1
  30. package/dist/brightMountainMediaBidAdapter.js +1 -1
  31. package/dist/byDataAnalyticsAdapter.js +1 -1
  32. package/dist/colossussspBidAdapter.js +1 -1
  33. package/dist/concertAnalyticsAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consumableBidAdapter.js +1 -1
  37. package/dist/conversantBidAdapter.js +1 -1
  38. package/dist/craftBidAdapter.js +1 -1
  39. package/dist/criteoBidAdapter.js +1 -1
  40. package/dist/datablocksAnalyticsAdapter.js +1 -1
  41. package/dist/dspxBidAdapter.js +1 -1
  42. package/dist/eplanningAnalyticsAdapter.js +1 -1
  43. package/dist/eplanningBidAdapter.js +1 -1
  44. package/dist/fintezaAnalyticsAdapter.js +1 -1
  45. package/dist/ftrackIdSystem.js +1 -1
  46. package/dist/glimpseBidAdapter.js +1 -1
  47. package/dist/gmosspBidAdapter.js +1 -1
  48. package/dist/goldbachBidAdapter.js +1 -1
  49. package/dist/gridBidAdapter.js +1 -1
  50. package/dist/gridNMBidAdapter.js +1 -1
  51. package/dist/gumgumBidAdapter.js +1 -1
  52. package/dist/h12mediaBidAdapter.js +1 -1
  53. package/dist/hadronAnalyticsAdapter.js +1 -1
  54. package/dist/id5AnalyticsAdapter.js +1 -1
  55. package/dist/id5IdSystem.js +1 -1
  56. package/dist/improvedigitalBidAdapter.js +1 -1
  57. package/dist/inmarBidAdapter.js +1 -1
  58. package/dist/insticatorBidAdapter.js +1 -1
  59. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  60. package/dist/ixBidAdapter.js +1 -1
  61. package/dist/justpremiumBidAdapter.js +1 -1
  62. package/dist/kargoAnalyticsAdapter.js +1 -1
  63. package/dist/koblerBidAdapter.js +1 -1
  64. package/dist/konduitAnalyticsAdapter.js +1 -1
  65. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  66. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  67. package/dist/logicadBidAdapter.js +1 -1
  68. package/dist/loglyliftBidAdapter.js +1 -1
  69. package/dist/malltvAnalyticsAdapter.js +1 -1
  70. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  71. package/dist/marsmediaBidAdapter.js +1 -1
  72. package/dist/mediafuseBidAdapter.js +1 -1
  73. package/dist/medianetAnalyticsAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/naveggIdSystem.js +1 -1
  78. package/dist/not-for-prod/prebid.js +153 -152
  79. package/dist/novatiqIdSystem.js +1 -1
  80. package/dist/oguryBidAdapter.js +1 -1
  81. package/dist/oneVideoBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/openxAnalyticsAdapter.js +1 -1
  85. package/dist/optimonAnalyticsAdapter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/parrableIdSystem.js +1 -1
  88. package/dist/pixfutureBidAdapter.js +1 -1
  89. package/dist/prebid-core.js +3 -3
  90. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  93. package/dist/pubmaticBidAdapter.js +1 -1
  94. package/dist/pubperfAnalyticsAdapter.js +1 -1
  95. package/dist/pubstackAnalyticsAdapter.js +1 -1
  96. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  97. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  98. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  99. package/dist/pxyzBidAdapter.js +1 -1
  100. package/dist/quantcastBidAdapter.js +1 -1
  101. package/dist/readpeakBidAdapter.js +1 -1
  102. package/dist/realvuAnalyticsAdapter.js +1 -1
  103. package/dist/relaidoBidAdapter.js +1 -1
  104. package/dist/relevantAnalyticsAdapter.js +1 -1
  105. package/dist/rhythmoneBidAdapter.js +1 -1
  106. package/dist/riseBidAdapter.js +1 -1
  107. package/dist/rivrAnalyticsAdapter.js +1 -1
  108. package/dist/roxotAnalyticsAdapter.js +1 -1
  109. package/dist/rubiconAnalyticsAdapter.js +1 -1
  110. package/dist/rubiconBidAdapter.js +1 -1
  111. package/dist/scaleableAnalyticsAdapter.js +1 -1
  112. package/dist/seedingAllianceBidAdapter.js +1 -1
  113. package/dist/seedtagBidAdapter.js +1 -1
  114. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  115. package/dist/sharethroughBidAdapter.js +1 -1
  116. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  117. package/dist/smaatoBidAdapter.js +1 -1
  118. package/dist/smartadserverBidAdapter.js +1 -1
  119. package/dist/smartxBidAdapter.js +1 -1
  120. package/dist/smilewantedBidAdapter.js +1 -1
  121. package/dist/sonobiAnalyticsAdapter.js +1 -1
  122. package/dist/sonobiBidAdapter.js +1 -1
  123. package/dist/sortableAnalyticsAdapter.js +1 -1
  124. package/dist/sortableBidAdapter.js +1 -1
  125. package/dist/sovrnAnalyticsAdapter.js +1 -1
  126. package/dist/sovrnBidAdapter.js +1 -1
  127. package/dist/sspBCBidAdapter.js +1 -1
  128. package/dist/staqAnalyticsAdapter.js +1 -1
  129. package/dist/sublimeBidAdapter.js +1 -1
  130. package/dist/synacormediaBidAdapter.js +1 -1
  131. package/dist/taboolaBidAdapter.js +1 -0
  132. package/dist/targetVideoBidAdapter.js +1 -1
  133. package/dist/teadsBidAdapter.js +1 -1
  134. package/dist/terceptAnalyticsAdapter.js +1 -1
  135. package/dist/trionBidAdapter.js +1 -1
  136. package/dist/tripleliftBidAdapter.js +1 -1
  137. package/dist/trustxBidAdapter.js +1 -1
  138. package/dist/ttdBidAdapter.js +1 -1
  139. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  140. package/dist/underdogmediaBidAdapter.js +1 -1
  141. package/dist/undertoneBidAdapter.js +1 -1
  142. package/dist/vidazooBidAdapter.js +1 -1
  143. package/dist/videobyteBidAdapter.js +1 -1
  144. package/dist/visxBidAdapter.js +1 -1
  145. package/dist/vuukleBidAdapter.js +1 -1
  146. package/dist/widespaceBidAdapter.js +1 -1
  147. package/dist/winrBidAdapter.js +1 -1
  148. package/dist/yahoosspBidAdapter.js +1 -1
  149. package/dist/yieldmoBidAdapter.js +1 -1
  150. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  151. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  152. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  153. package/integrationExamples/gpt/akamaidap_segments_example.html +5 -3
  154. package/modules/.submodules.json +1 -0
  155. package/modules/adlooxAnalyticsAdapter.js +9 -5
  156. package/modules/adlooxAnalyticsAdapter.md +3 -3
  157. package/modules/adlooxRtdProvider.js +3 -5
  158. package/modules/adlooxRtdProvider.md +2 -2
  159. package/modules/akamaiDapRtdProvider.js +460 -130
  160. package/modules/akamaiDapRtdProvider.md +5 -3
  161. package/modules/colossussspBidAdapter.js +17 -17
  162. package/modules/conversantBidAdapter.js +2 -2
  163. package/modules/ftrackIdSystem.js +3 -4
  164. package/modules/hadronAnalyticsAdapter.js +5 -1
  165. package/modules/koblerBidAdapter.js +54 -45
  166. package/modules/koblerBidAdapter.md +12 -17
  167. package/modules/naveggIdSystem.js +3 -2
  168. package/modules/novatiqIdSystem.js +6 -1
  169. package/modules/relaidoBidAdapter.js +0 -3
  170. package/modules/taboolaBidAdapter.js +265 -0
  171. package/modules/taboolaBidAdapter.md +49 -0
  172. package/package.json +1 -1
  173. package/src/AnalyticsAdapter.js +5 -1
  174. package/src/adloader.js +2 -1
  175. package/test/mocks/analyticsStub.js +13 -0
  176. package/test/mocks/xhr.js +22 -0
  177. package/test/spec/AnalyticsAdapter_spec.js +4 -0
  178. package/test/spec/modules/akamaiDapRtdProvider_spec.js +402 -108
  179. package/test/spec/modules/conversantBidAdapter_spec.js +36 -5
  180. package/test/spec/modules/datablocksBidAdapter_spec.js +9 -8
  181. package/test/spec/modules/fintezaAnalyticsAdapter_spec.js +4 -4
  182. package/test/spec/modules/ftrackIdSystem_spec.js +1 -9
  183. package/test/spec/modules/koblerBidAdapter_spec.js +160 -124
  184. package/test/spec/modules/naveggIdSystem_spec.js +25 -1
  185. package/test/spec/modules/proxistoreBidAdapter_spec.js +0 -2
  186. package/test/spec/modules/sovrnBidAdapter_spec.js +253 -264
  187. package/test/spec/modules/taboolaBidAdapter_spec.js +455 -0
  188. package/test/test_deps.js +1 -0
@@ -1,13 +1,14 @@
1
1
  import {config} from 'src/config.js';
2
- import {SEGMENTS_STORAGE_KEY, TOKEN_STORAGE_KEY, dapUtils, addRealTimeData, getRealTimeData, akamaiDapRtdSubmodule, storage} from 'modules/akamaiDapRtdProvider.js';
2
+ import {
3
+ dapUtils,
4
+ generateRealTimeData,
5
+ akamaiDapRtdSubmodule,
6
+ storage, DAP_MAX_RETRY_TOKENIZE, DAP_SS_ID, DAP_TOKEN, DAP_MEMBERSHIP, DAP_ENCRYPTED_MEMBERSHIP,
7
+ } from 'modules/akamaiDapRtdProvider.js';
3
8
  import {server} from 'test/mocks/xhr.js';
4
- import logMessage from 'src/utils.js'
5
9
  const responseHeader = {'Content-Type': 'application/json'};
6
10
 
7
11
  describe('akamaiDapRtdProvider', function() {
8
- let getDataFromLocalStorageStub;
9
- let getDapTokenStub;
10
-
11
12
  const testReqBidsConfigObj = {
12
13
  adUnits: [
13
14
  {
@@ -18,7 +19,21 @@ describe('akamaiDapRtdProvider', function() {
18
19
 
19
20
  const onDone = function() { return true };
20
21
 
21
- const onSuccess = function() { return ('request', 200, 'success') };
22
+ const sampleGdprConsentConfig = {
23
+ 'gdpr': {
24
+ 'consentString': null,
25
+ 'vendorData': {},
26
+ 'gdprApplies': true
27
+ }
28
+ };
29
+
30
+ const sampleUspConsentConfig = {
31
+ 'usp': '1YYY'
32
+ };
33
+
34
+ const sampleIdentity = {
35
+ type: 'dap-signature:1.0.0'
36
+ };
22
37
 
23
38
  const cmoduleConfig = {
24
39
  'name': 'dap',
@@ -28,8 +43,19 @@ describe('akamaiDapRtdProvider', function() {
28
43
  'apiVersion': 'x1',
29
44
  'domain': 'prebid.org',
30
45
  'identityType': 'dap-signature:1.0.0',
31
- 'segtax': 503,
32
- 'tokenTtl': 5
46
+ 'segtax': 503
47
+ }
48
+ }
49
+
50
+ const emoduleConfig = {
51
+ 'name': 'dap',
52
+ 'waitForIt': true,
53
+ 'params': {
54
+ 'apiHostname': 'prebid.dap.akadns.net',
55
+ 'apiVersion': 'x1',
56
+ 'domain': 'prebid.org',
57
+ 'identityType': 'dap-signature:1.0.0',
58
+ 'segtax': 504
33
59
  }
34
60
  }
35
61
 
@@ -37,81 +63,119 @@ describe('akamaiDapRtdProvider', function() {
37
63
  'api_hostname': 'prebid.dap.akadns.net',
38
64
  'api_version': 'x1',
39
65
  'domain': 'prebid.org',
40
- 'segtax': 503
66
+ 'segtax': 503,
67
+ 'identity': sampleIdentity
41
68
  }
42
- const sampleIdentity = {
43
- type: 'dap-signature:1.0.0'
69
+
70
+ const esampleConfig = {
71
+ 'api_hostname': 'prebid.dap.akadns.net',
72
+ 'api_version': 'x1',
73
+ 'domain': 'prebid.org',
74
+ 'segtax': 504,
75
+ 'identity': sampleIdentity
76
+ }
77
+ let cacheExpiry = Math.round(Date.now() / 1000.0) + 300; // in seconds
78
+ const sampleCachedToken = {'expires_at': cacheExpiry, 'token': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..6buzBd2BjtgoyaNbHN8YnQ.l38avCfm3sYNy798-ETYOugz0cOx1cCkjACkAhYszxzrZ0sUJ0AiF-NdDXVTiTyp2Ih3vCWKzS0rKJ8lbS1zhyEVWVu91QwtwseM2fBbwA5ggAgBEo5wV-IXqDLPxVnxsPF0D3hP6cNCiH9Q2c-vULfsLhMhG5zvvZDPBbn4hUY5fKB8LoCBTF9rbuuWGYK1nramnb4AlS5UK82wBsHQea1Ou_Kp5wWCMNZ6TZk5qKIuRBfPIAhQblWvHECaHXkg1wyoM9VASs_yNhne7RR-qkwzbFiPFiMJibNOt9hF3_vPDJO5-06ZBjRTP1BllYGWxI-uQX6InzN18Wtun2WHqg.63sH0SNlIRcsK57v0pMujfB_nhU8Y5CuQbsHqH5MGoM'};
79
+ 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'};
80
+ 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']};
81
+ const rtdUserObj = {
82
+ name: 'www.dataprovider3.com',
83
+ ext: {
84
+ taxonomyname: 'iab_audience_taxonomy'
85
+ },
86
+ segment: [
87
+ {
88
+ id: '1918'
89
+ },
90
+ {
91
+ id: '1939'
92
+ }
93
+ ]
94
+ };
95
+
96
+ const encRtdUserObj = {
97
+ name: 'www.dataprovider3.com',
98
+ ext: {
99
+ segtax: 504,
100
+ taxonomyname: 'iab_audience_taxonomy'
101
+ },
102
+ segment: []
103
+ };
104
+
105
+ const cachedRtd = {
106
+ rtd: {
107
+ ortb2: {
108
+ user: {
109
+ data: [rtdUserObj]
110
+ }
111
+ }
112
+ }
113
+ };
114
+
115
+ let membership = {
116
+ said: cachedMembership.said,
117
+ cohorts: cachedMembership.cohorts,
118
+ attributes: null
119
+ };
120
+ let encMembership = {
121
+ encryptedSegments: cachedEncryptedMembership.encryptedSegments
122
+ };
123
+ encRtdUserObj.segment.push({ id: encMembership.encryptedSegments });
124
+ const cachedEncRtd = {
125
+ rtd: {
126
+ ortb2: {
127
+ user: {
128
+ data: [encRtdUserObj]
129
+ }
130
+ }
131
+ }
44
132
  };
45
133
 
46
134
  beforeEach(function() {
47
135
  config.resetConfig();
48
- getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage')
136
+ storage.removeDataFromLocalStorage(DAP_TOKEN);
137
+ storage.removeDataFromLocalStorage(DAP_MEMBERSHIP);
138
+ storage.removeDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP);
139
+ storage.removeDataFromLocalStorage(DAP_SS_ID);
49
140
  });
50
141
 
51
142
  afterEach(function () {
52
- getDataFromLocalStorageStub.restore();
53
143
  });
54
144
 
55
145
  describe('akamaiDapRtdSubmodule', function() {
56
146
  it('successfully instantiates', function () {
57
- expect(akamaiDapRtdSubmodule.init()).to.equal(true);
147
+ expect(akamaiDapRtdSubmodule.init()).to.equal(true);
58
148
  });
59
149
  });
60
150
 
61
151
  describe('Get Real-Time Data', function() {
62
152
  it('gets rtd from local storage cache', function() {
63
- const rtdConfig = {
64
- params: {
65
- segmentCache: true
66
- }
67
- };
68
-
69
153
  const bidConfig = {};
70
-
71
- const rtdUserObj1 = {
72
- name: 'www.dataprovider3.com',
73
- ext: {
74
- taxonomyname: 'iab_audience_taxonomy'
75
- },
76
- segment: [
77
- {
78
- id: '1918'
79
- },
80
- {
81
- id: '1939'
82
- }
83
- ]
84
- };
85
-
86
- const cachedRtd = {
87
- rtd: {
88
- ortb2: {
89
- user: {
90
- data: [rtdUserObj1]
91
- }
92
- }
93
- }
94
- };
95
-
96
- getDataFromLocalStorageStub.withArgs(SEGMENTS_STORAGE_KEY).returns(JSON.stringify(cachedRtd));
154
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
155
+ let dapGetMembershipFromLocalStorageStub = sinon.stub(dapUtils, 'dapGetMembershipFromLocalStorage').returns(membership)
156
+ let dapGetRtdObjStub = sinon.stub(dapUtils, 'dapGetRtdObj').returns(cachedRtd)
157
+ let dapGetEncryptedMembershipFromLocalStorageStub = sinon.stub(dapUtils, 'dapGetEncryptedMembershipFromLocalStorage').returns(encMembership)
158
+ let dapGetEncryptedRtdObjStub = sinon.stub(dapUtils, 'dapGetEncryptedRtdObj').returns(cachedEncRtd)
97
159
 
98
160
  expect(config.getConfig().ortb2).to.be.undefined;
99
- getRealTimeData(bidConfig, () => {}, rtdConfig, {});
100
- expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]);
101
- });
102
-
103
- it('should initalise and return with config', function () {
104
- expect(getRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig)).to.equal(undefined)
161
+ generateRealTimeData(bidConfig, () => {}, emoduleConfig, {});
162
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([encRtdUserObj]);
163
+ generateRealTimeData(bidConfig, () => {}, cmoduleConfig, {});
164
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj]);
165
+ dapGetRtdObjStub.restore()
166
+ dapGetMembershipFromLocalStorageStub.restore()
167
+ dapGetEncryptedRtdObjStub.restore()
168
+ dapGetEncryptedMembershipFromLocalStorageStub.restore()
105
169
  });
106
170
  });
107
171
 
108
172
  describe('dapTokenize', function () {
109
173
  it('dapTokenize error callback', function () {
110
174
  let configAsync = JSON.parse(JSON.stringify(sampleConfig));
111
- let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity,
112
- function(token, status, xhr) {
175
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity, onDone,
176
+ function(token, status, xhr, onDone) {
113
177
  },
114
- function(xhr, status, error) {
178
+ function(xhr, status, error, onDone) {
115
179
  }
116
180
  );
117
181
  let request = server.requests[0];
@@ -121,10 +185,10 @@ describe('akamaiDapRtdProvider', function() {
121
185
 
122
186
  it('dapTokenize success callback', function () {
123
187
  let configAsync = JSON.parse(JSON.stringify(sampleConfig));
124
- let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity,
125
- function(token, status, xhr) {
188
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity, onDone,
189
+ function(token, status, xhr, onDone) {
126
190
  },
127
- function(xhr, status, error) {
191
+ function(xhr, status, error, onDone) {
128
192
  }
129
193
  );
130
194
  let request = server.requests[0];
@@ -135,40 +199,54 @@ describe('akamaiDapRtdProvider', function() {
135
199
 
136
200
  describe('dapTokenize and dapMembership incorrect params', function () {
137
201
  it('Onerror and config are null', function () {
138
- expect(dapUtils.dapTokenize(null, 'identity', null, null)).to.be.equal(undefined);
139
- expect(dapUtils.dapMembership(null, 'identity', null, null)).to.be.equal(undefined);
202
+ expect(dapUtils.dapTokenize(null, 'identity', onDone, null, null)).to.be.equal(undefined);
203
+ expect(dapUtils.dapMembership(null, 'identity', onDone, null, null)).to.be.equal(undefined);
204
+ expect(dapUtils.dapEncryptedMembership(null, 'identity', onDone, null, null)).to.be.equal(undefined);
140
205
  const config = {
141
206
  'api_hostname': 'prebid.dap.akadns.net',
142
207
  'api_version': 1,
143
208
  'domain': '',
144
209
  'segtax': 503
145
210
  };
211
+ const encConfig = {
212
+ 'api_hostname': 'prebid.dap.akadns.net',
213
+ 'api_version': 1,
214
+ 'domain': '',
215
+ 'segtax': 504
216
+ };
146
217
  let identity = {
147
218
  type: 'dap-signature:1.0.0'
148
219
  };
149
- expect(dapUtils.dapTokenize(config, identity, null, null)).to.be.equal(undefined);
150
- expect(dapUtils.dapMembership(config, 'token', null, null)).to.be.equal(undefined);
220
+ expect(dapUtils.dapTokenize(config, identity, onDone, null, null)).to.be.equal(undefined);
221
+ expect(dapUtils.dapMembership(config, 'token', onDone, null, null)).to.be.equal(undefined);
222
+ expect(dapUtils.dapEncryptedMembership(encConfig, 'token', onDone, null, null)).to.be.equal(undefined);
151
223
  });
224
+ });
152
225
 
153
- it('dapGetToken success', function () {
154
- let dapTokenizeStub = sinon.stub(dapUtils, 'dapTokenize').returns(onSuccess);
155
- expect(dapUtils.dapGetToken(sampleConfig, 'token',
156
- function(token, status, xhr) {
157
- },
158
- function(xhr, status, error) {
159
- }
160
- )).to.be.equal(null);
161
- dapTokenizeStub.restore();
226
+ describe('Getting dapTokenize, dapMembership and dapEncryptedMembership from localstorage', function () {
227
+ it('dapGetTokenFromLocalStorage success', function () {
228
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
229
+ expect(dapUtils.dapGetTokenFromLocalStorage(60)).to.be.equal(sampleCachedToken.token);
230
+ });
231
+
232
+ it('dapGetMembershipFromLocalStorage success', function () {
233
+ storage.setDataInLocalStorage(DAP_MEMBERSHIP, JSON.stringify(cachedMembership));
234
+ expect(JSON.stringify(dapUtils.dapGetMembershipFromLocalStorage())).to.be.equal(JSON.stringify(membership));
235
+ });
236
+
237
+ it('dapGetEncryptedMembershipFromLocalStorage success', function () {
238
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(cachedEncryptedMembership));
239
+ expect(JSON.stringify(dapUtils.dapGetEncryptedMembershipFromLocalStorage())).to.be.equal(JSON.stringify(encMembership));
162
240
  });
163
241
  });
164
242
 
165
243
  describe('dapMembership', function () {
166
244
  it('dapMembership success callback', function () {
167
245
  let configAsync = JSON.parse(JSON.stringify(sampleConfig));
168
- let submoduleCallback = dapUtils.dapMembership(configAsync, 'token',
169
- function(token, status, xhr) {
246
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token', onDone,
247
+ function(token, status, xhr, onDone) {
170
248
  },
171
- function(xhr, status, error) {
249
+ function(xhr, status, error, onDone) {
172
250
  }
173
251
  );
174
252
  let request = server.requests[0];
@@ -178,10 +256,38 @@ describe('akamaiDapRtdProvider', function() {
178
256
 
179
257
  it('dapMembership error callback', function () {
180
258
  let configAsync = JSON.parse(JSON.stringify(sampleConfig));
181
- let submoduleCallback = dapUtils.dapMembership(configAsync, 'token',
182
- function(token, status, xhr) {
259
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token', onDone,
260
+ function(token, status, xhr, onDone) {
261
+ },
262
+ function(xhr, status, error, onDone) {
263
+ }
264
+ );
265
+ let request = server.requests[0];
266
+ request.respond(400, responseHeader, JSON.stringify('error'));
267
+ expect(submoduleCallback).to.equal(undefined);
268
+ });
269
+ });
270
+
271
+ describe('dapEncMembership', function () {
272
+ it('dapEncMembership success callback', function () {
273
+ let configAsync = JSON.parse(JSON.stringify(esampleConfig));
274
+ let submoduleCallback = dapUtils.dapEncryptedMembership(configAsync, 'token', onDone,
275
+ function(token, status, xhr, onDone) {
276
+ },
277
+ function(xhr, status, error, onDone) {
278
+ }
279
+ );
280
+ let request = server.requests[0];
281
+ request.respond(200, responseHeader, JSON.stringify('success'));
282
+ expect(submoduleCallback).to.equal(undefined);
283
+ });
284
+
285
+ it('dapEncMembership error callback', function () {
286
+ let configAsync = JSON.parse(JSON.stringify(esampleConfig));
287
+ let submoduleCallback = dapUtils.dapEncryptedMembership(configAsync, 'token', onDone,
288
+ function(token, status, xhr, onDone) {
183
289
  },
184
- function(xhr, status, error) {
290
+ function(xhr, status, error, onDone) {
185
291
  }
186
292
  );
187
293
  let request = server.requests[0];
@@ -192,55 +298,243 @@ describe('akamaiDapRtdProvider', function() {
192
298
 
193
299
  describe('dapMembership', function () {
194
300
  it('should invoke the getDapToken and getDapMembership', function () {
195
- let config = {
196
- api_hostname: cmoduleConfig.params.apiHostname,
197
- api_version: cmoduleConfig.params.apiVersion,
198
- domain: cmoduleConfig.params.domain,
199
- segtax: cmoduleConfig.params.segtax
200
- };
201
- let identity = {
202
- type: cmoduleConfig.params.identityType
203
- };
204
-
205
301
  let membership = {
206
302
  said: 'item.said1',
207
303
  cohorts: 'item.cohorts',
208
304
  attributes: null
209
305
  };
210
306
 
211
- let getDapTokenStub = sinon.stub(dapUtils, 'dapGetToken').returns('token3');
212
- let getDapMembershipStub = sinon.stub(dapUtils, 'dapGetMembership').returns(membership);
213
- let dapTokenizeStub = sinon.stub(dapUtils, 'dapTokenize').returns('response', 200, 'request');
214
- getRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig);
215
- expect(getDapTokenStub.calledOnce).to.be.equal(true);
307
+ let getDapMembershipStub = sinon.stub(dapUtils, 'dapGetMembershipFromLocalStorage').returns(membership);
308
+ generateRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig);
216
309
  expect(getDapMembershipStub.calledOnce).to.be.equal(true);
217
- getDapTokenStub.restore();
218
310
  getDapMembershipStub.restore();
219
- dapTokenizeStub.restore();
220
311
  });
221
312
  });
222
313
 
223
- describe('dapMembershipToRtbSegment', function () {
224
- it('dapMembershipToRtbSegment', function () {
225
- let membership1 = {
226
- said: 'item.said1',
227
- cohorts: 'item.cohorts',
228
- attributes: null
314
+ describe('dapEncMembership test', function () {
315
+ it('should invoke the getDapToken and getEncDapMembership', function () {
316
+ let encMembership = {
317
+ encryptedSegments: 'enc.seg',
229
318
  };
319
+
320
+ let getDapEncMembershipStub = sinon.stub(dapUtils, 'dapGetEncryptedMembershipFromLocalStorage').returns(encMembership);
321
+ generateRealTimeData(testReqBidsConfigObj, onDone, emoduleConfig);
322
+ expect(getDapEncMembershipStub.calledOnce).to.be.equal(true);
323
+ getDapEncMembershipStub.restore();
324
+ });
325
+ });
326
+
327
+ describe('dapGetRtdObj test', function () {
328
+ it('dapGetRtdObj', function () {
230
329
  const config = {
231
330
  apiHostname: 'prebid.dap.akadns.net',
232
331
  apiVersion: 'x1',
233
332
  domain: 'prebid.org',
234
- tokenTtl: 5,
235
333
  segtax: 503
236
334
  };
237
- let identity = {
238
- type: 'dap-signature:1.0.0'
239
- };
240
-
241
- expect(dapUtils.dapGetMembership(config, 'token')).to.equal(null)
335
+ expect(dapUtils.dapRefreshMembership(config, 'token', onDone)).to.equal(undefined)
242
336
  const membership = {cohorts: ['1', '5', '7']}
243
- expect(dapUtils.dapMembershipToRtbSegment(membership, config)).to.not.equal(undefined);
337
+ expect(dapUtils.dapGetRtdObj(membership, config.segtax)).to.not.equal(undefined);
338
+ });
339
+ });
340
+
341
+ describe('checkAndAddRealtimeData test', function () {
342
+ it('add realtime data for segtax 503 and 504', function () {
343
+ dapUtils.checkAndAddRealtimeData(cachedEncRtd, 504);
344
+ dapUtils.checkAndAddRealtimeData(cachedEncRtd, 504);
345
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([encRtdUserObj]);
346
+ dapUtils.checkAndAddRealtimeData(cachedRtd, 503);
347
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj]);
348
+ });
349
+ });
350
+
351
+ describe('dapExtractExpiryFromToken test', function () {
352
+ it('test dapExtractExpiryFromToken function', function () {
353
+ let tokenWithoutExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIn0..6buzBd2BjtgoyaNbHN8YnQ.l38avCfm3sYNy798-ETYOugz0cOx1cCkjACkAhYszxzrZ0sUJ0AiF-NdDXVTiTyp2Ih3vCWKzS0rKJ8lbS1zhyEVWVu91QwtwseM2fBbwA5ggAgBEo5wV-IXqDLPxVnxsPF0D3hP6cNCiH9Q2c-vULfsLhMhG5zvvZDPBbn4hUY5fKB8LoCBTF9rbuuWGYK1nramnb4AlS5UK82wBsHQea1Ou_Kp5wWCMNZ6TZk5qKIuRBfPIAhQblWvHECaHXkg1wyoM9VASs_yNhne7RR-qkwzbFiPFiMJibNOt9hF3_vPDJO5-06ZBjRTP1BllYGWxI-uQX6InzN18Wtun2WHqg.63sH0SNlIRcsK57v0pMujfB_nhU8Y5CuQbsHqH5MGoM'
354
+ expect(dapUtils.dapExtractExpiryFromToken(tokenWithoutExpiry)).to.equal(undefined);
355
+ let tokenWithExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIiwiZXhwIjoxNjQzODMwMzY5fQ..hTbcSQgmmO0HUJJrQ5fRHw.7zjrQXNNVkb-GD0ZhIVhEPcWbyaDBilHTWv-bp1lFZ9mdkSC0QbcAvUbYteiTD7ya23GUwcL2WOW8WgRSHaWHOJe0B5NDqfdUGTzElWfu7fFodRxRgGmwG8Rq5xxteFKLLGHLf1mFYRJKDtjtgajGNUKIDfn9AEt-c5Qz4KU8VolG_KzrLROx-f6Z7MnoPTcwRCj0WjXD6j2D6RAZ80-mKTNIsMIELdj6xiabHcjDJ1WzwtwCZSE2y2nMs451pSYp8W-bFPfZmDDwrkjN4s9ASLlIXcXgxK-H0GsiEbckQOZ49zsIKyFtasBvZW8339rrXi1js-aBh99M7aS5w9DmXPpUDmppSPpwkeTfKiqF0cQiAUq8tpeEQrGDJuw3Qt2.XI8h9Xw-VZj_NOmKtV19wLM63S4snos7rzkoHf9FXCw'
356
+ expect(dapUtils.dapExtractExpiryFromToken(tokenWithExpiry)).to.equal(1643830369);
357
+ });
358
+ });
359
+
360
+ describe('dapRefreshToken test', function () {
361
+ it('test dapRefreshToken success response', function () {
362
+ dapUtils.dapRefreshToken(sampleConfig, true, onDone)
363
+ let request = server.requests[0];
364
+ responseHeader['Akamai-DAP-Token'] = sampleCachedToken.token;
365
+ request.respond(200, responseHeader, JSON.stringify(sampleCachedToken.token));
366
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_TOKEN)).token).to.be.equal(sampleCachedToken.token);
367
+ });
368
+
369
+ it('test dapRefreshToken success response with deviceid 100', function () {
370
+ dapUtils.dapRefreshToken(esampleConfig, true, onDone)
371
+ let request = server.requests[0];
372
+ responseHeader['Akamai-DAP-100'] = sampleCachedToken.token;
373
+ request.respond(200, responseHeader, '');
374
+ expect(storage.getDataFromLocalStorage('dap_deviceId100')).to.be.equal(sampleCachedToken.token);
375
+ });
376
+
377
+ it('test dapRefreshToken success response with exp claim', function () {
378
+ dapUtils.dapRefreshToken(sampleConfig, true, onDone)
379
+ let request = server.requests[0];
380
+ let tokenWithExpiry = 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Iiwia2lkIjoicGFzc3dvcmQxIiwiZXhwIjoxNjQzODMwMzY5fQ..hTbcSQgmmO0HUJJrQ5fRHw.7zjrQXNNVkb-GD0ZhIVhEPcWbyaDBilHTWv-bp1lFZ9mdkSC0QbcAvUbYteiTD7ya23GUwcL2WOW8WgRSHaWHOJe0B5NDqfdUGTzElWfu7fFodRxRgGmwG8Rq5xxteFKLLGHLf1mFYRJKDtjtgajGNUKIDfn9AEt-c5Qz4KU8VolG_KzrLROx-f6Z7MnoPTcwRCj0WjXD6j2D6RAZ80-mKTNIsMIELdj6xiabHcjDJ1WzwtwCZSE2y2nMs451pSYp8W-bFPfZmDDwrkjN4s9ASLlIXcXgxK-H0GsiEbckQOZ49zsIKyFtasBvZW8339rrXi1js-aBh99M7aS5w9DmXPpUDmppSPpwkeTfKiqF0cQiAUq8tpeEQrGDJuw3Qt2.XI8h9Xw-VZj_NOmKtV19wLM63S4snos7rzkoHf9FXCw'
381
+ responseHeader['Akamai-DAP-Token'] = tokenWithExpiry;
382
+ request.respond(200, responseHeader, JSON.stringify(tokenWithExpiry));
383
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_TOKEN)).expires_at).to.be.equal(1643830359);
384
+ });
385
+
386
+ it('test dapRefreshToken error response', function () {
387
+ storage.setDataInLocalStorage(DAP_TOKEN, JSON.stringify(sampleCachedToken));
388
+ dapUtils.dapRefreshToken(sampleConfig, false, onDone)
389
+ let request = server.requests[0];
390
+ request.respond(400, responseHeader, 'error');
391
+ 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
392
+ });
393
+ });
394
+
395
+ describe('dapRefreshMembership test', function () {
396
+ it('test dapRefreshMembership success response', function () {
397
+ 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'}
398
+ dapUtils.dapRefreshMembership(sampleConfig, sampleCachedToken.token, onDone)
399
+ let request = server.requests[0];
400
+ request.respond(200, responseHeader, JSON.stringify(membership));
401
+ let rtdObj = dapUtils.dapGetRtdObj(membership, 503)
402
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
403
+ });
404
+
405
+ it('test dapRefreshMembership success response with exp claim', function () {
406
+ 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'}
407
+ dapUtils.dapRefreshMembership(sampleConfig, sampleCachedToken.token, onDone)
408
+ let request = server.requests[0];
409
+ request.respond(200, responseHeader, JSON.stringify(membership));
410
+ let rtdObj = dapUtils.dapGetRtdObj(membership, 503)
411
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
412
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_MEMBERSHIP)).expires_at).to.be.equal(1647971548);
413
+ });
414
+
415
+ it('test dapRefreshMembership 400 error response', function () {
416
+ dapUtils.dapRefreshMembership(sampleConfig, sampleCachedToken.token, onDone)
417
+ let request = server.requests[0];
418
+ request.respond(400, responseHeader, 'error');
419
+ expect(config.getConfig().ortb2).to.be.equal(undefined);
420
+ });
421
+
422
+ it('test dapRefreshMembership 403 error response', function () {
423
+ dapUtils.dapRefreshMembership(sampleConfig, sampleCachedToken.token, onDone)
424
+ let request = server.requests[0];
425
+ request.respond(403, responseHeader, 'error');
426
+ let requestTokenize = server.requests[1];
427
+ responseHeader['Akamai-DAP-Token'] = sampleCachedToken.token;
428
+ requestTokenize.respond(200, responseHeader, '');
429
+ let requestMembership = server.requests[2];
430
+ requestMembership.respond(403, responseHeader, 'error');
431
+ expect(server.requests.length).to.be.equal(DAP_MAX_RETRY_TOKENIZE + 2);
432
+ });
433
+ });
434
+
435
+ describe('dapRefreshEncryptedMembership test', function () {
436
+ it('test dapRefreshEncryptedMembership success response', function () {
437
+ let expiry = Math.round(Date.now() / 1000.0) + 3600; // in seconds
438
+ 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';
439
+ dapUtils.dapRefreshEncryptedMembership(esampleConfig, sampleCachedToken.token, onDone)
440
+ let request = server.requests[0];
441
+ responseHeader['Akamai-DAP-Token'] = encMembership;
442
+ request.respond(200, responseHeader, encMembership);
443
+ let rtdObj = dapUtils.dapGetEncryptedRtdObj({'encryptedSegments': encMembership}, 504)
444
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
445
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP)).expires_at).to.equal(expiry);
446
+ });
447
+
448
+ it('test dapRefreshEncryptedMembership success response with exp claim', function () {
449
+ 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';
450
+ dapUtils.dapRefreshEncryptedMembership(esampleConfig, sampleCachedToken.token, onDone)
451
+ let request = server.requests[0];
452
+ responseHeader['Akamai-DAP-Token'] = encMembership;
453
+ request.respond(200, responseHeader, encMembership);
454
+ let rtdObj = dapUtils.dapGetEncryptedRtdObj({'encryptedSegments': encMembership}, 504)
455
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members(rtdObj.rtd.ortb2.user.data);
456
+ expect(JSON.parse(storage.getDataFromLocalStorage(DAP_ENCRYPTED_MEMBERSHIP)).expires_at).to.equal(1643830630);
457
+ });
458
+
459
+ it('test dapRefreshEncryptedMembership error response', function () {
460
+ dapUtils.dapRefreshEncryptedMembership(esampleConfig, sampleCachedToken.token, onDone)
461
+ let request = server.requests[0];
462
+ request.respond(400, responseHeader, 'error');
463
+ expect(config.getConfig().ortb2).to.be.equal(undefined);
464
+ });
465
+
466
+ it('test dapRefreshEncryptedMembership 403 error response', function () {
467
+ generateRealTimeData({}, () => {}, emoduleConfig, {});
468
+ dapUtils.dapRefreshEncryptedMembership(esampleConfig, sampleCachedToken.token, onDone)
469
+ let request = server.requests[0];
470
+ request.respond(403, responseHeader, 'error');
471
+ let requestTokenize = server.requests[1];
472
+ responseHeader['Akamai-DAP-Token'] = sampleCachedToken.token;
473
+ requestTokenize.respond(200, responseHeader, '');
474
+ let requestMembership = server.requests[2];
475
+ requestMembership.respond(403, responseHeader, 'error');
476
+ expect(server.requests.length).to.be.equal(DAP_MAX_RETRY_TOKENIZE + 2);
477
+ });
478
+ });
479
+
480
+ describe('dapGetEncryptedMembershipFromLocalStorage test', function () {
481
+ it('test dapGetEncryptedMembershipFromLocalStorage function with valid cache', function () {
482
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(cachedEncryptedMembership))
483
+ expect(JSON.stringify(dapUtils.dapGetEncryptedMembershipFromLocalStorage())).to.equal(JSON.stringify(encMembership));
484
+ });
485
+
486
+ it('test dapGetEncryptedMembershipFromLocalStorage function with invalid cache', function () {
487
+ let expiry = Math.round(Date.now() / 1000.0) - 100; // in seconds
488
+ let encMembership = {'expiry': expiry, 'encryptedSegments': cachedEncryptedMembership.encryptedSegments}
489
+ storage.setDataInLocalStorage(DAP_ENCRYPTED_MEMBERSHIP, JSON.stringify(encMembership))
490
+ expect(dapUtils.dapGetEncryptedMembershipFromLocalStorage()).to.equal(null);
491
+ });
492
+ });
493
+
494
+ describe('Akamai-DAP-SS-ID test', function () {
495
+ it('Akamai-DAP-SS-ID present in response header', function () {
496
+ let expiry = Math.round(Date.now() / 1000.0) + 300; // in seconds
497
+ dapUtils.dapRefreshToken(sampleConfig, false, onDone)
498
+ let request = server.requests[0];
499
+ let sampleSSID = 'Test_SSID_Spec';
500
+ responseHeader['Akamai-DAP-Token'] = sampleCachedToken.token;
501
+ responseHeader['Akamai-DAP-SS-ID'] = sampleSSID;
502
+ request.respond(200, responseHeader, '');
503
+ expect(storage.getDataFromLocalStorage(DAP_SS_ID)).to.be.equal(JSON.stringify(sampleSSID));
504
+ });
505
+
506
+ it('Test if Akamai-DAP-SS-ID is present in request header', function () {
507
+ let expiry = Math.round(Date.now() / 1000.0) + 100; // in seconds
508
+ storage.setDataInLocalStorage(DAP_SS_ID, JSON.stringify('Test_SSID_Spec'))
509
+ dapUtils.dapRefreshToken(sampleConfig, false, onDone)
510
+ let request = server.requests[0];
511
+ let ssidHeader = request.requestHeaders['Akamai-DAP-SS-ID'];
512
+ responseHeader['Akamai-DAP-Token'] = sampleCachedToken.token;
513
+ request.respond(200, responseHeader, '');
514
+ expect(ssidHeader).to.be.equal('Test_SSID_Spec');
515
+ });
516
+ });
517
+
518
+ describe('Test gdpr and usp consent handling', function () {
519
+ it('Gdpr applies and gdpr consent string not present', function () {
520
+ expect(akamaiDapRtdSubmodule.init(null, sampleGdprConsentConfig)).to.equal(false);
521
+ });
522
+
523
+ it('Gdpr applies and gdpr consent string is present', function () {
524
+ sampleGdprConsentConfig.gdpr.consentString = 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==';
525
+ expect(akamaiDapRtdSubmodule.init(null, sampleGdprConsentConfig)).to.equal(true);
526
+ });
527
+
528
+ it('USP consent present and user have opted out', function () {
529
+ expect(akamaiDapRtdSubmodule.init(null, sampleUspConsentConfig)).to.equal(false);
530
+ });
531
+
532
+ it('USP consent present and user have not been provided with option to opt out', function () {
533
+ expect(akamaiDapRtdSubmodule.init(null, {'usp': '1NYY'})).to.equal(false);
534
+ });
535
+
536
+ it('USP consent present and user have not opted out', function () {
537
+ expect(akamaiDapRtdSubmodule.init(null, {'usp': '1YNY'})).to.equal(true);
244
538
  });
245
539
  });
246
540
  });