prebid.js 7.4.0 → 7.7.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/.circleci/config.yml +11 -6
- package/dist/1plusXRtdProvider.js +1 -0
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adoceanBidAdapter.js +1 -1
- package/dist/adotBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adrinoBidAdapter.js +1 -1
- package/dist/adtelligentBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.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/atsAnalyticsAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bliinkBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/byDataAnalyticsAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/currency.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/gdprEnforcement.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/hadronIdSystem.js +1 -1
- package/dist/hadronRtdProvider.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/kargoAnalyticsAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.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/minutemediaBidAdapter.js +1 -1
- package/dist/naveggIdSystem.js +1 -1
- package/dist/newspassidBidAdapter.js +1 -0
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +131 -128
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/priceFloors.js +1 -1
- package/dist/pubCommonId.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/rasBidAdapter.js +1 -0
- 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/rubiconAnalyticsAdapter.js +1 -1
- package/dist/rubiconBidAdapter.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/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/taboolaBidAdapter.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/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/integrationExamples/gpt/1plusXRtdProviderExample.html +112 -0
- package/karma.conf.maker.js +3 -1
- package/modules/.submodules.json +2 -1
- package/modules/1plusXRtdProvider.js +251 -0
- package/modules/1plusXRtdProvider.md +65 -0
- package/modules/adgenerationBidAdapter.js +24 -1
- package/modules/adnuntiusBidAdapter.js +26 -8
- package/modules/adoceanBidAdapter.js +10 -3
- package/modules/adotBidAdapter.js +13 -4
- package/modules/adrinoBidAdapter.js +10 -2
- package/modules/adrinoBidAdapter.md +6 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +3 -3
- package/modules/atsAnalyticsAdapter.js +4 -5
- package/modules/big-richmediaBidAdapter.js +3 -3
- package/modules/bliinkBidAdapter.js +120 -193
- package/modules/bliinkBidAdapter.md +2 -5
- package/modules/byDataAnalyticsAdapter.js +172 -74
- package/modules/byDataAnalyticsAdapter.md +5 -6
- package/modules/consumableBidAdapter.js +21 -1
- package/modules/criteoBidAdapter.js +7 -1
- package/modules/currency.js +2 -2
- package/modules/cwireBidAdapter.md +1 -1
- package/modules/eplanningBidAdapter.js +82 -97
- package/modules/gdprEnforcement.js +8 -14
- package/modules/gridNMBidAdapter.js +45 -4
- package/modules/hadronAnalyticsAdapter.md +5 -5
- package/modules/hadronIdSystem.js +18 -5
- package/modules/hadronIdSystem.md +15 -11
- package/modules/hadronRtdProvider.js +14 -1
- package/modules/hadronRtdProvider.md +17 -13
- package/modules/imRtdProvider.js +0 -8
- package/modules/impactifyBidAdapter.js +6 -2
- package/modules/ixBidAdapter.js +133 -23
- package/modules/ixBidAdapter.md +2 -5
- package/modules/jixieBidAdapter.js +10 -10
- package/modules/kargoAnalyticsAdapter.js +88 -6
- package/modules/kargoAnalyticsAdapter.md +33 -0
- package/modules/minutemediaBidAdapter.js +1 -0
- package/modules/naveggIdSystem.js +1 -12
- package/modules/newspassidBidAdapter.js +649 -0
- package/modules/nextMillenniumBidAdapter.js +17 -1
- package/modules/nextMillenniumBidAdapter.md +1 -1
- package/modules/oguryBidAdapter.js +2 -0
- package/modules/onetagBidAdapter.js +44 -7
- package/modules/prebidServerBidAdapter/index.js +7 -0
- package/modules/priceFloors.js +1 -1
- package/modules/pubCommonId.js +1 -2
- package/modules/pubxaiAnalyticsAdapter.js +6 -1
- package/modules/rasBidAdapter.js +149 -0
- package/modules/rasBidAdapter.md +50 -0
- package/modules/rubiconBidAdapter.js +5 -0
- package/modules/seedingAllianceBidAdapter.js +3 -0
- package/modules/seedtagBidAdapter.js +37 -1
- package/modules/sharedIdSystem.js +11 -5
- package/modules/sharethroughBidAdapter.js +9 -24
- package/modules/taboolaBidAdapter.js +1 -1
- package/modules/taboolaBidAdapter.md +3 -3
- package/modules/targetVideoBidAdapter.js +18 -0
- package/modules/userId/index.js +39 -21
- package/package.json +1 -1
- package/src/auction.js +6 -5
- package/src/consentHandler.js +11 -11
- package/src/debugging.js +5 -3
- package/src/hook.js +2 -2
- package/src/storageManager.js +4 -5
- package/src/utils/promise.js +96 -21
- package/src/utils.js +3 -2
- package/test/helpers/consentData.js +2 -1
- package/test/spec/auctionmanager_spec.js +1 -6
- package/test/spec/debugging_spec.js +2 -2
- package/test/spec/modules/1plusXRtdProvider_spec.js +430 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
- package/test/spec/modules/adoceanBidAdapter_spec.js +4 -1
- package/test/spec/modules/adotBidAdapter_spec.js +12 -9
- package/test/spec/modules/adrinoBidAdapter_spec.js +22 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
- package/test/spec/modules/bliinkBidAdapter_spec.js +323 -136
- package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
- package/test/spec/modules/consumableBidAdapter_spec.js +122 -1
- package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
- package/test/spec/modules/eplanningBidAdapter_spec.js +58 -18
- package/test/spec/modules/gdprEnforcement_spec.js +53 -100
- package/test/spec/modules/gridNMBidAdapter_spec.js +32 -0
- package/test/spec/modules/hadronIdSystem_spec.js +2 -2
- package/test/spec/modules/idxIdSystem_spec.js +1 -1
- package/test/spec/modules/imRtdProvider_spec.js +0 -1
- package/test/spec/modules/ixBidAdapter_spec.js +212 -5
- package/test/spec/modules/jixieBidAdapter_spec.js +8 -8
- package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
- package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
- package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
- package/test/spec/modules/onetagBidAdapter_spec.js +53 -4
- package/test/spec/modules/parrableIdSystem_spec.js +2 -1
- package/test/spec/modules/prebidServerBidAdapter_spec.js +20 -0
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
- package/test/spec/modules/rasBidAdapter_spec.js +190 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +27 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
- package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
- package/test/spec/modules/targetVideoBidAdapter_spec.js +43 -0
- package/test/spec/modules/userId_spec.js +15 -2
- package/test/spec/unit/pbjs_api_spec.js +1 -5
- package/test/spec/unit/utils/promise_spec.js +283 -38
- package/test/helpers/syncPromise.js +0 -71
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import { config } from 'src/config';
|
|
2
|
+
import {
|
|
3
|
+
onePlusXSubmodule,
|
|
4
|
+
segtaxes,
|
|
5
|
+
extractConfig,
|
|
6
|
+
buildOrtb2Updates,
|
|
7
|
+
updateBidderConfig,
|
|
8
|
+
setTargetingDataToConfig
|
|
9
|
+
} from 'modules/1plusXRtdProvider';
|
|
10
|
+
|
|
11
|
+
describe('1plusXRtdProvider', () => {
|
|
12
|
+
// Fake server config
|
|
13
|
+
let fakeServer;
|
|
14
|
+
const fakeResponseHeaders = {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
'Access-Control-Allow-Origin': '*'
|
|
17
|
+
};
|
|
18
|
+
const fakeResponse = {
|
|
19
|
+
s: ['segment1', 'segment2', 'segment3'],
|
|
20
|
+
t: ['targeting1', 'targeting2', 'targeting3']
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// Bid request config
|
|
24
|
+
const reqBidsConfigObj = {
|
|
25
|
+
adUnits: [{
|
|
26
|
+
bids: [
|
|
27
|
+
{ bidder: 'appnexus' }
|
|
28
|
+
]
|
|
29
|
+
}]
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Bidder configs
|
|
33
|
+
const bidderConfigInitial = {
|
|
34
|
+
ortb2: {
|
|
35
|
+
user: { keywords: '' },
|
|
36
|
+
site: { ext: {} }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const bidderConfigInitialWith1plusXUserData = {
|
|
40
|
+
ortb2: {
|
|
41
|
+
user: {
|
|
42
|
+
data: [{ name: '1plusX.com', segment: [{ id: 'initial' }] }]
|
|
43
|
+
},
|
|
44
|
+
site: { content: { data: [] } }
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const bidderConfigInitialWithUserData = {
|
|
48
|
+
ortb2: {
|
|
49
|
+
user: {
|
|
50
|
+
data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
|
|
51
|
+
},
|
|
52
|
+
site: { content: { data: [] } }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const bidderConfigInitialWith1plusXSiteContent = {
|
|
56
|
+
ortb2: {
|
|
57
|
+
user: { data: [] },
|
|
58
|
+
site: {
|
|
59
|
+
content: {
|
|
60
|
+
data: [{
|
|
61
|
+
name: '1plusX.com', segment: [{ id: 'initial' }], ext: { segtax: 525 }
|
|
62
|
+
}]
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const bidderConfigInitialWithSiteContent = {
|
|
68
|
+
ortb2: {
|
|
69
|
+
user: { data: [] },
|
|
70
|
+
site: {
|
|
71
|
+
content: {
|
|
72
|
+
data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Util functions
|
|
78
|
+
const randomBidder = (len = 5) => Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, len);
|
|
79
|
+
|
|
80
|
+
before(() => {
|
|
81
|
+
config.resetConfig();
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
after(() => { })
|
|
85
|
+
|
|
86
|
+
beforeEach(() => {
|
|
87
|
+
fakeServer = sinon.createFakeServer();
|
|
88
|
+
fakeServer.respondWith('GET', '*', [200, fakeResponseHeaders, JSON.stringify(fakeResponse)]);
|
|
89
|
+
fakeServer.respondImmediately = true;
|
|
90
|
+
fakeServer.autoRespond = true;
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
describe('onePlusXSubmodule', () => {
|
|
94
|
+
it('init is successfull', () => {
|
|
95
|
+
const initResult = onePlusXSubmodule.init();
|
|
96
|
+
expect(initResult).to.be.true;
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('callback is called after getBidRequestData', () => {
|
|
100
|
+
// Nice case; everything runs as expected
|
|
101
|
+
{
|
|
102
|
+
const callbackSpy = sinon.spy();
|
|
103
|
+
const config = { params: { customerId: 'test', bidders: ['appnexus'] } };
|
|
104
|
+
onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
|
|
105
|
+
setTimeout(() => {
|
|
106
|
+
expect(callbackSpy.calledOnce).to.be.true
|
|
107
|
+
}, 100)
|
|
108
|
+
}
|
|
109
|
+
// No customer id in config => error but still callback called
|
|
110
|
+
{
|
|
111
|
+
const callbackSpy = sinon.spy();
|
|
112
|
+
const config = {}
|
|
113
|
+
onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
|
|
114
|
+
setTimeout(() => {
|
|
115
|
+
expect(callbackSpy.calledOnce).to.be.true
|
|
116
|
+
}, 100);
|
|
117
|
+
}
|
|
118
|
+
// No bidders in config => error but still callback called
|
|
119
|
+
{
|
|
120
|
+
const callbackSpy = sinon.spy();
|
|
121
|
+
const config = { customerId: 'test' }
|
|
122
|
+
onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
|
|
123
|
+
setTimeout(() => {
|
|
124
|
+
expect(callbackSpy.calledOnce).to.be.true
|
|
125
|
+
}, 100);
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
describe('extractConfig', () => {
|
|
131
|
+
const customerId = 'test';
|
|
132
|
+
const timeout = 1000;
|
|
133
|
+
const bidders = ['appnexus'];
|
|
134
|
+
|
|
135
|
+
it('Throws an error if no customerId is specified', () => {
|
|
136
|
+
const moduleConfig = { params: { timeout, bidders } };
|
|
137
|
+
expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
|
|
138
|
+
})
|
|
139
|
+
it('Throws an error if no bidder is specified', () => {
|
|
140
|
+
const moduleConfig = { params: { customerId, timeout } };
|
|
141
|
+
expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
|
|
142
|
+
})
|
|
143
|
+
it("Throws an error if there's no bidder in reqBidsConfigObj", () => {
|
|
144
|
+
const moduleConfig = { params: { customerId, timeout, bidders } };
|
|
145
|
+
const reqBidsConfigEmpty = { adUnits: [{ bids: [] }] };
|
|
146
|
+
expect(() => extractConfig(moduleConfig, reqBidsConfigEmpty)).to.throw();
|
|
147
|
+
})
|
|
148
|
+
it('Returns an object containing the parameters specified', () => {
|
|
149
|
+
const moduleConfig = { params: { customerId, timeout, bidders } };
|
|
150
|
+
const expectedKeys = ['customerId', 'timeout', 'bidders']
|
|
151
|
+
const extractedConfig = extractConfig(moduleConfig, reqBidsConfigObj);
|
|
152
|
+
expect(extractedConfig).to.be.an('object').and.to.have.all.keys(expectedKeys);
|
|
153
|
+
expect(extractedConfig.customerId).to.equal(customerId);
|
|
154
|
+
expect(extractedConfig.timeout).to.equal(timeout);
|
|
155
|
+
expect(extractedConfig.bidders).to.deep.equal(bidders);
|
|
156
|
+
})
|
|
157
|
+
/* 1plusX RTD module may only use bidders that are both specified in :
|
|
158
|
+
- the bid request configuration
|
|
159
|
+
- AND in the 1plusX RTD module configuration
|
|
160
|
+
Below 2 tests are enforcing those rules
|
|
161
|
+
*/
|
|
162
|
+
it('Returns the intersection of bidders found in bid request config & module config', () => {
|
|
163
|
+
const bidders = ['appnexus', 'rubicon'];
|
|
164
|
+
const moduleConfig = { params: { customerId, timeout, bidders } };
|
|
165
|
+
const { bidders: extractedBidders } = extractConfig(moduleConfig, reqBidsConfigObj);
|
|
166
|
+
expect(extractedBidders).to.be.an('array').and.to.have.length(1); 7
|
|
167
|
+
expect(extractedBidders[0]).to.equal('appnexus');
|
|
168
|
+
})
|
|
169
|
+
it('Throws an error if no bidder can be used by the module', () => {
|
|
170
|
+
const bidders = ['rubicon'];
|
|
171
|
+
const moduleConfig = { params: { customerId, timeout, bidders } };
|
|
172
|
+
expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
describe('buildOrtb2Updates', () => {
|
|
177
|
+
it('fills site.content.data & user.data in the ortb2 config', () => {
|
|
178
|
+
const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
|
|
179
|
+
const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
|
|
180
|
+
|
|
181
|
+
const expectedOutput = {
|
|
182
|
+
siteContentData: {
|
|
183
|
+
name: '1plusX.com',
|
|
184
|
+
segment: rtdData.topics.map((topicId) => ({ id: topicId })),
|
|
185
|
+
ext: { segtax: segtaxes.CONTENT }
|
|
186
|
+
},
|
|
187
|
+
userData: {
|
|
188
|
+
name: '1plusX.com',
|
|
189
|
+
segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
|
|
193
|
+
});
|
|
194
|
+
it('fills site.keywords in the ortb2 config (appnexus specific)', () => {
|
|
195
|
+
const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
|
|
196
|
+
const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
|
|
197
|
+
|
|
198
|
+
const expectedOutput = {
|
|
199
|
+
site: {
|
|
200
|
+
keywords: rtdData.topics.join(','),
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('defaults to empty array if no segment is given', () => {
|
|
207
|
+
const rtdData = { topics: fakeResponse.t };
|
|
208
|
+
const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
|
|
209
|
+
|
|
210
|
+
const expectedOutput = {
|
|
211
|
+
siteContentData: {
|
|
212
|
+
name: '1plusX.com',
|
|
213
|
+
segment: rtdData.topics.map((topicId) => ({ id: topicId })),
|
|
214
|
+
ext: { segtax: segtaxes.CONTENT }
|
|
215
|
+
},
|
|
216
|
+
userData: {
|
|
217
|
+
name: '1plusX.com',
|
|
218
|
+
segment: []
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
expect(ortb2Updates).to.deep.include(expectedOutput);
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
it('defaults to empty array if no topic is given', () => {
|
|
225
|
+
const rtdData = { segments: fakeResponse.s };
|
|
226
|
+
const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
|
|
227
|
+
|
|
228
|
+
const expectedOutput = {
|
|
229
|
+
siteContentData: {
|
|
230
|
+
name: '1plusX.com',
|
|
231
|
+
segment: [],
|
|
232
|
+
ext: { segtax: segtaxes.CONTENT }
|
|
233
|
+
},
|
|
234
|
+
userData: {
|
|
235
|
+
name: '1plusX.com',
|
|
236
|
+
segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
expect(ortb2Updates).to.deep.include(expectedOutput);
|
|
240
|
+
})
|
|
241
|
+
it('defaults to empty string if no topic is given (appnexus specific)', () => {
|
|
242
|
+
const rtdData = { segments: fakeResponse.s };
|
|
243
|
+
const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
|
|
244
|
+
|
|
245
|
+
const expectedOutput = {
|
|
246
|
+
site: {
|
|
247
|
+
keywords: '',
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
expect(ortb2Updates).to.deep.include(expectedOutput);
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
describe('updateBidderConfig', () => {
|
|
255
|
+
const ortb2UpdatesAppNexus = {
|
|
256
|
+
site: {
|
|
257
|
+
keywords: fakeResponse.t.join(','),
|
|
258
|
+
},
|
|
259
|
+
userData: {
|
|
260
|
+
name: '1plusX.com',
|
|
261
|
+
segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const ortb2Updates = {
|
|
265
|
+
siteContentData: {
|
|
266
|
+
name: '1plusX.com',
|
|
267
|
+
segment: fakeResponse.t.map((topicId) => ({ id: topicId })),
|
|
268
|
+
ext: { segtax: segtaxes.CONTENT }
|
|
269
|
+
},
|
|
270
|
+
userData: {
|
|
271
|
+
name: '1plusX.com',
|
|
272
|
+
segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
it('merges fetched data in bidderConfig for configured bidders', () => {
|
|
277
|
+
const bidder = randomBidder();
|
|
278
|
+
// Set initial config
|
|
279
|
+
config.setBidderConfig({
|
|
280
|
+
bidders: [bidder],
|
|
281
|
+
config: bidderConfigInitial
|
|
282
|
+
});
|
|
283
|
+
// Call submodule's setBidderConfig
|
|
284
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
|
|
285
|
+
// Check that the targeting data has been set in the config
|
|
286
|
+
expect(newBidderConfig).not.to.be.null;
|
|
287
|
+
expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
|
|
288
|
+
expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
|
|
289
|
+
// Check that existing config didn't get erased
|
|
290
|
+
expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
|
|
291
|
+
expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
|
|
292
|
+
})
|
|
293
|
+
|
|
294
|
+
it('merges fetched data in bidderConfig for configured bidders (appnexus specific)', () => {
|
|
295
|
+
const bidder = 'appnexus';
|
|
296
|
+
// Set initial config
|
|
297
|
+
config.setBidderConfig({
|
|
298
|
+
bidders: [bidder],
|
|
299
|
+
config: bidderConfigInitial
|
|
300
|
+
});
|
|
301
|
+
// Call submodule's setBidderConfig
|
|
302
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2UpdatesAppNexus, config.getBidderConfig());
|
|
303
|
+
|
|
304
|
+
// Check that the targeting data has been set in the config
|
|
305
|
+
expect(newBidderConfig).not.to.be.null;
|
|
306
|
+
expect(newBidderConfig.ortb2.site).to.deep.include(ortb2UpdatesAppNexus.site);
|
|
307
|
+
// Check that existing config didn't get erased
|
|
308
|
+
expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
|
|
309
|
+
expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
it('overwrites an existing 1plus.com entry in ortb2.user.data', () => {
|
|
313
|
+
const bidder = randomBidder();
|
|
314
|
+
// Set initial config
|
|
315
|
+
config.setBidderConfig({
|
|
316
|
+
bidders: [bidder],
|
|
317
|
+
config: bidderConfigInitialWith1plusXUserData
|
|
318
|
+
});
|
|
319
|
+
// Save previous user.data entry
|
|
320
|
+
const previousUserData = bidderConfigInitialWith1plusXUserData.ortb2.user.data[0];
|
|
321
|
+
// Call submodule's setBidderConfig
|
|
322
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
|
|
323
|
+
// Check that the targeting data has been set in the config
|
|
324
|
+
expect(newBidderConfig).not.to.be.null;
|
|
325
|
+
expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
|
|
326
|
+
expect(newBidderConfig.ortb2.user.data).not.to.include(previousUserData);
|
|
327
|
+
})
|
|
328
|
+
it("doesn't overwrite entries in ortb2.user.data that aren't 1plusx.com", () => {
|
|
329
|
+
const bidder = randomBidder();
|
|
330
|
+
// Set initial config
|
|
331
|
+
config.setBidderConfig({
|
|
332
|
+
bidders: [bidder],
|
|
333
|
+
config: bidderConfigInitialWithUserData
|
|
334
|
+
});
|
|
335
|
+
// Save previous user.data entry
|
|
336
|
+
const previousUserData = bidderConfigInitialWithUserData.ortb2.user.data[0];
|
|
337
|
+
// Call submodule's setBidderConfig
|
|
338
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
|
|
339
|
+
// Check that the targeting data has been set in the config
|
|
340
|
+
expect(newBidderConfig).not.to.be.null;
|
|
341
|
+
expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
|
|
342
|
+
expect(newBidderConfig.ortb2.user.data).to.deep.include(previousUserData);
|
|
343
|
+
})
|
|
344
|
+
|
|
345
|
+
it('overwrites an existing 1plus.com entry in ortb2.site.content.data', () => {
|
|
346
|
+
const bidder = randomBidder();
|
|
347
|
+
// Set initial config
|
|
348
|
+
config.setBidderConfig({
|
|
349
|
+
bidders: [bidder],
|
|
350
|
+
config: bidderConfigInitialWith1plusXSiteContent
|
|
351
|
+
});
|
|
352
|
+
// Save previous user.data entry
|
|
353
|
+
const previousSiteContent = bidderConfigInitialWith1plusXSiteContent.ortb2.site.content.data[0];
|
|
354
|
+
// Call submodule's setBidderConfig
|
|
355
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
|
|
356
|
+
// Check that the targeting data has been set in the config
|
|
357
|
+
expect(newBidderConfig).not.to.be.null;
|
|
358
|
+
expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
|
|
359
|
+
expect(newBidderConfig.ortb2.site.content.data).not.to.include(previousSiteContent);
|
|
360
|
+
})
|
|
361
|
+
it("doesn't overwrite entries in ortb2.site.content.data that aren't 1plusx.com", () => {
|
|
362
|
+
const bidder = randomBidder();
|
|
363
|
+
// Set initial config
|
|
364
|
+
config.setBidderConfig({
|
|
365
|
+
bidders: [bidder],
|
|
366
|
+
config: bidderConfigInitialWithSiteContent
|
|
367
|
+
});
|
|
368
|
+
// Save previous user.data entry
|
|
369
|
+
const previousSiteContent = bidderConfigInitialWithSiteContent.ortb2.site.content.data[0];
|
|
370
|
+
// Call submodule's setBidderConfig
|
|
371
|
+
const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
|
|
372
|
+
// Check that the targeting data has been set in the config
|
|
373
|
+
expect(newBidderConfig).not.to.be.null;
|
|
374
|
+
expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
|
|
375
|
+
expect(newBidderConfig.ortb2.site.content.data).to.deep.include(previousSiteContent);
|
|
376
|
+
})
|
|
377
|
+
})
|
|
378
|
+
|
|
379
|
+
describe('setTargetingDataToConfig', () => {
|
|
380
|
+
const expectedKeywords = fakeResponse.t.join(',');
|
|
381
|
+
const expectedSiteContentObj = {
|
|
382
|
+
data: [{
|
|
383
|
+
name: '1plusX.com',
|
|
384
|
+
segment: fakeResponse.t.map((topicId) => ({ id: topicId })),
|
|
385
|
+
ext: { segtax: segtaxes.CONTENT }
|
|
386
|
+
}]
|
|
387
|
+
}
|
|
388
|
+
const expectedUserObj = {
|
|
389
|
+
data: [{
|
|
390
|
+
name: '1plusX.com',
|
|
391
|
+
segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
|
|
392
|
+
}]
|
|
393
|
+
}
|
|
394
|
+
const expectedOrtb2 = {
|
|
395
|
+
appnexus: {
|
|
396
|
+
site: { keywords: expectedKeywords }
|
|
397
|
+
},
|
|
398
|
+
rubicon: {
|
|
399
|
+
site: { content: expectedSiteContentObj },
|
|
400
|
+
user: expectedUserObj
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
it('sets the config for the selected bidders', () => {
|
|
405
|
+
const bidders = ['appnexus', 'rubicon'];
|
|
406
|
+
// setting initial config for those bidders
|
|
407
|
+
config.setBidderConfig({
|
|
408
|
+
bidders,
|
|
409
|
+
config: bidderConfigInitial
|
|
410
|
+
})
|
|
411
|
+
// call setTargetingDataToConfig
|
|
412
|
+
setTargetingDataToConfig(fakeResponse, { bidders });
|
|
413
|
+
|
|
414
|
+
// Check that the targeting data has been set in both configs
|
|
415
|
+
for (const bidder of bidders) {
|
|
416
|
+
const newConfig = config.getBidderConfig()[bidder];
|
|
417
|
+
// Check that we got what we expect
|
|
418
|
+
const expectedConfErr = (prop) => `New config for ${bidder} doesn't comply with expected at ${prop}`;
|
|
419
|
+
expect(newConfig.ortb2.site, expectedConfErr('site')).to.deep.include(expectedOrtb2[bidder].site);
|
|
420
|
+
if (expectedOrtb2[bidder].user) {
|
|
421
|
+
expect(newConfig.ortb2.user, expectedConfErr('user')).to.deep.include(expectedOrtb2[bidder].user);
|
|
422
|
+
}
|
|
423
|
+
// Check that existing config didn't get erased
|
|
424
|
+
const existingConfErr = (prop) => `Existing config for ${bidder} got unlawfully overwritten at ${prop}`;
|
|
425
|
+
expect(newConfig.ortb2.site, existingConfErr('site')).to.deep.include(bidderConfigInitial.ortb2.site);
|
|
426
|
+
expect(newConfig.ortb2.user, existingConfErr('user')).to.deep.include(bidderConfigInitial.ortb2.user);
|
|
427
|
+
}
|
|
428
|
+
})
|
|
429
|
+
})
|
|
430
|
+
})
|
|
@@ -101,6 +101,41 @@ describe('AdgenerationAdapter', function () {
|
|
|
101
101
|
snowflake: {'id': 'novatiqId', syncResponse: 1}
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
+
},
|
|
105
|
+
{ // bannerWithAdgextCriteoId
|
|
106
|
+
bidder: 'adg',
|
|
107
|
+
params: {
|
|
108
|
+
id: '58278', // banner
|
|
109
|
+
},
|
|
110
|
+
adUnitCode: 'adunit-code',
|
|
111
|
+
sizes: [[320, 100]],
|
|
112
|
+
bidId: '2f6ac468a9c15e',
|
|
113
|
+
bidderRequestId: '14a9f773e30243',
|
|
114
|
+
auctionId: '4aae9f05-18c6-4fcd-80cf-282708cd584a',
|
|
115
|
+
transactionTd: 'f76f6dfd-d64f-4645-a29f-682bac7f431a',
|
|
116
|
+
userId: {
|
|
117
|
+
criteoId: 'criteo-id-test-1234567890'
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{ // bannerWithAdgextId5Id
|
|
121
|
+
bidder: 'adg',
|
|
122
|
+
params: {
|
|
123
|
+
id: '58278', // banner
|
|
124
|
+
},
|
|
125
|
+
adUnitCode: 'adunit-code',
|
|
126
|
+
sizes: [[320, 100]],
|
|
127
|
+
bidId: '2f6ac468a9c15e',
|
|
128
|
+
bidderRequestId: '14a9f773e30243',
|
|
129
|
+
auctionId: '4aae9f05-18c6-4fcd-80cf-282708cd584a',
|
|
130
|
+
transactionTd: 'f76f6dfd-d64f-4645-a29f-682bac7f431a',
|
|
131
|
+
userId: {
|
|
132
|
+
id5id: {
|
|
133
|
+
ext: {
|
|
134
|
+
linkType: 2
|
|
135
|
+
},
|
|
136
|
+
uid: 'id5-id-test-1234567890'
|
|
137
|
+
}
|
|
138
|
+
}
|
|
104
139
|
}
|
|
105
140
|
];
|
|
106
141
|
const bidderRequest = {
|
|
@@ -109,10 +144,12 @@ describe('AdgenerationAdapter', function () {
|
|
|
109
144
|
}
|
|
110
145
|
};
|
|
111
146
|
const data = {
|
|
112
|
-
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
113
|
-
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
114
|
-
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
115
|
-
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
147
|
+
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
148
|
+
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
149
|
+
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&tp=https%3A%2F%2Fexample.com`,
|
|
150
|
+
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
|
|
151
|
+
bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
152
|
+
bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
116
153
|
};
|
|
117
154
|
it('sends bid request to ENDPOINT via GET', function () {
|
|
118
155
|
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
|
|
@@ -149,6 +186,17 @@ describe('AdgenerationAdapter', function () {
|
|
|
149
186
|
});
|
|
150
187
|
expect(request.data).to.equal(data.bannerWithHyperId);
|
|
151
188
|
});
|
|
189
|
+
|
|
190
|
+
it('should attache params to the bannerWithAdgextCriteoId request', function () {
|
|
191
|
+
const request = spec.buildRequests(bidRequests, bidderRequest)[3];
|
|
192
|
+
expect(request.data).to.equal(data.bannerWithAdgextCriteoId);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('should attache params to the bannerWithAdgextId5Id request', function () {
|
|
196
|
+
const request = spec.buildRequests(bidRequests, bidderRequest)[4];
|
|
197
|
+
expect(request.data).to.equal(data.bannerWithAdgextId5Id);
|
|
198
|
+
});
|
|
199
|
+
|
|
152
200
|
it('allows setConfig to set bidder currency for JPY', function () {
|
|
153
201
|
config.setConfig({
|
|
154
202
|
currency: {
|