Skip to content

Commit 7650310

Browse files
committed
priceFloors: fix bug where floors are not set when TIDs are disabled
1 parent dd4b25e commit 7650310

File tree

4 files changed

+68
-19
lines changed

4 files changed

+68
-19
lines changed

integrationExamples/gpt/adUnitFloors.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<html>
1111

1212
<head>
13-
<script async src="../../build/dist/prebid.js"></script>
13+
<script async src="../../build/dev/prebid.js"></script>
1414
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
1515
<script>
1616
var FAILSAFE_TIMEOUT = 3300;
@@ -109,4 +109,3 @@ <h5>Div-1</h5>
109109
</body>
110110

111111
</html>
112-

src/adapters/bidderFactory.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ export function registerBidder(spec) {
184184
}
185185
}
186186

187-
function guardTids(bidderCode) {
187+
export function guardTids(bidderCode) {
188188
if (isActivityAllowed(ACTIVITY_TRANSMIT_TID, activityParams(MODULE_TYPE_BIDDER, bidderCode))) {
189189
return {
190190
bidRequest: (br) => br,
@@ -197,7 +197,15 @@ function guardTids(bidderCode) {
197197
}
198198
return Reflect.get(target, prop, receiver);
199199
}
200-
const bidRequest = memoize((br) => new Proxy(br, {get}), (arg) => arg.bidId)
200+
function privateAccessProxy(target, handler) {
201+
const proxy = new Proxy(target, handler);
202+
// always allow methods (such as getFloor) private access to TIDs
203+
Object.entries(target)
204+
.filter(([_, v]) => typeof v === 'function')
205+
.forEach(([prop, fn]) => proxy[prop] = fn.bind(target));
206+
return proxy;
207+
}
208+
const bidRequest = memoize((br) => privateAccessProxy(br, {get}), (arg) => arg.bidId);
201209
/**
202210
* Return a view on bidd(er) requests where auctionId/transactionId are nulled if the bidder is not allowed `transmitTid`.
203211
*
@@ -207,7 +215,7 @@ function guardTids(bidderCode) {
207215
*/
208216
return {
209217
bidRequest,
210-
bidderRequest: (br) => new Proxy(br, {
218+
bidderRequest: (br) => privateAccessProxy(br, {
211219
get(target, prop, receiver) {
212220
if (prop === 'bids') return br.bids.map(bidRequest);
213221
return get(target, prop, receiver);

test/spec/modules/priceFloors_spec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import 'src/prebid.js';
2020
import {createBid} from '../../../src/bidfactory.js';
2121
import {auctionManager} from '../../../src/auctionManager.js';
2222
import {stubAuctionIndex} from '../../helpers/indexStub.js';
23+
import {guardTids} from '../../../src/adapters/bidderFactory.js';
24+
import * as activities from '../../../src/activities/rules.js';
2325

2426
describe('the price floors module', function () {
2527
let logErrorSpy;
@@ -1369,6 +1371,18 @@ describe('the price floors module', function () {
13691371
floor: 2.5
13701372
});
13711373
});
1374+
1375+
it('works when TIDs are disabled', () => {
1376+
sandbox.stub(activities, 'isActivityAllowed').returns(false);
1377+
const req = utils.deepClone(bidRequest);
1378+
_floorDataForAuction[req.auctionId] = utils.deepClone(basicFloorConfig);
1379+
1380+
expect(guardTids('mock-bidder').bidRequest(req).getFloor({})).to.deep.equal({
1381+
currency: 'USD',
1382+
floor: 1.0
1383+
});
1384+
});
1385+
13721386
it('picks the right rule with more complex rules', function () {
13731387
_floorDataForAuction[bidRequest.auctionId] = {
13741388
...basicFloorConfig,

test/spec/unit/core/bidderFactory_spec.js

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {stubAuctionIndex} from '../../../helpers/indexStub.js';
1313
import {bidderSettings} from '../../../../src/bidderSettings.js';
1414
import {decorateAdUnitsWithNativeParams} from '../../../../src/native.js';
1515
import * as activityRules from 'src/activities/rules.js';
16-
import {sandbox} from 'sinon';
1716
import {MODULE_TYPE_BIDDER} from '../../../../src/activities/modules.js';
1817
import {ACTIVITY_TRANSMIT_TID} from '../../../../src/activities/activities.js';
1918

@@ -141,6 +140,21 @@ describe('bidders created by newBidder', function () {
141140
});
142141

143142
describe('transaction IDs', () => {
143+
beforeEach(() => {
144+
activityRules.isActivityAllowed.reset();
145+
ajaxStub.callsFake((_, callback) => callback.success(null, {getResponseHeader: sinon.stub()}));
146+
spec.interpretResponse.callsFake(() => [
147+
{
148+
requestId: 'bid',
149+
cpm: 123,
150+
ttl: 300,
151+
creativeId: 'crid',
152+
netRevenue: true,
153+
currency: 'USD'
154+
}
155+
])
156+
});
157+
144158
Object.entries({
145159
'be hidden': false,
146160
'not be hidden': true,
@@ -166,21 +180,8 @@ describe('bidders created by newBidder', function () {
166180
bidReqs.forEach(checkBidRequest);
167181
return {method: 'POST'};
168182
});
169-
spec.interpretResponse.callsFake(() => [
170-
{
171-
requestId: 'bid',
172-
cpm: 123,
173-
ttl: 300,
174-
creativeId: 'crid',
175-
netRevenue: true,
176-
currency: 'USD'
177-
}
178-
])
179-
activityRules.isActivityAllowed.reset();
180183
activityRules.isActivityAllowed.callsFake(() => allowed);
181184

182-
ajaxStub.callsFake((_, callback) => callback.success(null, {getResponseHeader: sinon.stub()}));
183-
184185
const bidder = newBidder(spec);
185186

186187
bidder.callBids({
@@ -206,6 +207,33 @@ describe('bidders created by newBidder', function () {
206207
})
207208
});
208209
});
210+
211+
it('should not be hidden from request methods', (done) => {
212+
const bidderRequest = {
213+
bidderCode: 'mockBidder',
214+
auctionId: 'aid',
215+
getAID() { return this.auctionId },
216+
bids: [
217+
{
218+
adUnitCode: 'mockAU',
219+
bidId: 'bid',
220+
transactionId: 'tid',
221+
auctionId: 'aid',
222+
getTIDs() {
223+
return [this.auctionId, this.transactionId]
224+
}
225+
}
226+
]
227+
};
228+
activityRules.isActivityAllowed.callsFake(() => false);
229+
spec.isBidRequestValid.returns(true);
230+
spec.buildRequests.callsFake((reqs, bidderReq) => {
231+
expect(bidderReq.getAID()).to.eql('aid');
232+
expect(reqs[0].getTIDs()).to.eql(['aid', 'tid']);
233+
done();
234+
});
235+
newBidder(spec).callBids(bidderRequest, addBidResponseStub, doneStub, ajaxStub, onTimelyResponseStub, wrappedCallback);
236+
})
209237
});
210238

211239
it('should handle bad bid requests gracefully', function () {

0 commit comments

Comments
 (0)