mk9-prebid
Version:
Header Bidding Management Library
281 lines (255 loc) • 8.22 kB
JavaScript
import yieldoneAnalytics from 'modules/yieldoneAnalyticsAdapter.js';
import { targeting } from 'src/targeting.js';
import { expect } from 'chai';
let events = require('src/events');
let adapterManager = require('src/adapterManager').default;
let constants = require('src/constants.json');
describe('Yieldone Prebid Analytic', function () {
let sendStatStub;
let getAllTargetingStub;
const fakeTargeting = {
'0000': {'someId': 'someValue'}
};
describe('enableAnalytics', function () {
beforeEach(function () {
sendStatStub = sinon.stub(yieldoneAnalytics, 'sendStat');
getAllTargetingStub = sinon.stub(targeting, 'getAllTargeting').returns(fakeTargeting);
sinon.stub(events, 'getEvents').returns([]);
});
afterEach(function () {
sendStatStub.restore();
getAllTargetingStub.restore();
events.getEvents.restore();
});
after(function () {
yieldoneAnalytics.disableAnalytics();
});
it('should catch all events', function (done) {
adapterManager.registerAnalyticsAdapter({
code: 'yieldone',
adapter: yieldoneAnalytics
});
const initOptions = {
pubId: '123456'
};
const auctionId = 'test-test-test';
const testReferrer = 'http://test';
const request = [
{
bidderCode: 'biddertest_1',
auctionId: auctionId,
refererInfo: {referer: testReferrer},
bids: [
{
adUnitCode: '0000',
auctionId: auctionId,
bidId: '1234',
bidder: 'biddertest_1',
mediaTypes: {banner: {sizes: [[300, 250], [336, 280]]}},
params: {param1: '111', param2: '222'},
sizes: [[300, 250], [336, 280]]
},
{
adUnitCode: '0000',
auctionId: auctionId,
bidId: '5678',
bidder: 'biddertest_1',
mediaTypes: {banner: {sizes: [[300, 250], [336, 280]]}},
params: {param1: '222', param2: '222'},
sizes: [[300, 250], [336, 280]]
}
]
},
{
bidderCode: 'biddertest_2',
auctionId: auctionId,
refererInfo: {referer: testReferrer},
bids: [
{
adUnitCode: '0000',
auctionId: auctionId,
bidId: '91011',
bidder: 'biddertest_2',
mediaTypes: {banner: {sizes: [[300, 250], [336, 280]]}},
params: {paramA: '111', paramB: '222'},
sizes: [[300, 250], [336, 280]]
}
]
},
{
bidderCode: 'biddertest_3',
auctionId: auctionId,
refererInfo: {referer: testReferrer},
bids: [
{
adUnitCode: '0000',
auctionId: auctionId,
bidId: '12131',
bidder: 'biddertest_3',
mediaTypes: {banner: {sizes: [[300, 250], [336, 280]]}},
params: {param_1: '111', param_2: '222'},
sizes: [[300, 250], [336, 280]]
},
{
adUnitCode: '0000',
auctionId: auctionId,
bidId: '14151',
bidder: 'biddertest_3',
mediaTypes: {banner: {sizes: [[300, 250], [336, 280]]}},
params: {param_1: '333', param_2: '222'},
sizes: [[300, 250], [336, 280]]
}
]
}
];
const responses = [
{
ad: 'test ad content 1',
width: 300,
height: 250,
statusMessage: 'Bid available',
bidId: '1234',
auctionId: auctionId,
cpm: 0.1,
bidder: 'biddertest_1',
adUnitCode: '0000',
timeToRespond: 100
},
{
ad: 'test ad content 2',
width: 336,
height: 280,
statusMessage: 'Bid available',
bidId: '5678',
auctionId: auctionId,
cpm: 0.2,
bidder: 'biddertest_1',
adUnitCode: '0000',
timeToRespond: 100
},
{
ad: 'test ad content 3',
width: 300,
height: 250,
statusMessage: 'Bid available',
bidId: '91011',
auctionId: auctionId,
cpm: 0.3,
bidder: 'biddertest_2',
adUnitCode: '0000',
timeToRespond: 100
},
{
bidId: '12131',
auctionId: auctionId,
bidder: 'biddertest_3'
},
{
bidId: '14151',
auctionId: auctionId,
bidder: 'biddertest_3'
}
];
const winner = {
ad: 'test ad content 3',
width: 300,
height: 250,
statusMessage: 'Bid available',
bidId: '91011',
auctionId: auctionId,
cpm: 0.3,
bidder: 'biddertest_2',
adUnitCode: '0000',
timeToRespond: 100
};
const auctionEnd = {
auctionId: auctionId,
bidsReceived: responses.slice(0, 3)
};
const preparedResponses = responses.map((resp) => {
const res = Object.assign({}, resp);
delete res.ad;
return res;
});
const expectedEvents = [
{
eventType: constants.EVENTS.AUCTION_INIT,
params: {
config: initOptions,
auctionId: auctionId
}
},
{
eventType: constants.EVENTS.BID_REQUESTED,
params: Object.assign(request[0])
},
{
eventType: constants.EVENTS.BID_REQUESTED,
params: Object.assign(request[1])
},
{
eventType: constants.EVENTS.BID_REQUESTED,
params: Object.assign(request[2])
},
{
eventType: constants.EVENTS.BID_RESPONSE,
params: Object.assign(preparedResponses[0])
},
{
eventType: constants.EVENTS.BID_RESPONSE,
params: Object.assign(preparedResponses[1])
},
{
eventType: constants.EVENTS.BID_RESPONSE,
params: Object.assign(preparedResponses[2])
},
{
eventType: constants.EVENTS.BID_TIMEOUT,
params: Object.assign(request[2])
}
];
const expectedResult = {
pubId: initOptions.pubId,
page: {url: testReferrer},
wrapper_version: '$prebid.version$',
events: expectedEvents
};
const preparedWinnerParams = Object.assign({adServerTargeting: fakeTargeting}, winner);
delete preparedWinnerParams.ad;
const wonExpectedEvents = [
{
eventType: constants.EVENTS.BID_WON,
params: preparedWinnerParams
}
];
const wonExpectedResult = {
pubId: initOptions.pubId,
page: {url: testReferrer},
wrapper_version: '$prebid.version$',
events: wonExpectedEvents
};
adapterManager.enableAnalytics({
provider: 'yieldone',
options: initOptions
});
events.emit(constants.EVENTS.AUCTION_INIT, {config: initOptions, auctionId: auctionId});
events.emit(constants.EVENTS.BID_REQUESTED, request[0]);
events.emit(constants.EVENTS.BID_REQUESTED, request[1]);
events.emit(constants.EVENTS.BID_REQUESTED, request[2]);
events.emit(constants.EVENTS.BID_RESPONSE, responses[0]);
events.emit(constants.EVENTS.BID_RESPONSE, responses[1]);
events.emit(constants.EVENTS.BID_RESPONSE, responses[2]);
events.emit(constants.EVENTS.BID_TIMEOUT, [responses[3], responses[4]]);
events.emit(constants.EVENTS.AUCTION_END, auctionEnd);
expect(yieldoneAnalytics.eventsStorage[auctionId]).to.deep.equal(expectedResult);
delete yieldoneAnalytics.eventsStorage[auctionId];
setTimeout(function() {
events.emit(constants.EVENTS.BID_WON, winner);
sinon.assert.callCount(sendStatStub, 2);
expect(yieldoneAnalytics.eventsStorage[auctionId]).to.deep.equal(wonExpectedResult);
delete yieldoneAnalytics.eventsStorage[auctionId];
done();
}, 1000);
});
});
});