mk9-prebid
Version:
Header Bidding Management Library
210 lines (189 loc) • 8.65 kB
JavaScript
import atsAnalyticsAdapter from '../../../modules/atsAnalyticsAdapter.js';
import { expect } from 'chai';
import adapterManager from 'src/adapterManager.js';
import {server} from '../../mocks/xhr.js';
import {parseBrowser} from '../../../modules/atsAnalyticsAdapter.js';
import {getStorageManager} from '../../../src/storageManager.js';
import {analyticsUrl} from '../../../modules/atsAnalyticsAdapter.js';
let events = require('src/events');
let constants = require('src/constants.json');
export const storage = getStorageManager();
describe('ats analytics adapter', function () {
beforeEach(function () {
sinon.stub(events, 'getEvents').returns([]);
storage.setCookie('_lr_env_src_ats', 'true', 'Thu, 01 Jan 1970 00:00:01 GMT');
});
afterEach(function () {
events.getEvents.restore();
atsAnalyticsAdapter.getUserAgent.restore();
atsAnalyticsAdapter.disableAnalytics();
Math.random.restore();
});
describe('track', function () {
it('builds and sends request and response data', function () {
sinon.stub(Math, 'random').returns(0.99);
sinon.stub(atsAnalyticsAdapter, 'shouldFireRequest').returns(true);
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
let now = new Date();
now.setTime(now.getTime() + 3600000);
storage.setCookie('_lr_env_src_ats', 'true', now.toUTCString());
storage.setCookie('_lr_sampling_rate', '10', now.toUTCString());
let initOptions = {
pid: '10433394'
};
let auctionTimestamp = 1496510254326;
// prepare general auction - request
let bidRequest = {
'bidderCode': 'appnexus',
'auctionStart': 1580739265161,
'bids': [{
'bidder': 'appnexus',
'params': {
'placementId': '10433394'
},
'userId': {
'idl_env': 'AmThEbO1ssIWjrNdU4noT4ZFBILSVBBYHbipOYt_JP40e5nZdXns2g'
},
'adUnitCode': 'div-gpt-ad-1438287399331-0',
'transactionId': '2f481ff1-8d20-4c28-8e36-e384e9e3eec6',
'sizes': '300x250,300x600',
'bidId': '30c77d079cdf17'
}],
'refererInfo': {
'referer': 'https://example.com/dev'
},
'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
};
// prepare general auction - response
let bidResponse = {
'height': 250,
'statusMessage': 'Bid available',
'adId': '2eddfdc0c791dc',
'mediaType': 'banner',
'source': 'client',
'requestId': '30c77d079cdf17',
'cpm': 0.5,
'creativeId': 29681110,
'currency': 'USD',
'netRevenue': true,
'ttl': 300,
'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
'responseTimestamp': 1580739791978,
'requestTimestamp': 1580739265164,
'bidder': 'appnexus',
'adUnitCode': 'div-gpt-ad-1438287399331-0',
'timeToRespond': 2510,
'size': '300x250'
};
// what we expect after general auction
let expectedAfterBid = {
'Data': [{
'has_envelope': true,
'adapter_version': 1,
'bidder': 'appnexus',
'bid_id': '30c77d079cdf17',
'auction_id': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
'user_browser': parseBrowser(),
'user_platform': navigator.platform,
'auction_start': '2020-02-03T14:14:25.161Z',
'domain': window.location.hostname,
'envelope_source': true,
'pid': '10433394',
'response_time_stamp': '2020-02-03T14:23:11.978Z',
'currency': 'USD',
'cpm': 0.5,
'net_revenue': true
}]
};
// lets simulate that some bidders timeout
let bidTimeoutArgsV1 = [
{
bidId: '2baa51527bd015',
bidder: 'bidderOne',
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '66529d4c-8998-47c2-ab3e-5b953490b98f'
},
{
bidId: '6fe3b4c2c23092',
bidder: 'bidderTwo',
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '66529d4c-8998-47c2-ab3e-5b953490b98f'
}
];
adapterManager.registerAnalyticsAdapter({
code: 'atsAnalytics',
adapter: atsAnalyticsAdapter
});
adapterManager.enableAnalytics({
provider: 'atsAnalytics',
options: initOptions
});
// Step 1: Send auction init event
events.emit(constants.EVENTS.AUCTION_INIT, {
timestamp: auctionTimestamp
});
// Step 2: Send bid requested event
events.emit(constants.EVENTS.BID_REQUESTED, bidRequest);
// Step 3: Send bid response event
events.emit(constants.EVENTS.BID_RESPONSE, bidResponse);
// Step 4: Send bid time out event
events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeoutArgsV1);
// Step 5: Send auction end event
events.emit(constants.EVENTS.AUCTION_END, {});
let requests = server.requests.filter(req => {
return req.url.indexOf(analyticsUrl) > -1;
});
expect(requests.length).to.equal(1);
let realAfterBid = JSON.parse(requests[0].requestBody);
// Step 6: assert real data after bid and expected data
expect(realAfterBid['Data']).to.deep.equal(expectedAfterBid['Data']);
// check that the publisher ID is configured via options
expect(atsAnalyticsAdapter.context.pid).to.equal(initOptions.pid);
atsAnalyticsAdapter.shouldFireRequest.restore();
})
it('check browser is safari', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Safari');
})
it('check browser is chrome', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/80.0.3987.95 Mobile/15E148 Safari/604.1');
sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Chrome');
})
it('check browser is edge', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.74 Safari/537.36 Edg/79.0.309.43');
sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Microsoft Edge');
})
it('check browser is firefox', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (iPhone; CPU OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/23.0 Mobile/15E148 Safari/605.1.15');
sinon.stub(Math, 'random').returns(0.99);
let browser = parseBrowser();
expect(browser).to.equal('Firefox');
})
it('should not fire analytics request if sampling rate is 0', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
sinon.stub(Math, 'random').returns(0.99);
let result = atsAnalyticsAdapter.shouldFireRequest(0);
expect(result).to.equal(false);
})
it('should fire analytics request', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
sinon.stub(Math, 'random').returns(0.99);
// publisher can try to pass anything they want but we will set sampling rate to 100, which means we will have 1% of requests
let result = atsAnalyticsAdapter.shouldFireRequest(10);
expect(result).to.equal(true);
})
it('should not fire analytics request if math random is something other then 0.99', function () {
sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
sinon.stub(Math, 'random').returns(0.98);
// publisher can try to pass anything they want but we will set sampling rate to 100, which means we will have 1% of requests
let result = atsAnalyticsAdapter.shouldFireRequest(10);
expect(result).to.equal(false);
})
})
})