Skip to content

Commit 92a27ff

Browse files
pm-harshad-manestsepelin
authored andcommitted
PubMatic Analytics: pass device platform related information (prebid#5855)
* added support for pubcommon, digitrust, id5id * added support for IdentityLink * changed the source for id5 * added unit test cases * changed source param for identityLink * not passing GDPR data in analytics * adding support for OpenWrap regex support * added unit test cases * passing device platform in logger call; test cases added
1 parent 0bb5813 commit 92a27ff

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

modules/pubmaticAnalyticsAdapter.js

+18
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,23 @@ function getDomainFromUrl(url) {
167167
return a.hostname;
168168
}
169169

170+
function getDevicePlatform() {
171+
var deviceType = 3;
172+
try {
173+
var ua = navigator.userAgent;
174+
if (ua && utils.isStr(ua) && ua.trim() != '') {
175+
ua = ua.toLowerCase().trim();
176+
var isMobileRegExp = new RegExp('(mobi|tablet|ios).*');
177+
if (ua.match(isMobileRegExp)) {
178+
deviceType = 2;
179+
} else {
180+
deviceType = 1;
181+
}
182+
}
183+
} catch (ex) {}
184+
return deviceType;
185+
}
186+
170187
function getValueForKgpv(bid, adUnitId) {
171188
if (bid.params.regexPattern) {
172189
return bid.params.regexPattern;
@@ -233,6 +250,7 @@ function executeBidsLoggerCall(e, highestCpmBids) {
233250
outputObj['tst'] = Math.round((new window.Date()).getTime() / 1000);
234251
outputObj['pid'] = '' + profileId;
235252
outputObj['pdvid'] = '' + profileVersionId;
253+
outputObj['dvc'] = {'plt': getDevicePlatform()};
236254
outputObj['tgid'] = (function() {
237255
var testGroupId = parseInt(config.getConfig('testGroupId') || 0);
238256
if (testGroupId <= 15 && testGroupId >= 0) {

test/spec/modules/pubmaticAnalyticsAdapter_spec.js

+113
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ let events = require('src/events');
1111
let ajax = require('src/ajax');
1212
let utils = require('src/utils');
1313

14+
const DEFAULT_USER_AGENT = window.navigator.userAgent;
15+
const MOBILE_USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1';
16+
const setUADefault = () => { window.navigator.__defineGetter__('userAgent', function () { return DEFAULT_USER_AGENT }) };
17+
const setUAMobile = () => { window.navigator.__defineGetter__('userAgent', function () { return MOBILE_USER_AGENT }) };
18+
const setUANull = () => { window.navigator.__defineGetter__('userAgent', function () { return null }) };
19+
1420
const {
1521
EVENTS: {
1622
AUCTION_INIT,
@@ -247,6 +253,7 @@ describe('pubmatic analytics adapter', function () {
247253
let clock;
248254

249255
beforeEach(function () {
256+
setUADefault();
250257
sandbox = sinon.sandbox.create();
251258

252259
xhr = sandbox.useFakeXMLHttpRequest();
@@ -643,6 +650,7 @@ describe('pubmatic analytics adapter', function () {
643650
});
644651

645652
it('Logger: currency conversion check', function() {
653+
setUANull();
646654
setConfig({
647655
adServerCurrency: 'JPY',
648656
rates: {
@@ -695,6 +703,111 @@ describe('pubmatic analytics adapter', function () {
695703
expect(data.s[1].ps[0].af).to.equal('banner');
696704
expect(data.s[1].ps[0].ocpm).to.equal(100);
697705
expect(data.s[1].ps[0].ocry).to.equal('JPY');
706+
expect(data.dvc).to.deep.equal({'plt': 3});
707+
});
708+
709+
it('Logger: regexPattern in bid.params', function() {
710+
setUAMobile();
711+
const BID_REQUESTED_COPY = utils.deepClone(MOCK.BID_REQUESTED);
712+
BID_REQUESTED_COPY.bids[1].params.regexPattern = '*';
713+
events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
714+
events.emit(BID_REQUESTED, BID_REQUESTED_COPY);
715+
events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
716+
events.emit(BID_RESPONSE, BID2);
717+
events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
718+
events.emit(AUCTION_END, MOCK.AUCTION_END);
719+
events.emit(SET_TARGETING, MOCK.SET_TARGETING);
720+
events.emit(BID_WON, MOCK.BID_WON[0]);
721+
events.emit(BID_WON, MOCK.BID_WON[1]);
722+
723+
clock.tick(2000 + 1000);
724+
expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
725+
let request = requests[2]; // logger is executed late, trackers execute first
726+
expect(request.url).to.equal('https://t.pubmatic.com/wl?pubid=9999');
727+
let data = getLoggerJsonFromRequest(request.requestBody);
728+
expect(data.s[1].sn).to.equal('/19968336/header-bid-tag-1');
729+
expect(data.s[1].sz).to.deep.equal(['1000x300', '970x250', '728x90']);
730+
expect(data.s[1].ps).to.be.an('array');
731+
expect(data.s[1].ps.length).to.equal(1);
732+
expect(data.s[1].ps[0].pn).to.equal('pubmatic');
733+
expect(data.s[1].ps[0].bidid).to.equal('3bd4ebb1c900e2');
734+
expect(data.s[1].ps[0].db).to.equal(0);
735+
expect(data.s[1].ps[0].kgpv).to.equal('*');
736+
expect(data.s[1].ps[0].kgpsv).to.equal('this-is-a-kgpv');
737+
expect(data.s[1].ps[0].psz).to.equal('728x90');
738+
expect(data.s[1].ps[0].eg).to.equal(1.52);
739+
expect(data.s[1].ps[0].en).to.equal(1.52);
740+
expect(data.s[1].ps[0].di).to.equal('the-deal-id');
741+
expect(data.s[1].ps[0].dc).to.equal('PMP');
742+
expect(data.s[1].ps[0].mi).to.equal('matched-impression');
743+
expect(data.s[1].ps[0].l1).to.equal(3214);
744+
expect(data.s[1].ps[0].l2).to.equal(0);
745+
expect(data.s[1].ps[0].ss).to.equal(1);
746+
expect(data.s[1].ps[0].t).to.equal(0);
747+
expect(data.s[1].ps[0].wb).to.equal(0); // bidPriceUSD is not getting set as currency module is not added, so unable to set wb to 1
748+
expect(data.s[1].ps[0].af).to.equal('banner');
749+
expect(data.s[1].ps[0].ocpm).to.equal(1.52);
750+
expect(data.s[1].ps[0].ocry).to.equal('USD');
751+
expect(data.dvc).to.deep.equal({'plt': 2});
752+
// respective tracker slot
753+
let firstTracker = requests[1].url;
754+
expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
755+
data = {};
756+
firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
757+
expect(data.kgpv).to.equal('*');
758+
});
759+
760+
it('Logger: regexPattern in bid.bidResponse', function() {
761+
const BID2_COPY = utils.deepClone(BID2);
762+
BID2_COPY.regexPattern = '*';
763+
events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
764+
events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
765+
events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
766+
events.emit(BID_RESPONSE, MOCK.BID_RESPONSE[0]);
767+
events.emit(BID_RESPONSE, BID2_COPY);
768+
events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
769+
events.emit(AUCTION_END, MOCK.AUCTION_END);
770+
events.emit(SET_TARGETING, MOCK.SET_TARGETING);
771+
events.emit(BID_WON, MOCK.BID_WON[0]);
772+
events.emit(BID_WON, Object.assign({}, BID2_COPY, {
773+
'status': 'rendered'
774+
}));
775+
776+
clock.tick(2000 + 1000);
777+
expect(requests.length).to.equal(3); // 1 logger and 2 win-tracker
778+
let request = requests[2]; // logger is executed late, trackers execute first
779+
expect(request.url).to.equal('https://t.pubmatic.com/wl?pubid=9999');
780+
let data = getLoggerJsonFromRequest(request.requestBody);
781+
expect(data.s[1].sn).to.equal('/19968336/header-bid-tag-1');
782+
expect(data.s[1].sz).to.deep.equal(['1000x300', '970x250', '728x90']);
783+
expect(data.s[1].ps).to.be.an('array');
784+
expect(data.s[1].ps.length).to.equal(1);
785+
expect(data.s[1].ps[0].pn).to.equal('pubmatic');
786+
expect(data.s[1].ps[0].bidid).to.equal('3bd4ebb1c900e2');
787+
expect(data.s[1].ps[0].db).to.equal(0);
788+
expect(data.s[1].ps[0].kgpv).to.equal('*');
789+
expect(data.s[1].ps[0].kgpsv).to.equal('this-is-a-kgpv');
790+
expect(data.s[1].ps[0].psz).to.equal('728x90');
791+
expect(data.s[1].ps[0].eg).to.equal(1.52);
792+
expect(data.s[1].ps[0].en).to.equal(1.52);
793+
expect(data.s[1].ps[0].di).to.equal('the-deal-id');
794+
expect(data.s[1].ps[0].dc).to.equal('PMP');
795+
expect(data.s[1].ps[0].mi).to.equal('matched-impression');
796+
expect(data.s[1].ps[0].l1).to.equal(3214);
797+
expect(data.s[1].ps[0].l2).to.equal(0);
798+
expect(data.s[1].ps[0].ss).to.equal(1);
799+
expect(data.s[1].ps[0].t).to.equal(0);
800+
expect(data.s[1].ps[0].wb).to.equal(0); // bidPriceUSD is not getting set as currency module is not added, so unable to set wb to 1
801+
expect(data.s[1].ps[0].af).to.equal('banner');
802+
expect(data.s[1].ps[0].ocpm).to.equal(1.52);
803+
expect(data.s[1].ps[0].ocry).to.equal('USD');
804+
expect(data.dvc).to.deep.equal({'plt': 1});
805+
// respective tracker slot
806+
let firstTracker = requests[1].url;
807+
expect(firstTracker.split('?')[0]).to.equal('https://t.pubmatic.com/wt');
808+
data = {};
809+
firstTracker.split('?')[1].split('&').map(e => e.split('=')).forEach(e => data[e[0]] = e[1]);
810+
expect(data.kgpv).to.equal('*');
698811
});
699812

700813
it('Logger: regexPattern in bid.params', function() {

0 commit comments

Comments
 (0)