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