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
|
@@ -0,0 +1,802 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { config } from 'src/config.js';
|
|
3
|
+
import { BANNER } from 'src/mediaTypes.js';
|
|
4
|
+
import { spec } from 'modules/adtrgtmeBidAdapter.js';
|
|
5
|
+
|
|
6
|
+
const DEFAULT_SID = 1220291391;
|
|
7
|
+
const DEFAULT_ZID = 1836455615;
|
|
8
|
+
const DEFAULT_BID_ID = '84ab500420319d';
|
|
9
|
+
|
|
10
|
+
const DEFAULT_AD_UNIT_CODE = '/1220291391/header-banner';
|
|
11
|
+
const DEFAULT_AD_UNIT_TYPE = BANNER;
|
|
12
|
+
const DEFAULT_PARAMS_BID_OVERRIDE = {};
|
|
13
|
+
|
|
14
|
+
const ADAPTER_VERSION = '1.0.0';
|
|
15
|
+
const PREBID_VERSION = '$prebid.version$';
|
|
16
|
+
const INTEGRATION_METHOD = 'prebid.js';
|
|
17
|
+
|
|
18
|
+
// Utility functions
|
|
19
|
+
const generateBidRequest = ({bidId, adUnitCode, bidOverrideObject, zid, ortb2}) => {
|
|
20
|
+
const bidRequest = {
|
|
21
|
+
adUnitCode,
|
|
22
|
+
auctionId: 'b06c5141-fe8f-4cdf-9d7d-54415490a917',
|
|
23
|
+
bidId,
|
|
24
|
+
bidderRequestsCount: 1,
|
|
25
|
+
bidder: 'adtrgtme',
|
|
26
|
+
bidderRequestId: '7101db09af0db2',
|
|
27
|
+
bidderWinsCount: 0,
|
|
28
|
+
mediaTypes: {},
|
|
29
|
+
params: {
|
|
30
|
+
bidOverride: bidOverrideObject
|
|
31
|
+
},
|
|
32
|
+
src: 'client',
|
|
33
|
+
transactionId: '5b17b67d-7704-4732-8cc9-5b1723e9bcf9',
|
|
34
|
+
ortb2
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const bannerObj = {
|
|
38
|
+
sizes: [[300, 250]]
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
bidRequest.mediaTypes.banner = bannerObj;
|
|
42
|
+
bidRequest.sizes = [[300, 250]];
|
|
43
|
+
|
|
44
|
+
bidRequest.params.sid = DEFAULT_SID;
|
|
45
|
+
if (typeof zid == 'number') {
|
|
46
|
+
bidRequest.params.zid = zid;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return bidRequest;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let generateBidderRequest = (bidRequestArray, adUnitCode, ortb2 = {}) => {
|
|
53
|
+
const bidderRequest = {
|
|
54
|
+
adUnitCode: adUnitCode || 'default-adUnitCode',
|
|
55
|
+
auctionId: 'd4c83a3b-18e4-4208-b98b-63848449c7aa',
|
|
56
|
+
auctionStart: new Date().getTime(),
|
|
57
|
+
bidderCode: 'adtrgtme',
|
|
58
|
+
bidderRequestId: '112f1c7c5d399a',
|
|
59
|
+
bids: bidRequestArray,
|
|
60
|
+
refererInfo: {
|
|
61
|
+
page: 'https://publisher-test.com',
|
|
62
|
+
reachedTop: true,
|
|
63
|
+
isAmp: false,
|
|
64
|
+
numIframes: 0,
|
|
65
|
+
stack: ['https://publisher-test.com'],
|
|
66
|
+
},
|
|
67
|
+
gdprConsent: {
|
|
68
|
+
consentString: 'BOtmiBKOtmiBKABABAENAFAAAAACeAAA',
|
|
69
|
+
vendorData: {},
|
|
70
|
+
gdprApplies: true
|
|
71
|
+
},
|
|
72
|
+
start: new Date().getTime(),
|
|
73
|
+
timeout: 1000,
|
|
74
|
+
ortb2
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
return bidderRequest;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const generateBuildRequestMock = ({bidId, adUnitCode, adUnitType, zid, bidOverrideObject, pubIdMode, ortb2}) => {
|
|
81
|
+
const bidRequestConfig = {
|
|
82
|
+
bidId: bidId || DEFAULT_BID_ID,
|
|
83
|
+
adUnitCode: adUnitCode || DEFAULT_AD_UNIT_CODE,
|
|
84
|
+
adUnitType: adUnitType || DEFAULT_AD_UNIT_TYPE,
|
|
85
|
+
zid: zid || DEFAULT_ZID,
|
|
86
|
+
bidOverrideObject: bidOverrideObject || DEFAULT_PARAMS_BID_OVERRIDE,
|
|
87
|
+
|
|
88
|
+
pubIdMode: pubIdMode || false,
|
|
89
|
+
ortb2: ortb2 || {}
|
|
90
|
+
};
|
|
91
|
+
const bidRequest = generateBidRequest(bidRequestConfig);
|
|
92
|
+
const validBidRequests = [bidRequest];
|
|
93
|
+
const bidderRequest = generateBidderRequest(validBidRequests, adUnitCode, ortb2);
|
|
94
|
+
|
|
95
|
+
return { bidRequest, validBidRequests, bidderRequest }
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const generateAdmPayload = (admPayloadType) => {
|
|
99
|
+
let ADM_PAYLOAD;
|
|
100
|
+
switch (admPayloadType) {
|
|
101
|
+
case 'banner':
|
|
102
|
+
ADM_PAYLOAD = '<script>logInfo(\'ad\'); AdPlacement </script>'; // banner
|
|
103
|
+
break;
|
|
104
|
+
default: '<script>logInfo(\'ad\'); AdPlacement </script>'; break;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return ADM_PAYLOAD;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const generateResponseMock = (admPayloadType) => {
|
|
111
|
+
const bidResponse = {
|
|
112
|
+
id: 'fc0c35df-21fb-4f93-9ebd-88759dbe31f9',
|
|
113
|
+
impid: '274395c06a24e5',
|
|
114
|
+
adm: generateAdmPayload(admPayloadType),
|
|
115
|
+
price: 1,
|
|
116
|
+
w: 300,
|
|
117
|
+
h: 250,
|
|
118
|
+
crid: 'ssp-placement-name',
|
|
119
|
+
adomain: ['advertiser-domain.com']
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const serverResponse = {
|
|
123
|
+
body: {
|
|
124
|
+
id: 'fc0c35df-21fb-4f93-9ebd-88759dbe31f9',
|
|
125
|
+
seatbid: [{ bid: [ bidResponse ], seat: 13107 }]
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({adUnitType: admPayloadType});
|
|
129
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
130
|
+
|
|
131
|
+
return {serverResponse, data, bidderRequest};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Unit tests
|
|
135
|
+
describe('adtrgtme Bid Adapter:', () => {
|
|
136
|
+
it('PLACEHOLDER TO PASS GULP', () => {
|
|
137
|
+
const obj = {};
|
|
138
|
+
expect(obj).to.be.an('object');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('Validate basic properties', () => {
|
|
142
|
+
it('should define the correct bidder code', () => {
|
|
143
|
+
expect(spec.code).to.equal('adtrgtme')
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('getUserSyncs()', () => {
|
|
148
|
+
const IMAGE_PIXEL_URL = 'http://image-pixel.com/foo/bar?1234&baz=true';
|
|
149
|
+
const IFRAME_ONE_URL = 'http://image-iframe.com/foo/bar?1234&baz=true';
|
|
150
|
+
const IFRAME_TWO_URL = 'http://image-iframe-two.com/foo/bar?1234&baz=true';
|
|
151
|
+
|
|
152
|
+
let serverResponses = [];
|
|
153
|
+
beforeEach(() => {
|
|
154
|
+
serverResponses[0] = {
|
|
155
|
+
body: {
|
|
156
|
+
ext: {
|
|
157
|
+
pixels: `<script>document.write('<iframe src="${IFRAME_ONE_URL}"></iframe>` +
|
|
158
|
+
`<img src="${IMAGE_PIXEL_URL}"></iframe>` +
|
|
159
|
+
`<iframe src="${IFRAME_TWO_URL}"></iframe>');</script>`
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
after(() => {
|
|
166
|
+
serverResponses = undefined;
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('for only iframe enabled syncs', () => {
|
|
170
|
+
let syncOptions = {
|
|
171
|
+
iframeEnabled: true,
|
|
172
|
+
pixelEnabled: false
|
|
173
|
+
};
|
|
174
|
+
let pixelsObjects = spec.getUserSyncs(syncOptions, serverResponses);
|
|
175
|
+
expect(pixelsObjects.length).to.equal(2);
|
|
176
|
+
expect(pixelsObjects).to.deep.equal(
|
|
177
|
+
[
|
|
178
|
+
{type: 'iframe', 'url': IFRAME_ONE_URL},
|
|
179
|
+
{type: 'iframe', 'url': IFRAME_TWO_URL}
|
|
180
|
+
]
|
|
181
|
+
)
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('for only pixel enabled syncs', () => {
|
|
185
|
+
let syncOptions = {
|
|
186
|
+
iframeEnabled: false,
|
|
187
|
+
pixelEnabled: true
|
|
188
|
+
};
|
|
189
|
+
let pixelsObjects = spec.getUserSyncs(syncOptions, serverResponses);
|
|
190
|
+
expect(pixelsObjects.length).to.equal(1);
|
|
191
|
+
expect(pixelsObjects).to.deep.equal(
|
|
192
|
+
[
|
|
193
|
+
{type: 'image', 'url': IMAGE_PIXEL_URL}
|
|
194
|
+
]
|
|
195
|
+
)
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('for both pixel and iframe enabled syncs', () => {
|
|
199
|
+
let syncOptions = {
|
|
200
|
+
iframeEnabled: true,
|
|
201
|
+
pixelEnabled: true
|
|
202
|
+
};
|
|
203
|
+
let pixelsObjects = spec.getUserSyncs(syncOptions, serverResponses);
|
|
204
|
+
expect(pixelsObjects.length).to.equal(3);
|
|
205
|
+
expect(pixelsObjects).to.deep.equal(
|
|
206
|
+
[
|
|
207
|
+
{type: 'iframe', 'url': IFRAME_ONE_URL},
|
|
208
|
+
{type: 'image', 'url': IMAGE_PIXEL_URL},
|
|
209
|
+
{type: 'iframe', 'url': IFRAME_TWO_URL}
|
|
210
|
+
]
|
|
211
|
+
)
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Validate Bid Requests
|
|
216
|
+
describe('isBidRequestValid()', () => {
|
|
217
|
+
const INVALID_INPUT = [
|
|
218
|
+
{},
|
|
219
|
+
{params: {}},
|
|
220
|
+
{params: {sid: '1234', zid: '4321'}},
|
|
221
|
+
{params: {sid: '1220291391', zid: 4321}},
|
|
222
|
+
{params: {zid: ''}},
|
|
223
|
+
{params: {sid: '', zid: ''}},
|
|
224
|
+
];
|
|
225
|
+
|
|
226
|
+
INVALID_INPUT.forEach(input => {
|
|
227
|
+
it(`should determine that the bid is INVALID for the input ${JSON.stringify(input)}`, () => {
|
|
228
|
+
expect(spec.isBidRequestValid(input)).to.be.false;
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('should determine that the bid is VALID if sid and zid are present on the params object', () => {
|
|
233
|
+
const validBid = {
|
|
234
|
+
params: {
|
|
235
|
+
sid: 1220291391,
|
|
236
|
+
zid: 1836455615
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
expect(spec.isBidRequestValid(validBid)).to.be.true;
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
describe('Price Floor module support:', () => {
|
|
244
|
+
it('should get bidfloor from getFloor method', () => {
|
|
245
|
+
const { bidRequest, validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
246
|
+
bidRequest.params.bidOverride = {cur: 'EUR'};
|
|
247
|
+
bidRequest.getFloor = (floorObj) => {
|
|
248
|
+
return {
|
|
249
|
+
floor: bidRequest.floors.values[floorObj.mediaType + '|300x250'],
|
|
250
|
+
currency: floorObj.currency,
|
|
251
|
+
mediaType: floorObj.mediaType
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
bidRequest.floors = {
|
|
255
|
+
currency: 'EUR',
|
|
256
|
+
values: {
|
|
257
|
+
'banner|300x250': 5.55
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
261
|
+
expect(data.cur).to.deep.equal(['EUR']);
|
|
262
|
+
expect(data.imp[0].bidfloor).is.a('number');
|
|
263
|
+
expect(data.imp[0].bidfloor).to.equal(5.55);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
describe('Schain module support:', () => {
|
|
268
|
+
it('should send Global or Bidder specific schain', function () {
|
|
269
|
+
const { bidRequest, validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
270
|
+
const globalSchain = {
|
|
271
|
+
ver: '1.0',
|
|
272
|
+
complete: 1,
|
|
273
|
+
nodes: [{
|
|
274
|
+
asi: 'some-platform.com',
|
|
275
|
+
sid: '111111',
|
|
276
|
+
rid: bidRequest.bidId,
|
|
277
|
+
hp: 1
|
|
278
|
+
}]
|
|
279
|
+
};
|
|
280
|
+
bidRequest.schain = globalSchain;
|
|
281
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
282
|
+
const schain = data.source.ext.schain;
|
|
283
|
+
expect(schain.nodes.length).to.equal(1);
|
|
284
|
+
expect(schain).to.equal(globalSchain);
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
describe('First party data module - "Site" support (ortb2):', () => {
|
|
289
|
+
// Should not allow invalid "site" data types
|
|
290
|
+
const INVALID_ORTB2_TYPES = [ null, [], 123, 'unsupportedKeyName', true, false, undefined ];
|
|
291
|
+
INVALID_ORTB2_TYPES.forEach(param => {
|
|
292
|
+
it(`should not allow invalid site types to be added to bid-request: ${JSON.stringify(param)}`, () => {
|
|
293
|
+
const ortb2 = { site: param }
|
|
294
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
295
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
296
|
+
expect(data.site[param]).to.be.undefined;
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
// Should add valid "site" params
|
|
301
|
+
const VALID_SITE_STRINGS = ['name', 'domain', 'page', 'ref', 'keywords'];
|
|
302
|
+
const VALID_SITE_ARRAYS = ['cat', 'sectioncat', 'pagecat'];
|
|
303
|
+
|
|
304
|
+
VALID_SITE_STRINGS.forEach(param => {
|
|
305
|
+
it(`should allow supported site keys to be added bid-request: ${JSON.stringify(param)}`, () => {
|
|
306
|
+
const ortb2 = {
|
|
307
|
+
site: {
|
|
308
|
+
[param]: 'something'
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
312
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
313
|
+
expect(data.site[param]).to.exist;
|
|
314
|
+
expect(data.site[param]).to.be.a('string');
|
|
315
|
+
expect(data.site[param]).to.be.equal(ortb2.site[param]);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
VALID_SITE_ARRAYS.forEach(param => {
|
|
320
|
+
it(`should determine that the ortb2.site Array key is valid and append to the bid-request: ${JSON.stringify(param)}`, () => {
|
|
321
|
+
const ortb2 = {
|
|
322
|
+
site: {
|
|
323
|
+
[param]: ['something']
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
327
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
328
|
+
expect(data.site[param]).to.exist;
|
|
329
|
+
expect(data.site[param]).to.be.a('array');
|
|
330
|
+
expect(data.site[param]).to.be.equal(ortb2.site[param]);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
// Should not allow invalid "site.content" data types
|
|
335
|
+
INVALID_ORTB2_TYPES.forEach(param => {
|
|
336
|
+
it(`should determine that the ortb2.site.content key is invalid and should not be added to bid-request: ${JSON.stringify(param)}`, () => {
|
|
337
|
+
const ortb2 = {
|
|
338
|
+
site: {
|
|
339
|
+
content: param
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
343
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
344
|
+
expect(data.site.content).to.be.undefined;
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
// Should not allow invalid "site.content" keys
|
|
349
|
+
it(`should not allow invalid ortb2.site.content object keys to be added to bid-request: {custom object}`, () => {
|
|
350
|
+
const ortb2 = {
|
|
351
|
+
site: {
|
|
352
|
+
content: {
|
|
353
|
+
fake: 'news',
|
|
354
|
+
unreal: 'param',
|
|
355
|
+
counterfit: 'data'
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
360
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
361
|
+
expect(data.site.content).to.be.a('object');
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// Should append valid "site.content" keys
|
|
365
|
+
const VALID_CONTENT_STRINGS = ['id', 'title', 'language'];
|
|
366
|
+
VALID_CONTENT_STRINGS.forEach(param => {
|
|
367
|
+
it(`should determine that the ortb2.site String key is valid and append to the bid-request: ${JSON.stringify(param)}`, () => {
|
|
368
|
+
const ortb2 = {
|
|
369
|
+
site: {
|
|
370
|
+
content: {
|
|
371
|
+
[param]: 'something'
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
376
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
377
|
+
expect(data.site.content[param]).to.exist;
|
|
378
|
+
expect(data.site.content[param]).to.be.a('string');
|
|
379
|
+
expect(data.site.content[param]).to.be.equal(ortb2.site.content[param]);
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
const VALID_CONTENT_ARRAYS = ['cat'];
|
|
384
|
+
VALID_CONTENT_ARRAYS.forEach(param => {
|
|
385
|
+
it(`should determine that the ortb2.site Array key is valid and append to the bid-request: ${JSON.stringify(param)}`, () => {
|
|
386
|
+
const ortb2 = {
|
|
387
|
+
site: {
|
|
388
|
+
content: {
|
|
389
|
+
[param]: ['something', 'something-else']
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
394
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
395
|
+
expect(data.site.content[param]).to.be.a('array');
|
|
396
|
+
expect(data.site.content[param]).to.be.equal(ortb2.site.content[param]);
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
describe('First party data module - "User" support (ortb2):', () => {
|
|
402
|
+
// Global ortb2.user validations
|
|
403
|
+
// Should not allow invalid "user" data types
|
|
404
|
+
const INVALID_ORTB2_TYPES = [ null, [], 'unsupportedKeyName', true, false, undefined ];
|
|
405
|
+
INVALID_ORTB2_TYPES.forEach(param => {
|
|
406
|
+
it(`should not allow invalid site types to be added to bid-request: ${JSON.stringify(param)}`, () => {
|
|
407
|
+
const ortb2 = { user: param }
|
|
408
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
409
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
410
|
+
expect(data.user[param]).to.be.undefined;
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// Should add valid "user" params
|
|
415
|
+
const VALID_USER_STRINGS = ['id', 'buyeruid', 'gender', 'keywords', 'customdata'];
|
|
416
|
+
VALID_USER_STRINGS.forEach(param => {
|
|
417
|
+
it(`should allow supported user string keys to be added bid-request: ${JSON.stringify(param)}`, () => {
|
|
418
|
+
const ortb2 = {
|
|
419
|
+
user: {
|
|
420
|
+
[param]: 'something'
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
424
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
425
|
+
expect(data.user[param]).to.exist;
|
|
426
|
+
expect(data.user[param]).to.be.a('string');
|
|
427
|
+
expect(data.user[param]).to.be.equal(ortb2.user[param]);
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
const VALID_USER_OBJECTS = ['ext'];
|
|
432
|
+
VALID_USER_OBJECTS.forEach(param => {
|
|
433
|
+
it(`should allow supported user extObject keys to be added to the bid-request: ${JSON.stringify(param)}`, () => {
|
|
434
|
+
const ortb2 = {
|
|
435
|
+
user: {
|
|
436
|
+
[param]: {a: '123', b: '456'}
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2});
|
|
440
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
441
|
+
expect(data.user[param]).to.exist;
|
|
442
|
+
expect(data.user[param]).to.be.a('object');
|
|
443
|
+
expect(data.user[param]).to.be.deep.include({[param]: {a: '123', b: '456'}});
|
|
444
|
+
config.setConfig({ortb2: {}});
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
// adUnit.ortb2Imp.ext.data
|
|
449
|
+
it(`should allow adUnit.ortb2Imp.ext.data object to be added to the bid-request`, () => {
|
|
450
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({})
|
|
451
|
+
validBidRequests[0].ortb2Imp = {
|
|
452
|
+
ext: {
|
|
453
|
+
data: {
|
|
454
|
+
pbadslot: 'homepage-top-rect',
|
|
455
|
+
adUnitSpecificAttribute: '123'
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
460
|
+
expect(data.imp[0].ext.data).to.deep.equal(validBidRequests[0].ortb2Imp.ext.data);
|
|
461
|
+
});
|
|
462
|
+
// adUnit.ortb2Imp.instl
|
|
463
|
+
it(`should allow adUnit.ortb2Imp.instl numeric boolean "1" to be added to the bid-request`, () => {
|
|
464
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({})
|
|
465
|
+
validBidRequests[0].ortb2Imp = {
|
|
466
|
+
instl: 1
|
|
467
|
+
};
|
|
468
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
469
|
+
expect(data.imp[0].instl).to.deep.equal(validBidRequests[0].ortb2Imp.instl);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it(`should prevent adUnit.ortb2Imp.instl boolean "true" to be added to the bid-request`, () => {
|
|
473
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({})
|
|
474
|
+
validBidRequests[0].ortb2Imp = {
|
|
475
|
+
instl: true
|
|
476
|
+
};
|
|
477
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
478
|
+
expect(data.imp[0].instl).to.not.exist;
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
it(`should prevent adUnit.ortb2Imp.instl boolean "false" to be added to the bid-request`, () => {
|
|
482
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({})
|
|
483
|
+
validBidRequests[0].ortb2Imp = {
|
|
484
|
+
instl: false
|
|
485
|
+
};
|
|
486
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
487
|
+
expect(data.imp[0].instl).to.not.exist;
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
describe('GDPR & Consent:', () => {
|
|
492
|
+
it('should return request objects that do not send cookies if purpose 1 consent is not provided', () => {
|
|
493
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
494
|
+
bidderRequest.gdprConsent = {
|
|
495
|
+
consentString: 'BOtmiBKOtmiBKABABAENAFAAAAACeAAA',
|
|
496
|
+
apiVersion: 2,
|
|
497
|
+
vendorData: {
|
|
498
|
+
purpose: {
|
|
499
|
+
consents: {
|
|
500
|
+
'1': false
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
gdprApplies: true
|
|
505
|
+
};
|
|
506
|
+
const options = spec.buildRequests(validBidRequests, bidderRequest)[0].options;
|
|
507
|
+
expect(options.withCredentials).to.be.false;
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
describe('Endpoint & Impression Request Mode:', () => {
|
|
512
|
+
it('should route request to config override endpoint', () => {
|
|
513
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
514
|
+
const sid = validBidRequests[0].params.sid;
|
|
515
|
+
const testOverrideEndpoint = 'http://new_bidder_host.com/ssp?s=';
|
|
516
|
+
config.setConfig({
|
|
517
|
+
adtrgtme: {
|
|
518
|
+
endpoint: testOverrideEndpoint
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
const response = spec.buildRequests(validBidRequests, bidderRequest)[0];
|
|
522
|
+
expect(response).to.deep.include(
|
|
523
|
+
{
|
|
524
|
+
method: 'POST',
|
|
525
|
+
url: testOverrideEndpoint + sid
|
|
526
|
+
});
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
it('should route request to endpoint + sid', () => {
|
|
530
|
+
config.setConfig({
|
|
531
|
+
adtrgtme: {}
|
|
532
|
+
});
|
|
533
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
534
|
+
const sid = validBidRequests[0].params.sid;
|
|
535
|
+
const response = spec.buildRequests(validBidRequests, bidderRequest);
|
|
536
|
+
expect(response[0]).to.deep.include({
|
|
537
|
+
method: 'POST',
|
|
538
|
+
url: 'https://z.cdn.adtarget.market/ssp?prebid&s=' + sid
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
|
|
542
|
+
it('should return a single request object for single request mode', () => {
|
|
543
|
+
let { bidRequest, validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
544
|
+
const BID_ID_2 = '84ab50xxxxx';
|
|
545
|
+
const BID_ZID_2 = 98876543210;
|
|
546
|
+
const AD_UNIT_CODE_2 = 'test-ad-unit-code-123';
|
|
547
|
+
const { bidRequest: bidRequest2 } = generateBuildRequestMock({bidId: BID_ID_2, zid: BID_ZID_2, adUnitCode: AD_UNIT_CODE_2});
|
|
548
|
+
validBidRequests = [bidRequest, bidRequest2];
|
|
549
|
+
bidderRequest.bids = validBidRequests;
|
|
550
|
+
|
|
551
|
+
config.setConfig({
|
|
552
|
+
adtrgtme: {
|
|
553
|
+
singleRequestMode: true
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest).data;
|
|
558
|
+
|
|
559
|
+
expect(data.imp).to.be.an('array').with.lengthOf(2);
|
|
560
|
+
|
|
561
|
+
expect(data.imp[0]).to.deep.include({
|
|
562
|
+
id: DEFAULT_BID_ID,
|
|
563
|
+
ext: {
|
|
564
|
+
dfp_ad_unit_code: DEFAULT_AD_UNIT_CODE
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
expect(data.imp[1]).to.deep.include({
|
|
569
|
+
id: BID_ID_2,
|
|
570
|
+
tagid: BID_ZID_2,
|
|
571
|
+
ext: {
|
|
572
|
+
dfp_ad_unit_code: AD_UNIT_CODE_2
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
describe('Validate request filtering:', () => {
|
|
579
|
+
it('should not return request when no bids are present', function () {
|
|
580
|
+
let request = spec.buildRequests([]);
|
|
581
|
+
expect(request).to.be.undefined;
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
it('buildRequests(): should return an array with the correct amount of request objects', () => {
|
|
585
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
586
|
+
const response = spec.buildRequests(validBidRequests, bidderRequest).bidderRequest;
|
|
587
|
+
expect(response.bids).to.be.an('array').to.have.lengthOf(1);
|
|
588
|
+
});
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
describe('Request Headers validation:', () => {
|
|
592
|
+
it('should return request objects with the relevant custom headers and content type declaration', () => {
|
|
593
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
594
|
+
bidderRequest.gdprConsent.gdprApplies = false;
|
|
595
|
+
const options = spec.buildRequests(validBidRequests, bidderRequest).options;
|
|
596
|
+
expect(options).to.deep.equal(
|
|
597
|
+
{
|
|
598
|
+
contentType: 'application/json',
|
|
599
|
+
customHeaders: {
|
|
600
|
+
'x-openrtb-version': '2.5'
|
|
601
|
+
},
|
|
602
|
+
withCredentials: true
|
|
603
|
+
});
|
|
604
|
+
});
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
describe('Request Payload oRTB bid validation:', () => {
|
|
608
|
+
it('should generate a valid openRTB bid-request object in the data field', () => {
|
|
609
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
610
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest).data;
|
|
611
|
+
expect(data.site).to.deep.include({
|
|
612
|
+
id: bidderRequest.bids[0].params.sid,
|
|
613
|
+
page: bidderRequest.refererInfo.page
|
|
614
|
+
});
|
|
615
|
+
|
|
616
|
+
expect(data.device).to.deep.equal({
|
|
617
|
+
dnt: 0,
|
|
618
|
+
ua: navigator.userAgent,
|
|
619
|
+
ip: undefined
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
expect(data.regs).to.deep.equal({
|
|
623
|
+
ext: {
|
|
624
|
+
'us_privacy': '',
|
|
625
|
+
gdpr: 1
|
|
626
|
+
}
|
|
627
|
+
});
|
|
628
|
+
|
|
629
|
+
expect(data.source).to.deep.equal({
|
|
630
|
+
ext: {
|
|
631
|
+
hb: 1,
|
|
632
|
+
adapterver: ADAPTER_VERSION,
|
|
633
|
+
prebidver: PREBID_VERSION,
|
|
634
|
+
integration: {
|
|
635
|
+
name: INTEGRATION_METHOD,
|
|
636
|
+
ver: PREBID_VERSION
|
|
637
|
+
}
|
|
638
|
+
},
|
|
639
|
+
fd: 1
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
expect(data.cur).to.deep.equal(['USD']);
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
it('should generate a valid openRTB imp.ext object in the bid-request', () => {
|
|
646
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
647
|
+
const bid = validBidRequests[0];
|
|
648
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest).data;
|
|
649
|
+
expect(data.imp[0].ext).to.deep.equal({
|
|
650
|
+
dfp_ad_unit_code: DEFAULT_AD_UNIT_CODE
|
|
651
|
+
});
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
it('should use siteId value as site.id in the outbound bid-request when using "pubId" integration mode', () => {
|
|
655
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({pubIdMode: true});
|
|
656
|
+
validBidRequests[0].params.sid = 9876543210;
|
|
657
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest).data;
|
|
658
|
+
expect(data.site.id).to.equal(9876543210);
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
it('should use placementId value as imp.tagid in the outbound bid-request when using "zid"', () => {
|
|
662
|
+
let { validBidRequests, bidderRequest } = generateBuildRequestMock({}),
|
|
663
|
+
TEST_ZID = 54321;
|
|
664
|
+
validBidRequests[0].params.zid = TEST_ZID;
|
|
665
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest).data;
|
|
666
|
+
expect(data.imp[0].tagid).to.deep.equal(TEST_ZID);
|
|
667
|
+
});
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
describe('Request Payload oRTB bid.imp validation:', () => {
|
|
671
|
+
// Validate Banner imp imp when adtrgtme.mode=undefined
|
|
672
|
+
it('should generate a valid "Banner" imp object', () => {
|
|
673
|
+
config.setConfig({
|
|
674
|
+
adtrgtme: {}
|
|
675
|
+
});
|
|
676
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
677
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
678
|
+
expect(data.imp[0].banner).to.deep.equal({
|
|
679
|
+
mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
|
|
680
|
+
format: [{w: 300, h: 250}]
|
|
681
|
+
});
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
// Validate Banner imp
|
|
685
|
+
it('should generate a valid "Banner" imp object', () => {
|
|
686
|
+
config.setConfig({
|
|
687
|
+
adtrgtme: { mode: 'banner' }
|
|
688
|
+
});
|
|
689
|
+
const { validBidRequests, bidderRequest } = generateBuildRequestMock({});
|
|
690
|
+
const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data;
|
|
691
|
+
expect(data.imp[0].banner).to.deep.equal({
|
|
692
|
+
mimes: ['text/html', 'text/javascript', 'application/javascript', 'image/jpg'],
|
|
693
|
+
format: [{w: 300, h: 250}]
|
|
694
|
+
});
|
|
695
|
+
});
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
describe('interpretResponse()', () => {
|
|
699
|
+
describe('for mediaTypes: "banner"', () => {
|
|
700
|
+
it('should insert banner payload into response[0].ad', () => {
|
|
701
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
702
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
703
|
+
expect(response[0].ad).to.equal('<script>logInfo(\'ad\'); AdPlacement </script>');
|
|
704
|
+
expect(response[0].mediaType).to.equal('banner');
|
|
705
|
+
})
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
describe('Support Advertiser domains', () => {
|
|
709
|
+
it('should append bid-response adomain to meta.advertiserDomains', () => {
|
|
710
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
711
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
712
|
+
expect(response[0].meta.advertiserDomains).to.be.a('array');
|
|
713
|
+
expect(response[0].meta.advertiserDomains[0]).to.equal('advertiser-domain.com');
|
|
714
|
+
})
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
describe('bid response Ad ID / Creative ID', () => {
|
|
718
|
+
it('should use adId if it exists in the bid-response', () => {
|
|
719
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
720
|
+
const adId = 'bid-response-adId';
|
|
721
|
+
serverResponse.body.seatbid[0].bid[0].adId = adId;
|
|
722
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
723
|
+
expect(response[0].adId).to.equal(adId);
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
it('should use impid if adId does not exist in the bid-response', () => {
|
|
727
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
728
|
+
const impid = '25b6c429c1f52f';
|
|
729
|
+
serverResponse.body.seatbid[0].bid[0].impid = impid;
|
|
730
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
731
|
+
expect(response[0].adId).to.equal(impid);
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
it('should use crid if adId & impid do not exist in the bid-response', () => {
|
|
735
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
736
|
+
const crid = 'passback-12579';
|
|
737
|
+
serverResponse.body.seatbid[0].bid[0].impid = undefined;
|
|
738
|
+
serverResponse.body.seatbid[0].bid[0].crid = crid;
|
|
739
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
740
|
+
expect(response[0].adId).to.equal(crid);
|
|
741
|
+
});
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
describe('Time To Live (ttl)', () => {
|
|
745
|
+
const UNSUPPORTED_TTL_FORMATS = ['string', [1, 2, 3], true, false, null, undefined];
|
|
746
|
+
UNSUPPORTED_TTL_FORMATS.forEach(param => {
|
|
747
|
+
it('should not allow unsupported global adtrgtme.ttl formats and default to 300', () => {
|
|
748
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
749
|
+
config.setConfig({
|
|
750
|
+
adtrgtme: { ttl: param }
|
|
751
|
+
});
|
|
752
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
753
|
+
expect(response[0].ttl).to.equal(300);
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
it('should not allow unsupported params.ttl formats and default to 300', () => {
|
|
757
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
758
|
+
bidderRequest.bids[0].params.ttl = param;
|
|
759
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
760
|
+
expect(response[0].ttl).to.equal(300);
|
|
761
|
+
});
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
const UNSUPPORTED_TTL_VALUES = [-1, 3601];
|
|
765
|
+
UNSUPPORTED_TTL_VALUES.forEach(param => {
|
|
766
|
+
it('should not allow invalid global adtrgtme.ttl values 3600 < ttl < 0 and default to 300', () => {
|
|
767
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
768
|
+
config.setConfig({
|
|
769
|
+
adtrgtme: { ttl: param }
|
|
770
|
+
});
|
|
771
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
772
|
+
expect(response[0].ttl).to.equal(300);
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
it('should not allow invalid params.ttl values 3600 < ttl < 0 and default to 300', () => {
|
|
776
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
777
|
+
bidderRequest.bids[0].params.ttl = param;
|
|
778
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
779
|
+
expect(response[0].ttl).to.equal(300);
|
|
780
|
+
});
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
it('should give presedence to Gloabl ttl over params.ttl ', () => {
|
|
784
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
785
|
+
config.setConfig({
|
|
786
|
+
adtrgtme: { ttl: 500 }
|
|
787
|
+
});
|
|
788
|
+
bidderRequest.bids[0].params.ttl = 400;
|
|
789
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
790
|
+
expect(response[0].ttl).to.equal(500);
|
|
791
|
+
});
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
describe('Aliasing support', () => {
|
|
795
|
+
it('should return undefined as the bidder code value', () => {
|
|
796
|
+
const { serverResponse, bidderRequest } = generateResponseMock('banner');
|
|
797
|
+
const response = spec.interpretResponse(serverResponse, {bidderRequest});
|
|
798
|
+
expect(response[0].bidderCode).to.be.undefined;
|
|
799
|
+
});
|
|
800
|
+
});
|
|
801
|
+
});
|
|
802
|
+
});
|