prebid.js 7.25.0 → 7.27.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/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adWMGAnalyticsAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
- package/dist/adlooxAdServerVideo.js +1 -1
- package/dist/adlooxAnalyticsAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/admaticBidAdapter.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adomikAnalyticsAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adxpremiumAnalyticsAdapter.js +1 -1
- package/dist/aidemBidAdapter.js +1 -0
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/analyticsAdapter.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/atsAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidViewability.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/browsiRtdProvider.js +1 -1
- package/dist/bucksenseBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/captifyRtdProvider.js +1 -0
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertAnalyticsAdapter.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/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/datablocksAnalyticsAdapter.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningAnalyticsAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fluctBidAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/gdprEnforcement.js +1 -1
- package/dist/genericAnalyticsAdapter.js +1 -0
- package/dist/geoedgeRtdProvider.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/glomexBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/googleAnalyticsAdapter.js +1 -1
- package/dist/gravitoIdSystem.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -0
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronAnalyticsAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.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/invisiblyAnalyticsAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerRtdProvider.js +1 -1
- package/dist/kargoAnalyticsAdapter.js +1 -1
- package/dist/kinessoIdSystem.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/limelightDigitalBidAdapter.js +1 -1
- package/dist/liveIntentAnalyticsAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/livewrappedAnalyticsAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.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/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +240 -202
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openxAnalyticsAdapter.js +1 -1
- package/dist/optimonAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pbsExtensions.js +1 -1
- package/dist/pianoDmpAnalyticsAdapter.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
- package/dist/pubCommonId.js +1 -1
- package/dist/pubProvidedIdSystem.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubperfAnalyticsAdapter.js +1 -1
- package/dist/pubstackAnalyticsAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pulsepointAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/rasBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/realvuAnalyticsAdapter.js +1 -1
- package/dist/redtramBidAdapter.js +1 -0
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevantAnalyticsAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rivrAnalyticsAdapter.js +1 -1
- package/dist/roxotAnalyticsAdapter.js +1 -1
- package/dist/rtbhouseBidAdapter.js +1 -1
- package/dist/rtdModule.js +1 -1
- package/dist/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/s2sTesting.js +1 -1
- package/dist/scaleableAnalyticsAdapter.js +1 -1
- package/dist/schain.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/sigmoidAnalyticsAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartytechBidAdapter.js +1 -0
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiAnalyticsAdapter.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/staqAnalyticsAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/teadsIdSystem.js +1 -1
- package/dist/terceptAnalyticsAdapter.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/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/viqeoBidAdapter.js +1 -0
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/weboramaRtdProvider.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yandexBidAdapter.js +1 -1
- package/dist/yieldlabBidAdapter.js +1 -1
- package/dist/yieldliftBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
- package/dist/zeta_global_sspBidAdapter.js +1 -1
- package/dist/zeusPrimeRtdProvider.js +31 -0
- package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
- package/integrationExamples/gpt/growthcode.html +134 -0
- package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
- package/modules/.submodules.json +3 -1
- package/modules/admaticBidAdapter.js +116 -58
- package/modules/admaticBidAdapter.md +2 -2
- package/modules/admixerBidAdapter.js +1 -1
- package/modules/aidemBidAdapter.js +492 -0
- package/modules/aidemBidAdapter.md +187 -0
- package/modules/beopBidAdapter.js +17 -2
- package/modules/browsiRtdProvider.js +6 -4
- package/modules/bucksenseBidAdapter.js +1 -1
- package/modules/captifyRtdProvider.js +146 -0
- package/modules/captifyRtdProvider.md +68 -0
- package/modules/criteoBidAdapter.js +3 -3
- package/modules/discoveryBidAdapter.js +38 -17
- package/modules/discoveryBidAdapter.md +7 -6
- package/modules/eplanningBidAdapter.js +2 -6
- package/modules/fluctBidAdapter.js +5 -0
- package/modules/gdprEnforcement.js +26 -24
- package/modules/genericAnalyticsAdapter.js +157 -0
- package/modules/geoedgeRtdProvider.js +22 -0
- package/modules/glomexBidAdapter.js +2 -0
- package/modules/gravitoIdSystem.js +3 -4
- package/modules/gridBidAdapter.js +441 -23
- package/modules/gridNMBidAdapter.js +1 -1
- package/modules/growthCodeAnalyticsAdapter.js +176 -0
- package/modules/growthCodeAnalyticsAdapter.md +41 -0
- package/modules/impactifyBidAdapter.js +19 -1
- package/modules/jwplayerRtdProvider.js +1 -2
- package/modules/limelightDigitalBidAdapter.js +1 -1
- package/modules/minutemediaBidAdapter.md +3 -3
- package/modules/nextMillenniumBidAdapter.js +19 -23
- package/modules/nexx360BidAdapter.js +264 -138
- package/modules/pubCommonId.js +2 -1
- package/modules/pubProvidedIdSystem.js +2 -0
- package/modules/rasBidAdapter.js +8 -3
- package/modules/rasBidAdapter.md +16 -15
- package/modules/redtramBidAdapter.js +155 -0
- package/modules/redtramBidAdapter.md +33 -0
- package/modules/riseBidAdapter.js +15 -0
- package/modules/riseBidAdapter.md +3 -3
- package/modules/rtbhouseBidAdapter.js +90 -29
- package/modules/rubiconBidAdapter.js +2 -1
- package/modules/seedtagBidAdapter.js +67 -56
- package/modules/seedtagBidAdapter.md +60 -0
- package/modules/sharedIdSystem.js +3 -1
- package/modules/smartadserverBidAdapter.js +6 -2
- package/modules/smartxBidAdapter.js +11 -8
- package/modules/smartytechBidAdapter.js +78 -0
- package/modules/smartytechBidAdapter.md +44 -0
- package/modules/smnBidAdapter.md +52 -0
- package/modules/taboolaBidAdapter.js +3 -3
- package/modules/taboolaBidAdapter.md +0 -2
- package/modules/tappxBidAdapter.js +21 -6
- package/modules/tripleliftBidAdapter.js +1 -1
- package/modules/ttdBidAdapter.js +8 -3
- package/modules/userId/index.js +1 -1
- package/modules/vidazooBidAdapter.js +26 -3
- package/modules/viqeoBidAdapter.js +180 -0
- package/modules/viqeoBidAdapter.md +56 -0
- package/modules/yandexBidAdapter.js +85 -19
- package/modules/yandexBidAdapter.md +7 -7
- package/modules/yieldlabBidAdapter.js +29 -12
- package/modules/yieldliftBidAdapter.js +3 -3
- package/modules/yieldoneBidAdapter.js +60 -8
- package/modules/yieldoneBidAdapter.md +109 -9
- package/modules/zeta_global_sspBidAdapter.js +4 -0
- package/modules/zeusPrimeRtdProvider.js +357 -0
- package/modules/zeusPrimeRtdProvider.md +60 -0
- package/package.json +1 -1
- package/src/adloader.js +0 -1
- package/src/auction.js +19 -3
- package/src/consentHandler.js +8 -0
- package/src/events.js +4 -0
- package/src/native.js +31 -20
- package/src/refererDetection.js +6 -1
- package/src/storageManager.js +6 -3
- package/test/helpers/analytics.js +34 -0
- package/test/mocks/analyticsStub.js +3 -1
- package/test/spec/AnalyticsAdapter_spec.js +119 -116
- package/test/spec/auctionmanager_spec.js +86 -0
- package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
- package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
- package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
- package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
- package/test/spec/modules/beopBidAdapter_spec.js +52 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
- package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
- package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
- package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
- package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
- package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
- package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
- package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
- package/test/spec/modules/fpdModule_spec.js +1 -1
- package/test/spec/modules/gdprEnforcement_spec.js +115 -68
- package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
- package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
- package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
- package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
- package/test/spec/modules/gridBidAdapter_spec.js +289 -1
- package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
- package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
- package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
- package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
- package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
- package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
- package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
- package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
- package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
- package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
- package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
- package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
- package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
- package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
- package/test/spec/modules/rasBidAdapter_spec.js +5 -1
- package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
- package/test/spec/modules/riseBidAdapter_spec.js +24 -0
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
- package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
- package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
- package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
- package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
- package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
- package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
- package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
- package/test/spec/modules/ttdBidAdapter_spec.js +27 -0
- package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
- package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
- package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
- package/test/spec/modules/yieldlabBidAdapter_spec.js +174 -20
- package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
- package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
- package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
- package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
- package/test/spec/native_spec.js +68 -56
- package/test/spec/refererDetection_spec.js +45 -7
- package/test/spec/unit/core/storageManager_spec.js +2 -1
|
@@ -20,6 +20,7 @@ import * as events from 'src/events.js';
|
|
|
20
20
|
import 'modules/appnexusBidAdapter.js'; // some tests expect this to be in the adapter registry
|
|
21
21
|
import 'src/prebid.js'
|
|
22
22
|
import {hook} from '../../../src/hook.js';
|
|
23
|
+
import {VENDORLESS_GVLID} from '../../../src/consentHandler.js';
|
|
23
24
|
|
|
24
25
|
describe('gdpr enforcement', function () {
|
|
25
26
|
let nextFnSpy;
|
|
@@ -150,13 +151,13 @@ describe('gdpr enforcement', function () {
|
|
|
150
151
|
}
|
|
151
152
|
});
|
|
152
153
|
|
|
153
|
-
deviceAccessHook(nextFnSpy
|
|
154
|
+
deviceAccessHook(nextFnSpy);
|
|
154
155
|
expect(nextFnSpy.calledOnce).to.equal(true);
|
|
155
156
|
let result = {
|
|
156
157
|
hasEnforcementHook: true,
|
|
157
158
|
valid: false
|
|
158
159
|
}
|
|
159
|
-
sinon.assert.calledWith(nextFnSpy,
|
|
160
|
+
sinon.assert.calledWith(nextFnSpy, undefined, undefined, result);
|
|
160
161
|
});
|
|
161
162
|
|
|
162
163
|
it('should only check for consent for vendor exceptions when enforcePurpose and enforceVendor are false', function () {
|
|
@@ -178,8 +179,8 @@ describe('gdpr enforcement', function () {
|
|
|
178
179
|
consentData.apiVersion = 2;
|
|
179
180
|
gdprDataHandlerStub.returns(consentData);
|
|
180
181
|
|
|
181
|
-
deviceAccessHook(nextFnSpy,
|
|
182
|
-
deviceAccessHook(nextFnSpy,
|
|
182
|
+
deviceAccessHook(nextFnSpy, 1, 'appnexus');
|
|
183
|
+
deviceAccessHook(nextFnSpy, 5, 'rubicon');
|
|
183
184
|
expect(logWarnSpy.callCount).to.equal(0);
|
|
184
185
|
});
|
|
185
186
|
|
|
@@ -201,8 +202,8 @@ describe('gdpr enforcement', function () {
|
|
|
201
202
|
consentData.apiVersion = 2;
|
|
202
203
|
gdprDataHandlerStub.returns(consentData);
|
|
203
204
|
|
|
204
|
-
deviceAccessHook(nextFnSpy,
|
|
205
|
-
deviceAccessHook(nextFnSpy,
|
|
205
|
+
deviceAccessHook(nextFnSpy, 1, 'appnexus');
|
|
206
|
+
deviceAccessHook(nextFnSpy, 3, 'rubicon');
|
|
206
207
|
expect(logWarnSpy.callCount).to.equal(1);
|
|
207
208
|
});
|
|
208
209
|
|
|
@@ -224,13 +225,13 @@ describe('gdpr enforcement', function () {
|
|
|
224
225
|
consentData.apiVersion = 2;
|
|
225
226
|
gdprDataHandlerStub.returns(consentData);
|
|
226
227
|
|
|
227
|
-
deviceAccessHook(nextFnSpy,
|
|
228
|
+
deviceAccessHook(nextFnSpy, 1, 'appnexus');
|
|
228
229
|
expect(nextFnSpy.calledOnce).to.equal(true);
|
|
229
230
|
let result = {
|
|
230
231
|
hasEnforcementHook: true,
|
|
231
232
|
valid: true
|
|
232
233
|
}
|
|
233
|
-
sinon.assert.calledWith(nextFnSpy,
|
|
234
|
+
sinon.assert.calledWith(nextFnSpy, 1, 'appnexus', result);
|
|
234
235
|
});
|
|
235
236
|
|
|
236
237
|
it('should use gvlMapping set by publisher', function() {
|
|
@@ -255,13 +256,13 @@ describe('gdpr enforcement', function () {
|
|
|
255
256
|
consentData.apiVersion = 2;
|
|
256
257
|
gdprDataHandlerStub.returns(consentData);
|
|
257
258
|
|
|
258
|
-
deviceAccessHook(nextFnSpy,
|
|
259
|
+
deviceAccessHook(nextFnSpy, 1, 'appnexus');
|
|
259
260
|
expect(nextFnSpy.calledOnce).to.equal(true);
|
|
260
261
|
let result = {
|
|
261
262
|
hasEnforcementHook: true,
|
|
262
263
|
valid: true
|
|
263
264
|
}
|
|
264
|
-
sinon.assert.calledWith(nextFnSpy,
|
|
265
|
+
sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
|
|
265
266
|
config.resetConfig();
|
|
266
267
|
});
|
|
267
268
|
|
|
@@ -290,31 +291,17 @@ describe('gdpr enforcement', function () {
|
|
|
290
291
|
consentData.apiVersion = 2;
|
|
291
292
|
gdprDataHandlerStub.returns(consentData);
|
|
292
293
|
|
|
293
|
-
deviceAccessHook(nextFnSpy,
|
|
294
|
+
deviceAccessHook(nextFnSpy, 1, 'appnexus');
|
|
294
295
|
expect(nextFnSpy.calledOnce).to.equal(true);
|
|
295
296
|
let result = {
|
|
296
297
|
hasEnforcementHook: true,
|
|
297
298
|
valid: true
|
|
298
299
|
}
|
|
299
|
-
sinon.assert.calledWith(nextFnSpy,
|
|
300
|
+
sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
|
|
300
301
|
config.resetConfig();
|
|
301
302
|
curBidderStub.restore();
|
|
302
303
|
});
|
|
303
304
|
|
|
304
|
-
it(`should mark module as vendorless for rule validation when isVendorless = true and ${STRICT_STORAGE_ENFORCEMENT} is set`, () => {
|
|
305
|
-
setEnforcementConfig({
|
|
306
|
-
[STRICT_STORAGE_ENFORCEMENT]: true
|
|
307
|
-
});
|
|
308
|
-
let consentData = {
|
|
309
|
-
vendorData: staticConfig.consentData.getTCData,
|
|
310
|
-
gdprApplies: true
|
|
311
|
-
}
|
|
312
|
-
gdprDataHandlerStub.returns(consentData);
|
|
313
|
-
const validate = sinon.stub().callsFake(() => true);
|
|
314
|
-
deviceAccessHook(nextFnSpy, true, 123, 'mockModule', undefined, {validate});
|
|
315
|
-
expect(validate.args[0][4]('mockModule')).to.be.true;
|
|
316
|
-
});
|
|
317
|
-
|
|
318
305
|
it(`should not enforce consent for vendorless modules if ${STRICT_STORAGE_ENFORCEMENT} is not set`, () => {
|
|
319
306
|
setEnforcementConfig({});
|
|
320
307
|
let consentData = {
|
|
@@ -323,9 +310,9 @@ describe('gdpr enforcement', function () {
|
|
|
323
310
|
}
|
|
324
311
|
gdprDataHandlerStub.returns(consentData);
|
|
325
312
|
const validate = sinon.stub().callsFake(() => false);
|
|
326
|
-
deviceAccessHook(nextFnSpy,
|
|
313
|
+
deviceAccessHook(nextFnSpy, VENDORLESS_GVLID, 'mockModule', undefined, {validate});
|
|
327
314
|
sinon.assert.callCount(validate, 0);
|
|
328
|
-
sinon.assert.calledWith(nextFnSpy,
|
|
315
|
+
sinon.assert.calledWith(nextFnSpy, VENDORLESS_GVLID, 'mockModule', {hasEnforcementHook: true, valid: true});
|
|
329
316
|
})
|
|
330
317
|
});
|
|
331
318
|
|
|
@@ -804,11 +791,12 @@ describe('gdpr enforcement', function () {
|
|
|
804
791
|
});
|
|
805
792
|
|
|
806
793
|
describe('validateRules', function () {
|
|
807
|
-
const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = []) => ({
|
|
794
|
+
const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = [], softVendorExceptions = []) => ({
|
|
808
795
|
purpose: purposeName,
|
|
809
|
-
enforcePurpose
|
|
810
|
-
enforceVendor
|
|
811
|
-
vendorExceptions
|
|
796
|
+
enforcePurpose,
|
|
797
|
+
enforceVendor,
|
|
798
|
+
vendorExceptions,
|
|
799
|
+
softVendorExceptions,
|
|
812
800
|
});
|
|
813
801
|
|
|
814
802
|
const consentData = {
|
|
@@ -922,6 +910,19 @@ describe('gdpr enforcement', function () {
|
|
|
922
910
|
expect(isAllowed).to.equal(true);
|
|
923
911
|
});
|
|
924
912
|
|
|
913
|
+
describe('when the vendor has a softVendorException', () => {
|
|
914
|
+
const gdprRule = createGdprRule('storage', true, true, [], [vendorBlockedModule]);
|
|
915
|
+
|
|
916
|
+
it('should return false if general consent was not given', () => {
|
|
917
|
+
const isAllowed = validateRules(gdprRule, consentDataWithPurposeConsentFalse, vendorBlockedModule, vendorBlockedGvlId);
|
|
918
|
+
expect(isAllowed).to.be.false;
|
|
919
|
+
})
|
|
920
|
+
it('should return true if general consent was given', () => {
|
|
921
|
+
const isAllowed = validateRules(gdprRule, consentData, vendorBlockedModule, vendorBlockedGvlId);
|
|
922
|
+
expect(isAllowed).to.be.true;
|
|
923
|
+
})
|
|
924
|
+
})
|
|
925
|
+
|
|
925
926
|
describe('when module does not need vendor consent', () => {
|
|
926
927
|
Object.entries({
|
|
927
928
|
'storage': 1,
|
|
@@ -937,11 +938,9 @@ describe('gdpr enforcement', function () {
|
|
|
937
938
|
it(`should be ${t} when purpose is ${t}`, () => {
|
|
938
939
|
const consent = utils.deepClone(consentData);
|
|
939
940
|
consent.vendorData.purpose.consents[purposeNo] = consentGiven;
|
|
940
|
-
// vendor consent (and gvlid) should be ignored
|
|
941
|
-
consent.vendorData.vendor.consents[123] = !consentGiven;
|
|
942
941
|
// take legitimate interest out of the picture for this test
|
|
943
942
|
consent.vendorData.purpose.legitimateInterests = {};
|
|
944
|
-
const actual = validateRules(rule, consent, 'mockModule',
|
|
943
|
+
const actual = validateRules(rule, consent, 'mockModule', VENDORLESS_GVLID);
|
|
945
944
|
expect(actual).to.equal(consentGiven);
|
|
946
945
|
})
|
|
947
946
|
})
|
|
@@ -1131,56 +1130,104 @@ describe('gdpr enforcement', function () {
|
|
|
1131
1130
|
})
|
|
1132
1131
|
});
|
|
1133
1132
|
|
|
1134
|
-
describe('
|
|
1133
|
+
describe('gvlid resolution', () => {
|
|
1135
1134
|
let sandbox;
|
|
1136
|
-
let getGvlidForBidAdapterStub;
|
|
1137
|
-
let getGvlidForUserIdModuleStub;
|
|
1138
|
-
let getGvlidForAnalyticsAdapterStub;
|
|
1139
1135
|
beforeEach(function() {
|
|
1140
1136
|
sandbox = sinon.createSandbox();
|
|
1141
|
-
getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
|
|
1142
|
-
getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
|
|
1143
|
-
getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
|
|
1144
1137
|
});
|
|
1138
|
+
|
|
1145
1139
|
afterEach(function() {
|
|
1146
1140
|
sandbox.restore();
|
|
1147
1141
|
config.resetConfig();
|
|
1148
1142
|
});
|
|
1149
1143
|
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1144
|
+
describe('getGvlid', function() {
|
|
1145
|
+
let getGvlidForBidAdapterStub;
|
|
1146
|
+
let getGvlidForUserIdModuleStub;
|
|
1147
|
+
let getGvlidForAnalyticsAdapterStub;
|
|
1148
|
+
beforeEach(function() {
|
|
1149
|
+
getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
|
|
1150
|
+
getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
|
|
1151
|
+
getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
|
|
1152
|
+
});
|
|
1154
1153
|
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1154
|
+
it('should return "null" if called without passing any argument', function() {
|
|
1155
|
+
const gvlid = getGvlid();
|
|
1156
|
+
expect(gvlid).to.equal(null);
|
|
1157
|
+
});
|
|
1159
1158
|
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1159
|
+
it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
|
|
1160
|
+
getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
|
|
1161
|
+
getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
|
|
1162
|
+
getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
|
|
1163
1163
|
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1164
|
+
const gvlid = getGvlid('moduleA');
|
|
1165
|
+
expect(gvlid).to.equal(null);
|
|
1166
|
+
});
|
|
1167
|
+
|
|
1168
|
+
it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
|
|
1169
|
+
config.setConfig({
|
|
1170
|
+
gvlMapping: {
|
|
1171
|
+
moduleA: 1
|
|
1172
|
+
}
|
|
1173
|
+
});
|
|
1174
|
+
|
|
1175
|
+
// Actual GVL ID for moduleA is 2, as defined on its the bidAdapter.js file.
|
|
1176
|
+
getGvlidForBidAdapterStub.withArgs('moduleA').returns(2);
|
|
1177
|
+
|
|
1178
|
+
const gvlid = getGvlid('moduleA');
|
|
1179
|
+
expect(gvlid).to.equal(1);
|
|
1169
1180
|
});
|
|
1170
1181
|
|
|
1171
|
-
|
|
1172
|
-
|
|
1182
|
+
it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
|
|
1183
|
+
getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
|
|
1184
|
+
getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
|
|
1185
|
+
getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);
|
|
1186
|
+
|
|
1187
|
+
expect(getGvlid('moduleA')).to.equal(7);
|
|
1188
|
+
});
|
|
1173
1189
|
|
|
1174
|
-
|
|
1175
|
-
|
|
1190
|
+
it('should pass extra arguments to analytics\' getGvlid', () => {
|
|
1191
|
+
getGvlidForAnalyticsAdapterStub.withArgs('analytics').returns(321);
|
|
1192
|
+
const cfg = {some: 'args'};
|
|
1193
|
+
getGvlid('analytics', cfg);
|
|
1194
|
+
sinon.assert.calledWith(getGvlidForAnalyticsAdapterStub, 'analytics', cfg);
|
|
1195
|
+
});
|
|
1176
1196
|
});
|
|
1177
1197
|
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1198
|
+
describe('getGvlidForAnalyticsAdapter', () => {
|
|
1199
|
+
let getAnalyticsAdapter, adapter, adapterEntry;
|
|
1200
|
+
|
|
1201
|
+
beforeEach(() => {
|
|
1202
|
+
adapter = {};
|
|
1203
|
+
adapterEntry = {
|
|
1204
|
+
adapter
|
|
1205
|
+
};
|
|
1206
|
+
getAnalyticsAdapter = sandbox.stub(adapterManager, 'getAnalyticsAdapter');
|
|
1207
|
+
getAnalyticsAdapter.withArgs('analytics').returns(adapterEntry);
|
|
1208
|
+
});
|
|
1209
|
+
|
|
1210
|
+
it('should return gvlid from adapterManager if defined', () => {
|
|
1211
|
+
adapterEntry.gvlid = 123;
|
|
1212
|
+
adapter.gvlid = 321
|
|
1213
|
+
expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(123);
|
|
1214
|
+
});
|
|
1215
|
+
|
|
1216
|
+
it('should return gvlid from adapter if defined', () => {
|
|
1217
|
+
adapter.gvlid = 321;
|
|
1218
|
+
expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(321);
|
|
1219
|
+
});
|
|
1182
1220
|
|
|
1183
|
-
|
|
1221
|
+
it('should invoke adapter.gvlid if it\'s a function', () => {
|
|
1222
|
+
adapter.gvlid = (cfg) => cfg.k
|
|
1223
|
+
const cfg = {k: 231};
|
|
1224
|
+
expect(internal.getGvlidForAnalyticsAdapter('analytics', cfg)).to.eql(231);
|
|
1225
|
+
});
|
|
1226
|
+
|
|
1227
|
+
it('should not choke if adapter gvlid fn throws', () => {
|
|
1228
|
+
adapter.gvlid = () => { throw new Error(); };
|
|
1229
|
+
expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.not.be.ok;
|
|
1230
|
+
});
|
|
1184
1231
|
});
|
|
1185
|
-
})
|
|
1232
|
+
})
|
|
1186
1233
|
});
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import {defaultHandler, GenericAnalytics} from '../../../modules/genericAnalyticsAdapter.js';
|
|
2
|
+
import * as events from 'src/events.js';
|
|
3
|
+
import * as CONSTANTS from 'src/constants.json';
|
|
4
|
+
|
|
5
|
+
const {AUCTION_INIT, BID_RESPONSE} = CONSTANTS.EVENTS;
|
|
6
|
+
|
|
7
|
+
describe('Generic analytics', () => {
|
|
8
|
+
describe('adapter', () => {
|
|
9
|
+
let adapter, sandbox, clock;
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
sandbox = sinon.sandbox.create();
|
|
12
|
+
sandbox.stub(events, 'getEvents').returns([]);
|
|
13
|
+
clock = sandbox.useFakeTimers();
|
|
14
|
+
adapter = new GenericAnalytics();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
adapter.disableAnalytics();
|
|
19
|
+
sandbox.restore();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('configuration', () => {
|
|
23
|
+
it('should be accepted if valid', () => {
|
|
24
|
+
adapter.enableAnalytics({
|
|
25
|
+
options: {
|
|
26
|
+
url: 'mock',
|
|
27
|
+
method: 'GET',
|
|
28
|
+
batchSize: 123,
|
|
29
|
+
batchDelay: 321
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
expect(adapter.enabled).to.be.true;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('should not work if', () => {
|
|
36
|
+
afterEach(function() {
|
|
37
|
+
expect(adapter.enabled).to.equal(false, this.currentTest.title);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('neither handler nor url are specified', () => {
|
|
41
|
+
adapter.enableAnalytics({});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
['batchSize', 'batchDelay', 'handler'].forEach(option => {
|
|
45
|
+
it(`${option} is not valid`, () => {
|
|
46
|
+
adapter.enableAnalytics({
|
|
47
|
+
options: {
|
|
48
|
+
url: 'mock',
|
|
49
|
+
[option]: false
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('method is not GET or POST', () => {
|
|
56
|
+
adapter.enableAnalytics({
|
|
57
|
+
options: {
|
|
58
|
+
url: 'mock',
|
|
59
|
+
method: 'PATCH'
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('events is not an object', () => {
|
|
65
|
+
adapter.enableAnalytics({
|
|
66
|
+
options: {
|
|
67
|
+
url: 'mock',
|
|
68
|
+
events: null
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('events\' properties are not functions', () => {
|
|
74
|
+
adapter.enableAnalytics({
|
|
75
|
+
options: {
|
|
76
|
+
url: 'mock',
|
|
77
|
+
events: {
|
|
78
|
+
bidResponse: null
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe('when handler is specified', () => {
|
|
87
|
+
let handler;
|
|
88
|
+
beforeEach(() => {
|
|
89
|
+
handler = sinon.stub();
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('should collect events in batches, and call handler', () => {
|
|
93
|
+
adapter.enableAnalytics({
|
|
94
|
+
options: {
|
|
95
|
+
handler,
|
|
96
|
+
batchSize: 2
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
events.emit(AUCTION_INIT, {i: 0});
|
|
100
|
+
sinon.assert.notCalled(handler);
|
|
101
|
+
events.emit(BID_RESPONSE, {i: 0});
|
|
102
|
+
sinon.assert.calledWith(handler, sinon.match((arg) => {
|
|
103
|
+
return sinon.match({eventType: AUCTION_INIT, args: {i: 0}}).test(arg[0]) &&
|
|
104
|
+
sinon.match({eventType: BID_RESPONSE, args: {i: 0}}).test(arg[1]);
|
|
105
|
+
}));
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should not choke if handler throws', () => {
|
|
109
|
+
adapter.enableAnalytics({
|
|
110
|
+
options: {
|
|
111
|
+
handler,
|
|
112
|
+
batchSize: 1
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
handler.throws(new Error());
|
|
116
|
+
events.emit(AUCTION_INIT, {i: 0});
|
|
117
|
+
let recv;
|
|
118
|
+
handler.reset();
|
|
119
|
+
handler.callsFake((arg) => {
|
|
120
|
+
recv = arg;
|
|
121
|
+
});
|
|
122
|
+
events.emit(BID_RESPONSE, {i: 1});
|
|
123
|
+
expect(recv).to.eql([{eventType: BID_RESPONSE, args: {i: 1}}]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should not cause infinite recursion, if handler triggers more events', () => {
|
|
127
|
+
let i = 0;
|
|
128
|
+
handler.callsFake(() => {
|
|
129
|
+
if (i <= 100) {
|
|
130
|
+
i++;
|
|
131
|
+
events.emit(BID_RESPONSE, {});
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
adapter.enableAnalytics({
|
|
135
|
+
options: {
|
|
136
|
+
handler,
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
events.emit(AUCTION_INIT, {});
|
|
140
|
+
expect(i >= 100).to.be.false;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should send incomplete batch after batchDelay', () => {
|
|
144
|
+
adapter.enableAnalytics({
|
|
145
|
+
options: {
|
|
146
|
+
batchDelay: 100,
|
|
147
|
+
batchSize: 2,
|
|
148
|
+
handler
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
[0, 1, 2].forEach(i => events.emit(BID_RESPONSE, {i}));
|
|
152
|
+
sinon.assert.calledOnce(handler);
|
|
153
|
+
clock.tick(100);
|
|
154
|
+
sinon.assert.calledTwice(handler);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('does not send empty batches', () => {
|
|
158
|
+
adapter.enableAnalytics({
|
|
159
|
+
options: {
|
|
160
|
+
batchDelay: 100,
|
|
161
|
+
batchSize: 2,
|
|
162
|
+
handler
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
[0, 1, 2].forEach(i => events.emit(BID_RESPONSE, {i}));
|
|
166
|
+
sinon.assert.calledOnce(handler);
|
|
167
|
+
clock.tick(50);
|
|
168
|
+
events.emit(BID_RESPONSE, {i: 3});
|
|
169
|
+
sinon.assert.calledTwice(handler);
|
|
170
|
+
clock.tick(100);
|
|
171
|
+
sinon.assert.calledTwice(handler);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe('and options.events is specified', () => {
|
|
175
|
+
it('filters out other events', () => {
|
|
176
|
+
adapter.enableAnalytics({
|
|
177
|
+
options: {
|
|
178
|
+
handler,
|
|
179
|
+
events: {
|
|
180
|
+
bidResponse(bid) {
|
|
181
|
+
return bid;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
events.emit(AUCTION_INIT, {});
|
|
187
|
+
sinon.assert.notCalled(handler);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('transforms event data', () => {
|
|
191
|
+
adapter.enableAnalytics({
|
|
192
|
+
options: {
|
|
193
|
+
handler,
|
|
194
|
+
events: {
|
|
195
|
+
bidResponse(bid) {
|
|
196
|
+
return {
|
|
197
|
+
extra: 'data',
|
|
198
|
+
prop: bid.prop
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
events.emit(BID_RESPONSE, {prop: 'value', i: 0});
|
|
205
|
+
sinon.assert.calledWith(handler, sinon.match(data => sinon.match({extra: 'data', prop: 'value'}).test(data[0])));
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('does not choke if an event handler throws', () => {
|
|
209
|
+
adapter.enableAnalytics({
|
|
210
|
+
options: {
|
|
211
|
+
handler,
|
|
212
|
+
events: {
|
|
213
|
+
bidResponse(bid) {
|
|
214
|
+
return bid;
|
|
215
|
+
},
|
|
216
|
+
auctionInit(auction) {
|
|
217
|
+
throw new Error();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
events.emit(AUCTION_INIT, {});
|
|
223
|
+
events.emit(BID_RESPONSE, {i: 0});
|
|
224
|
+
sinon.assert.calledOnce(handler);
|
|
225
|
+
sinon.assert.calledWith(handler, sinon.match(data => sinon.match({i: 0}).test(data[0])));
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('filters out events when their handler returns undefined', () => {
|
|
229
|
+
adapter.enableAnalytics({
|
|
230
|
+
options: {
|
|
231
|
+
handler,
|
|
232
|
+
events: {
|
|
233
|
+
auctionInit(auction) {
|
|
234
|
+
return auction;
|
|
235
|
+
},
|
|
236
|
+
bidResponse(bid) {}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
events.emit(AUCTION_INIT, {i: 0});
|
|
241
|
+
events.emit(BID_RESPONSE, {i: 1});
|
|
242
|
+
sinon.assert.calledOnce(handler);
|
|
243
|
+
sinon.assert.calledWith(handler, sinon.match(data => sinon.match({i: 0}).test(data[0])));
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
describe('default handler', () => {
|
|
250
|
+
const url = 'mock-url';
|
|
251
|
+
|
|
252
|
+
let ajax;
|
|
253
|
+
beforeEach(() => {
|
|
254
|
+
ajax = sinon.stub();
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
Object.entries({
|
|
258
|
+
'GET': (data) => JSON.parse(data.data),
|
|
259
|
+
'POST': (data) => JSON.parse(data)
|
|
260
|
+
}).forEach(([method, parse]) => {
|
|
261
|
+
describe(`when HTTP method is ${method}`, () => {
|
|
262
|
+
it('should send single event when batchSize is 1', () => {
|
|
263
|
+
const handler = defaultHandler({url, method, batchSize: 1, ajax});
|
|
264
|
+
const payload = {i: 0};
|
|
265
|
+
handler([payload, {}]);
|
|
266
|
+
sinon.assert.calledWith(ajax, url, sinon.match.any,
|
|
267
|
+
sinon.match(data => sinon.match(payload).test(parse(data))),
|
|
268
|
+
{method}
|
|
269
|
+
);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('should send multiple events when batchSize is greater than 1', () => {
|
|
273
|
+
const handler = defaultHandler({url, method, batchSize: 10, ajax});
|
|
274
|
+
const payload = [{i: 0}, {i: 1}];
|
|
275
|
+
handler(payload);
|
|
276
|
+
sinon.assert.calledWith(ajax, url, sinon.match.any,
|
|
277
|
+
sinon.match(data => sinon.match(payload).test(parse(data))),
|
|
278
|
+
{method}
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -2,6 +2,8 @@ import * as utils from '../../../src/utils.js';
|
|
|
2
2
|
import * as hook from '../../../src/hook.js'
|
|
3
3
|
import { beforeInit, geoedgeSubmodule, setWrapper, wrapper, htmlPlaceholder, WRAPPER_URL, getClientUrl } from '../../../modules/geoedgeRtdProvider.js';
|
|
4
4
|
import { server } from '../../../test/mocks/xhr.js';
|
|
5
|
+
import * as events from '../../../src/events.js';
|
|
6
|
+
import CONSTANTS from '../../../src/constants.json';
|
|
5
7
|
|
|
6
8
|
let key = '123123123';
|
|
7
9
|
function makeConfig() {
|
|
@@ -88,6 +90,19 @@ describe('Geoedge RTD module', function () {
|
|
|
88
90
|
let isLinkPreloadAsScript = arg => arg.tagName === 'LINK' && arg.rel === 'preload' && arg.as === 'script' && arg.href === getClientUrl(key);
|
|
89
91
|
expect(insertElementStub.calledWith(sinon.match(isLinkPreloadAsScript))).to.equal(true);
|
|
90
92
|
});
|
|
93
|
+
it('should emit billable events with applicable winning bids', function () {
|
|
94
|
+
let applicableBid = mockBid('bidderA');
|
|
95
|
+
let nonApplicableBid = mockBid('bidderB');
|
|
96
|
+
let counter = 0;
|
|
97
|
+
events.on(CONSTANTS.EVENTS.BILLABLE_EVENT, function (event) {
|
|
98
|
+
if (event.vendor === 'geoedge' && event.type === 'impression') {
|
|
99
|
+
counter += 1;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
events.emit(CONSTANTS.EVENTS.BID_WON, applicableBid);
|
|
103
|
+
events.emit(CONSTANTS.EVENTS.BID_WON, nonApplicableBid);
|
|
104
|
+
expect(counter).to.equal(1);
|
|
105
|
+
});
|
|
91
106
|
});
|
|
92
107
|
describe('onBidResponseEvent', function () {
|
|
93
108
|
let bidFromA = mockBid('bidderA');
|
|
@@ -49,6 +49,10 @@ const RESPONSE = {
|
|
|
49
49
|
describe('glomexBidAdapter', function () {
|
|
50
50
|
const adapter = newBidder(spec)
|
|
51
51
|
|
|
52
|
+
it('should expose gvlid', function() {
|
|
53
|
+
expect(spec.gvlid).to.equal(967)
|
|
54
|
+
});
|
|
55
|
+
|
|
52
56
|
describe('inherited functions', function () {
|
|
53
57
|
it('exists and is a function', function () {
|
|
54
58
|
expect(adapter.callBids).to.exist.and.to.be.a('function')
|
|
@@ -40,7 +40,7 @@ describe('gravitompId module', function () {
|
|
|
40
40
|
describe('decode()', function () {
|
|
41
41
|
it('should return the gravitompId when it exists in cookie', function () {
|
|
42
42
|
const decoded = gravitoIdSystemSubmodule.decode(GRAVITOID_TEST_OBJ);
|
|
43
|
-
expect(decoded).to.be.deep.equal({gravitompId:
|
|
43
|
+
expect(decoded).to.be.deep.equal({gravitompId: GRAVITOID_TEST_VALUE});
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it('should return the undefined when decode id is not "string"', function () {
|