UNPKG

mk9-prebid

Version:

Header Bidding Management Library

1,235 lines (1,175 loc) 41.8 kB
import { assert, expect } from 'chai'; import { BANNER } from 'src/mediaTypes.js'; import { config } from 'src/config.js'; import { spec } from 'modules/synacormediaBidAdapter.js'; describe('synacormediaBidAdapter ', function () { describe('isBidRequestValid', function () { let bid; beforeEach(function () { bid = { sizes: [300, 250], params: { seatId: 'prebid', tagId: '1234' } }; }); it('should return true when params placementId and seatId are truthy', function () { bid.params.placementId = bid.params.tagId; delete bid.params.tagId; assert(spec.isBidRequestValid(bid)); }); it('should return true when params tagId and seatId are truthy', function () { delete bid.params.placementId; assert(spec.isBidRequestValid(bid)); }); it('should return false when sizes are missing', function () { delete bid.sizes; assert.isFalse(spec.isBidRequestValid(bid)); }); it('should return false when the only size is unwanted', function () { bid.sizes = [[1, 1]]; assert.isFalse(spec.isBidRequestValid(bid)); }); it('should return false when seatId param is missing', function () { delete bid.params.seatId; assert.isFalse(spec.isBidRequestValid(bid)); }); it('should return false when both placementId param and tagId param are missing', function () { delete bid.params.placementId; delete bid.params.tagId; assert.isFalse(spec.isBidRequestValid(bid)); }); it('should return false when params is missing or null', function () { assert.isFalse(spec.isBidRequestValid({ params: null })); assert.isFalse(spec.isBidRequestValid({})); assert.isFalse(spec.isBidRequestValid(null)); }); }); describe('impression type', function () { let nonVideoReq = { bidId: '9876abcd', sizes: [[300, 250], [300, 600]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' } }; let bannerReq = { bidId: '9876abcd', sizes: [[300, 250], [300, 600]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' }, mediaTypes: { banner: { format: [ { w: 300, h: 600 } ], pos: 0 } }, }; let videoReq = { bidId: '9876abcd', sizes: [[640, 480]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' }, mediaTypes: { video: { context: 'instream', playerSize: [ [ 640, 480 ] ] } }, }; it('should return correct impression type video/banner', function () { assert.isFalse(spec.isVideoBid(nonVideoReq)); assert.isFalse(spec.isVideoBid(bannerReq)); assert.isTrue(spec.isVideoBid(videoReq)); }); }); describe('buildRequests', function () { let validBidRequestVideo = { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: '1234', video: { minduration: 30 } }, mediaTypes: { video: { context: 'instream', playerSize: [[640, 480]] } }, adUnitCode: 'video1', transactionId: '93e5def8-29aa-4fe8-bd3a-0298c39f189a', sizes: [[640, 480]], bidId: '2624fabbb078e8', bidderRequestId: '117954d20d7c9c', auctionId: 'defd525f-4f1e-4416-a4cb-ae53be90e706', src: 'client', bidRequestsCount: 1 }; let bidderRequestVideo = { bidderCode: 'synacormedia', auctionId: 'VideoAuctionId124', bidderRequestId: '117954d20d7c9c', auctionStart: 1553624929697, timeout: 700, refererInfo: { referer: 'https://localhost:9999/test/pages/video.html?pbjs_debug=true', reachedTop: true, numIframes: 0, stack: ['https://localhost:9999/test/pages/video.html?pbjs_debug=true'] }, start: 1553624929700 }; bidderRequestVideo.bids = validBidRequestVideo; let expectedDataVideo1 = { id: 'v2624fabbb078e8-640x480', tagid: '1234', video: { w: 640, h: 480, pos: 0, minduration: 30 } }; let validBidRequest = { bidId: '9876abcd', sizes: [[300, 250], [300, 600]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' } }; let bidderRequest = { auctionId: 'xyz123', refererInfo: { referer: 'https://test.com/foo/bar' } }; let bidderRequestWithCCPA = { auctionId: 'xyz123', refererInfo: { referer: 'https://test.com/foo/bar' }, uspConsent: '1YYY' }; let validBidRequestWithUserIds = { bidId: '9876abcd', sizes: [[300, 250], [300, 600]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' }, userIdAsEids: [ { source: 'pubcid.org', uids: [{ id: 'cid0032l2344jskdsl3', atype: 1 }] }, { source: 'liveramp.com', uids: [{ id: 'lrv39010k42dl', atype: 1, ext: { rtiPartner: 'TDID' } }] }, { source: 'neustar.biz', uids: [{ id: 'neustar809-044-23njhwer3', atype: 1 }] } ] }; let expectedEids = [ { source: 'pubcid.org', uids: [{ id: 'cid0032l2344jskdsl3', atype: 1 }] }, { source: 'liveramp.com', uids: [{ id: 'lrv39010k42dl', atype: 1, ext: { rtiPartner: 'TDID' } }] } ]; let expectedDataImp1 = { banner: { format: [ { h: 250, w: 300 }, { h: 600, w: 300 } ], pos: 0 }, id: 'b9876abcd', tagid: '1234', bidfloor: 0.5 }; it('should return valid request when valid bids are used', function () { // banner test let req = spec.buildRequests([validBidRequest], bidderRequest); expect(req).be.an('object'); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?'); expect(req.data).to.exist.and.to.be.an('object'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([expectedDataImp1]); // video test let reqVideo = spec.buildRequests([validBidRequestVideo], bidderRequestVideo); expect(reqVideo).be.an('object'); expect(reqVideo).to.have.property('method', 'POST'); expect(reqVideo).to.have.property('url'); expect(reqVideo.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?'); expect(reqVideo.data).to.exist.and.to.be.an('object'); expect(reqVideo.data.id).to.equal('VideoAuctionId124'); expect(reqVideo.data.imp).to.eql([expectedDataVideo1]); }); it('should return multiple bids when multiple valid requests with the same seatId are used', function () { let secondBidRequest = { bidId: 'foobar', sizes: [[300, 600]], params: { seatId: validBidRequest.params.seatId, tagId: '5678', bidfloor: '0.50' } }; let req = spec.buildRequests([validBidRequest, secondBidRequest], bidderRequest); expect(req).to.exist.and.be.an('object'); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([expectedDataImp1, { banner: { format: [ { h: 600, w: 300 } ], pos: 0 }, id: 'bfoobar', tagid: '5678', bidfloor: 0.5 }]); }); it('should return only first bid when different seatIds are used', function () { let mismatchedSeatBidRequest = { bidId: 'foobar', sizes: [[300, 250]], params: { seatId: 'somethingelse', tagId: '5678', bidfloor: '0.50' } }; let req = spec.buildRequests([mismatchedSeatBidRequest, validBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://somethingelse.technoratimedia.com/openrtb/bids/somethingelse?'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { banner: { format: [ { h: 250, w: 300 } ], pos: 0 }, id: 'bfoobar', tagid: '5678', bidfloor: 0.5 } ]); }); it('should not use bidfloor when the value is not a number', function () { let badFloorBidRequest = { bidId: '9876abcd', sizes: [[300, 250]], params: { seatId: 'prebid', tagId: '1234', bidfloor: 'abcd' } }; let req = spec.buildRequests([badFloorBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { banner: { format: [ { h: 250, w: 300 } ], pos: 0 }, id: 'b9876abcd', tagid: '1234', } ]); }); it('should not use bidfloor when there is no value', function () { let badFloorBidRequest = { bidId: '9876abcd', sizes: [[300, 250]], params: { seatId: 'prebid', tagId: '1234' } }; let req = spec.buildRequests([badFloorBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { banner: { format: [ { h: 250, w: 300 } ], pos: 0 }, id: 'b9876abcd', tagid: '1234', } ]); }); it('should use the pos given by the bid request', function () { let newPosBidRequest = { bidId: '9876abcd', sizes: [[300, 250]], params: { seatId: 'prebid', tagId: '1234', pos: 1 } }; let req = spec.buildRequests([newPosBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { banner: { format: [ { h: 250, w: 300 } ], pos: 1 }, id: 'b9876abcd', tagid: '1234' } ]); }); it('should use the default pos if none in bid request', function () { let newPosBidRequest = { bidId: '9876abcd', sizes: [[300, 250]], params: { seatId: 'prebid', tagId: '1234', } }; let req = spec.buildRequests([newPosBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { banner: { format: [ { h: 250, w: 300 } ], pos: 0 }, id: 'b9876abcd', tagid: '1234' } ]); }); it('should not return a request when no valid bid request used', function () { expect(spec.buildRequests([], bidderRequest)).to.be.undefined; expect(spec.buildRequests([validBidRequest], null)).to.be.undefined; }); it('should return empty impression when there is no valid sizes in bidrequest', function () { let validBidReqWithoutSize = { bidId: '9876abcd', sizes: [], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' } }; let validBidReqInvalidSize = { bidId: '9876abcd', sizes: [[300]], params: { seatId: 'prebid', tagId: '1234', bidfloor: '0.50' } }; let bidderRequest = { auctionId: 'xyz123', refererInfo: { referer: 'https://test.com/foo/bar' } }; let req = spec.buildRequests([validBidReqWithoutSize], bidderRequest); assert.isUndefined(req); req = spec.buildRequests([validBidReqInvalidSize], bidderRequest); assert.isUndefined(req); }); it('should use all the video params in the impression request', function () { let validBidRequestVideo = { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: '1234', video: { minduration: 30, maxduration: 45, startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'], protocols: [1], api: 1 } }, mediaTypes: { video: { context: 'instream', playerSize: [[640, 480]] } }, adUnitCode: 'video1', transactionId: '93e5def8-29aa-4fe8-bd3a-0298c39f189a', sizes: [[640, 480]], bidId: '2624fabbb078e8', bidderRequestId: '117954d20d7c9c', auctionId: 'defd525f-4f1e-4416-a4cb-ae53be90e706', src: 'client', bidRequestsCount: 1 }; let req = spec.buildRequests([validBidRequestVideo], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { video: { h: 480, pos: 0, w: 640, minduration: 30, maxduration: 45, startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'], protocols: [1], api: 1 }, id: 'v2624fabbb078e8-640x480', tagid: '1234', } ]); }); it('should move any video params in the mediaTypes object to params.video object', function () { let validBidRequestVideo = { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: '1234', video: { minduration: 30, maxduration: 45, protocols: [1], api: 1 } }, mediaTypes: { video: { context: 'instream', playerSize: [[640, 480]], startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'] } }, adUnitCode: 'video1', transactionId: '93e5def8-29aa-4fe8-bd3a-0298c39f189a', sizes: [[640, 480]], bidId: '2624fabbb078e8', bidderRequestId: '117954d20d7c9c', auctionId: 'defd525f-4f1e-4416-a4cb-ae53be90e706', src: 'client', bidRequestsCount: 1 }; let req = spec.buildRequests([validBidRequestVideo], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data.id).to.equal('xyz123'); expect(req.data.imp).to.eql([ { video: { h: 480, pos: 0, w: 640, minduration: 30, maxduration: 45, startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'], protocols: [1], api: 1 }, id: 'v2624fabbb078e8-640x480', tagid: '1234', } ]); }); it('should create params.video object if not present on bid request and move any video params in the mediaTypes object to it', function () { let validBidRequestVideo = { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: '1234' }, mediaTypes: { video: { context: 'instream', playerSize: [[ 640, 480 ]], startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'] } }, adUnitCode: 'video1', transactionId: '93e5def8-29aa-4fe8-bd3a-0298c39f189a', sizes: [[ 640, 480 ]], bidId: '2624fabbb078e8', bidderRequestId: '117954d20d7c9c', auctionId: 'defd525f-4f1e-4416-a4cb-ae53be90e706', src: 'client', bidRequestsCount: 1 }; let req = spec.buildRequests([validBidRequestVideo], bidderRequest); expect(req.data.imp).to.eql([ { video: { h: 480, pos: 0, w: 640, startdelay: 1, linearity: 1, placement: 1, mimes: ['video/mp4'] }, id: 'v2624fabbb078e8-640x480', tagid: '1234', } ]); }); it('should contain the CCPA privacy string when UspConsent is in bidder request', function () { // banner test let req = spec.buildRequests([validBidRequest], bidderRequestWithCCPA); expect(req).be.an('object'); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?'); expect(req.data).to.exist.and.to.be.an('object'); expect(req.data.id).to.equal('xyz123'); expect(req.data.regs.ext.us_privacy).to.equal('1YYY'); expect(req.data.imp).to.eql([expectedDataImp1]); }); it('should contain user object when user ids are present in the bidder request', function () { let req = spec.buildRequests([validBidRequestWithUserIds], bidderRequest); expect(req).be.an('object'); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('https://prebid.technoratimedia.com/openrtb/bids/prebid?'); expect(req.data).to.exist.and.to.be.an('object'); expect(req.data.id).to.equal('xyz123'); expect(req.data.user).be.an('object'); expect(req.data.user).to.have.property('ext'); expect(req.data.user.ext).to.have.property('eids'); expect(req.data.user.ext.eids).to.eql(expectedEids); expect(req.data.imp).to.eql([expectedDataImp1]); }); }); describe('Bid Requests with placementId should be backward compatible ', function () { let validVideoBidReq = { bidder: 'synacormedia', params: { seatId: 'prebid', placementId: 'demo1', pos: 1, video: {} }, renderer: { url: '../syncOutstreamPlayer.js' }, mediaTypes: { video: { playerSize: [[300, 250]], context: 'outstream' } }, adUnitCode: 'div-1', transactionId: '0869f34e-090b-4b20-84ee-46ff41405a39', sizes: [[300, 250]], bidId: '22b3a2268d9f0e', bidderRequestId: '1d195910597e13', auctionId: '3375d336-2aea-4ee7-804c-6d26b621ad20', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0 }; let validBannerBidRequest = { bidId: '9876abcd', sizes: [[300, 250]], params: { seatId: 'prebid', placementId: '1234', } }; let bidderRequest = { refererInfo: { referer: 'http://localhost:9999/' }, bidderCode: 'synacormedia', auctionId: 'f8a75621-d672-4cbb-9275-3db7d74fb110' }; it('should return valid bid request for banner impression', function () { let req = spec.buildRequests([validBannerBidRequest], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('//prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); }); it('should return valid bid request for video impression', function () { let req = spec.buildRequests([validVideoBidReq], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('//prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); }); }); describe('Bid Requests with schain object ', function () { let validBidReq = { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: 'demo1', pos: 1, video: {} }, renderer: { url: '../syncOutstreamPlayer.js' }, mediaTypes: { video: { playerSize: [[300, 250]], context: 'outstream' } }, adUnitCode: 'div-1', transactionId: '0869f34e-090b-4b20-84ee-46ff41405a39', sizes: [[300, 250]], bidId: '22b3a2268d9f0e', bidderRequestId: '1d195910597e13', auctionId: '3375d336-2aea-4ee7-804c-6d26b621ad20', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0, schain: { ver: '1.0', complete: 1, nodes: [ { asi: 'indirectseller.com', sid: '00001', hp: 1 } ] } }; let bidderRequest = { refererInfo: { referer: 'http://localhost:9999/' }, bidderCode: 'synacormedia', auctionId: 'f8a75621-d672-4cbb-9275-3db7d74fb110', bidderRequestId: '16d438671bfbec', bids: [ { bidder: 'synacormedia', params: { seatId: 'prebid', tagId: 'demo1', pos: 1, video: {} }, renderer: { url: '../syncOutstreamPlayer.js' }, mediaTypes: { video: { playerSize: [[300, 250]], context: 'outstream' } }, adUnitCode: 'div-1', sizes: [[300, 250]], bidId: '211c0236bb8f4e', bidderRequestId: '16d438671bfbec', auctionId: 'f8a75621-d672-4cbb-9275-3db7d74fb110', src: 'client', bidRequestsCount: 1, bidderRequestsCount: 1, bidderWinsCount: 0, schain: { ver: '1.0', complete: 1, nodes: [ { asi: 'indirectseller.com', sid: '00001', hp: 1 } ] } } ], auctionStart: 1580310345205, timeout: 1000, start: 1580310345211 }; it('should return valid bid request with schain object', function () { let req = spec.buildRequests([validBidReq], bidderRequest); expect(req).to.have.property('method', 'POST'); expect(req).to.have.property('url'); expect(req.url).to.contain('//prebid.technoratimedia.com/openrtb/bids/prebid?src=$$REPO_AND_VERSION$$'); expect(req.data).to.have.property('source'); expect(req.data.source).to.have.property('ext'); expect(req.data.source.ext).to.have.property('schain'); }); }); describe('interpretResponse', function () { let bidResponse = { id: '10865933907263896~9998~0', impid: 'b9876abcd', price: 0.13, crid: '1022-250', adm: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=${AUCTION_PRICE}\"></script>', nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=${AUCTION_PRICE}', w: 300, h: 250 }; let bidResponse2 = { id: '10865933907263800~9999~0', impid: 'b9876abcd', price: 1.99, crid: '9993-013', adm: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=OTk5OX4wJkFVQ1RJT05fU0VBVF9JR&AUCTION_PRICE=${AUCTION_PRICE}\"></script>', nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=OTk5OX4wJkFVQ1RJT05fU0VBVF9JR&AUCTION_PRICE=${AUCTION_PRICE}', w: 300, h: 600 }; let bidRequest = { data: { id: '', imp: [ { id: 'abc123', banner: { format: [ { w: 400, h: 350 } ], pos: 1 } } ], }, method: 'POST', options: { contentType: 'application/json', withCredentials: true }, url: 'https://prebid.technoratimedia.com/openrtb/bids/prebid?src=prebid_prebid_3.27.0-pre' }; let serverResponse; beforeEach(function () { serverResponse = { body: { id: 'abc123', seatbid: [{ seat: '9998', bid: [], }] } }; }); it('should return 1 video bid when 1 bid is in the video response', function () { bidRequest = { data: { id: 'abcd1234', imp: [ { video: { w: 640, h: 480 }, id: 'v2da7322b2df61f' } ] }, method: 'POST', options: { contentType: 'application/json', withCredentials: true }, url: 'https://prebid.technoratimedia.com/openrtb/bids/prebid?src=prebid_prebid_3.27.0-pre' }; let serverRespVideo = { body: { id: 'abcd1234', seatbid: [ { bid: [ { id: '11339128001692337~9999~0', impid: 'v2da7322b2df61f', price: 0.45, nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}', adm: '<?xml version="1.0" encoding="UTF-8"?>\n<VAST version="3.0">\n<Ad id="11339128001692337~9999~0">\n<Wrapper>\n<AdSystem>Synacor Media Ad Server - 9999</AdSystem>\n<VASTAdTagURI>https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}</VASTAdTagURI>\n</Wrapper>\n</Ad>\n</VAST>', adomain: ['psacentral.org'], cid: 'bidder-crid', crid: 'bidder-cid', cat: [], w: 640, h: 480 } ], seat: '9999' } ] } }; // serverResponse.body.seatbid[0].bid.push(bidResponse); let resp = spec.interpretResponse(serverRespVideo, bidRequest); expect(resp).to.be.an('array').to.have.lengthOf(1); expect(resp[0]).to.eql({ requestId: '2da7322b2df61f', cpm: 0.45, width: 640, height: 480, creativeId: '9999_bidder-cid', currency: 'USD', netRevenue: true, mediaType: 'video', ad: '<?xml version="1.0" encoding="UTF-8"?>\n<VAST version="3.0">\n<Ad id="11339128001692337~9999~0">\n<Wrapper>\n<AdSystem>Synacor Media Ad Server - 9999</AdSystem>\n<VASTAdTagURI>https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=0.45</VASTAdTagURI>\n</Wrapper>\n</Ad>\n</VAST>', ttl: 60, meta: { advertiserDomains: ['psacentral.org'] }, videoCacheKey: 'QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk', vastUrl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=0.45' }); }); it('should return 1 bid when 1 bid is in the response', function () { serverResponse.body.seatbid[0].bid.push(bidResponse); let resp = spec.interpretResponse(serverResponse, bidRequest); expect(resp).to.be.an('array').to.have.lengthOf(1); expect(resp[0]).to.eql({ requestId: '9876abcd', cpm: 0.13, width: 300, height: 250, creativeId: '9998_1022-250', currency: 'USD', netRevenue: true, mediaType: BANNER, ad: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=0.13\"></script>', ttl: 60 }); }); it('should return 2 bids when 2 bids are in the response', function () { serverResponse.body.seatbid[0].bid.push(bidResponse); serverResponse.body.seatbid.push({ seat: '9999', bid: [bidResponse2], }); let resp = spec.interpretResponse(serverResponse, bidRequest); expect(resp).to.be.an('array').to.have.lengthOf(2); expect(resp[0]).to.eql({ requestId: '9876abcd', cpm: 0.13, width: 300, height: 250, creativeId: '9998_1022-250', currency: 'USD', netRevenue: true, mediaType: BANNER, ad: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=0.13\"></script>', ttl: 60 }); expect(resp[1]).to.eql({ requestId: '9876abcd', cpm: 1.99, width: 300, height: 600, creativeId: '9999_9993-013', currency: 'USD', netRevenue: true, mediaType: BANNER, ad: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=OTk5OX4wJkFVQ1RJT05fU0VBVF9JR&AUCTION_PRICE=1.99\"></script>', ttl: 60 }); }); it('should not return a bid when no bid is in the response', function () { let resp = spec.interpretResponse(serverResponse, bidRequest); expect(resp).to.be.an('array').that.is.empty; }); it('should not return a bid when there is no response body', function () { expect(spec.interpretResponse({ body: null })).to.not.exist; expect(spec.interpretResponse({ body: 'some error text' })).to.not.exist; }); it('should not include videoCacheKey property on the returned response when cache url is present in the config', function () { let sandbox = sinon.sandbox.create(); let serverRespVideo = { body: { id: 'abcd1234', seatbid: [ { bid: [ { id: '11339128001692337~9999~0', impid: 'v2da7322b2df61f', price: 0.45, nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}', adm: '<?xml version="1.0" encoding="UTF-8"?>\n<VAST version="3.0">\n<Ad id="11339128001692337~9999~0">\n<Wrapper>\n<AdSystem>Synacor Media Ad Server - 9999</AdSystem>\n<VASTAdTagURI>https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}</VASTAdTagURI>\n</Wrapper>\n</Ad>\n</VAST>', adomain: ['psacentral.org'], cid: 'bidder-crid', crid: 'bidder-cid', cat: [], w: 640, h: 480 } ], seat: '9999' } ] } }; sandbox.stub(config, 'getConfig').callsFake(key => { const config = { 'cache.url': 'faKeCacheUrl' }; return config[key]; }); let resp = spec.interpretResponse(serverRespVideo, bidRequest); sandbox.restore(); expect(resp[0].videoCacheKey).to.not.exist; }); it('should use video bid request height and width if not present in response', function () { bidRequest = { data: { id: 'abcd1234', imp: [ { video: { w: 300, h: 250 }, id: 'v2da7322b2df61f' } ] }, method: 'POST', options: { contentType: 'application/json', withCredentials: true }, url: 'https://prebid.technoratimedia.com/openrtb/bids/prebid?src=prebid_prebid_3.27.0-pre' }; let serverRespVideo = { body: { id: 'abcd1234', seatbid: [ { bid: [ { id: '11339128001692337~9999~0', impid: 'v2da7322b2df61f', price: 0.45, nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}', adm: '<?xml version="1.0" encoding="UTF-8"?>\n<VAST version="3.0">\n<Ad id="11339128001692337~9999~0">\n<Wrapper>\n<AdSystem>Synacor Media Ad Server - 9999</AdSystem>\n<VASTAdTagURI>https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=${AUCTION_PRICE}</VASTAdTagURI>\n</Wrapper>\n</Ad>\n</VAST>', adomain: ['psacentral.org'], cid: 'bidder-crid', crid: 'bidder-cid', cat: [] } ], seat: '9999' } ] } }; let resp = spec.interpretResponse(serverRespVideo, bidRequest); expect(resp).to.be.an('array').to.have.lengthOf(1); expect(resp[0]).to.eql({ requestId: '2da7322b2df61f', cpm: 0.45, width: 300, height: 250, creativeId: '9999_bidder-cid', currency: 'USD', netRevenue: true, mediaType: 'video', ad: '<?xml version="1.0" encoding="UTF-8"?>\n<VAST version="3.0">\n<Ad id="11339128001692337~9999~0">\n<Wrapper>\n<AdSystem>Synacor Media Ad Server - 9999</AdSystem>\n<VASTAdTagURI>https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=0.45</VASTAdTagURI>\n</Wrapper>\n</Ad>\n</VAST>', ttl: 60, meta: { advertiserDomains: ['psacentral.org'] }, videoCacheKey: 'QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk', vastUrl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=QVVDVElPTl9JRD1lOTBhYWU1My1hZDkwLTRkNDEtYTQxMC1lZDY1MjIxMDc0ZGMmQVVDVElPTl9CSURfSUQ9MTEzMzkxMjgwMDE2OTIzMzd-OTk5OX4wJkFVQ1RJT05fU0VBVF9JRD05OTk5JkFVQ1RJT05fSU1QX0lEPXYyZGE3MzIyYjJkZjYxZi02NDB4NDgwJkFDVE9SX1JFRj1ha2thLnRjcDovL2F3cy1lYXN0MUBhZHMxMy5jYXAtdXNlMS5zeW5hY29yLmNvbToyNTUxL3VzZXIvJGNMYmZiIy0xOTk4NTIzNTk3JlNFQVRfSUQ9cHJlYmlk&AUCTION_PRICE=0.45' }); }); it('should use banner bid request height and width if not present in response', function () { bidRequest = { data: { id: 'abc123', imp: [ { banner: { format: [{ w: 400, h: 350 }] }, id: 'babc123' } ] }, method: 'POST', options: { contentType: 'application/json', withCredentials: true }, url: 'https://prebid.technoratimedia.com/openrtb/bids/prebid?src=prebid_prebid_3.27.0-pre' }; bidResponse = { id: '10865933907263896~9998~0', impid: 'babc123', price: 0.13, crid: '1022-250', adm: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=${AUCTION_PRICE}\"></script>', nurl: 'https://uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=${AUCTION_PRICE}', }; serverResponse.body.seatbid[0].bid.push(bidResponse); let resp = spec.interpretResponse(serverResponse, bidRequest); expect(resp).to.be.an('array').to.have.lengthOf(1); expect(resp[0]).to.eql({ requestId: 'abc123', cpm: 0.13, width: 400, height: 350, creativeId: '9998_1022-250', currency: 'USD', netRevenue: true, mediaType: BANNER, ad: '<script src=\"//uat-net.technoratimedia.com/openrtb/tags?ID=k5JkFVQ1RJT05fSU1QX0lEPXYyZjczN&AUCTION_PRICE=0.13\"></script>', ttl: 60 }); }); }); describe('getUserSyncs', function () { it('should return a usersync when iframes is enabled', function () { let usersyncs = spec.getUserSyncs({ iframeEnabled: true }, null); expect(usersyncs).to.be.an('array').that.is.not.empty; expect(usersyncs[0]).to.have.property('type', 'iframe'); expect(usersyncs[0]).to.have.property('url'); expect(usersyncs[0].url).to.contain('https://ad-cdn.technoratimedia.com/html/usersync.html'); }); it('should not return a usersync when iframes are not enabled', function () { let usersyncs = spec.getUserSyncs({ pixelEnabled: true }, null); expect(usersyncs).to.be.an('array').that.is.empty; }); }); });