Skip to content

Commit 8e464a9

Browse files
rajcspsgrajkumar.natarajan
authored andcommitted
Synacormedia bid adapter: add support for floors module (prebid#7682)
* issue 6465 add support for floors module * issue 6465 fix typo Co-authored-by: rajkumar.natarajan <[email protected]>
1 parent 1d4456e commit 8e464a9

File tree

2 files changed

+101
-10
lines changed

2 files changed

+101
-10
lines changed

modules/synacormediaBidAdapter.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { getAdUnitSizes, logWarn, deepSetValue } from '../src/utils.js';
3+
import { getAdUnitSizes, logWarn, deepSetValue, isFn, isPlainObject } from '../src/utils.js';
44
import { registerBidder } from '../src/adapters/bidderFactory.js';
55
import { BANNER, VIDEO } from '../src/mediaTypes.js';
66
import includes from 'core-js-pure/features/array/includes.js';
@@ -67,11 +67,7 @@ export const spec = {
6767
} else {
6868
seatId = bid.params.seatId;
6969
}
70-
const tagIdOrplacementId = bid.params.tagId || bid.params.placementId;
71-
const bidFloor = bid.params.bidfloor ? parseFloat(bid.params.bidfloor) : null;
72-
if (isNaN(bidFloor)) {
73-
logWarn(`Synacormedia: there is an invalid bid floor: ${bid.params.bidfloor}`);
74-
}
70+
const tagIdOrPlacementId = bid.params.tagId || bid.params.placementId;
7571
let pos = parseInt(bid.params.pos, 10);
7672
if (isNaN(pos)) {
7773
logWarn(`Synacormedia: there is an invalid POS: ${bid.params.pos}`);
@@ -83,9 +79,9 @@ export const spec = {
8379

8480
let imps = [];
8581
if (videoOrBannerKey === 'banner') {
86-
imps = this.buildBannerImpressions(adSizes, bid, tagIdOrplacementId, pos, bidFloor, videoOrBannerKey);
82+
imps = this.buildBannerImpressions(adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey);
8783
} else if (videoOrBannerKey === 'video') {
88-
imps = this.buildVideoImpressions(adSizes, bid, tagIdOrplacementId, pos, bidFloor, videoOrBannerKey);
84+
imps = this.buildVideoImpressions(adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey);
8985
}
9086
if (imps.length > 0) {
9187
imps.forEach(i => openRtbBidRequest.imp.push(i));
@@ -128,7 +124,7 @@ export const spec = {
128124
return eids;
129125
},
130126

131-
buildBannerImpressions: function (adSizes, bid, tagIdOrPlacementId, pos, bidFloor, videoOrBannerKey) {
127+
buildBannerImpressions: function (adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey) {
132128
let format = [];
133129
let imps = [];
134130
adSizes.forEach((size, i) => {
@@ -151,6 +147,10 @@ export const spec = {
151147
},
152148
tagid: tagIdOrPlacementId,
153149
};
150+
const bidFloor = getBidFloor(bid, 'banner', '*');
151+
if (isNaN(bidFloor)) {
152+
logWarn(`Synacormedia: there is an invalid bid floor: ${bid.params.bidfloor}`);
153+
}
154154
if (bidFloor !== null && !isNaN(bidFloor)) {
155155
imp.bidfloor = bidFloor;
156156
}
@@ -159,7 +159,7 @@ export const spec = {
159159
return imps;
160160
},
161161

162-
buildVideoImpressions: function(adSizes, bid, tagIdOrPlacementId, pos, bidFloor, videoOrBannerKey) {
162+
buildVideoImpressions: function(adSizes, bid, tagIdOrPlacementId, pos, videoOrBannerKey) {
163163
let imps = [];
164164
adSizes.forEach((size, i) => {
165165
if (!size || size.length != 2) {
@@ -171,6 +171,11 @@ export const spec = {
171171
id: `${videoOrBannerKey.substring(0, 1)}${bid.bidId}-${size0}x${size1}`,
172172
tagid: tagIdOrPlacementId
173173
};
174+
const bidFloor = getBidFloor(bid, 'video', size);
175+
if (isNaN(bidFloor)) {
176+
logWarn(`Synacormedia: there is an invalid bid floor: ${bid.params.bidfloor}`);
177+
}
178+
174179
if (bidFloor !== null && !isNaN(bidFloor)) {
175180
imp.bidfloor = bidFloor;
176181
}
@@ -287,4 +292,20 @@ export const spec = {
287292
}
288293
};
289294

295+
function getBidFloor(bid, mediaType, size) {
296+
if (!isFn(bid.getFloor)) {
297+
return bid.params.bidfloor ? parseFloat(bid.params.bidfloor) : null;
298+
}
299+
let floor = bid.getFloor({
300+
currency: 'USD',
301+
mediaType,
302+
size
303+
});
304+
305+
if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'USD') {
306+
return floor.floor;
307+
}
308+
return null;
309+
}
310+
290311
registerBidder(spec);

test/spec/modules/synacormediaBidAdapter_spec.js

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,4 +1231,74 @@ describe('synacormediaBidAdapter ', function () {
12311231
expect(usersyncs).to.be.an('array').that.is.empty;
12321232
});
12331233
});
1234+
1235+
describe('Bid Requests with price module should use if available', function () {
1236+
let validVideoBidRequest = {
1237+
bidder: 'synacormedia',
1238+
params: {
1239+
bidfloor: '0.50',
1240+
seatId: 'prebid',
1241+
placementId: 'demo1',
1242+
pos: 1,
1243+
video: {}
1244+
},
1245+
renderer: {
1246+
url: '../syncOutstreamPlayer.js'
1247+
},
1248+
mediaTypes: {
1249+
video: {
1250+
playerSize: [[300, 250]],
1251+
context: 'outstream'
1252+
}
1253+
},
1254+
adUnitCode: 'div-1',
1255+
transactionId: '0869f34e-090b-4b20-84ee-46ff41405a39',
1256+
sizes: [[300, 250]],
1257+
bidId: '22b3a2268d9f0e',
1258+
bidderRequestId: '1d195910597e13',
1259+
auctionId: '3375d336-2aea-4ee7-804c-6d26b621ad20',
1260+
src: 'client',
1261+
bidRequestsCount: 1,
1262+
bidderRequestsCount: 1,
1263+
bidderWinsCount: 0
1264+
};
1265+
1266+
let validBannerBidRequest = {
1267+
bidId: '9876abcd',
1268+
sizes: [[300, 250]],
1269+
params: {
1270+
bidfloor: '0.50',
1271+
seatId: 'prebid',
1272+
placementId: '1234',
1273+
}
1274+
};
1275+
1276+
let bidderRequest = {
1277+
refererInfo: {
1278+
referer: 'http://localhost:9999/'
1279+
},
1280+
bidderCode: 'synacormedia',
1281+
auctionId: 'f8a75621-d672-4cbb-9275-3db7d74fb110'
1282+
};
1283+
1284+
it('should return valid bidfloor using price module for banner/video impression', function () {
1285+
let bannerRequest = spec.buildRequests([validBannerBidRequest], bidderRequest);
1286+
let videoRequest = spec.buildRequests([validVideoBidRequest], bidderRequest);
1287+
1288+
expect(bannerRequest.data.imp[0].bidfloor).to.equal(0.5);
1289+
expect(videoRequest.data.imp[0].bidfloor).to.equal(0.5);
1290+
1291+
let priceModuleFloor = 3;
1292+
let floorResponse = { currency: 'USD', floor: priceModuleFloor };
1293+
1294+
validBannerBidRequest.getFloor = () => { return floorResponse; };
1295+
validVideoBidRequest.getFloor = () => { return floorResponse; };
1296+
1297+
bannerRequest = spec.buildRequests([validBannerBidRequest], bidderRequest);
1298+
videoRequest = spec.buildRequests([validVideoBidRequest], bidderRequest);
1299+
1300+
expect(bannerRequest.data.imp[0].bidfloor).to.equal(priceModuleFloor);
1301+
expect(videoRequest.data.imp[0].bidfloor).to.equal(priceModuleFloor);
1302+
});
1303+
});
12341304
});

0 commit comments

Comments
 (0)