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
|
@@ -2,6 +2,7 @@ const expect = require('chai').expect;
|
|
|
2
2
|
const {setupTest, testPageURL} = require('../../../helpers/testing-utils');
|
|
3
3
|
|
|
4
4
|
const TEST_PAGE_URL = testPageURL('banner.html?pbjs_debug=true');
|
|
5
|
+
const SYNC_PAGE_URL = testPageURL('banner_sync.html?pbjs_debug=true');
|
|
5
6
|
const CREATIVE_IFRAME_ID = 'google_ads_iframe_/19968336/header-bid-tag-0_0';
|
|
6
7
|
const CREATIVE_IFRAME_CSS_SELECTOR = 'iframe[id="' + CREATIVE_IFRAME_ID + '"]';
|
|
7
8
|
|
|
@@ -14,20 +15,25 @@ const EXPECTED_TARGETING_KEYS = {
|
|
|
14
15
|
'hb_bidder_appnexus': 'appnexus'
|
|
15
16
|
};
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
Object.entries({
|
|
19
|
+
'synchronously': SYNC_PAGE_URL,
|
|
20
|
+
'asynchronously': TEST_PAGE_URL,
|
|
21
|
+
}).forEach(([t, testPage]) => {
|
|
22
|
+
setupTest({
|
|
23
|
+
url: testPage,
|
|
24
|
+
waitFor: CREATIVE_IFRAME_CSS_SELECTOR,
|
|
25
|
+
expectGAMCreative: true
|
|
26
|
+
}, `Prebid.js Banner Ad Unit Test (loading ${t})`, function () {
|
|
27
|
+
it('should load the targeting keys with correct values', async function () {
|
|
28
|
+
const result = await browser.execute(function () {
|
|
29
|
+
return window.pbjs.getAdserverTargeting('div-gpt-ad-1460505748561-1');
|
|
30
|
+
});
|
|
31
|
+
const targetingKeys = result['div-gpt-ad-1460505748561-1'];
|
|
27
32
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
expect(targetingKeys).to.include(EXPECTED_TARGETING_KEYS);
|
|
34
|
+
expect(targetingKeys.hb_adid).to.be.a('string');
|
|
35
|
+
expect(targetingKeys.hb_adid_appnexus).to.be.a('string');
|
|
36
|
+
expect(targetingKeys.hb_size).to.satisfy((size) => size === '300x250' || '300x600');
|
|
37
|
+
});
|
|
32
38
|
});
|
|
33
39
|
});
|
|
@@ -34,7 +34,7 @@ describe('GDPR FPD enrichment', () => {
|
|
|
34
34
|
})
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
-
it('sets user.ext.consent, but not regs.ext.gdpr, if
|
|
37
|
+
it('sets user.ext.consent, but not regs.ext.gdpr, if gdprApplies is not a boolean', () => {
|
|
38
38
|
consent = {consentString: 'mock-consent'};
|
|
39
39
|
return callHook().then(ortb2 => {
|
|
40
40
|
expect(ortb2).to.eql({
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/* globals describe, beforeEach, afterEach, sinon */
|
|
2
|
+
import { expect } from 'chai';
|
|
3
|
+
import { getDeviceType, getBrowser, getOS } from 'libraries/userAgentUtils';
|
|
4
|
+
import { deviceTypes, browserTypes, osTypes } from 'libraries/userAgentUtils/userAgentTypes.enums';
|
|
5
|
+
|
|
6
|
+
const ORIGINAL_USER_AGENT = window.navigator.userAgent;
|
|
7
|
+
const ORIGINAL_VENDOR = window.navigator.vendor;
|
|
8
|
+
const ORIGINAL_APP_VERSION = window.navigator.appVersion;
|
|
9
|
+
|
|
10
|
+
describe('Test user agent categorization', () => {
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
window.navigator.__defineGetter__('userAgent', () => ORIGINAL_USER_AGENT);
|
|
13
|
+
window.navigator.__defineGetter__('vendor', () => ORIGINAL_VENDOR);
|
|
14
|
+
window.navigator.__defineGetter__('appVersion', () => ORIGINAL_APP_VERSION);
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
describe('test getDeviceType', () => {
|
|
18
|
+
it('user agent device type is tablet', () => {
|
|
19
|
+
const tabletUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4.17.9 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3'
|
|
20
|
+
window.navigator.__defineGetter__('userAgent', () => tabletUserAgent);
|
|
21
|
+
expect(getDeviceType()).to.equal(deviceTypes.TABLET);
|
|
22
|
+
})
|
|
23
|
+
it('user agent device type is mobile', () => {
|
|
24
|
+
const mobileUserAgent = 'Mozilla/5.0 (Linux; Android 12; M2102J20SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36'
|
|
25
|
+
window.navigator.__defineGetter__('userAgent', () => mobileUserAgent);
|
|
26
|
+
expect(getDeviceType()).to.equal(deviceTypes.MOBILE);
|
|
27
|
+
})
|
|
28
|
+
it('user agent device type is desktop', () => {
|
|
29
|
+
const desktopUserAgent = 'Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36'
|
|
30
|
+
window.navigator.__defineGetter__('userAgent', () => desktopUserAgent);
|
|
31
|
+
expect(getDeviceType()).to.equal(deviceTypes.DESKTOP);
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
describe('test getBrowser', () => {
|
|
36
|
+
it('user agent browser is edge', () => {
|
|
37
|
+
const edgeUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10532'
|
|
38
|
+
window.navigator.__defineGetter__('userAgent', () => edgeUserAgent);
|
|
39
|
+
expect(getBrowser()).to.equal(browserTypes.EDGE);
|
|
40
|
+
})
|
|
41
|
+
it('user agent browser is chrome', () => {
|
|
42
|
+
const chromeUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/44.0.2403.67 Mobile/12H143 Safari/600.1.4'
|
|
43
|
+
window.navigator.__defineGetter__('userAgent', () => chromeUserAgent);
|
|
44
|
+
expect(getBrowser()).to.equal(browserTypes.CHROME);
|
|
45
|
+
})
|
|
46
|
+
it('user agent browser is firefox', () => {
|
|
47
|
+
const firefoxUserAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:40.0) Gecko/20100101 Firefox/40.0.2 Waterfox/40.0.2'
|
|
48
|
+
window.navigator.__defineGetter__('userAgent', () => firefoxUserAgent);
|
|
49
|
+
expect(getBrowser()).to.equal(browserTypes.FIREFOX);
|
|
50
|
+
})
|
|
51
|
+
it('user agent browser is safari', () => {
|
|
52
|
+
const safariUserAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36'
|
|
53
|
+
window.navigator.__defineGetter__('userAgent', () => safariUserAgent);
|
|
54
|
+
window.navigator.__defineGetter__('vendor', () => 'Apple Computer, Inc.');
|
|
55
|
+
expect(getBrowser()).to.equal(browserTypes.SAFARI);
|
|
56
|
+
})
|
|
57
|
+
it('user agent browser is internet explorer', () => {
|
|
58
|
+
const internetexplorerUserAgent = 'Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
|
|
59
|
+
window.navigator.__defineGetter__('userAgent', () => internetexplorerUserAgent);
|
|
60
|
+
expect(getBrowser()).to.equal(browserTypes.INTERNET_EXPLORER);
|
|
61
|
+
})
|
|
62
|
+
it('user agent is other', () => {
|
|
63
|
+
const otherUserAgent = 'Dalvik/2.1.0 (Linux; U; Android 9; ADT-2 Build/PTT5.181126.002)'
|
|
64
|
+
window.navigator.__defineGetter__('userAgent', () => otherUserAgent);
|
|
65
|
+
expect(getBrowser()).to.equal(browserTypes.OTHER);
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
describe('test getOS', () => {
|
|
70
|
+
it('user agent is android', () => {
|
|
71
|
+
const androidUserAgent = 'Mozilla/5.0 (Android; Mobile; rv:40.0) Gecko/40.0 Firefox/40.0'
|
|
72
|
+
window.navigator.__defineGetter__('userAgent', () => androidUserAgent);
|
|
73
|
+
expect(getOS()).to.equal(osTypes.ANDROID);
|
|
74
|
+
})
|
|
75
|
+
it('user agent is ios', () => {
|
|
76
|
+
const iosUserAgent = 'Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4'
|
|
77
|
+
window.navigator.__defineGetter__('userAgent', () => iosUserAgent);
|
|
78
|
+
expect(getOS()).to.equal(osTypes.IOS);
|
|
79
|
+
})
|
|
80
|
+
it('user agent is windows', () => {
|
|
81
|
+
const windowsUserAgent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36'
|
|
82
|
+
window.navigator.__defineGetter__('userAgent', () => windowsUserAgent);
|
|
83
|
+
expect(getOS()).to.equal(osTypes.WINDOWS);
|
|
84
|
+
})
|
|
85
|
+
it('user agent is mac', () => {
|
|
86
|
+
const macUserAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0'
|
|
87
|
+
window.navigator.__defineGetter__('userAgent', () => macUserAgent);
|
|
88
|
+
expect(getOS()).to.equal(osTypes.MAC);
|
|
89
|
+
})
|
|
90
|
+
it('user agent is linux', () => {
|
|
91
|
+
const linuxUserAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0'
|
|
92
|
+
window.navigator.__defineGetter__('userAgent', () => linuxUserAgent);
|
|
93
|
+
expect(getOS()).to.equal(osTypes.LINUX);
|
|
94
|
+
})
|
|
95
|
+
it('user agent is unix', () => {
|
|
96
|
+
const unixUserAgent = 'Mozilla/5.0 (X11; CrOS armv7l 7077.134.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.156 Safari/537.36'
|
|
97
|
+
const unixappVersion = '5.0 (X11; CrOS armv7l 7077.134.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.156 Safari/537.36'
|
|
98
|
+
window.navigator.__defineGetter__('userAgent', () => unixUserAgent);
|
|
99
|
+
window.navigator.__defineGetter__('appVersion', () => unixappVersion);
|
|
100
|
+
expect(getOS()).to.equal(osTypes.UNIX);
|
|
101
|
+
})
|
|
102
|
+
it('user agent is other', () => {
|
|
103
|
+
const otherUserAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
|
|
104
|
+
window.navigator.__defineGetter__('userAgent', () => otherUserAgent);
|
|
105
|
+
window.navigator.__defineGetter__('appVersion', () => '');
|
|
106
|
+
expect(getOS()).to.equal(osTypes.OTHER);
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
})
|
|
@@ -118,6 +118,7 @@ describe('Adagio Rtd Provider', function () {
|
|
|
118
118
|
describe('store session data in localStorage', function () {
|
|
119
119
|
const session = {
|
|
120
120
|
lastActivityTime: 1714116520700,
|
|
121
|
+
id: 'uid-1234',
|
|
121
122
|
rnd: 0.5697,
|
|
122
123
|
vwSmplg: 0.1,
|
|
123
124
|
vwSmplgNxt: 0.1
|
|
@@ -128,6 +129,7 @@ describe('Adagio Rtd Provider', function () {
|
|
|
128
129
|
sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
|
|
129
130
|
sandbox.stub(Date, 'now').returns(1714116520710);
|
|
130
131
|
sandbox.stub(Math, 'random').returns(0.8);
|
|
132
|
+
sandbox.stub(utils, 'generateUUID').returns('uid-1234');
|
|
131
133
|
|
|
132
134
|
const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
|
|
133
135
|
|
|
@@ -136,6 +138,7 @@ describe('Adagio Rtd Provider', function () {
|
|
|
136
138
|
const expected = {
|
|
137
139
|
session: {
|
|
138
140
|
new: true,
|
|
141
|
+
id: utils.generateUUID(),
|
|
139
142
|
rnd: Math.random()
|
|
140
143
|
}
|
|
141
144
|
}
|
|
@@ -176,6 +179,7 @@ describe('Adagio Rtd Provider', function () {
|
|
|
176
179
|
sandbox.stub(Date, 'now').returns(1715679344351);
|
|
177
180
|
sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
|
|
178
181
|
sandbox.stub(Math, 'random').returns(0.8);
|
|
182
|
+
sandbox.stub(utils, 'generateUUID').returns('uid-5678');
|
|
179
183
|
|
|
180
184
|
const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
|
|
181
185
|
|
|
@@ -185,6 +189,7 @@ describe('Adagio Rtd Provider', function () {
|
|
|
185
189
|
session: {
|
|
186
190
|
...session,
|
|
187
191
|
new: true,
|
|
192
|
+
id: utils.generateUUID(),
|
|
188
193
|
rnd: Math.random(),
|
|
189
194
|
}
|
|
190
195
|
}
|
|
@@ -196,6 +201,73 @@ describe('Adagio Rtd Provider', function () {
|
|
|
196
201
|
}).calledOnce).to.be.true;
|
|
197
202
|
});
|
|
198
203
|
});
|
|
204
|
+
|
|
205
|
+
describe('store session data in localStorage when used with external AB Test snippet', function () {
|
|
206
|
+
const sessionWithABTest = {
|
|
207
|
+
lastActivityTime: 1714116520700,
|
|
208
|
+
id: 'uid-1234',
|
|
209
|
+
rnd: 0.5697,
|
|
210
|
+
vwSmplg: 0.1,
|
|
211
|
+
vwSmplgNxt: 0.1,
|
|
212
|
+
testName: 'adg-test',
|
|
213
|
+
testVersion: 'srv',
|
|
214
|
+
initiator: 'snippet'
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
it('store new session data instancied by the AB Test snippet for further usage', function () {
|
|
218
|
+
const sessionWithNewFlag = { ...sessionWithABTest, new: true };
|
|
219
|
+
const storageValue = JSON.stringify({session: sessionWithNewFlag});
|
|
220
|
+
sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
|
|
221
|
+
sandbox.stub(Date, 'now').returns(1714116520710);
|
|
222
|
+
sandbox.stub(Math, 'random').returns(0.8);
|
|
223
|
+
|
|
224
|
+
const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
|
|
225
|
+
|
|
226
|
+
adagioRtdSubmodule.init(config);
|
|
227
|
+
|
|
228
|
+
const expected = {
|
|
229
|
+
session: {
|
|
230
|
+
...sessionWithNewFlag
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
expect(spy.withArgs({
|
|
235
|
+
action: 'session',
|
|
236
|
+
ts: Date.now(),
|
|
237
|
+
data: expected,
|
|
238
|
+
}).calledOnce).to.be.true;
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('store new session data after removing AB Test props when initiator is not the snippet', function () {
|
|
242
|
+
const sessionWithNewFlag = { ...sessionWithABTest, new: false, initiator: 'adgjs' };
|
|
243
|
+
const storageValue = JSON.stringify({session: sessionWithNewFlag});
|
|
244
|
+
sandbox.stub(storage, 'getDataFromLocalStorage').callsArgWith(1, storageValue);
|
|
245
|
+
sandbox.stub(Date, 'now').returns(1714116520710);
|
|
246
|
+
sandbox.stub(Math, 'random').returns(0.8);
|
|
247
|
+
sandbox.stub(utils, 'generateUUID').returns('uid-5678');
|
|
248
|
+
|
|
249
|
+
const spy = sandbox.spy(_internal.getAdagioNs().queue, 'push')
|
|
250
|
+
|
|
251
|
+
adagioRtdSubmodule.init(config);
|
|
252
|
+
|
|
253
|
+
const expected = {
|
|
254
|
+
session: {
|
|
255
|
+
...sessionWithNewFlag,
|
|
256
|
+
new: true,
|
|
257
|
+
id: utils.generateUUID(),
|
|
258
|
+
rnd: Math.random(),
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
delete expected.session.testName;
|
|
262
|
+
delete expected.session.testVersion;
|
|
263
|
+
|
|
264
|
+
expect(spy.withArgs({
|
|
265
|
+
action: 'session',
|
|
266
|
+
ts: Date.now(),
|
|
267
|
+
data: expected,
|
|
268
|
+
}).calledOnce).to.be.true;
|
|
269
|
+
});
|
|
270
|
+
});
|
|
199
271
|
});
|
|
200
272
|
|
|
201
273
|
describe('submodule `getBidRequestData`', function () {
|
|
@@ -4,7 +4,7 @@ import {newBidder} from 'src/adapters/bidderFactory.js';
|
|
|
4
4
|
import {config} from '../../../src/config.js';
|
|
5
5
|
|
|
6
6
|
const BIDDER_CODE = 'admixer';
|
|
7
|
-
const
|
|
7
|
+
const RTB_BIDDER_CODE = 'rtbstack'
|
|
8
8
|
const ENDPOINT_URL = 'https://inv-nets.admixer.net/prebid.1.2.aspx';
|
|
9
9
|
const ENDPOINT_URL_CUSTOM = 'https://custom.admixer.net/prebid.aspx';
|
|
10
10
|
const ZONE_ID = '2eb6bd58-865c-47ce-af7f-a918108c3fd2';
|
|
@@ -37,11 +37,10 @@ describe('AdmixerAdapter', function () {
|
|
|
37
37
|
auctionId: '1d1a030790a475',
|
|
38
38
|
};
|
|
39
39
|
|
|
40
|
-
let
|
|
41
|
-
bidder:
|
|
40
|
+
let rtbBid = {
|
|
41
|
+
bidder: RTB_BIDDER_CODE,
|
|
42
42
|
params: {
|
|
43
|
-
|
|
44
|
-
endpointId: ENDPOINT_ID,
|
|
43
|
+
tagId: ENDPOINT_ID,
|
|
45
44
|
},
|
|
46
45
|
adUnitCode: 'adunit-code',
|
|
47
46
|
sizes: [
|
|
@@ -56,8 +55,8 @@ describe('AdmixerAdapter', function () {
|
|
|
56
55
|
it('should return true when required params found', function () {
|
|
57
56
|
expect(spec.isBidRequestValid(bid)).to.equal(true);
|
|
58
57
|
});
|
|
59
|
-
it('should return true when params required by
|
|
60
|
-
expect(spec.isBidRequestValid(
|
|
58
|
+
it('should return true when params required by RTB found', function () {
|
|
59
|
+
expect(spec.isBidRequestValid(rtbBid)).to.equal(true);
|
|
61
60
|
});
|
|
62
61
|
|
|
63
62
|
it('should return false when required params are not passed', function () {
|
|
@@ -68,8 +67,8 @@ describe('AdmixerAdapter', function () {
|
|
|
68
67
|
};
|
|
69
68
|
expect(spec.isBidRequestValid(invalidBid)).to.equal(false);
|
|
70
69
|
});
|
|
71
|
-
it('should return false when params required by
|
|
72
|
-
let invalidBid = Object.assign({},
|
|
70
|
+
it('should return false when params required by RTB are not passed', function () {
|
|
71
|
+
let invalidBid = Object.assign({}, rtbBid);
|
|
73
72
|
delete invalidBid.params;
|
|
74
73
|
invalidBid.params = {
|
|
75
74
|
clientId: 0,
|
|
@@ -118,7 +117,7 @@ describe('AdmixerAdapter', function () {
|
|
|
118
117
|
it('sends bid request to CUSTOM_ENDPOINT via GET', function () {
|
|
119
118
|
config.setBidderConfig({
|
|
120
119
|
bidders: [BIDDER_CODE], // one or more bidders
|
|
121
|
-
config: {
|
|
120
|
+
config: { bidderURL: ENDPOINT_URL_CUSTOM },
|
|
122
121
|
});
|
|
123
122
|
const request = config.runWithBidder(BIDDER_CODE, () =>
|
|
124
123
|
spec.buildRequests(validRequest, bidderRequest)
|
|
@@ -133,9 +132,8 @@ describe('AdmixerAdapter', function () {
|
|
|
133
132
|
validRequest: [
|
|
134
133
|
{
|
|
135
134
|
bidder: bidder,
|
|
136
|
-
params: bidder === '
|
|
137
|
-
|
|
138
|
-
endpointId: ENDPOINT_ID
|
|
135
|
+
params: bidder === 'rtbstack' ? {
|
|
136
|
+
tagId: ENDPOINT_ID
|
|
139
137
|
} : {
|
|
140
138
|
zone: ZONE_ID,
|
|
141
139
|
},
|
|
@@ -193,10 +191,16 @@ describe('AdmixerAdapter', function () {
|
|
|
193
191
|
expect(request.url).to.equal('https://inv-nets.admixer.net/adxprebid.1.2.aspx');
|
|
194
192
|
expect(request.method).to.equal('POST');
|
|
195
193
|
});
|
|
196
|
-
it('build request for
|
|
197
|
-
const requestParams = requestParamsFor('
|
|
198
|
-
|
|
199
|
-
|
|
194
|
+
it('build request for rtbstack', function () {
|
|
195
|
+
const requestParams = requestParamsFor('rtbstack');
|
|
196
|
+
config.setBidderConfig({
|
|
197
|
+
bidders: ['rtbstack'],
|
|
198
|
+
config: { bidderURL: ENDPOINT_URL_CUSTOM },
|
|
199
|
+
});
|
|
200
|
+
const request = config.runWithBidder(BIDDER_CODE, () =>
|
|
201
|
+
spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest)
|
|
202
|
+
);
|
|
203
|
+
expect(request.url).to.equal(ENDPOINT_URL_CUSTOM);
|
|
200
204
|
expect(request.method).to.equal('POST');
|
|
201
205
|
});
|
|
202
206
|
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import advRedAnalytics from 'modules/advRedAnalyticsAdapter.js';
|
|
2
|
+
import {expect} from 'chai';
|
|
3
|
+
import {server} from 'test/mocks/xhr.js';
|
|
4
|
+
import {expectEvents} from '../../helpers/analytics.js';
|
|
5
|
+
import { EVENTS } from 'src/constants.js';
|
|
6
|
+
import sinon from 'sinon';
|
|
7
|
+
|
|
8
|
+
let events = require('src/events');
|
|
9
|
+
|
|
10
|
+
describe('AdvRed Analytics Adapter', function () {
|
|
11
|
+
let bidWonEvent = {
|
|
12
|
+
'bidderCode': 'appnexus',
|
|
13
|
+
'width': 300,
|
|
14
|
+
'height': 250,
|
|
15
|
+
'adId': '1ebb82ec35375e',
|
|
16
|
+
'mediaType': 'banner',
|
|
17
|
+
'cpm': 0.5,
|
|
18
|
+
'requestId': '1582271863760569973',
|
|
19
|
+
'creative_id': '96846035',
|
|
20
|
+
'creativeId': '96846035',
|
|
21
|
+
'ttl': 60,
|
|
22
|
+
'currency': 'USD',
|
|
23
|
+
'netRevenue': true,
|
|
24
|
+
'auctionId': '9c7b70b9-b6ab-4439-9e71-b7b382797c18',
|
|
25
|
+
'responseTimestamp': 1537521629657,
|
|
26
|
+
'requestTimestamp': 1537521629331,
|
|
27
|
+
'bidder': 'appnexus',
|
|
28
|
+
'adUnitCode': 'div-gpt-ad-1460505748561-0',
|
|
29
|
+
'timeToRespond': 326,
|
|
30
|
+
'size': '300x250',
|
|
31
|
+
'status': 'rendered',
|
|
32
|
+
'eventType': 'bidWon',
|
|
33
|
+
'ad': 'some ad',
|
|
34
|
+
'adUrl': 'ad url'
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
describe('AdvRed Analytic tests', function () {
|
|
38
|
+
beforeEach(function () {
|
|
39
|
+
sinon.stub(events, 'getEvents').returns([]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
afterEach(function () {
|
|
43
|
+
advRedAnalytics.disableAnalytics();
|
|
44
|
+
events.getEvents.restore();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('support custom endpoint', function () {
|
|
48
|
+
let custom_endpoint = 'custom url';
|
|
49
|
+
advRedAnalytics.enableAnalytics({
|
|
50
|
+
provider: 'advRed',
|
|
51
|
+
options: {
|
|
52
|
+
url: custom_endpoint,
|
|
53
|
+
publisherId: '1234567890'
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(advRedAnalytics.getOptions().url).to.equal(custom_endpoint);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('bid won event', function() {
|
|
61
|
+
let publisherId = '1234567890';
|
|
62
|
+
advRedAnalytics.enableAnalytics({
|
|
63
|
+
provider: 'advRed',
|
|
64
|
+
options: {
|
|
65
|
+
publisherId: publisherId
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
events.emit(EVENTS.BID_WON, bidWonEvent);
|
|
70
|
+
advRedAnalytics.sendEvents();
|
|
71
|
+
|
|
72
|
+
expect(server.requests.length).to.equal(1);
|
|
73
|
+
expect(server.requests[0].url).to.equal('https://api.adv.red/api/event');
|
|
74
|
+
|
|
75
|
+
const message = JSON.parse(server.requests[0].requestBody);
|
|
76
|
+
expect(message.pwId).to.exist;
|
|
77
|
+
expect(message.publisherId).to.equal(publisherId);
|
|
78
|
+
expect(message.events.length).to.equal(1);
|
|
79
|
+
expect(message.events[0].eventType).to.equal('bidWon');
|
|
80
|
+
expect(message.events[0].ad).to.be.undefined;
|
|
81
|
+
expect(message.events[0].adUrl).to.be.undefined;
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('track event', function () {
|
|
85
|
+
sinon.spy(advRedAnalytics, 'track');
|
|
86
|
+
|
|
87
|
+
advRedAnalytics.enableAnalytics({
|
|
88
|
+
provider: 'advRed',
|
|
89
|
+
options: {
|
|
90
|
+
publisherId: '1234567890'
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
expectEvents().to.beTrackedBy(advRedAnalytics.track);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe('pageUrl detection', function () {
|
|
99
|
+
afterEach(function () {
|
|
100
|
+
advRedAnalytics.disableAnalytics()
|
|
101
|
+
});
|
|
102
|
+
it('check pageUrl property', function () {
|
|
103
|
+
advRedAnalytics.enableAnalytics({
|
|
104
|
+
provider: 'advRed',
|
|
105
|
+
options: {
|
|
106
|
+
publisherId: '1234567890'
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const message = JSON.parse(server.requests[0].requestBody);
|
|
111
|
+
expect(message.pageUrl).to.equal(window.top.location.href);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -431,6 +431,42 @@ describe('AppNexusAdapter', function () {
|
|
|
431
431
|
expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
|
|
432
432
|
});
|
|
433
433
|
|
|
434
|
+
it('should convert and include ORTB2 device data when available', function () {
|
|
435
|
+
const bidRequest = deepClone(bidRequests[0]);
|
|
436
|
+
const bidderRequest = {
|
|
437
|
+
ortb2: {
|
|
438
|
+
device: {
|
|
439
|
+
w: 980,
|
|
440
|
+
h: 1720,
|
|
441
|
+
dnt: 0,
|
|
442
|
+
ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1',
|
|
443
|
+
language: 'en',
|
|
444
|
+
devicetype: 1,
|
|
445
|
+
make: 'Apple',
|
|
446
|
+
model: 'iPhone 12 Pro Max',
|
|
447
|
+
os: 'iOS',
|
|
448
|
+
osv: '17.4',
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
const expectedDeviceResult = {
|
|
454
|
+
useragent: bidderRequest.ortb2.device.ua,
|
|
455
|
+
devicetype: 'Mobile/Tablet - General',
|
|
456
|
+
make: bidderRequest.ortb2.device.make,
|
|
457
|
+
model: bidderRequest.ortb2.device.model,
|
|
458
|
+
os: bidderRequest.ortb2.device.os,
|
|
459
|
+
os_version: bidderRequest.ortb2.device.osv,
|
|
460
|
+
w: bidderRequest.ortb2.device.w,
|
|
461
|
+
h: bidderRequest.ortb2.device.h,
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
const request = spec.buildRequests([bidRequest], bidderRequest);
|
|
465
|
+
const payload = JSON.parse(request.data);
|
|
466
|
+
|
|
467
|
+
expect(payload.device).to.deep.equal(expectedDeviceResult);
|
|
468
|
+
});
|
|
469
|
+
|
|
434
470
|
it('should add video property when adUnit includes a renderer', function () {
|
|
435
471
|
const videoData = {
|
|
436
472
|
mediaTypes: {
|
|
@@ -8,11 +8,17 @@ describe('Azerion Edge RTD submodule', function () {
|
|
|
8
8
|
{ id: '1', visits: 123 },
|
|
9
9
|
{ id: '2', visits: 456 },
|
|
10
10
|
];
|
|
11
|
-
|
|
11
|
+
const IMPROVEDIGITAL_GVLID = '253';
|
|
12
12
|
const key = 'publisher123';
|
|
13
13
|
const bidders = ['appnexus', 'improvedigital'];
|
|
14
14
|
const process = { key: 'value' };
|
|
15
15
|
const dataProvider = { name: 'azerionedge', waitForIt: true };
|
|
16
|
+
const userConsent = {gdpr: {gdprApplies: 'gdpr-applies', consentString: 'consent-string'}, usp: 'usp'};
|
|
17
|
+
|
|
18
|
+
const resetAll = () => {
|
|
19
|
+
window.azerionPublisherAudiences.resetHistory();
|
|
20
|
+
loadExternalScript.resetHistory();
|
|
21
|
+
}
|
|
16
22
|
|
|
17
23
|
let reqBidsConfigObj;
|
|
18
24
|
let storageStub;
|
|
@@ -33,7 +39,11 @@ describe('Azerion Edge RTD submodule', function () {
|
|
|
33
39
|
let returned;
|
|
34
40
|
|
|
35
41
|
beforeEach(function () {
|
|
36
|
-
returned = azerionedgeRTD.azerionedgeSubmodule.init(dataProvider);
|
|
42
|
+
returned = azerionedgeRTD.azerionedgeSubmodule.init(dataProvider, userConsent);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should have the correct gvlid', () => {
|
|
46
|
+
expect(azerionedgeRTD.azerionedgeSubmodule.gvlid).to.equal(IMPROVEDIGITAL_GVLID);
|
|
37
47
|
});
|
|
38
48
|
|
|
39
49
|
it('should return true', function () {
|
|
@@ -49,18 +59,21 @@ describe('Azerion Edge RTD submodule', function () {
|
|
|
49
59
|
expect(loadExternalScript.args[0][0]).to.deep.equal(expected);
|
|
50
60
|
});
|
|
51
61
|
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
[
|
|
63
|
+
['gdprApplies', userConsent.gdpr.gdprApplies],
|
|
64
|
+
['gdprConsent', userConsent.gdpr.consentString],
|
|
65
|
+
['uspConsent', userConsent.usp],
|
|
66
|
+
].forEach(([key, value]) => {
|
|
67
|
+
it(`should call azerionPublisherAudiencesStub with ${key}:${value}`, function () {
|
|
68
|
+
expect(window.azerionPublisherAudiences.args[0][0]).to.include({[key]: value});
|
|
69
|
+
});
|
|
54
70
|
});
|
|
55
71
|
|
|
56
72
|
describe('with key', function () {
|
|
57
73
|
beforeEach(function () {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
returned = azerionedgeRTD.azerionedgeSubmodule.init(
|
|
61
|
-
...dataProvider,
|
|
62
|
-
params: { key },
|
|
63
|
-
});
|
|
74
|
+
resetAll();
|
|
75
|
+
const config = { ...dataProvider, params: { key } };
|
|
76
|
+
returned = azerionedgeRTD.azerionedgeSubmodule.init(config, userConsent);
|
|
64
77
|
});
|
|
65
78
|
|
|
66
79
|
it('should return true', function () {
|
|
@@ -75,22 +88,24 @@ describe('Azerion Edge RTD submodule', function () {
|
|
|
75
88
|
|
|
76
89
|
describe('with process configuration', function () {
|
|
77
90
|
beforeEach(function () {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
returned = azerionedgeRTD.azerionedgeSubmodule.init(
|
|
81
|
-
...dataProvider,
|
|
82
|
-
params: { process },
|
|
83
|
-
});
|
|
91
|
+
resetAll();
|
|
92
|
+
const config = { ...dataProvider, params: { process } };
|
|
93
|
+
returned = azerionedgeRTD.azerionedgeSubmodule.init(config, userConsent);
|
|
84
94
|
});
|
|
85
95
|
|
|
86
96
|
it('should return true', function () {
|
|
87
97
|
expect(returned).to.equal(true);
|
|
88
98
|
});
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
100
|
+
[
|
|
101
|
+
['gdprApplies', userConsent.gdpr.gdprApplies],
|
|
102
|
+
['gdprConsent', userConsent.gdpr.consentString],
|
|
103
|
+
['uspConsent', userConsent.usp],
|
|
104
|
+
...Object.entries(process),
|
|
105
|
+
].forEach(([key, value]) => {
|
|
106
|
+
it(`should call azerionPublisherAudiencesStub with ${key}:${value}`, function () {
|
|
107
|
+
expect(window.azerionPublisherAudiences.args[0][0]).to.include({[key]: value});
|
|
108
|
+
});
|
|
94
109
|
});
|
|
95
110
|
});
|
|
96
111
|
});
|
|
@@ -111,7 +126,7 @@ describe('Azerion Edge RTD submodule', function () {
|
|
|
111
126
|
);
|
|
112
127
|
});
|
|
113
128
|
|
|
114
|
-
it('does not
|
|
129
|
+
it('does not apply audiences to bidders', function () {
|
|
115
130
|
expect(reqBidsConfigObj.ortb2Fragments.bidder).to.deep.equal({});
|
|
116
131
|
});
|
|
117
132
|
|