mk9-prebid
Version:
Header Bidding Management Library
1,182 lines (1,144 loc) • 38.8 kB
JavaScript
import { expect } from 'chai';
import { spec } from 'modules/trustxBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
import { config } from 'src/config.js';
describe('TrustXAdapter', 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 () {
let bid = {
'bidder': 'trustx',
'params': {
'uid': '44'
},
'adUnitCode': 'adunit-code',
'sizes': [[300, 250], [300, 600]],
'bidId': '30b31c1838de1e',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475',
};
it('should return true when required params found', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return false when required params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {
'uid': 0
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
});
describe('buildRequests', function () {
function parseRequest(data) {
return JSON.parse(data);
}
const bidderRequest = {
refererInfo: {referer: 'https://example.com'},
bidderRequestId: '22edbae2733bf6',
auctionId: '9e2dfbfe-00c7-4f5e-9850-4044df3229c7',
timeout: 3000
};
const referrer = encodeURIComponent(bidderRequest.refererInfo.referer);
let bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '43',
'bidFloor': 1.25,
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'mediaTypes': {
'banner': {
'sizes': [[300, 250], [300, 600]]
}
},
'bidId': '42dbe3a7168a6a',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '9e2dfbfe-00c7-4f5e-9850-4044df3229c7',
},
{
'bidder': 'trustx',
'params': {
'uid': '44',
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '30b31c1838de1e',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '9e2dfbfe-00c7-4f5e-9850-4044df3229c7',
},
{
'bidder': 'trustx',
'params': {
'uid': '45',
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'mediaTypes': {
'video': {
'playerSize': [[400, 600]],
'mimes': ['video/mp4', 'video/webm', 'application/javascript', 'video/ogg']
}
},
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '9e2dfbfe-00c7-4f5e-9850-4044df3229c7',
},
{
'bidder': 'trustx',
'params': {
'uid': '41',
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'mediaTypes': {
'video': {
'playerSize': [[400, 600]],
'protocols': [1, 2, 3]
},
'banner': {
'sizes': [[728, 90]]
}
},
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '9e2dfbfe-00c7-4f5e-9850-4044df3229c7',
}
];
it('should attach valid params to the tag', function () {
const request = spec.buildRequests([bidRequests[0]], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.deep.equal({
'id': bidderRequest.bidderRequestId,
'site': {
'page': referrer
},
'tmax': bidderRequest.timeout,
'source': {
'tid': bidderRequest.auctionId,
'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'}
},
'imp': [{
'id': bidRequests[0].bidId,
'tagid': bidRequests[0].params.uid,
'ext': {'divid': bidRequests[0].adUnitCode},
'bidfloor': bidRequests[0].params.bidFloor,
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}]
});
});
it('make possible to process request without mediaTypes', function () {
const request = spec.buildRequests([bidRequests[0], bidRequests[1]], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.deep.equal({
'id': bidderRequest.bidderRequestId,
'site': {
'page': referrer
},
'tmax': bidderRequest.timeout,
'source': {
'tid': bidderRequest.auctionId,
'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'}
},
'imp': [{
'id': bidRequests[0].bidId,
'tagid': bidRequests[0].params.uid,
'ext': {'divid': bidRequests[0].adUnitCode},
'bidfloor': bidRequests[0].params.bidFloor,
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}, {
'id': bidRequests[1].bidId,
'tagid': bidRequests[1].params.uid,
'ext': {'divid': bidRequests[1].adUnitCode},
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}]
});
});
it('should attach valid params to the video tag', function () {
const request = spec.buildRequests(bidRequests.slice(0, 3), bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.deep.equal({
'id': bidderRequest.bidderRequestId,
'site': {
'page': referrer
},
'tmax': bidderRequest.timeout,
'source': {
'tid': bidderRequest.auctionId,
'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'}
},
'imp': [{
'id': bidRequests[0].bidId,
'tagid': bidRequests[0].params.uid,
'ext': {'divid': bidRequests[0].adUnitCode},
'bidfloor': bidRequests[0].params.bidFloor,
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}, {
'id': bidRequests[1].bidId,
'tagid': bidRequests[1].params.uid,
'ext': {'divid': bidRequests[1].adUnitCode},
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}, {
'id': bidRequests[2].bidId,
'tagid': bidRequests[2].params.uid,
'ext': {'divid': bidRequests[2].adUnitCode},
'video': {
'w': 400,
'h': 600,
'mimes': ['video/mp4', 'video/webm', 'application/javascript', 'video/ogg']
}
}]
});
});
it('should support mixed mediaTypes', function () {
const request = spec.buildRequests(bidRequests, bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.deep.equal({
'id': bidderRequest.bidderRequestId,
'site': {
'page': referrer
},
'tmax': bidderRequest.timeout,
'source': {
'tid': bidderRequest.auctionId,
'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'}
},
'imp': [{
'id': bidRequests[0].bidId,
'tagid': bidRequests[0].params.uid,
'ext': {'divid': bidRequests[0].adUnitCode},
'bidfloor': bidRequests[0].params.bidFloor,
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}, {
'id': bidRequests[1].bidId,
'tagid': bidRequests[1].params.uid,
'ext': {'divid': bidRequests[1].adUnitCode},
'banner': {
'w': 300,
'h': 250,
'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]
}
}, {
'id': bidRequests[2].bidId,
'tagid': bidRequests[2].params.uid,
'ext': {'divid': bidRequests[2].adUnitCode},
'video': {
'w': 400,
'h': 600,
'mimes': ['video/mp4', 'video/webm', 'application/javascript', 'video/ogg'],
}
}, {
'id': bidRequests[3].bidId,
'tagid': bidRequests[3].params.uid,
'ext': {'divid': bidRequests[3].adUnitCode},
'banner': {
'w': 728,
'h': 90,
'format': [{'w': 728, 'h': 90}]
},
'video': {
'w': 400,
'h': 600,
'protocols': [1, 2, 3]
}
}]
});
});
it('if gdprConsent is present payload must have gdpr params', function () {
const gdprBidderRequest = Object.assign({gdprConsent: {consentString: 'AAA', gdprApplies: true}}, bidderRequest);
const request = spec.buildRequests(bidRequests, gdprBidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('user');
expect(payload.user).to.have.property('ext');
expect(payload.user.ext).to.have.property('consent', 'AAA');
expect(payload).to.have.property('regs');
expect(payload.regs).to.have.property('ext');
expect(payload.regs.ext).to.have.property('gdpr', 1);
});
it('if usPrivacy is present payload must have us_privacy param', function () {
const bidderRequestWithUSP = Object.assign({uspConsent: '1YNN'}, bidderRequest);
const request = spec.buildRequests(bidRequests, bidderRequestWithUSP);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('regs');
expect(payload.regs).to.have.property('ext');
expect(payload.regs.ext).to.have.property('us_privacy', '1YNN');
});
it('if userId is present payload must have user.ext param with right keys', function () {
const eids = [
{
source: 'pubcid.org',
uids: [{
id: 'some-random-id-value',
atype: 1
}]
},
{
source: 'adserver.org',
uids: [{
id: 'some-random-id-value',
atype: 1,
ext: {
rtiPartner: 'TDID'
}
}]
}
];
const bidRequestsWithUserIds = bidRequests.map((bid) => {
return Object.assign({
userIdAsEids: eids
}, bid);
});
const request = spec.buildRequests(bidRequestsWithUserIds, bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('user');
expect(payload.user).to.have.property('ext');
expect(payload.user.ext.eids).to.deep.equal(eids);
});
it('if schain is present payload must have source.ext.schain param', function () {
const schain = {
complete: 1,
nodes: [
{
asi: 'indirectseller.com',
sid: '00001',
hp: 1
}
]
};
const bidRequestsWithSChain = bidRequests.map((bid) => {
return Object.assign({
schain: schain
}, bid);
});
const request = spec.buildRequests(bidRequestsWithSChain, bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('source');
expect(payload.source).to.have.property('ext');
expect(payload.source.ext).to.have.property('schain');
expect(payload.source.ext.schain).to.deep.equal(schain);
});
it('if content and segment is present in jwTargeting, payload must have right params', function () {
const jsContent = {id: 'test_jw_content_id'};
const jsSegments = ['test_seg_1', 'test_seg_2'];
const bidRequestsWithJwTargeting = bidRequests.map((bid) => {
return Object.assign({
rtd: {
jwplayer: {
targeting: {
segments: jsSegments,
content: jsContent
}
}
}
}, bid);
});
const request = spec.buildRequests(bidRequestsWithJwTargeting, bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('user');
expect(payload.user.data).to.deep.equal([{
name: 'iow_labs_pub_data',
segment: [
{name: 'jwpseg', value: jsSegments[0]},
{name: 'jwpseg', value: jsSegments[1]}
]
}]);
expect(payload).to.have.property('site');
expect(payload.site.content).to.deep.equal(jsContent);
});
it('if segment is present in permutive targeting, payload must have right params', function () {
const permSegments = ['test_perm_1', 'test_perm_2'];
const bidRequestsWithPermutiveTargeting = bidRequests.map((bid) => {
return Object.assign({
rtd: {
p_standard: {
targeting: {
segments: permSegments
}
}
}
}, bid);
});
const request = spec.buildRequests(bidRequestsWithPermutiveTargeting, bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('user');
expect(payload.user.data).to.deep.equal([{
name: 'permutive',
segment: [
{name: 'p_standard', value: permSegments[0]},
{name: 'p_standard', value: permSegments[1]}
]
}]);
});
it('should contain the keyword values if it present in ortb2.(site/user)', function () {
const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
arg => arg === 'ortb2.user' ? {'keywords': 'foo,any'} : (arg === 'ortb2.site' ? {'keywords': 'bar'} : null));
const keywords = {
'site': {
'somePublisher': [
{
'name': 'someName',
'brandsafety': ['disaster'],
'topic': ['stress', 'fear']
}
]
},
'user': {
'formatedPublisher': [
{
'name': 'fomatedName',
'segments': [
{ 'name': 'segName1', 'value': 'segVal1' },
{ 'name': 'segName2', 'value': 'segVal2' }
]
}
]
}
};
const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } }
const request = spec.buildRequests([bidRequestWithKW], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.ext.keywords).to.deep.equal({
'site': {
'somePublisher': [
{
'name': 'someName',
'segments': [
{ 'name': 'brandsafety', 'value': 'disaster' },
{ 'name': 'topic', 'value': 'stress' },
{ 'name': 'topic', 'value': 'fear' }
]
}
],
'ortb2': [
{
'name': 'keywords',
'segments': [
{ 'name': 'keywords', 'value': 'bar' }
]
}
]
},
'user': {
'formatedPublisher': [
{
'name': 'fomatedName',
'segments': [
{ 'name': 'segName1', 'value': 'segVal1' },
{ 'name': 'segName2', 'value': 'segVal2' }
]
}
],
'ortb2': [
{
'name': 'keywords',
'segments': [
{ 'name': 'keywords', 'value': 'foo' },
{ 'name': 'keywords', 'value': 'any' }
]
}
]
}
});
getConfigStub.restore();
});
it('shold be right tmax when timeout in config is less then timeout in bidderRequest', function() {
const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
arg => arg === 'bidderTimeout' ? 2000 : null);
const request = spec.buildRequests([bidRequests[0]], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.tmax).to.equal(2000);
getConfigStub.restore();
});
it('shold be right tmax when timeout in bidderRequest is less then timeout in config', function() {
const getConfigStub = sinon.stub(config, 'getConfig').callsFake(
arg => arg === 'bidderTimeout' ? 5000 : null);
const request = spec.buildRequests([bidRequests[0]], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.tmax).to.equal(3000);
getConfigStub.restore();
});
describe('floorModule', function () {
const floorTestData = {
'currency': 'USD',
'floor': 1.50
};
const bidRequest = Object.assign({
getFloor: (_) => {
return floorTestData;
}
}, bidRequests[1]);
it('should return the value from getFloor if present', function () {
const request = spec.buildRequests([bidRequest], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor);
});
it('should return the getFloor.floor value if it is greater than bidfloor', function () {
const bidfloor = 0.80;
const bidRequestsWithFloor = { ...bidRequest };
bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params);
const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor);
});
it('should return the bidfloor value if it is greater than getFloor.floor', function () {
const bidfloor = 1.80;
const bidRequestsWithFloor = { ...bidRequest };
bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params);
const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload.imp[0].bidfloor).to.equal(bidfloor);
});
});
});
describe('interpretResponse', function () {
const responses = [
{'bid': [{'impid': '659423fff799cb', 'price': 1.15, 'adm': '<div>test content 1</div>', 'auid': 43, 'h': 250, 'w': 300, 'adomain': ['somedomain.com']}], 'seat': '1'},
{'bid': [{'impid': '4dff80cc4ee346', 'price': 0.5, 'adm': '<div>test content 2</div>', 'auid': 44, 'h': 600, 'w': 300}], 'seat': '1'},
{'bid': [{'impid': '5703af74d0472a', 'price': 0.15, 'adm': '<div>test content 3</div>', 'auid': 43, 'h': 90, 'w': 728}], 'seat': '1'},
{'bid': [{'impid': '659423faac49cb', 'price': 0, 'auid': 45, 'h': 250, 'w': 300}], 'seat': '1'},
{'bid': [{'price': 0, 'adm': '<div>test content 5</div>', 'h': 250, 'w': 300}], 'seat': '1'},
undefined,
{'bid': [], 'seat': '1'},
{'seat': '1'},
];
it('should get correct bid response', function () {
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '659423fff799cb',
'bidderRequestId': '5f2009617a7c0a',
'auctionId': '1cbd2feafe5e8b',
}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': '659423fff799cb',
'cpm': 1.15,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 250,
'ad': '<div>test content 1</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': ['somedomain.com']
},
}
];
const result = spec.interpretResponse({'body': {'seatbid': [responses[0]]}}, request);
expect(result).to.deep.equal(expectedResponse);
});
it('should get correct multi bid response', function () {
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '659423fff799cb',
'bidderRequestId': '2c2bb1972df9a',
'auctionId': '1fa09aee5c8c99',
},
{
'bidder': 'trustx',
'params': {
'uid': '44'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '4dff80cc4ee346',
'bidderRequestId': '2c2bb1972df9a',
'auctionId': '1fa09aee5c8c99',
},
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'bidId': '5703af74d0472a',
'bidderRequestId': '2c2bb1972df9a',
'auctionId': '1fa09aee5c8c99',
}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': '659423fff799cb',
'cpm': 1.15,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 250,
'ad': '<div>test content 1</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': ['somedomain.com']
},
},
{
'requestId': '4dff80cc4ee346',
'cpm': 0.5,
'creativeId': 44,
'dealId': undefined,
'width': 300,
'height': 600,
'ad': '<div>test content 2</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '5703af74d0472a',
'cpm': 0.15,
'creativeId': 43,
'dealId': undefined,
'width': 728,
'height': 90,
'ad': '<div>test content 3</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
}
];
const result = spec.interpretResponse({'body': {'seatbid': responses.slice(0, 3)}}, request);
expect(result).to.deep.equal(expectedResponse);
});
it('handles wrong and nobid responses', function () {
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '45'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '300bfeb0d7190gf',
'bidderRequestId': '2c2bb1972d23af',
'auctionId': '1fa09aee5c84d34',
},
{
'bidder': 'trustx',
'params': {
'uid': '46'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '300bfeb0d71321',
'bidderRequestId': '2c2bb1972d23af',
'auctionId': '1fa09aee5c84d34',
},
{
'bidder': 'trustx',
'params': {
'uid': '50'
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'bidId': '300bfeb0d7183bb',
'bidderRequestId': '2c2bb1972d23af',
'auctionId': '1fa09aee5c84d34',
}
];
const request = spec.buildRequests(bidRequests);
const result = spec.interpretResponse({'body': {'seatbid': responses.slice(3)}}, request);
expect(result.length).to.equal(0);
});
it('complicated case', function () {
const fullResponse = [
{'bid': [{'impid': '2164be6358b9', 'price': 1.15, 'adm': '<div>test content 1</div>', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
{'bid': [{'impid': '4e111f1b66e4', 'price': 0.5, 'adm': '<div>test content 2</div>', 'auid': 44, 'h': 600, 'w': 300}], 'seat': '1'},
{'bid': [{'impid': '26d6f897b516', 'price': 0.15, 'adm': '<div>test content 3</div>', 'auid': 43, 'h': 90, 'w': 728}], 'seat': '1'},
{'bid': [{'impid': '326bde7fbf69', 'price': 0.15, 'adm': '<div>test content 4</div>', 'auid': 43, 'h': 600, 'w': 300}], 'seat': '1'},
{'bid': [{'impid': '1751cd90161', 'price': 0.5, 'adm': '<div>test content 5</div>', 'auid': 44, 'h': 600, 'w': 350}], 'seat': '1'},
];
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '2164be6358b9',
'bidderRequestId': '106efe3247',
'auctionId': '32a1f276cb87cb8',
},
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '326bde7fbf69',
'bidderRequestId': '106efe3247',
'auctionId': '32a1f276cb87cb8',
},
{
'bidder': 'trustx',
'params': {
'uid': '44'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '4e111f1b66e4',
'bidderRequestId': '106efe3247',
'auctionId': '32a1f276cb87cb8',
},
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'bidId': '26d6f897b516',
'bidderRequestId': '106efe3247',
'auctionId': '32a1f276cb87cb8',
},
{
'bidder': 'trustx',
'params': {
'uid': '44'
},
'adUnitCode': 'adunit-code-2',
'sizes': [[728, 90]],
'bidId': '1751cd90161',
'bidderRequestId': '106efe3247',
'auctionId': '32a1f276cb87cb8',
}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': '2164be6358b9',
'cpm': 1.15,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 250,
'ad': '<div>test content 1</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '4e111f1b66e4',
'cpm': 0.5,
'creativeId': 44,
'dealId': undefined,
'width': 300,
'height': 600,
'ad': '<div>test content 2</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '26d6f897b516',
'cpm': 0.15,
'creativeId': 43,
'dealId': undefined,
'width': 728,
'height': 90,
'ad': '<div>test content 3</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '326bde7fbf69',
'cpm': 0.15,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 600,
'ad': '<div>test content 4</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '1751cd90161',
'cpm': 0.5,
'creativeId': 44,
'dealId': undefined,
'width': 350,
'height': 600,
'ad': '<div>test content 5</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
}
];
const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
expect(result).to.deep.equal(expectedResponse);
});
it('dublicate uids and sizes in one slot', function () {
const fullResponse = [
{'bid': [{'impid': '5126e301f4be', 'price': 1.15, 'adm': '<div>test content 1</div>', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
{'bid': [{'impid': '57b2ebe70e16', 'price': 0.5, 'adm': '<div>test content 2</div>', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
];
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '5126e301f4be',
'bidderRequestId': '171c5405a390',
'auctionId': '35bcbc0f7e79c',
},
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '57b2ebe70e16',
'bidderRequestId': '171c5405a390',
'auctionId': '35bcbc0f7e79c',
},
{
'bidder': 'trustx',
'params': {
'uid': '43'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '225fcd44b18c',
'bidderRequestId': '171c5405a390',
'auctionId': '35bcbc0f7e79c',
}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': '5126e301f4be',
'cpm': 1.15,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 250,
'ad': '<div>test content 1</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
},
{
'requestId': '57b2ebe70e16',
'cpm': 0.5,
'creativeId': 43,
'dealId': undefined,
'width': 300,
'height': 250,
'ad': '<div>test content 2</div>',
'currency': 'USD',
'mediaType': 'banner',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
}
];
const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
expect(result).to.deep.equal(expectedResponse);
});
});
it('should get correct video bid response', function () {
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '50'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '57dfefb80eca',
'bidderRequestId': '20394420a762a2',
'auctionId': '140132d07b031',
'mediaTypes': {
'video': {
'context': 'instream'
}
}
},
{
'bidder': 'trustx',
'params': {
'uid': '51'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': 'e893c787c22dd',
'bidderRequestId': '20394420a762a2',
'auctionId': '140132d07b031',
'mediaTypes': {
'video': {
'context': 'instream'
}
}
}
];
const response = [
{'bid': [{'impid': '57dfefb80eca', 'price': 1.15, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>', 'auid': 50, content_type: 'video', w: 300, h: 600}], 'seat': '2'},
{'bid': [{'impid': '5126e301f4be', 'price': 1.00, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21331274\"><\/Ad>\n<\/VAST>', 'auid': 51, content_type: 'video'}], 'seat': '2'}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': '57dfefb80eca',
'cpm': 1.15,
'creativeId': 50,
'dealId': undefined,
'width': 300,
'height': 600,
'currency': 'USD',
'mediaType': 'video',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
'vastXml': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>',
'adResponse': {
'content': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>'
}
}
];
const result = spec.interpretResponse({'body': {'seatbid': response}}, request);
expect(result).to.deep.equal(expectedResponse);
});
it('should have right renderer in the bid response', function () {
const spySetRenderer = sinon.spy();
const stubRenderer = {
setRender: spySetRenderer
};
const spyRendererInstall = sinon.spy(function() { return stubRenderer; });
const stubRendererConst = {
install: spyRendererInstall
};
const bidRequests = [
{
'bidder': 'trustx',
'params': {
'uid': '50'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': 'e6e65553fc8',
'bidderRequestId': '1380f393215dc7',
'auctionId': '10b8d2f3c697e3',
'mediaTypes': {
'video': {
'context': 'outstream'
}
}
},
{
'bidder': 'trustx',
'params': {
'uid': '51'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': 'c8fdcb3f269f',
'bidderRequestId': '1380f393215dc7',
'auctionId': '10b8d2f3c697e3'
},
{
'bidder': 'trustx',
'params': {
'uid': '52'
},
'adUnitCode': 'adunit-code-1',
'sizes': [[300, 250], [300, 600]],
'bidId': '1de036c37685',
'bidderRequestId': '1380f393215dc7',
'auctionId': '10b8d2f3c697e3',
'renderer': {}
}
];
const response = [
{'bid': [{'impid': 'e6e65553fc8', 'price': 1.15, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>', 'auid': 50, content_type: 'video', w: 300, h: 600}], 'seat': '2'},
{'bid': [{'impid': 'c8fdcb3f269f', 'price': 1.00, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21331274\"><\/Ad>\n<\/VAST>', 'auid': 51, content_type: 'video', w: 300, h: 250}], 'seat': '2'},
{'bid': [{'impid': '1de036c37685', 'price': 1.20, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21376532\"><\/Ad>\n<\/VAST>', 'auid': 52, content_type: 'video', w: 300, h: 250}], 'seat': '2'}
];
const request = spec.buildRequests(bidRequests);
const expectedResponse = [
{
'requestId': 'e6e65553fc8',
'cpm': 1.15,
'creativeId': 50,
'dealId': undefined,
'width': 300,
'height': 600,
'currency': 'USD',
'mediaType': 'video',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
'vastXml': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>',
'adResponse': {
'content': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>'
},
'renderer': stubRenderer
},
{
'requestId': 'c8fdcb3f269f',
'cpm': 1.00,
'creativeId': 51,
'dealId': undefined,
'width': 300,
'height': 250,
'currency': 'USD',
'mediaType': 'video',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
'vastXml': '<VAST version=\"3.0\">\n<Ad id=\"21331274\"><\/Ad>\n<\/VAST>',
'adResponse': {
'content': '<VAST version=\"3.0\">\n<Ad id=\"21331274\"><\/Ad>\n<\/VAST>'
},
'renderer': stubRenderer
},
{
'requestId': '1de036c37685',
'cpm': 1.20,
'creativeId': 52,
'dealId': undefined,
'width': 300,
'height': 250,
'currency': 'USD',
'mediaType': 'video',
'netRevenue': false,
'ttl': 360,
'meta': {
'advertiserDomains': []
},
'vastXml': '<VAST version=\"3.0\">\n<Ad id=\"21376532\"><\/Ad>\n<\/VAST>',
'adResponse': {
'content': '<VAST version=\"3.0\">\n<Ad id=\"21376532\"><\/Ad>\n<\/VAST>'
}
}
];
const result = spec.interpretResponse({'body': {'seatbid': response}}, request, stubRendererConst);
expect(spySetRenderer.calledTwice).to.equal(true);
expect(spySetRenderer.getCall(0).args[0]).to.be.a('function');
expect(spySetRenderer.getCall(1).args[0]).to.be.a('function');
expect(spyRendererInstall.calledTwice).to.equal(true);
expect(spyRendererInstall.getCall(0).args[0]).to.deep.equal({
id: 'e6e65553fc8',
url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js',
loaded: false
});
expect(spyRendererInstall.getCall(1).args[0]).to.deep.equal({
id: 'c8fdcb3f269f',
url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js',
loaded: false
});
expect(result).to.deep.equal(expectedResponse);
});
});