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