UNPKG

mk9-prebid

Version:

Header Bidding Management Library

585 lines (521 loc) 17.2 kB
import { expect } from 'chai'; import { spec } from 'modules/adriverBidAdapter.js'; import { newBidder } from 'src/adapters/bidderFactory.js'; import * as bidderFactory from 'src/adapters/bidderFactory.js'; import { auctionManager } from 'src/auctionManager.js'; const ENDPOINT = 'https://pb.adriver.ru/cgi-bin/bid.cgi'; describe('adriverAdapter', function () { const adapter = newBidder(spec); describe('inherited functions', function () { it('exists and is a function', function () { expect(adapter.callBids).to.exist.and.to.be.a('function'); }); }); describe('isBidRequestValid', function () { const bid = { bidder: 'adriver', params: { placementId: '55:test_placement', siteid: 'testSiteID' }, adUnitCode: 'adunit-code', sizes: [[300, 250], [300, 600], [300, 250]], bidId: '30b31c1838de1e', bidderRequestId: '22edbae2733bf6', auctionId: '1d1a030790a475', userIdAsEids: [ { source: 'id5-sync.com', uids: [ { id: '', atype: 1, ext: { linkType: 0, abTestingControlGroup: true } } ] }, { source: 'sharedid.org', uids: [ { id: '01F4W41TMN7NBXBA0PXJMPB7GF', atype: 1, ext: { third: '01F4W41TMN7NBXBA0PXJMPB7GF' } } ] } ] }; it('should return true when required params found', function () { expect(spec.isBidRequestValid(bid)).to.equal(true); }); }); describe('buildRequests', function () { let getAdUnitsStub; const floor = 3; const bidRequests = [ { bidder: 'adriver', params: { placementId: '55:test_placement', siteid: 'testSiteID', dealid: 'dealidTest' }, adUnitCode: 'adunit-code', sizes: [[300, 250], [300, 600], [300, 250]], bidId: '30b31c1838de1e', bidderRequestId: '22edbae2733bf6', auctionId: '1d1a030790a475', transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843', userIdAsEids: [ { source: 'id5-sync.com', uids: [ { id: '', atype: 1, ext: { linkType: 0, abTestingControlGroup: true } } ] }, { source: 'sharedid.org', uids: [ { id: '01F4W41TMN7NBXBA0PXJMPB7GF', atype: 1, ext: { third: '01F4W41TMN7NBXBA0PXJMPB7GF' } } ] } ] } ]; const bidderRequest = { 'bidderCode': 'adriver', 'auctionId': '2cdbf766-c37e-464c-a924-d8cf2a2f7ed2', 'bidderRequestId': '10415226a1f2ac', 'bids': [ { 'bidder': 'adriver', 'params': { 'siteid': '216200', 'bidfloor': 1.33, 'placementId': 'test1' }, 'auctionId': '2cdbf766-c37e-464c-a924-d8cf2a2f7ed2', 'floorData': { 'skipped': false, 'skipRate': 5, 'modelVersion': 'BlackBerryZap', 'location': 'setConfig' }, 'userId': { 'id5id': { 'uid': 'ID5-ZHMO7vyrzH4ggO1TVF8lZ31h77BjNP6pLgMwIrhvtw!ID5*wP-eG3RLeJjkl1O5yeOMcf3Ksrsq1OeqM5nQZLgPvOMAACaMv9QnPWzdhdbFYu3r', 'ext': { 'linkType': 2, 'abTestingControlGroup': false } }, 'sharedid': { 'id': '01F4W41TMN7NBXBA0PXJMPB7GF', 'third': '01F4W41TMN7NBXBA0PXJMPB7GF' } }, 'userIdAsEids': [ { 'source': 'id5-sync.com', 'uids': [ { 'id': 'ID5-ZHMO7vyrzH4ggO1TVF8lZ31h77BjNP6pLgMwIrhvtw!ID5*wP-eG3RLeJjkl1O5yeOMcf3Ksrsq1OeqM5nQZLgPvOMAACaMv9QnPWzdhdbFYu3r', 'atype': 1, 'ext': { 'linkType': 2, 'abTestingControlGroup': false } } ] }, { 'source': 'sharedid.org', 'uids': [ { 'id': '01F4W41TMN7NBXBA0PXJMPB7GF', 'atype': 1, 'ext': { 'third': '01F4W41TMN7NBXBA0PXJMPB7GF' } } ] } ], 'mediaTypes': { 'banner': { 'sizes': [ [ 300, 250 ], [ 600, 500 ] ] } }, 'adUnitCode': 'div-gpt-ad-51545-0', 'transactionId': '01dfccdf-70d0-461f-b284-9132877ebe02', 'sizes': [ [ 300, 250 ], [ 600, 500 ] ], 'bidId': '2794d8415635b3', 'bidderRequestId': '10415226a1f2ac', 'src': 'client', 'bidRequestsCount': 1, 'bidderRequestsCount': 1, 'bidderWinsCount': 0 } ], 'auctionStart': 1622465003758, 'timeout': 1000, 'refererInfo': { 'referer': 'http://localhost:9999/integrationExamples/gpt/adUnitFloors.html', 'reachedTop': true, 'isAmp': false, 'numIframes': 0, 'stack': [ 'http://localhost:9999/integrationExamples/gpt/adUnitFloors.html' ], 'canonicalUrl': null }, 'start': 1622465003762 }; let floorTestData = { 'currency': 'USD', 'floor': floor }; bidRequests[0].getFloor = _ => { return floorTestData; }; beforeEach(function() { getAdUnitsStub = sinon.stub(auctionManager, 'getAdUnits').callsFake(function() { return []; }); }); afterEach(function() { getAdUnitsStub.restore(); }); it('should exist currency', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.cur).to.exist; }); it('should exist timeout', function () { const request = spec.buildRequests(bidRequests, bidderRequest); const payload = JSON.parse(request.data); expect(payload.tmax).to.exist; expect(payload.tmax).to.equal(1000); }); it('should exist at', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.at).to.exist; expect(payload.at).to.deep.equal(1); }); it('should parse imp', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.imp[0]).to.exist; expect(payload.imp[0].id).to.deep.equal('55:test_placement'); expect(payload.imp[0].ext).to.exist; expect(payload.imp[0].ext.query).to.deep.equal('bn=15&custom=111=' + '30b31c1838de1e'); expect(payload.imp[0].banner).to.exist; expect(payload.imp[0].banner.w).to.deep.equal(300); expect(payload.imp[0].banner.h).to.deep.equal(250); }); it('should parse pmp', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.imp[0].pmp).to.exist; expect(payload.imp[0].pmp.deals).to.exist; expect(payload.imp[0].pmp.deals[0].bidfloor).to.exist; expect(payload.imp[0].pmp.deals[0].bidfloor).to.deep.equal(3); expect(payload.imp[0].pmp.deals[0].bidfloorcur).to.exist; expect(payload.imp[0].pmp.deals[0].bidfloorcur).to.deep.equal('RUB'); }); it('sends bid request to ENDPOINT via POST', function () { const request = spec.buildRequests(bidRequests); expect(request.url).to.equal(ENDPOINT); expect(request.method).to.equal('POST'); }); }); describe('interpretResponse', function () { let bfStub; before(function() { bfStub = sinon.stub(bidderFactory, 'getIabSubCategory'); }); after(function() { bfStub.restore(); }); let response = { 'id': '221594457-1615288400-1-46-', 'bidid': 'D8JW8XU8-L5m7qFMNQGs7i1gcuPvYMEDOKsktw6e9uLy5Eebo9HftVXb0VpKj4R2dXa93i6QmRhjextJVM4y1SqodMAh5vFOb_eVkHA', 'seatbid': [{ 'bid': [{ 'id': '1', 'impid': '/19968336/header-bid-tag-0', 'price': 4.29, 'h': 250, 'w': 300, 'adid': '7121351', 'adomain': ['http://ikea.com'], 'nurl': 'https://ad.adriver.ru/cgi-bin/erle.cgi?expid=D8JW8XU8-L5m7qFMNQGs7i1gcuPvYMEDOKsktw6e9uLy5Eebo9HftVXb0VpKj4R2dXa93i6QmRhjextJVM4y1SqodMAh5vFOb_eVkHA&bid=7121351&wprc=4.29&tuid=-1&custom=207=/19968336/header-bid-tag-0', 'cid': '717570', 'ext': '2c262a7058758d' }] }, { 'bid': [{ 'id': '1', 'impid': '/19968336/header-bid-tag-0', 'price': 17.67, 'h': 600, 'w': 300, 'adid': '7121369', 'adomain': ['http://ikea.com'], 'nurl': 'https://ad.adriver.ru/cgi-bin/erle.cgi?expid=DdtToXX5cpTaMMxrJSEsOsUIXt3WmC3jOvuNI5DguDrY8edFG60Jg1M-iMkVNKQ4OiAdHSLPJLQQXMUXZfI9VbjMoGCb-zzOTPiMpshI&bid=7121369&wprc=17.67&tuid=-1&custom=207=/19968336/header-bid-tag-0', 'cid': '717570', 'ext': '2c262a7058758d' }] }], 'cur': 'RUB' }; it('should get correct bid response', function () { let expectedResponse = [ { requestId: '2c262a7058758d', cpm: 4.29, width: 300, height: 250, creativeId: '/19968336/header-bid-tag-0', currency: 'RUB', netRevenue: true, ttl: 3000, meta: { advertiserDomains: ['http://ikea.com'] }, ad: '<IFRAME SRC="https://ad.adriver.ru/cgi-bin/erle.cgi?expid=D8JW8XU8-L5m7qFMNQGs7i1gcuPvYMEDOKsktw6e9uLy5Eebo9HftVXb0VpKj4R2dXa93i6QmRhjextJVM4y1SqodMAh5vFOb_eVkHA&bid=7121351&wprc=4.29&tuid=-1&custom=207=/19968336/header-bid-tag-0" FRAMEBORDER="0" SCROLLING="no" MARGINHEIGHT="0" MARGINWIDTH="0" TOPMARGIN="0" LEFTMARGIN="0" ALLOWTRANSPARENCY="true" STYLE ="WIDTH:300px; HEIGHT:250px"></IFRAME>' } ]; let bidderRequest = { bids: [{ bidId: '3db3773286ee59', adUnitCode: 'code' }] }; let result = spec.interpretResponse({ body: response }, {bidderRequest}); expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0])); }); it('handles nobid responses', function () { let response = { 'version': '0.0.1', 'tags': [{ 'uuid': '84ab500420319d', 'tag_id': 5976557, 'auction_id': '297492697822162468', 'nobid': true }] }; let bidderRequest; let result = spec.interpretResponse({ body: response }, {bidderRequest}); expect(result.length).to.equal(0); }); }); describe('function _getFloor', function () { let bidRequests = [ { bidder: 'adriver', params: { placementId: '55:test_placement', siteid: 'testSiteID', dealid: 'dealidTest', }, adUnitCode: 'adunit-code', sizes: [[300, 250], [300, 600], [300, 250]], bidId: '30b31c1838de1e', bidderRequestId: '22edbae2733bf6', auctionId: '1d1a030790a475', transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843', userIdAsEids: [ { source: 'id5-sync.com', uids: [ { id: '', atype: 1, ext: { linkType: 0, abTestingControlGroup: true } } ] }, { source: 'sharedid.org', uids: [ { id: '01F4W41TMN7NBXBA0PXJMPB7GF', atype: 1, ext: { third: '01F4W41TMN7NBXBA0PXJMPB7GF' } } ] } ] } ]; const floorTestData = { 'currency': 'RUB', 'floor': 1.50 }; const bitRequestStandard = JSON.parse(JSON.stringify(bidRequests)); bitRequestStandard[0].getFloor = () => { return floorTestData; }; it('valid BidRequests', function () { const request = spec.buildRequests(bitRequestStandard); const payload = JSON.parse(request.data); expect(typeof bitRequestStandard[0].getFloor).to.equal('function'); expect(payload.imp[0].bidfloor).to.equal(1.50); expect(payload.imp[0].bidfloorcur).to.equal('RUB'); }); const bitRequestEmptyCurrency = JSON.parse(JSON.stringify(bidRequests)); const floorTestDataEmptyCurrency = { 'currency': 'RUB', 'floor': 1.50 }; bitRequestEmptyCurrency[0].getFloor = () => { return floorTestDataEmptyCurrency; }; it('empty currency', function () { const request = spec.buildRequests(bitRequestEmptyCurrency); const payload = JSON.parse(request.data); expect(payload.imp[0].bidfloor).to.equal(1.50); expect(payload.imp[0].bidfloorcur).to.equal('RUB'); }); const bitRequestFloorNull = JSON.parse(JSON.stringify(bidRequests)); const floorTestDataFloorNull = { 'currency': '', 'floor': null }; bitRequestFloorNull[0].getFloor = () => { return floorTestDataFloorNull; }; it('empty floor', function () { const request = spec.buildRequests(bitRequestFloorNull); const payload = JSON.parse(request.data); expect(payload.imp[0].bidfloor).to.equal(0); }); const bitRequestGetFloorNotFunction = JSON.parse(JSON.stringify(bidRequests)); bitRequestGetFloorNotFunction[0].getFloor = 0; it('bid.getFloor is not a function', function () { const request = spec.buildRequests(bitRequestGetFloorNotFunction); const payload = JSON.parse(request.data); expect(payload.imp[0].bidfloor).to.equal(0); expect(payload.imp[0].bidfloorcur).to.equal('RUB'); }); const bitRequestGetFloorBySized = JSON.parse(JSON.stringify(bidRequests)); bitRequestGetFloorBySized[0].getFloor = (requestParams = {currency: 'USD', mediaType: '*', size: '*'}) => { if (requestParams.size.length === 2 && requestParams.size[0] === 300 && requestParams.size[1] === 250) { return { 'currency': 'RUB', 'floor': 3.33 } } else { return {} } }; it('bid.getFloor get size', function () { const request = spec.buildRequests(bitRequestGetFloorBySized); const payload = JSON.parse(request.data); expect(payload.imp[0].bidfloor).to.equal(3.33); expect(payload.imp[0].bidfloorcur).to.equal('RUB'); expect(payload.imp[0].bidfloorcur).to.equal('RUB'); }); }); describe('user ids', function () { let bidRequests = [ { bidder: 'adriver', params: { placementId: '55:test_placement', siteid: 'testSiteID', dealid: 'dealidTest', }, adUnitCode: 'adunit-code', sizes: [[300, 250], [300, 600], [300, 250]], bidId: '30b31c1838de1e', bidderRequestId: '22edbae2733bf6', auctionId: '1d1a030790a475', transactionId: '04f2659e-c005-4eb1-a57c-fa93145e3843', userIdAsEids: [ { source: 'id5-sync.com', uids: [ { id: '', atype: 1, ext: { linkType: 0, abTestingControlGroup: true } } ] }, { source: 'sharedid.org', uids: [ { id: '01F4W41TMN7NBXBA0PXJMPB7GF', atype: 1, ext: { third: '01F4W41TMN7NBXBA0PXJMPB7GF' } } ] } ] } ]; it('user id id5-sync.com', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.user.ext.eids[0].source).to.equal('id5-sync.com'); expect(payload.user.ext.eids[0].uids[0].id).to.equal(''); }); it('user id sharedid.org', function () { const request = spec.buildRequests(bidRequests); const payload = JSON.parse(request.data); expect(payload.user.ext.eids[1].source).to.equal('sharedid.org'); expect(payload.user.ext.eids[1].uids[0].id).to.equal('01F4W41TMN7NBXBA0PXJMPB7GF'); }); }); });