prebid.js 8.0.0 → 8.2.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/.devcontainer/devcontainer.json +3 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/admanBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bedigitechBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -0
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/categoryTranslation.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/cmp.js +1 -0
- package/dist/colossussspBidAdapter.js +1 -1
- package/dist/conceptxBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -1
- package/dist/consentManagementGpp.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/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +15 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freepassBidAdapter.js +1 -0
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gppControl_usnat.js +1 -0
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kiviadsBidAdapter.js +1 -0
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/mgidXBidAdapter.js +1 -0
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/mspa.js +1 -0
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +146 -139
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionAnalyticsAdapter.js +1 -1
- package/dist/oxxionRtdProvider.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.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/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rtbhouseBidAdapter.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/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.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/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/libraries/cmp/cmpClient.js +139 -0
- package/libraries/mspa/activityControls.js +91 -0
- package/modules/admanBidAdapter.js +5 -0
- package/modules/amxBidAdapter.js +11 -12
- package/modules/bedigitechBidAdapter.js +15 -12
- package/modules/bedigitechBidAdapter.md +2 -2
- package/modules/beopBidAdapter.js +0 -4
- package/modules/bidwatchAnalyticsAdapter.js +33 -5
- package/modules/bridBidAdapter.js +223 -0
- package/modules/categoryTranslation.js +3 -2
- package/modules/colossussspBidAdapter.js +9 -0
- package/modules/conceptxBidAdapter.js +6 -3
- package/modules/consentManagement.js +12 -86
- package/modules/consentManagementGpp.js +47 -126
- package/modules/consentManagementUsp.js +19 -97
- package/modules/freepassBidAdapter.js +98 -0
- package/modules/freepassBidAdapter.md +31 -0
- package/modules/freepassIdSystem.md +1 -1
- package/modules/gppControl_usnat.js +11 -0
- package/modules/greenbidsAnalyticsAdapter.js +7 -13
- package/modules/gridBidAdapter.js +3 -4
- package/modules/intentIqIdSystem.js +11 -9
- package/modules/ixBidAdapter.js +284 -55
- package/modules/kiviadsBidAdapter.js +212 -0
- package/modules/kiviadsBidAdapter.md +79 -0
- package/modules/liveIntentIdSystem.js +8 -3
- package/modules/mediasquareBidAdapter.js +19 -23
- package/modules/mgidXBidAdapter.js +263 -0
- package/modules/mgidXBidAdapter.md +79 -0
- package/modules/oxxionAnalyticsAdapter.js +33 -5
- package/modules/oxxionRtdProvider.js +124 -11
- package/modules/oxxionRtdProvider.md +19 -4
- package/modules/pubmaticBidAdapter.js +18 -2
- package/modules/rtbhouseBidAdapter.js +9 -2
- package/modules/rtbhouseBidAdapter.md +27 -8
- package/modules/rubiconBidAdapter.js +13 -1
- package/modules/sharethroughBidAdapter.js +14 -0
- package/modules/sonobiBidAdapter.js +4 -7
- package/modules/tripleliftBidAdapter.js +21 -1
- package/modules/userId/eids.js +29 -0
- package/modules/userId/eids.md +19 -2
- package/modules/userId/index.js +78 -29
- package/modules/userId/userId.md +3 -0
- package/package.json +1 -1
- package/src/activities/params.js +4 -1
- package/test/spec/libraries/cmp/cmpClient_spec.js +233 -0
- package/test/spec/libraries/mspa/activityControls_spec.js +315 -0
- package/test/spec/modules/admanBidAdapter_spec.js +8 -2
- package/test/spec/modules/adqueryBidAdapter_spec.js +5 -1
- package/test/spec/modules/amxBidAdapter_spec.js +6 -3
- package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
- package/test/spec/modules/bridBidAdapter_spec.js +129 -0
- package/test/spec/modules/byDataAnalyticsAdapter_spec.js +9 -7
- package/test/spec/modules/chtnwBidAdapter_spec.js +4 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
- package/test/spec/modules/consentManagementGpp_spec.js +84 -7
- package/test/spec/modules/consentManagement_spec.js +8 -18
- package/test/spec/modules/datablocksBidAdapter_spec.js +7 -3
- package/test/spec/modules/eids_spec.js +87 -0
- package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
- package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
- package/test/spec/modules/gridBidAdapter_spec.js +29 -28
- package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
- package/test/spec/modules/intentIqIdSystem_spec.js +36 -2
- package/test/spec/modules/ixBidAdapter_spec.js +785 -15
- package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
- package/test/spec/modules/lassoBidAdapter_spec.js +6 -4
- package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +17 -2
- package/test/spec/modules/liveIntentIdSystem_spec.js +11 -6
- package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
- package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
- package/test/spec/modules/onetagBidAdapter_spec.js +81 -75
- package/test/spec/modules/orbidderBidAdapter_spec.js +6 -3
- package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
- package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
- package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
- package/test/spec/modules/relaidoBidAdapter_spec.js +4 -3
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
- package/test/spec/modules/tripleliftBidAdapter_spec.js +20 -1
- package/test/spec/modules/ucfunnelBidAdapter_spec.js +37 -16
- package/test/spec/modules/userId_spec.js +393 -6
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import {mspaRule, setupRules, isTransmitUfpdConsentDenied, isTransmitGeoConsentDenied, isBasicConsentDenied, isSensitiveNoticeMissing, isConsentDenied} from '../../../../libraries/mspa/activityControls.js';
|
|
2
|
+
import {ruleRegistry} from '../../../../src/activities/rules.js';
|
|
3
|
+
describe('isBasicConsentDenied', () => {
|
|
4
|
+
const cd = {
|
|
5
|
+
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
6
|
+
Gpc: 0,
|
|
7
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
8
|
+
MspaCoveredTransaction: 2,
|
|
9
|
+
MspaOptOutOptionMode: 0,
|
|
10
|
+
MspaServiceProviderMode: 0,
|
|
11
|
+
PersonalDataConsents: 0,
|
|
12
|
+
SaleOptOut: 2,
|
|
13
|
+
SaleOptOutNotice: 1,
|
|
14
|
+
SensitiveDataLimitUseNotice: 1,
|
|
15
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
16
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
17
|
+
SharingNotice: 1,
|
|
18
|
+
SharingOptOut: 2,
|
|
19
|
+
SharingOptOutNotice: 1,
|
|
20
|
+
TargetedAdvertisingOptOut: 2,
|
|
21
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
22
|
+
Version: 1
|
|
23
|
+
};
|
|
24
|
+
it('should be false (basic consent conditions pass) with variety of notice and opt in', () => {
|
|
25
|
+
const result = isBasicConsentDenied(cd);
|
|
26
|
+
expect(result).to.equal(false);
|
|
27
|
+
});
|
|
28
|
+
it('should be true (basic consent conditions do not pass) with personal data consent set to true (invalid state)', () => {
|
|
29
|
+
cd.PersonalDataConsents = 2;
|
|
30
|
+
const result = isBasicConsentDenied(cd);
|
|
31
|
+
expect(result).to.equal(true);
|
|
32
|
+
cd.PersonalDataConsents = 0;
|
|
33
|
+
});
|
|
34
|
+
it('should be true (basic consent conditions do not pass) with sensitive opt in but no notice', () => {
|
|
35
|
+
cd.SensitiveDataLimitUseNotice = 0;
|
|
36
|
+
const result = isBasicConsentDenied(cd);
|
|
37
|
+
expect(result).to.equal(true);
|
|
38
|
+
cd.SensitiveDataLimitUseNotice = 1;
|
|
39
|
+
});
|
|
40
|
+
})
|
|
41
|
+
describe('isSensitiveNoticeMissing', () => {
|
|
42
|
+
const cd = {
|
|
43
|
+
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
44
|
+
Gpc: 0,
|
|
45
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
46
|
+
MspaCoveredTransaction: 2,
|
|
47
|
+
MspaOptOutOptionMode: 0,
|
|
48
|
+
MspaServiceProviderMode: 0,
|
|
49
|
+
PersonalDataConsents: 0,
|
|
50
|
+
SaleOptOut: 2,
|
|
51
|
+
SaleOptOutNotice: 1,
|
|
52
|
+
SensitiveDataLimitUseNotice: 1,
|
|
53
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
54
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
55
|
+
SharingNotice: 1,
|
|
56
|
+
SharingOptOut: 2,
|
|
57
|
+
SharingOptOutNotice: 1,
|
|
58
|
+
TargetedAdvertisingOptOut: 2,
|
|
59
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
60
|
+
Version: 1
|
|
61
|
+
};
|
|
62
|
+
it('should be false (sensitive notice is given or not needed) with variety of notice and opt in', () => {
|
|
63
|
+
const result = isSensitiveNoticeMissing(cd);
|
|
64
|
+
expect(result).to.equal(false);
|
|
65
|
+
});
|
|
66
|
+
it('should be true (sensitive notice is missing) with variety of notice and opt in', () => {
|
|
67
|
+
cd.SensitiveDataLimitUseNotice = 2;
|
|
68
|
+
const result = isSensitiveNoticeMissing(cd);
|
|
69
|
+
expect(result).to.equal(true);
|
|
70
|
+
cd.SensitiveDataLimitUseNotice = 1;
|
|
71
|
+
});
|
|
72
|
+
})
|
|
73
|
+
describe('isConsentDenied', () => {
|
|
74
|
+
const cd = {
|
|
75
|
+
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
76
|
+
Gpc: 0,
|
|
77
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
78
|
+
MspaCoveredTransaction: 2,
|
|
79
|
+
MspaOptOutOptionMode: 0,
|
|
80
|
+
MspaServiceProviderMode: 0,
|
|
81
|
+
PersonalDataConsents: 0,
|
|
82
|
+
SaleOptOut: 2,
|
|
83
|
+
SaleOptOutNotice: 1,
|
|
84
|
+
SensitiveDataLimitUseNotice: 1,
|
|
85
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
86
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
87
|
+
SharingNotice: 1,
|
|
88
|
+
SharingOptOut: 2,
|
|
89
|
+
SharingOptOutNotice: 1,
|
|
90
|
+
TargetedAdvertisingOptOut: 2,
|
|
91
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
92
|
+
Version: 1
|
|
93
|
+
};
|
|
94
|
+
it('should be false (consent given personalized ads / sale / share) with variety of notice and opt in', () => {
|
|
95
|
+
const result = isConsentDenied(cd);
|
|
96
|
+
expect(result).to.equal(false);
|
|
97
|
+
});
|
|
98
|
+
it('should be true (no consent) on opt out of targeted ads via TargetedAdvertisingOptOut', () => {
|
|
99
|
+
cd.TargetedAdvertisingOptOut = 1;
|
|
100
|
+
const result = isConsentDenied(cd);
|
|
101
|
+
expect(result).to.equal(true);
|
|
102
|
+
cd.TargetedAdvertisingOptOut = 2;
|
|
103
|
+
});
|
|
104
|
+
it('should be true (no consent) on opt out of targeted ads via no TargetedAdvertisingOptOutNotice', () => {
|
|
105
|
+
cd.TargetedAdvertisingOptOutNotice = 2;
|
|
106
|
+
const result = isConsentDenied(cd);
|
|
107
|
+
expect(result).to.equal(true);
|
|
108
|
+
cd.TargetedAdvertisingOptOutNotice = 1;
|
|
109
|
+
});
|
|
110
|
+
it('should be true (no consent) if TargetedAdvertisingOptOutNotice is 0 and TargetedAdvertisingOptOut is 2', () => {
|
|
111
|
+
cd.TargetedAdvertisingOptOutNotice = 0;
|
|
112
|
+
const result = isConsentDenied(cd);
|
|
113
|
+
expect(result).to.equal(true);
|
|
114
|
+
cd.TargetedAdvertisingOptOutNotice = 1;
|
|
115
|
+
});
|
|
116
|
+
})
|
|
117
|
+
describe('isTransmitUfpdConsentDenied', () => {
|
|
118
|
+
const cd = {
|
|
119
|
+
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
120
|
+
Gpc: 0,
|
|
121
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
122
|
+
MspaCoveredTransaction: 2,
|
|
123
|
+
MspaOptOutOptionMode: 0,
|
|
124
|
+
MspaServiceProviderMode: 0,
|
|
125
|
+
PersonalDataConsents: 0,
|
|
126
|
+
SaleOptOut: 2,
|
|
127
|
+
SaleOptOutNotice: 1,
|
|
128
|
+
SensitiveDataLimitUseNotice: 1,
|
|
129
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
130
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
131
|
+
SharingNotice: 1,
|
|
132
|
+
SharingOptOut: 2,
|
|
133
|
+
SharingOptOutNotice: 1,
|
|
134
|
+
TargetedAdvertisingOptOut: 2,
|
|
135
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
136
|
+
Version: 1
|
|
137
|
+
};
|
|
138
|
+
it('should be false (consent given to add ufpd) with variety of notice and opt in', () => {
|
|
139
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
140
|
+
expect(result).to.equal(false);
|
|
141
|
+
});
|
|
142
|
+
it('should be true (consent denied to add ufpd) if no consent to process health information', () => {
|
|
143
|
+
cd.SensitiveDataProcessing[2] = 1;
|
|
144
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
145
|
+
expect(result).to.equal(true);
|
|
146
|
+
cd.SensitiveDataProcessing[2] = 0;
|
|
147
|
+
});
|
|
148
|
+
it('should be true (consent denied to add ufpd) with consent to process biometric data, as this should not be on openrtb', () => {
|
|
149
|
+
cd.SensitiveDataProcessing[6] = 1;
|
|
150
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
151
|
+
expect(result).to.equal(true);
|
|
152
|
+
cd.SensitiveDataProcessing[6] = 1;
|
|
153
|
+
});
|
|
154
|
+
it('should be true (consent denied to add ufpd) without sharing notice', () => {
|
|
155
|
+
cd.SharingNotice = 2;
|
|
156
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
157
|
+
expect(result).to.equal(true);
|
|
158
|
+
cd.SharingNotice = 1;
|
|
159
|
+
});
|
|
160
|
+
it('should be true (consent denied to add ufpd) with sale opt out', () => {
|
|
161
|
+
cd.SaleOptOut = 1;
|
|
162
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
163
|
+
expect(result).to.equal(true);
|
|
164
|
+
cd.SaleOptOut = 2;
|
|
165
|
+
});
|
|
166
|
+
it('should be true (consent denied to add ufpd) without targeted ads opt out', () => {
|
|
167
|
+
cd.TargetedAdvertisingOptOut = 1;
|
|
168
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
169
|
+
expect(result).to.equal(true);
|
|
170
|
+
cd.TargetedAdvertisingOptOut = 2;
|
|
171
|
+
});
|
|
172
|
+
it('should be true (consent denied to add ufpd) with missing sensitive data limit notice', () => {
|
|
173
|
+
cd.SensitiveDataLimitUseNotice = 2;
|
|
174
|
+
const result = isTransmitUfpdConsentDenied(cd);
|
|
175
|
+
expect(result).to.equal(true);
|
|
176
|
+
cd.SensitiveDataLimitUseNotice = 1;
|
|
177
|
+
});
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
describe('isTransmitGeoConsentDenied', () => {
|
|
181
|
+
const cd = {
|
|
182
|
+
// not covered, opt out of geo
|
|
183
|
+
Gpc: 0,
|
|
184
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
185
|
+
MspaCoveredTransaction: 2,
|
|
186
|
+
MspaOptOutOptionMode: 0,
|
|
187
|
+
MspaServiceProviderMode: 0,
|
|
188
|
+
PersonalDataConsents: 0,
|
|
189
|
+
SaleOptOut: 2,
|
|
190
|
+
SaleOptOutNotice: 1,
|
|
191
|
+
SensitiveDataLimitUseNotice: 1,
|
|
192
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
|
|
193
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
194
|
+
SharingNotice: 1,
|
|
195
|
+
SharingOptOut: 2,
|
|
196
|
+
SharingOptOutNotice: 1,
|
|
197
|
+
TargetedAdvertisingOptOut: 2,
|
|
198
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
199
|
+
Version: 1
|
|
200
|
+
};
|
|
201
|
+
it('should be true (consent denied to add precise geo) -- sensitive flag denied', () => {
|
|
202
|
+
const result = isTransmitGeoConsentDenied(cd);
|
|
203
|
+
expect(result).to.equal(true);
|
|
204
|
+
});
|
|
205
|
+
it('should be true (consent denied to add precise geo) -- sensitive data limit usage not given', () => {
|
|
206
|
+
cd.SensitiveDataLimitUseNotice = 0;
|
|
207
|
+
const result = isTransmitGeoConsentDenied(cd);
|
|
208
|
+
expect(result).to.equal(true);
|
|
209
|
+
cd.SensitiveDataLimitUseNotice = 1;
|
|
210
|
+
});
|
|
211
|
+
it('should be false (consent given to add precise geo) -- sensitive position 8 (index 7) is true', () => {
|
|
212
|
+
cd.SensitiveDataProcessing[7] = 2;
|
|
213
|
+
const result = isTransmitGeoConsentDenied(cd);
|
|
214
|
+
expect(result).to.equal(false);
|
|
215
|
+
cd.SensitiveDataProcessing[7] = 1;
|
|
216
|
+
});
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
describe('mspaRule', () => {
|
|
220
|
+
it('does not apply if SID is not applicable', () => {
|
|
221
|
+
const rule = mspaRule([1, 2], () => null, () => true, () => [3, 4]);
|
|
222
|
+
expect(rule()).to.not.exist;
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it('does not apply when no SID is applicable', () => {
|
|
226
|
+
const rule = mspaRule([1], () => null, () => true, () => []);
|
|
227
|
+
expect(rule()).to.not.exist;
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
describe('when SID is applicable', () => {
|
|
231
|
+
let consent, denies;
|
|
232
|
+
function mkRule() {
|
|
233
|
+
return mspaRule([1, 2], () => consent, denies, () => [2])
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
beforeEach(() => {
|
|
237
|
+
consent = null;
|
|
238
|
+
denies = sinon.stub();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('should deny when no consent is available', () => {
|
|
242
|
+
expect(mkRule()().allow).to.equal(false);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
Object.entries({
|
|
246
|
+
'denies': true,
|
|
247
|
+
'allows': false
|
|
248
|
+
}).forEach(([t, denied]) => {
|
|
249
|
+
it(`should check if deny fn ${t}`, () => {
|
|
250
|
+
denies.returns(denied);
|
|
251
|
+
consent = {mock: 'value'};
|
|
252
|
+
const result = mkRule()();
|
|
253
|
+
sinon.assert.calledWith(denies, consent);
|
|
254
|
+
if (denied) {
|
|
255
|
+
expect(result.allow).to.equal(false);
|
|
256
|
+
} else {
|
|
257
|
+
expect(result).to.not.exist;
|
|
258
|
+
}
|
|
259
|
+
})
|
|
260
|
+
})
|
|
261
|
+
})
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
describe('setupRules', () => {
|
|
265
|
+
let rules, registerRule, isAllowed, consent;
|
|
266
|
+
beforeEach(() => {
|
|
267
|
+
rules = {
|
|
268
|
+
mockActivity: sinon.stub().returns(true)
|
|
269
|
+
};
|
|
270
|
+
([registerRule, isAllowed] = ruleRegistry());
|
|
271
|
+
consent = {
|
|
272
|
+
applicableSections: [1],
|
|
273
|
+
sectionData: {
|
|
274
|
+
mockApi: {
|
|
275
|
+
mock: 'consent'
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
function runSetup(api, sids, normalize) {
|
|
282
|
+
return setupRules(api, sids, normalize, rules, registerRule, () => consent)
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
it('should use section data for the given api', () => {
|
|
286
|
+
runSetup('mockApi', [1]);
|
|
287
|
+
expect(isAllowed('mockActivity', {})).to.equal(false);
|
|
288
|
+
sinon.assert.calledWith(rules.mockActivity, {mock: 'consent'})
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it('should not choke when no consent data is available', () => {
|
|
292
|
+
consent = null;
|
|
293
|
+
runSetup('mockApi', [1]);
|
|
294
|
+
expect(isAllowed('mockActivity', {})).to.equal(true);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('should check applicableSections against given SIDs', () => {
|
|
298
|
+
runSetup('mockApi', [2]);
|
|
299
|
+
expect(isAllowed('mockActivity', {})).to.equal(true);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('should pass consent through normalizeConsent', () => {
|
|
303
|
+
const normalize = sinon.stub().returns({normalized: 'consent'})
|
|
304
|
+
runSetup('mockApi', [1], normalize);
|
|
305
|
+
expect(isAllowed('mockActivity', {})).to.equal(false);
|
|
306
|
+
sinon.assert.calledWith(normalize, {mock: 'consent'});
|
|
307
|
+
sinon.assert.calledWith(rules.mockActivity, {normalized: 'consent'});
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
it('should return a function that unregisters activity controls', () => {
|
|
311
|
+
const dereg = runSetup('mockApi', [1]);
|
|
312
|
+
dereg();
|
|
313
|
+
expect(isAllowed('mockActivity', {})).to.equal(true);
|
|
314
|
+
});
|
|
315
|
+
})
|
|
@@ -106,8 +106,11 @@ describe('AdmanAdapter', function () {
|
|
|
106
106
|
let placements = data['placements'];
|
|
107
107
|
for (let i = 0; i < placements.length; i++) {
|
|
108
108
|
let placement = placements[i];
|
|
109
|
-
expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'bidFloor');
|
|
109
|
+
expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'bidFloor', 'ext');
|
|
110
110
|
expect(placement.schain).to.be.an('object')
|
|
111
|
+
expect(placement.ext).to.be.an('object')
|
|
112
|
+
expect(placement.ext).to.have.key('tid')
|
|
113
|
+
expect(placement.ext.tid).to.equal(bidBanner.transactionId);
|
|
111
114
|
expect(placement.placementId).to.be.a('number');
|
|
112
115
|
expect(placement.bidId).to.be.a('string');
|
|
113
116
|
expect(placement.traffic).to.be.a('string');
|
|
@@ -132,7 +135,10 @@ describe('AdmanAdapter', function () {
|
|
|
132
135
|
let placement = placements[i];
|
|
133
136
|
expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'schain', 'bidFloor',
|
|
134
137
|
'playerSize', 'minduration', 'maxduration', 'mimes', 'protocols', 'startdelay', 'placement', 'skip',
|
|
135
|
-
'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity');
|
|
138
|
+
'skipafter', 'minbitrate', 'maxbitrate', 'delivery', 'playbackmethod', 'api', 'linearity', 'ext');
|
|
139
|
+
expect(placement.ext).to.be.an('object')
|
|
140
|
+
expect(placement.ext).to.have.key('tid')
|
|
141
|
+
expect(placement.ext.tid).to.equal(bidBanner.transactionId);
|
|
136
142
|
expect(placement.schain).to.be.an('object')
|
|
137
143
|
expect(placement.placementId).to.be.a('number');
|
|
138
144
|
expect(placement.bidId).to.be.a('string');
|
|
@@ -80,7 +80,11 @@ describe('adqueryBidAdapter', function () {
|
|
|
80
80
|
})
|
|
81
81
|
|
|
82
82
|
describe('buildRequests', function () {
|
|
83
|
-
let req
|
|
83
|
+
let req;
|
|
84
|
+
beforeEach(() => {
|
|
85
|
+
req = spec.buildRequests([ bidRequest ], { refererInfo: { } })[0]
|
|
86
|
+
})
|
|
87
|
+
|
|
84
88
|
let rdata
|
|
85
89
|
|
|
86
90
|
it('should return request object', function () {
|
|
@@ -39,7 +39,9 @@ const sampleBidderRequest = {
|
|
|
39
39
|
gppString: 'example',
|
|
40
40
|
applicableSections: 'example'
|
|
41
41
|
},
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
auctionId: null,
|
|
44
|
+
|
|
43
45
|
uspConsent: '1YYY',
|
|
44
46
|
refererInfo: {
|
|
45
47
|
reachedTop: true,
|
|
@@ -90,7 +92,8 @@ const sampleBidRequestBase = {
|
|
|
90
92
|
adUnitCode: 'div-gpt-ad-example',
|
|
91
93
|
transactionId: utils.getUniqueIdentifierStr(),
|
|
92
94
|
bidId: sampleRequestId,
|
|
93
|
-
|
|
95
|
+
|
|
96
|
+
auctionId: null,
|
|
94
97
|
};
|
|
95
98
|
|
|
96
99
|
const schainConfig = {
|
|
@@ -494,7 +497,7 @@ describe('AmxBidAdapter', () => {
|
|
|
494
497
|
|
|
495
498
|
it('can build a video request', () => {
|
|
496
499
|
const { data } = spec.buildRequests(
|
|
497
|
-
[{...sampleBidRequestVideo, params: { ...sampleBidRequestVideo.params, adUnitId: 'custom-auid' }}],
|
|
500
|
+
[{ ...sampleBidRequestVideo, params: { ...sampleBidRequestVideo.params, adUnitId: 'custom-auid' } }],
|
|
498
501
|
sampleBidderRequest
|
|
499
502
|
);
|
|
500
503
|
expect(Object.keys(data.m).length).to.equal(1);
|
|
@@ -25,7 +25,7 @@ describe('BedigitechAdapter', function () {
|
|
|
25
25
|
bidderRequestId: '22edbae2733bf6',
|
|
26
26
|
auctionId: '1d1a030790a475',
|
|
27
27
|
params: {
|
|
28
|
-
placementId:
|
|
28
|
+
placementId: 309,
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
31
|
|
|
@@ -57,19 +57,19 @@ describe('BedigitechAdapter', function () {
|
|
|
57
57
|
bidderRequestId: '22edbae2733bf6',
|
|
58
58
|
auctionId: '1d1a030790a475',
|
|
59
59
|
params: {
|
|
60
|
-
placementId:
|
|
60
|
+
placementId: 309,
|
|
61
61
|
},
|
|
62
62
|
}];
|
|
63
63
|
|
|
64
64
|
it('sends bid request to url via GET', function () {
|
|
65
65
|
const request = spec.buildRequests(bidRequests)[0];
|
|
66
66
|
expect(request.method).to.equal('GET');
|
|
67
|
-
expect(request.url).to.equal('https://
|
|
67
|
+
expect(request.url).to.equal('https://bid.bedigitech.com/bid/pub_bid.php');
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
it('should attach pid to url', function () {
|
|
71
71
|
const request = spec.buildRequests(bidRequests)[0];
|
|
72
|
-
expect(request.data.pid).to.equal(
|
|
72
|
+
expect(request.data.pid).to.equal(309);
|
|
73
73
|
});
|
|
74
74
|
});
|
|
75
75
|
|
|
@@ -77,15 +77,17 @@ describe('BedigitechAdapter', function () {
|
|
|
77
77
|
const response = {
|
|
78
78
|
'body': [
|
|
79
79
|
{
|
|
80
|
-
'id': 'bedigitechMyidfdfdf',
|
|
81
|
-
'requestId': 'gshgfshdfgdfsd',
|
|
82
|
-
'cpm': '5.0',
|
|
83
80
|
'ad': '%3C!--%20Creative%20--%3E',
|
|
84
|
-
'
|
|
85
|
-
'
|
|
81
|
+
'cpm': '5.0',
|
|
82
|
+
'crid': '0af345b42983cc4bc0',
|
|
86
83
|
'currency': 'USD',
|
|
84
|
+
'height': 250,
|
|
85
|
+
'id': 'bedigitechMyidfdfdf',
|
|
86
|
+
'netRevenue': true,
|
|
87
|
+
'requestTime': 1686306237,
|
|
88
|
+
'timeToRespond': 300,
|
|
87
89
|
'ttl': 300,
|
|
88
|
-
'
|
|
90
|
+
'width': 300
|
|
89
91
|
}
|
|
90
92
|
],
|
|
91
93
|
'headers': {
|
|
@@ -93,41 +95,28 @@ describe('BedigitechAdapter', function () {
|
|
|
93
95
|
}
|
|
94
96
|
};
|
|
95
97
|
|
|
96
|
-
|
|
97
|
-
bidder: 'bedigitech',
|
|
98
|
-
adUnitCode: 'adunit-code',
|
|
99
|
-
mediaTypes: {
|
|
100
|
-
banner: {
|
|
101
|
-
sizes: [[300, 250], [300, 600]]
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
bidId: '30b31c1838de1e',
|
|
105
|
-
bidderRequestId: '22edbae2733bf6',
|
|
106
|
-
auctionId: '1d1a030790a475',
|
|
107
|
-
params: {
|
|
108
|
-
placementId: 1234,
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
it('should get correct bid response', function () {
|
|
98
|
+
it('should get correct bid responseiiiiii', function () {
|
|
113
99
|
const expectedResponse = [
|
|
114
100
|
{
|
|
115
|
-
'id': 'bedigitechMyidfdfdf',
|
|
116
|
-
'requestId': 'gshgfshdfgdfsd',
|
|
117
|
-
'cpm': '5.0',
|
|
118
101
|
'ad': '%3C!--%20Creative%20--%3E',
|
|
119
|
-
'
|
|
120
|
-
'height': 250,
|
|
121
|
-
'currency': 'USD',
|
|
122
|
-
'ttl': 300,
|
|
102
|
+
'cpm': '5.0',
|
|
123
103
|
'creativeId': '0af345b42983cc4bc0',
|
|
104
|
+
'currency': 'USD',
|
|
105
|
+
'height': 250,
|
|
106
|
+
'id': 'bedigitechMyidfdfdf',
|
|
124
107
|
'meta': {
|
|
125
108
|
'mediaType': BANNER,
|
|
126
109
|
},
|
|
110
|
+
'netRevenue': true,
|
|
111
|
+
'requestId': 'bedigitechMyidfdfdf',
|
|
112
|
+
'requestTimestamp': 1686306237,
|
|
113
|
+
'timeToRespond': 300,
|
|
114
|
+
'ttl': 300,
|
|
115
|
+
'width': 300,
|
|
116
|
+
'bidderCode': 'bedigitech',
|
|
127
117
|
}
|
|
128
118
|
];
|
|
129
|
-
|
|
130
|
-
const result = spec.interpretResponse(response, bidRequest);
|
|
119
|
+
const result = spec.interpretResponse(response);
|
|
131
120
|
expect(result).to.have.lengthOf(1);
|
|
132
121
|
let resultKeys = Object.keys(result[0]);
|
|
133
122
|
expect(resultKeys.sort()).to.deep.equal(Object.keys(expectedResponse[0]).sort());
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import bidwatchAnalytics from 'modules/bidwatchAnalyticsAdapter.js';
|
|
2
|
+
import {dereferenceWithoutRenderer} from 'modules/bidwatchAnalyticsAdapter.js';
|
|
2
3
|
import { expect } from 'chai';
|
|
3
4
|
import { server } from 'test/mocks/xhr.js';
|
|
4
5
|
let adapterManager = require('src/adapterManager').default;
|
|
@@ -155,7 +156,7 @@ describe('BidWatch Analytics', function () {
|
|
|
155
156
|
'requestId': '34a63e5d5378a3',
|
|
156
157
|
'transactionId': 'de664ccb-e18b-4436-aeb0-362382eb1b40',
|
|
157
158
|
'auctionId': '1e8b993d-8f0a-4232-83eb-3639ddf3a44b',
|
|
158
|
-
'mediaType': '
|
|
159
|
+
'mediaType': 'video',
|
|
159
160
|
'source': 'client',
|
|
160
161
|
'cpm': 27.4276,
|
|
161
162
|
'creativeId': '158534630',
|
|
@@ -168,6 +169,7 @@ describe('BidWatch Analytics', function () {
|
|
|
168
169
|
'example.com'
|
|
169
170
|
]
|
|
170
171
|
},
|
|
172
|
+
'renderer': 'something',
|
|
171
173
|
'originalCpm': 25.02521,
|
|
172
174
|
'originalCurrency': 'EUR',
|
|
173
175
|
'responseTimestamp': 1647424261559,
|
|
@@ -221,6 +223,7 @@ describe('BidWatch Analytics', function () {
|
|
|
221
223
|
'example.com'
|
|
222
224
|
]
|
|
223
225
|
},
|
|
226
|
+
'renderer': 'something',
|
|
224
227
|
'originalCpm': 25.02521,
|
|
225
228
|
'originalCurrency': 'EUR',
|
|
226
229
|
'responseTimestamp': 1647424261558,
|
|
@@ -267,7 +270,24 @@ describe('BidWatch Analytics', function () {
|
|
|
267
270
|
bidwatchAnalytics.disableAnalytics();
|
|
268
271
|
bidwatchAnalytics.track.restore();
|
|
269
272
|
});
|
|
273
|
+
it('test dereferenceWithoutRenderer', function () {
|
|
274
|
+
adapterManager.registerAnalyticsAdapter({
|
|
275
|
+
code: 'bidwatch',
|
|
276
|
+
adapter: bidwatchAnalytics
|
|
277
|
+
});
|
|
270
278
|
|
|
279
|
+
adapterManager.enableAnalytics({
|
|
280
|
+
provider: 'bidwatch',
|
|
281
|
+
options: {
|
|
282
|
+
domain: 'test'
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
let resultBidWon = JSON.parse(dereferenceWithoutRenderer(bidWon));
|
|
286
|
+
expect(resultBidWon).not.to.have.property('renderer');
|
|
287
|
+
let resultBid = JSON.parse(dereferenceWithoutRenderer(auctionEnd));
|
|
288
|
+
expect(resultBid).to.have.property('bidsReceived').and.to.have.lengthOf(1);
|
|
289
|
+
expect(resultBid.bidsReceived[0]).not.to.have.property('renderer');
|
|
290
|
+
});
|
|
271
291
|
it('test auctionEnd', function () {
|
|
272
292
|
adapterManager.registerAnalyticsAdapter({
|
|
273
293
|
code: 'bidwatch',
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { spec } from '../../../modules/bridBidAdapter.js'
|
|
2
|
+
|
|
3
|
+
describe('Brid Bid Adapter', function() {
|
|
4
|
+
const videoRequest = [{
|
|
5
|
+
bidder: 'brid',
|
|
6
|
+
params: {
|
|
7
|
+
placementId: 12345,
|
|
8
|
+
},
|
|
9
|
+
mediaTypes: {
|
|
10
|
+
video: {
|
|
11
|
+
playerSize: [[640, 360]],
|
|
12
|
+
context: 'instream',
|
|
13
|
+
playbackmethod: [1, 2, 3, 4]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}];
|
|
17
|
+
|
|
18
|
+
it('Test the bid validation function', function() {
|
|
19
|
+
const validBid = spec.isBidRequestValid(videoRequest[0]);
|
|
20
|
+
const invalidBid = spec.isBidRequestValid(null);
|
|
21
|
+
|
|
22
|
+
expect(validBid).to.be.true;
|
|
23
|
+
expect(invalidBid).to.be.false;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('Test the request processing function', function () {
|
|
27
|
+
const request = spec.buildRequests(videoRequest, videoRequest[0]);
|
|
28
|
+
expect(request).to.not.be.empty;
|
|
29
|
+
|
|
30
|
+
const payload = JSON.parse(request[0].data);
|
|
31
|
+
expect(payload).to.not.be.empty;
|
|
32
|
+
expect(payload.sdk).to.deep.equal({
|
|
33
|
+
source: 'pbjs',
|
|
34
|
+
version: '$prebid.version$'
|
|
35
|
+
});
|
|
36
|
+
expect(payload.imp[0].ext.prebid.storedrequest.id).to.equal(12345);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('Test nobid responses', function () {
|
|
40
|
+
const responseBody = {
|
|
41
|
+
'id': 'test-id',
|
|
42
|
+
'cur': 'USD',
|
|
43
|
+
'seatbid': [],
|
|
44
|
+
'nbr': 0
|
|
45
|
+
};
|
|
46
|
+
const bidderRequest = null;
|
|
47
|
+
|
|
48
|
+
const bidResponse = spec.interpretResponse({ body: responseBody }, {bidderRequest});
|
|
49
|
+
|
|
50
|
+
expect(bidResponse.length).to.equal(0);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('Test the response parsing function', function () {
|
|
54
|
+
const responseBody = {
|
|
55
|
+
'id': 'test-id',
|
|
56
|
+
'cur': 'USD',
|
|
57
|
+
'seatbid': [{
|
|
58
|
+
'bid': [{
|
|
59
|
+
'id': '5044997188309660254',
|
|
60
|
+
'price': 5,
|
|
61
|
+
'adm': 'test ad',
|
|
62
|
+
'adid': '97517771',
|
|
63
|
+
'crid': '97517771',
|
|
64
|
+
'adomain': ['domain.com'],
|
|
65
|
+
'w': 640,
|
|
66
|
+
'h': 480
|
|
67
|
+
}],
|
|
68
|
+
'seat': 'bidder'
|
|
69
|
+
}]
|
|
70
|
+
};
|
|
71
|
+
const bidderRequest = {
|
|
72
|
+
bidderCode: 'brid',
|
|
73
|
+
bidderRequestId: '22edbae2733bf6',
|
|
74
|
+
bids: videoRequest
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const bidResponse = spec.interpretResponse({ body: responseBody }, {bidderRequest});
|
|
78
|
+
expect(bidResponse).to.not.be.empty;
|
|
79
|
+
|
|
80
|
+
const bid = bidResponse[0];
|
|
81
|
+
expect(bid).to.not.be.empty;
|
|
82
|
+
expect(bid.ad).to.equal('test ad');
|
|
83
|
+
expect(bid.cpm).to.equal(5);
|
|
84
|
+
expect(bid.width).to.equal(640);
|
|
85
|
+
expect(bid.height).to.equal(480);
|
|
86
|
+
expect(bid.currency).to.equal('USD');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('Test GDPR and USP consents are present in the request', function () {
|
|
90
|
+
let gdprConsentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
|
|
91
|
+
let uspConsentString = '1YA-';
|
|
92
|
+
let bidderRequest = {
|
|
93
|
+
'bidderCode': 'brid',
|
|
94
|
+
'bidderRequestId': '22edbae2733bf6',
|
|
95
|
+
'timeout': 3000,
|
|
96
|
+
'uspConsent': uspConsentString,
|
|
97
|
+
'gdprConsent': {
|
|
98
|
+
consentString: gdprConsentString,
|
|
99
|
+
gdprApplies: true,
|
|
100
|
+
addtlConsent: '1~7.12.35.62.66.70.89.93.108'
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
bidderRequest.bids = videoRequest;
|
|
104
|
+
|
|
105
|
+
const request = spec.buildRequests(videoRequest, bidderRequest);
|
|
106
|
+
const payload = JSON.parse(request[0].data);
|
|
107
|
+
|
|
108
|
+
expect(payload.user.ext.consent).to.equal(gdprConsentString);
|
|
109
|
+
expect(payload.regs.ext.us_privacy).to.equal(uspConsentString);
|
|
110
|
+
expect(payload.regs.ext.gdpr).to.equal(1);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('Test GDPR is not present', function () {
|
|
114
|
+
let uspConsentString = '1YA-';
|
|
115
|
+
let bidderRequest = {
|
|
116
|
+
'bidderCode': 'brid',
|
|
117
|
+
'bidderRequestId': '22edbae2733bf6',
|
|
118
|
+
'timeout': 3000,
|
|
119
|
+
'uspConsent': uspConsentString
|
|
120
|
+
};
|
|
121
|
+
bidderRequest.bids = videoRequest;
|
|
122
|
+
|
|
123
|
+
const request = spec.buildRequests(videoRequest, bidderRequest);
|
|
124
|
+
const payload = JSON.parse(request[0].data);
|
|
125
|
+
|
|
126
|
+
expect(payload.regs.ext.gdpr).to.be.undefined;
|
|
127
|
+
expect(payload.regs.ext.us_privacy).to.equal(uspConsentString);
|
|
128
|
+
});
|
|
129
|
+
});
|