UNPKG

mk9-prebid

Version:

Header Bidding Management Library

216 lines (165 loc) 7.26 kB
import { expect } from 'chai'; import events from 'src/events.js'; import CONSTANTS from 'src/constants.json'; import { server } from 'test/mocks/xhr.js'; const REQUEST_BIDS = CONSTANTS.EVENTS.REQUEST_BIDS; const BID_REQUESTED = CONSTANTS.EVENTS.BID_REQUESTED; const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE; const BID_WON = CONSTANTS.EVENTS.BID_WON; const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT; const AD_RENDER_FAILED = CONSTANTS.EVENTS.AD_RENDER_FAILED; const AD_RENDER_SUCCEEDED = CONSTANTS.EVENTS.AD_RENDER_SUCCEEDED; const AUCTION_DEBUG = CONSTANTS.EVENTS.AUCTION_DEBUG; const ADD_AD_UNITS = CONSTANTS.EVENTS.ADD_AD_UNITS; const AnalyticsAdapter = require('src/AnalyticsAdapter').default; const config = { url: 'https://localhost:9999/endpoint', analyticsType: 'endpoint' }; describe(` FEATURE: Analytics Adapters API SCENARIO: A publisher enables analytics AND an \`example\` instance of \`AnalyticsAdapter\`\n`, () => { let adapter; beforeEach(function () { adapter = new AnalyticsAdapter(config); }); afterEach(function () { adapter.disableAnalytics(); }); it(`SHOULD call the endpoint WHEN an event occurs that is to be tracked`, function () { const eventType = BID_REQUESTED; const args = { some: 'data' }; adapter.track({ eventType, args }); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {some: 'data'}, eventType: 'bidRequested'}); }); it(`SHOULD queue the event first and then track it WHEN an event occurs before tracking library is available`, function () { const eventType = BID_RESPONSE; const args = { wat: 'wot' }; events.emit(eventType, args); adapter.enableAnalytics(); // As now AUCTION_DEBUG is triggered for WARNINGS too, the BID_RESPONSE goes last in the array const index = server.requests.length - 1; let result = JSON.parse(server.requests[index].requestBody); expect(result).to.deep.equal({eventType: 'bidResponse', args: {wat: 'wot'}}); }); describe(`WHEN an event occurs after enable analytics\n`, function () { beforeEach(function () { sinon.stub(events, 'getEvents').returns([]); // these tests shouldn't be affected by previous tests }); afterEach(function () { events.getEvents.restore(); }); it('SHOULD call global when a bidWon event occurs', function () { const eventType = BID_WON; const args = { more: 'info' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {more: 'info'}, eventType: 'bidWon'}); }); it('SHOULD call global when a adRenderFailed event occurs', function () { const eventType = AD_RENDER_FAILED; const args = { call: 'adRenderFailed' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'adRenderFailed'}, eventType: 'adRenderFailed'}); }); it('SHOULD call global when a adRenderSucceeded event occurs', function () { const eventType = AD_RENDER_SUCCEEDED; const args = { call: 'adRenderSucceeded' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'adRenderSucceeded'}, eventType: 'adRenderSucceeded'}); }); it('SHOULD call global when an auction debug event occurs', function () { const eventType = AUCTION_DEBUG; const args = { call: 'auctionDebug' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'auctionDebug'}, eventType: 'auctionDebug'}); }); it('SHOULD call global when an addAdUnits event occurs', function () { const eventType = ADD_AD_UNITS; const args = { call: 'addAdUnits' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'addAdUnits'}, eventType: 'addAdUnits'}); }); it('SHOULD call global when a requestBids event occurs', function () { const eventType = REQUEST_BIDS; const args = { call: 'request' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'request'}, eventType: 'requestBids'}); }); it('SHOULD call global when a bidRequest event occurs', function () { const eventType = BID_REQUESTED; const args = { call: 'request' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'request'}, eventType: 'bidRequested'}); }); it('SHOULD call global when a bidResponse event occurs', function () { const eventType = BID_RESPONSE; const args = { call: 'response' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'response'}, eventType: 'bidResponse'}); }); it('SHOULD call global when a bidTimeout event occurs', function () { const eventType = BID_TIMEOUT; const args = { call: 'timeout' }; adapter.enableAnalytics(); events.emit(eventType, args); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {call: 'timeout'}, eventType: 'bidTimeout'}); }); it('SHOULD NOT call global again when adapter.enableAnalytics is called with previous timeout', function () { const eventType = BID_TIMEOUT; const args = { call: 'timeout' }; events.emit(eventType, args); adapter.enableAnalytics(); events.emit(eventType, args); expect(server.requests.length).to.equal(1); }); describe(`AND sampling is enabled\n`, function () { const eventType = BID_WON; const args = { more: 'info' }; beforeEach(function () { sinon.stub(Math, 'random').returns(0.5); }); afterEach(function () { Math.random.restore(); }); it(`THEN should enable analytics when random number is in sample range`, function () { adapter.enableAnalytics({ options: { sampling: 0.75 } }); events.emit(eventType, args); expect(server.requests.length).to.equal(1); let result = JSON.parse(server.requests[0].requestBody); expect(result).to.deep.equal({args: {more: 'info'}, eventType: 'bidWon'}); }); it(`THEN should disable analytics when random number is outside sample range`, function () { adapter.enableAnalytics({ options: { sampling: 0.25 } }); events.emit(eventType, args); expect(server.requests.length).to.equal(0); }); }); }); });