Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Snigel Bid Adapter: add placement counter and adapter version field #12358

Merged
merged 1 commit into from
Oct 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions modules/snigelBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const SESSION_ID_KEY = '_sn_session_pba';
const getConfig = config.getConfig;
const storageManager = getStorageManager({bidderCode: BIDDER_CODE});
const refreshes = {};
const placementCounters = {};
const pageViewId = generateUUID();
const pageViewStart = new Date().getTime();
let auctionCounter = 0;
Expand Down Expand Up @@ -46,6 +47,7 @@ export const spec = {
cur: getCurrencies(),
test: getTestFlag(),
version: 'v' + '$prebid.version$',
adapterVersion: '2.0',
gpp: deepAccess(bidderRequest, 'gppConsent.gppString') || deepAccess(bidderRequest, 'ortb2.regs.gpp'),
gpp_sid:
deepAccess(bidderRequest, 'gppConsent.applicableSections') || deepAccess(bidderRequest, 'ortb2.regs.gpp_sid'),
Expand All @@ -71,6 +73,7 @@ export const spec = {
gpid: deepAccess(r, 'ortb2Imp.ext.gpid'),
pbadslot: deepAccess(r, 'ortb2Imp.ext.data.pbadslot') || deepAccess(r, 'ortb2Imp.ext.gpid'),
name: r.params.placement,
counter: getPlacementCounter(r.params.placement),
sizes: r.sizes,
floor: getPriceFloor(r, BANNER, FLOOR_MATCH_ALL_SIZES),
refresh: getRefreshInformation(r.adUnitCode),
Expand Down Expand Up @@ -182,6 +185,17 @@ function getRefreshInformation(adUnitCode) {
};
}

function getPlacementCounter(placement) {
const counter = placementCounters[placement];
if (counter === undefined) {
placementCounters[placement] = 0;
return 0;
}

placementCounters[placement]++;
return placementCounters[placement];
}

function mapIdToRequestId(id, bidRequest) {
return bidRequest.bidderRequest.bids.filter((bid) => bid.adUnitCode === id)[0].bidId;
}
Expand Down
69 changes: 51 additions & 18 deletions test/spec/modules/snigelBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,50 @@ describe('snigelBidAdapter', function () {
expect(data.placements[2].refresh.count).to.equal(1);
expect(data.placements[2].refresh.time).to.be.greaterThanOrEqual(0);
});

it('should increment auction counter upon every request', function () {
const bidderRequest = makeBidderRequest({});

let request = spec.buildRequests([], bidderRequest);
expect(request).to.have.property('data');
let data = JSON.parse(request.data);
const previousCounter = data.counter;

request = spec.buildRequests([], bidderRequest);
expect(request).to.have.property('data');
data = JSON.parse(request.data);
expect(data.counter).to.equal(previousCounter + 1);
});

it('should increment placement counter for each placement', function () {
const bidderRequest = Object.assign({}, BASE_BIDDER_REQUEST);
const topLeaderboard = makeBidRequest({adUnitCode: 'top_leaderboard', params: {placement: 'ros'}});
const bottomLeaderboard = makeBidRequest({adUnitCode: 'bottom_leaderboard', params: {placement: 'ros'}});
const sidebar = makeBidRequest({adUnitCode: 'sidebar', params: {placement: 'other'}});

let request = spec.buildRequests([topLeaderboard, bottomLeaderboard, sidebar], bidderRequest);
expect(request).to.have.property('data');
let data = JSON.parse(request.data);
const previousCounters = {};
data.placements.forEach((placement) => {
previousCounters[placement.name] = Math.max(previousCounters[placement.name] || 0, placement.counter);
});

request = spec.buildRequests([topLeaderboard, bottomLeaderboard, sidebar], bidderRequest);
expect(request).to.have.property('data');
data = JSON.parse(request.data);
expect(data).to.have.property('placements');
expect(data.placements.length).to.equal(3);
expect(data.placements[0].id).to.equal('top_leaderboard');
expect(previousCounters).to.have.property(data.placements[0].name);
expect(data.placements[0].counter).to.equal(previousCounters[data.placements[0].name] + 1);
expect(data.placements[1].id).to.equal('bottom_leaderboard');
expect(previousCounters).to.have.property(data.placements[1].name);
expect(data.placements[1].counter).to.equal(previousCounters[data.placements[1].name] + 2);
expect(data.placements[2].id).to.equal('sidebar');
expect(previousCounters).to.have.property(data.placements[2].name);
expect(data.placements[2].counter).to.equal(previousCounters[data.placements[2].name] + 1);
});
});

describe('interpretResponse', function () {
Expand Down Expand Up @@ -347,7 +391,7 @@ describe('snigelBidAdapter', function () {
expect(sync.url).to.equal(`https://somesyncurl?gdpr=1&gdpr_consent=${DUMMY_GDPR_CONSENT_STRING}`);
});

it('should omit session ID if no device access', function() {
it('should omit session ID if no device access', function () {
const bidderRequest = makeBidderRequest();
const unregisterRule = registerActivityControl(ACTIVITY_ACCESS_DEVICE, 'denyAccess', () => {
return {allow: false, reason: 'no consent'};
Expand All @@ -373,9 +417,9 @@ describe('snigelBidAdapter', function () {
},
vendor: {
consents: {[spec.gvlid]: true},
}
},
},
}
},
});
let request = spec.buildRequests([], baseBidderRequest);
expect(request).to.have.property('data');
Expand All @@ -388,25 +432,14 @@ describe('snigelBidAdapter', function () {
data = JSON.parse(request.data);
expect(data.gdprConsent).to.be.false;

bidderRequest = {...baseBidderRequest, ...{gdprConsent: {vendorData: {vendor: {consents: {[spec.gvlid]: false}}}}}};
bidderRequest = {
...baseBidderRequest,
...{gdprConsent: {vendorData: {vendor: {consents: {[spec.gvlid]: false}}}}},
};
request = spec.buildRequests([], bidderRequest);
expect(request).to.have.property('data');
data = JSON.parse(request.data);
expect(data.gdprConsent).to.be.false;
});

it('should increment auction counter upon every request', function() {
const bidderRequest = makeBidderRequest({});

let request = spec.buildRequests([], bidderRequest);
expect(request).to.have.property('data');
let data = JSON.parse(request.data);
const previousCounter = data.counter;

request = spec.buildRequests([], bidderRequest);
expect(request).to.have.property('data');
data = JSON.parse(request.data);
expect(data.counter).to.equal(previousCounter + 1);
});
});
});