mk9-prebid
Version:
Header Bidding Management Library
308 lines (285 loc) • 9.36 kB
JavaScript
import {expect} from 'chai';
import sortableAnalyticsAdapter, {TIMEOUT_FOR_REGISTRY, DEFAULT_PBID_TIMEOUT} from 'modules/sortableAnalyticsAdapter.js';
import events from 'src/events.js';
import CONSTANTS from 'src/constants.json';
import * as prebidGlobal from 'src/prebidGlobal.js';
import {server} from 'test/mocks/xhr.js';
describe('Sortable Analytics Adapter', function() {
let sandbox;
let clock;
const initialConfig = {
provider: 'sortable',
options: {
siteId: 'testkey'
}
};
const TEST_DATA = {
AUCTION_INIT: {
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
timeout: 3000
},
BID_REQUESTED: {
refererInfo: {
referer: 'test.com',
reachedTop: true,
numIframes: 1
},
bidderCode: 'sortable',
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
bids: [{
bidder: 'sortable',
params: {
tagId: 'medrec_1'
},
adUnitCode: '300x250',
transactionId: 'aa02b498-8a99-418e-bc59-6b6fd45f32de',
sizes: [
[300, 250]
],
bidId: '26721042674416',
bidderRequestId: '10141593b1d84a',
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
bidRequestsCount: 1
}, {
bidder: 'sortable',
params: {
tagId: 'lead_1'
},
adUnitCode: '728x90',
transactionId: 'b7e9e957-af4f-4c47-8ca7-41f01cb4f105',
sizes: [
[728, 90]
],
bidId: '50fa575b41e596',
bidderRequestId: '37a8760be6db23',
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
bidRequestsCount: 1
}],
start: 1553529405788
},
BID_ADJUSTMENT_1: {
bidderCode: 'sortable',
adId: '88221d316425f7',
mediaType: 'banner',
cpm: 0.70,
dealId: null,
currency: 'USD',
netRevenue: true,
ttl: 60,
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
responseTimestamp: 1553534161763,
bidder: 'sortable',
adUnitCode: '300x250',
timeToRespond: 331,
width: '300',
height: '250'
},
AUCTION_END: {
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e'
},
BID_ADJUSTMENT_2: {
bidderCode: 'sortable',
adId: '88221d316425f8',
mediaType: 'banner',
cpm: 0.50,
dealId: null,
currency: 'USD',
netRevenue: true,
ttl: 60,
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
responseTimestamp: 1553534161770,
bidder: 'sortable',
adUnitCode: '728x90',
timeToRespond: 338,
width: '728',
height: '90'
},
BID_WON_1: {
bidderCode: 'sortable',
adId: '88221d316425f7',
mediaType: 'banner',
cpm: 0.70,
dealId: null,
currency: 'USD',
netRevenue: true,
ttl: 60,
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
responseTimestamp: 1553534161763,
bidder: 'sortable',
adUnitCode: '300x250',
timeToRespond: 331
},
BID_WON_2: {
bidderCode: 'sortable',
adId: '88221d316425f8',
mediaType: 'banner',
cpm: 0.50,
dealId: null,
currency: 'USD',
netRevenue: true,
ttl: 60,
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
responseTimestamp: 1553534161770,
bidder: 'sortable',
adUnitCode: '728x90',
timeToRespond: 338
},
BID_TIMEOUT: [{
auctionId: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
adUnitCode: '300x250',
bidder: 'sortable'
}]
};
beforeEach(function() {
sandbox = sinon.sandbox.create();
clock = sandbox.useFakeTimers();
sandbox.stub(events, 'getEvents').returns([]);
sandbox.stub(prebidGlobal, 'getGlobal').returns({
version: '1.0',
bidderSettings: {
'sortable': {
bidCpmAdjustment: function (number) {
return number * 0.95;
}
}
}
});
sortableAnalyticsAdapter.enableAnalytics(initialConfig);
});
afterEach(function() {
sandbox.restore();
clock.restore();
sortableAnalyticsAdapter.disableAnalytics();
});
describe('initialize adapter', function() {
const settings = sortableAnalyticsAdapter.getOptions();
it('should init settings correctly and apply defaults', function() {
expect(settings).to.include({
'disableSessionTracking': false,
'key': initialConfig.options.siteId,
'protocol': 'https',
'url': `https://pa.deployads.com/pae/${initialConfig.options.siteId}`,
'timeoutForPbid': DEFAULT_PBID_TIMEOUT
});
});
it('should assign a pageview ID', function() {
expect(settings).to.have.own.property('pageviewId');
});
});
describe('events tracking', function() {
beforeEach(function() {
server.requests = [];
});
it('should send the PBID event', function() {
events.emit(CONSTANTS.EVENTS.AUCTION_INIT, TEST_DATA.AUCTION_INIT);
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, TEST_DATA.BID_REQUESTED);
events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, TEST_DATA.BID_ADJUSTMENT_1);
events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, TEST_DATA.BID_ADJUSTMENT_2);
events.emit(CONSTANTS.EVENTS.AUCTION_END, TEST_DATA.AUCTION_END);
events.emit(CONSTANTS.EVENTS.BID_WON, TEST_DATA.BID_WON_1);
events.emit(CONSTANTS.EVENTS.BID_WON, TEST_DATA.BID_WON_2);
clock.tick(DEFAULT_PBID_TIMEOUT);
expect(server.requests.length).to.equal(1);
let result = JSON.parse(server.requests[0].requestBody);
expect(result).to.have.own.property('pbid');
expect(result.pbid).to.deep.include({
ai: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
ac: ['300x250', '728x90'],
adi: ['88221d316425f7', '88221d316425f8'],
bs: 'sortable',
bid: ['26721042674416', '50fa575b41e596'],
bif: 0.95,
brc: 1,
brid: ['10141593b1d84a', '37a8760be6db23'],
rs: ['300x250', '728x90'],
btcp: [0.70, 0.50],
btcc: 'USD',
btin: true,
btsrc: 'sortable',
c: [0.70, 0.50],
cc: 'USD',
did: null,
inr: true,
it: true,
iw: true,
ito: false,
mt: 'banner',
rtp: true,
nif: 1,
pbv: '1.0',
siz: ['300x250', '728x90'],
st: 1553529405788,
tgid: ['medrec_1', 'lead_1'],
to: 3000,
trid: ['aa02b498-8a99-418e-bc59-6b6fd45f32de', 'b7e9e957-af4f-4c47-8ca7-41f01cb4f105'],
ttl: 60,
ttr: [331, 338],
u: 'test.com',
_count: 2
});
});
it('should track a late bidWon event', function() {
events.emit(CONSTANTS.EVENTS.AUCTION_INIT, TEST_DATA.AUCTION_INIT);
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, TEST_DATA.BID_REQUESTED);
events.emit(CONSTANTS.EVENTS.BID_ADJUSTMENT, TEST_DATA.BID_ADJUSTMENT_1);
events.emit(CONSTANTS.EVENTS.AUCTION_END, TEST_DATA.AUCTION_END);
clock.tick(DEFAULT_PBID_TIMEOUT);
events.emit(CONSTANTS.EVENTS.BID_WON, TEST_DATA.BID_WON_1);
clock.tick(TIMEOUT_FOR_REGISTRY);
expect(server.requests.length).to.equal(2);
const pbid_req = JSON.parse(server.requests[0].requestBody);
expect(pbid_req).to.have.own.property('pbid');
const pbwon_req = JSON.parse(server.requests[1].requestBody);
expect(pbwon_req).to.have.own.property('pbrw');
expect(pbwon_req.pbrw).to.deep.equal({
ac: '300x250',
ai: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
bif: 0.95,
bs: 'sortable',
s: initialConfig.options.siteId,
cc: 'USD',
c: 0.70,
inr: true,
_count: 1,
_type: 'pbrw'
});
});
it('should track late bidder timeouts', function() {
events.emit(CONSTANTS.EVENTS.AUCTION_INIT, TEST_DATA.AUCTION_INIT);
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, TEST_DATA.BID_REQUESTED);
events.emit(CONSTANTS.EVENTS.AUCTION_END, TEST_DATA.AUCTION_END);
clock.tick(DEFAULT_PBID_TIMEOUT);
events.emit(CONSTANTS.EVENTS.BID_TIMEOUT, TEST_DATA.BID_TIMEOUT);
clock.tick(TIMEOUT_FOR_REGISTRY);
expect(server.requests.length).to.equal(2);
const pbid_req = JSON.parse(server.requests[0].requestBody);
expect(pbid_req).to.have.own.property('pbid');
const pbto_req = JSON.parse(server.requests[1].requestBody);
expect(pbto_req).to.have.own.property('pbto');
expect(pbto_req.pbto).to.deep.equal({
ai: 'fb8d579a-5c3f-4705-ab94-3cff39005d9e',
s: initialConfig.options.siteId,
ac: '300x250',
bs: 'sortable',
_type: 'pbto',
_count: 1
});
});
it('should track errors', function() {
events.emit(CONSTANTS.EVENTS.AUCTION_INIT, TEST_DATA.AUCTION_INIT);
events.emit(CONSTANTS.EVENTS.BID_REQUESTED, {});
clock.tick(TIMEOUT_FOR_REGISTRY);
expect(server.requests.length).to.equal(1);
const err_req = JSON.parse(server.requests[0].requestBody);
expect(err_req).to.have.own.property('pber');
expect(err_req.pber).to.include({
args: '{}',
s: initialConfig.options.siteId,
_count: 1,
ti: 'bidRequested',
_type: 'pber'
});
expect(err_req.pber.msg).to.be.a('string');
});
});
});