Skip to content

Commit 6342942

Browse files
authored
snigel Bid Adapter : pass more information to backend (#10987)
* snigelBidAdapter: pass more information to backend * snigelBidAdapter: add unit tests for the new functionality
1 parent 8931850 commit 6342942

File tree

2 files changed

+107
-4
lines changed

2 files changed

+107
-4
lines changed

modules/snigelBidAdapter.js

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
import {config} from '../src/config.js';
22
import {registerBidder} from '../src/adapters/bidderFactory.js';
33
import {BANNER} from '../src/mediaTypes.js';
4-
import {deepAccess, isArray, isFn, isPlainObject, inIframe, getDNT} from '../src/utils.js';
4+
import {deepAccess, isArray, isFn, isPlainObject, inIframe, getDNT, generateUUID} from '../src/utils.js';
55
import {hasPurpose1Consent} from '../src/utils/gpdr.js';
66
import {getGlobal} from '../src/prebidGlobal.js';
7+
import {getStorageManager} from '../src/storageManager.js';
78

89
const BIDDER_CODE = 'snigel';
910
const GVLID = 1076;
1011
const DEFAULT_URL = 'https://adserv.snigelweb.com/bp/v1/prebid';
1112
const DEFAULT_TTL = 60;
1213
const DEFAULT_CURRENCIES = ['USD'];
1314
const FLOOR_MATCH_ALL_SIZES = '*';
15+
const SESSION_ID_KEY = '_sn_session_pba';
1416

1517
const getConfig = config.getConfig;
18+
const storageManager = getStorageManager({bidderCode: BIDDER_CODE});
1619
const refreshes = {};
20+
const pageViewId = generateUUID();
21+
const pageViewStart = new Date().getTime();
22+
let auctionCounter = 0;
1723

1824
export const spec = {
1925
code: BIDDER_CODE,
@@ -33,6 +39,11 @@ export const spec = {
3339
id: bidderRequest.auctionId,
3440
accountId: deepAccess(bidRequests, '0.params.accountId'),
3541
site: deepAccess(bidRequests, '0.params.site'),
42+
sessionId: getSessionId(),
43+
counter: auctionCounter++,
44+
pageViewId: pageViewId,
45+
pageViewStart: pageViewStart,
46+
gdprConsent: gdprApplies === true ? hasFullGdprConsent(deepAccess(bidderRequest, 'gdprConsent')) : false,
3647
cur: getCurrencies(),
3748
test: getTestFlag(),
3849
version: getGlobal().version,
@@ -104,9 +115,7 @@ export const spec = {
104115
registerBidder(spec);
105116

106117
function getPage(bidderRequest) {
107-
return (
108-
getConfig(`${BIDDER_CODE}.page`) || deepAccess(bidderRequest, 'refererInfo.page') || window.location.href
109-
);
118+
return getConfig(`${BIDDER_CODE}.page`) || deepAccess(bidderRequest, 'refererInfo.page') || window.location.href;
110119
}
111120

112121
function getEndpoint() {
@@ -193,6 +202,19 @@ function hasSyncConsent(gdprConsent, uspConsent, gppConsent) {
193202
return hasPurpose1Consent(gdprConsent) && hasUspConsent(uspConsent) && hasGppConsent(gppConsent);
194203
}
195204

205+
function hasFullGdprConsent(gdprConsent) {
206+
try {
207+
const purposeConsents = Object.values(gdprConsent.vendorData.purpose.consents);
208+
return (
209+
purposeConsents.length > 0 &&
210+
purposeConsents.every((value) => value === true) &&
211+
gdprConsent.vendorData.vendor.consents[GVLID] === true
212+
);
213+
} catch (e) {
214+
return false;
215+
}
216+
}
217+
196218
function getSyncUrl(responses) {
197219
return getConfig(`${BIDDER_CODE}.syncUrl`) || deepAccess(responses[0], 'body.syncUrl');
198220
}
@@ -202,3 +224,20 @@ function getSyncEndpoint(url, gdprConsent) {
202224
gdprConsent?.consentString || ''
203225
)}`;
204226
}
227+
228+
function getSessionId() {
229+
try {
230+
if (storageManager.localStorageIsEnabled()) {
231+
let sessionId = storageManager.getDataFromLocalStorage(SESSION_ID_KEY);
232+
if (sessionId == null) {
233+
sessionId = generateUUID();
234+
storageManager.setDataInLocalStorage(SESSION_ID_KEY, sessionId);
235+
}
236+
return sessionId;
237+
} else {
238+
return undefined;
239+
}
240+
} catch (e) {
241+
return undefined;
242+
}
243+
}

test/spec/modules/snigelBidAdapter_spec.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import {expect} from 'chai';
22
import {spec} from 'modules/snigelBidAdapter.js';
33
import {config} from 'src/config.js';
44
import {isValid} from 'src/adapters/bidderFactory.js';
5+
import {registerActivityControl} from 'src/activities/rules.js';
6+
import {ACTIVITY_ACCESS_DEVICE} from 'src/activities/activities.js';
57

68
const BASE_BID_REQUEST = {
79
adUnitCode: 'top_leaderboard',
@@ -344,5 +346,67 @@ describe('snigelBidAdapter', function () {
344346
expect(sync).to.have.property('url');
345347
expect(sync.url).to.equal(`https://somesyncurl?gdpr=1&gdpr_consent=${DUMMY_GDPR_CONSENT_STRING}`);
346348
});
349+
350+
it('should omit session ID if no device access', function() {
351+
const bidderRequest = makeBidderRequest();
352+
const unregisterRule = registerActivityControl(ACTIVITY_ACCESS_DEVICE, 'denyAccess', () => {
353+
return {allow: false, reason: 'no consent'};
354+
});
355+
356+
try {
357+
const request = spec.buildRequests([], bidderRequest);
358+
expect(request).to.have.property('data');
359+
const data = JSON.parse(request.data);
360+
expect(data.sessionId).to.be.undefined;
361+
} finally {
362+
unregisterRule();
363+
}
364+
});
365+
366+
it('should determine full GDPR consent correctly', function () {
367+
const baseBidderRequest = makeBidderRequest({
368+
gdprConsent: {
369+
gdprApplies: true,
370+
vendorData: {
371+
purpose: {
372+
consents: {1: true, 2: true, 3: true, 4: true, 5: true},
373+
},
374+
vendor: {
375+
consents: {[spec.gvlid]: true},
376+
}
377+
},
378+
}
379+
});
380+
let request = spec.buildRequests([], baseBidderRequest);
381+
expect(request).to.have.property('data');
382+
let data = JSON.parse(request.data);
383+
expect(data.gdprConsent).to.be.true;
384+
385+
let bidderRequest = {...baseBidderRequest, ...{gdprConsent: {vendorData: {purpose: {consents: {1: false}}}}}};
386+
request = spec.buildRequests([], bidderRequest);
387+
expect(request).to.have.property('data');
388+
data = JSON.parse(request.data);
389+
expect(data.gdprConsent).to.be.false;
390+
391+
bidderRequest = {...baseBidderRequest, ...{gdprConsent: {vendorData: {vendor: {consents: {[spec.gvlid]: false}}}}}};
392+
request = spec.buildRequests([], bidderRequest);
393+
expect(request).to.have.property('data');
394+
data = JSON.parse(request.data);
395+
expect(data.gdprConsent).to.be.false;
396+
});
397+
398+
it('should increment auction counter upon every request', function() {
399+
const bidderRequest = makeBidderRequest({});
400+
401+
let request = spec.buildRequests([], bidderRequest);
402+
expect(request).to.have.property('data');
403+
let data = JSON.parse(request.data);
404+
const previousCounter = data.counter;
405+
406+
request = spec.buildRequests([], bidderRequest);
407+
expect(request).to.have.property('data');
408+
data = JSON.parse(request.data);
409+
expect(data.counter).to.equal(previousCounter + 1);
410+
});
347411
});
348412
});

0 commit comments

Comments
 (0)