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