mk9-prebid
Version:
Header Bidding Management Library
1,248 lines (1,082 loc) • 43.2 kB
JavaScript
import {expect} from 'chai';
import {spec, storage} from 'modules/livewrappedBidAdapter.js';
import {config} from 'src/config.js';
import * as utils from 'src/utils.js';
import { BANNER, NATIVE, VIDEO } from 'src/mediaTypes.js';
describe('Livewrapped adapter tests', function () {
let sandbox,
bidderRequest;
beforeEach(function () {
sandbox = sinon.sandbox.create();
window.livewrapped = undefined;
bidderRequest = {
bidderCode: 'livewrapped',
auctionId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a',
bidderRequestId: '178e34bad3658f',
bids: [
{
bidder: 'livewrapped',
params: {
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']}
},
adUnitCode: 'panorama_d_1',
sizes: [[980, 240], [980, 120]],
bidId: '2ffb201a808da7',
bidderRequestId: '178e34bad3658f',
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D'
}
],
start: 1472239426002,
auctionStart: 1472239426000,
timeout: 5000
};
});
afterEach(function () {
sandbox.restore();
});
describe('isBidRequestValid', function() {
it('should accept a request with id only as valid', function() {
let bid = {params: {adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37'}};
let result = spec.isBidRequestValid(bid);
expect(result).to.be.true;
});
it('should accept a request with adUnitName and PublisherId as valid', function() {
let bid = {params: {adUnitName: 'panorama_d_1', publisherId: '26947112-2289-405D-88C1-A7340C57E63E'}};
let result = spec.isBidRequestValid(bid);
expect(result).to.be.true;
});
it('should accept a request with adUnitCode and PublisherId as valid', function() {
let bid = {adUnitCode: 'panorama_d_1', params: {publisherId: '26947112-2289-405D-88C1-A7340C57E63E'}};
let result = spec.isBidRequestValid(bid);
expect(result).to.be.true;
});
it('should accept a request with placementCode and PublisherId as valid', function() {
let bid = {placementCode: 'panorama_d_1', params: {publisherId: '26947112-2289-405D-88C1-A7340C57E63E'}};
let result = spec.isBidRequestValid(bid);
expect(result).to.be.true;
});
it('should not accept a request with adUnitName, adUnitCode, placementCode but no PublisherId as valid', function() {
let bid = {placementCode: 'panorama_d_1', adUnitCode: 'panorama_d_1', params: {adUnitName: 'panorama_d_1'}};
let result = spec.isBidRequestValid(bid);
expect(result).to.be.false;
});
});
describe('buildRequests', function() {
it('should make a well-formed single request object', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let result = spec.buildRequests(bidderRequest.bids, bidderRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed multiple request object', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let multiplebidRequest = clone(bidderRequest);
multiplebidRequest.bids.push(clone(bidderRequest.bids[0]));
multiplebidRequest.bids[1].adUnitCode = 'box_d_1';
multiplebidRequest.bids[1].sizes = [[300, 250]];
multiplebidRequest.bids[1].bidId = '3ffb201a808da7';
delete multiplebidRequest.bids[1].params.adUnitId;
let result = spec.buildRequests(multiplebidRequest.bids, multiplebidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}, {
callerAdUnitId: 'box_d_1',
bidId: '3ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 300, height: 250}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with AdUnitName', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
testbidRequest.bids[0].params.adUnitName = 'caller id 1';
delete testbidRequest.bids[0].params.adUnitId;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'caller id 1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with less parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with less parameters, no publisherId', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.publisherId;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with app parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].params.deviceId = 'deviceid';
testbidRequest.bids[0].params.ifa = 'ifa';
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
deviceId: 'deviceid',
ifa: 'ifa',
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with debug parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].params.tid = 'tracking id';
testbidRequest.bids[0].params.test = true;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
tid: 'tracking id',
test: true,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with optional parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].params.options = {keyvalues: [{key: 'key', value: 'value'}]};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}],
options: {keyvalues: [{key: 'key', value: 'value'}]}
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with ad blocker revovered parameter', function() {
sandbox.stub(utils, 'getWindowTop').returns({ I12C: { Morph: 1 } });
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
rcv: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with native only parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].mediaTypes = {'native': {'nativedata': 'content parsed serverside only'}};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}],
native: {'nativedata': 'content parsed serverside only'}
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with native and banner parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].mediaTypes = {'native': {'nativedata': 'content parsed serverside only'}, 'banner': {'sizes': [[980, 240], [980, 120]]}};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}],
native: {'nativedata': 'content parsed serverside only'},
banner: true
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make a well-formed single request object with video only parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].mediaTypes = {'video': {'videodata': 'content parsed serverside only'}};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}],
video: {'videodata': 'content parsed serverside only'}
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should use app objects', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.url;
let origGetConfig = config.getConfig;
sandbox.stub(config, 'getConfig').callsFake(function (key) {
if (key === 'app') {
return {bundle: 'bundle', domain: 'https://appdomain.com'};
}
if (key === 'device') {
return {ifa: 'ifa', width: 300, height: 200};
}
return origGetConfig.apply(config, arguments);
});
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://appdomain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 300,
height: 200,
ifa: 'ifa',
bundle: 'bundle',
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should use mediaTypes.banner.sizes before legacy sizes', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
delete testbidRequest.bids[0].params.seats;
delete testbidRequest.bids[0].params.adUnitId;
testbidRequest.bids[0].mediaTypes = {'banner': {'sizes': [[728, 90]]}};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
url: 'https://www.domain.com',
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 728, height: 90}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass gdpr true parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testRequest = clone(bidderRequest);
testRequest.gdprConsent = {
gdprApplies: true,
consentString: 'test'
};
let result = spec.buildRequests(testRequest.bids, testRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
gdprApplies: true,
gdprConsent: 'test',
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass gdpr false parameters', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testRequest = clone(bidderRequest);
testRequest.gdprConsent = {
gdprApplies: false
};
let result = spec.buildRequests(testRequest.bids, testRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
gdprApplies: false,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass us privacy parameter', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testRequest = clone(bidderRequest);
testRequest.uspConsent = '1---';
let result = spec.buildRequests(testRequest.bids, testRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
usPrivacy: '1---',
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass coppa parameter', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let origGetConfig = config.getConfig;
sandbox.stub(config, 'getConfig').callsFake(function (key) {
if (key === 'coppa') {
return true;
}
return origGetConfig.apply(config, arguments);
});
let result = spec.buildRequests(bidderRequest.bids, bidderRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
coppa: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass no cookie support', function() {
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => false);
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
let result = spec.buildRequests(bidderRequest.bids, bidderRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: false,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should pass no cookie support Safari', function() {
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => true);
let result = spec.buildRequests(bidderRequest.bids, bidderRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: false,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should use params.url, then config pageUrl, then bidderRequest.refererInfo.referer', function() {
let testRequest = clone(bidderRequest);
testRequest.refererInfo = {referer: 'https://www.topurl.com'};
let result = spec.buildRequests(testRequest.bids, testRequest);
let data = JSON.parse(result.data);
expect(data.url).to.equal('https://www.domain.com');
delete testRequest.bids[0].params.url;
result = spec.buildRequests(testRequest.bids, testRequest);
data = JSON.parse(result.data);
expect(data.url).to.equal('https://www.topurl.com');
let origGetConfig = config.getConfig;
sandbox.stub(config, 'getConfig').callsFake(function (key) {
if (key === 'pageUrl') {
return 'https://www.configurl.com';
}
return origGetConfig.apply(config, arguments);
});
result = spec.buildRequests(testRequest.bids, testRequest);
data = JSON.parse(result.data);
expect(data.url).to.equal('https://www.configurl.com');
});
it('should make use of pubcid if available', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
testbidRequest.bids[0].crumbs = {pubcid: 'pubcid 123'};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'pubcid 123',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
it('should make userId take precedence over pubcid', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
testbidRequest.bids[0].crumbs = {pubcid: 'pubcid 123'};
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(result.url).to.equal('https://lwadm.com/ad');
let expectedQuery = {
auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C',
publisherId: '26947112-2289-405D-88C1-A7340C57E63E',
userId: 'user id',
url: 'https://www.domain.com',
seats: {'dsp': ['seat 1']},
version: '1.4',
width: 100,
height: 100,
cookieSupport: true,
adRequests: [{
adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37',
callerAdUnitId: 'panorama_d_1',
bidId: '2ffb201a808da7',
transactionId: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D',
formats: [{width: 980, height: 240}, {width: 980, height: 120}]
}]
};
expect(data).to.deep.equal(expectedQuery);
});
});
it('should make use of user ids if available', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
delete testbidRequest.bids[0].params.userId;
testbidRequest.bids[0].userIdAsEids = [
{
'source': 'id5-sync.com',
'uids': [{
'id': 'ID5-id',
'atype': 1,
'ext': {
'linkType': 2
}
}]
},
{
'source': 'pubcid.org',
'uids': [{
'id': 'publisher-common-id',
'atype': 1
}]
}
];
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(data.rtbData.user.ext.eids).to.deep.equal(testbidRequest.bids[0].userIdAsEids);
});
it('should send schain object if available', function() {
sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false);
sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true);
let testbidRequest = clone(bidderRequest);
let schain = {
'ver': '1.0',
'complete': 1,
'nodes': [
{
'asi': 'directseller.com',
'sid': '00001',
'rid': 'BidRequest1',
'hp': 1
}
]
};
testbidRequest.bids[0].schain = schain;
let result = spec.buildRequests(testbidRequest.bids, testbidRequest);
let data = JSON.parse(result.data);
expect(data.schain).to.deep.equal(schain);
});
describe('interpretResponse', function () {
it('should handle single success response', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: '<span>ad</span>',
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120,
meta: undefined
}
],
currency: 'USD'
};
let expectedResponse = [{
requestId: '32e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 2.565917,
width: 300,
height: 250,
ad: '<span>ad</span>',
ttl: 120,
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: undefined
}];
let bids = spec.interpretResponse({body: lwResponse});
expect(bids).to.deep.equal(expectedResponse);
})
it('should handle single native success response', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: '{\'native\':\'native\'}',
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
native: {'native': 'native'},
ttl: 120,
meta: undefined
}
],
currency: 'USD'
};
let expectedResponse = [{
requestId: '32e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 2.565917,
width: 300,
height: 250,
ad: '{\'native\':\'native\'}',
ttl: 120,
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: undefined,
native: {'native': 'native'},
mediaType: NATIVE
}];
let bids = spec.interpretResponse({body: lwResponse});
expect(bids).to.deep.equal(expectedResponse);
})
it('should handle single video success response', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: 'VAST XML',
video: {},
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120,
meta: undefined
}
],
currency: 'USD'
};
let expectedResponse = [{
requestId: '32e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 2.565917,
width: 300,
height: 250,
ad: 'VAST XML',
ttl: 120,
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: undefined,
vastXml: 'VAST XML',
mediaType: VIDEO
}];
let bids = spec.interpretResponse({body: lwResponse});
expect(bids).to.deep.equal(expectedResponse);
})
it('should handle multiple success response', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: '<span>ad1</span>',
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120,
meta: undefined
},
{
id: '38e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_1',
tag: '<span>ad2</span>',
width: 980,
height: 240,
cpmBid: 3.565917,
bidId: '42e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '62cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120,
meta: undefined
}
],
currency: 'USD'
};
let expectedResponse = [{
requestId: '32e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 2.565917,
width: 300,
height: 250,
ad: '<span>ad1</span>',
ttl: 120,
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: undefined
}, {
requestId: '42e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 3.565917,
width: 980,
height: 240,
ad: '<span>ad2</span>',
ttl: 120,
creativeId: '62cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: undefined
}];
let bids = spec.interpretResponse({body: lwResponse});
expect(bids).to.deep.equal(expectedResponse);
})
it('should return meta-data', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: '<span>ad</span>',
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120,
meta: {metadata: 'metadata'}
}
],
currency: 'USD'
};
let expectedResponse = [{
requestId: '32e50fad901ae89',
bidderCode: 'livewrapped',
cpm: 2.565917,
width: 300,
height: 250,
ad: '<span>ad</span>',
ttl: 120,
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
netRevenue: true,
currency: 'USD',
meta: {metadata: 'metadata'}
}];
let bids = spec.interpretResponse({body: lwResponse});
expect(bids).to.deep.equal(expectedResponse);
})
it('should send debug-data to external debugger', function() {
let lwResponse = {
ads: [
{
id: '28e5ddf4-3c01-11e8-86a7-0a44794250d4',
callerId: 'site_outsider_0',
tag: '<span>ad</span>',
width: 300,
height: 250,
cpmBid: 2.565917,
bidId: '32e50fad901ae89',
auctionId: '13e674db-d4d8-4e19-9d28-ff38177db8bf',
creativeId: '52cbd598-2715-4c43-a06f-229fc170f945:427077',
ttl: 120
}
],
currency: 'USD',
dbg: 'debugdata'
};
let debugData;
window.livewrapped = {
s2sDebug: function(dbg) {
debugData = dbg;
}
};
spec.interpretResponse({body: lwResponse});
expect(debugData).to.equal(lwResponse.dbg);
})
});
describe('user sync', function () {
let serverResponses;
beforeEach(function () {
serverResponses = [{
body: {
pixels: [
{type: 'Redirect', url: 'https://pixelsync'},
{type: 'Iframe', url: 'https://iframesync'}
]
}
}];
});
it('should return empty if no server responses', function() {
let syncs = spec.getUserSyncs({
pixelEnabled: true,
iframeEnabled: true
}, []);
let expectedResponse = [];
expect(syncs).to.deep.equal(expectedResponse)
});
it('should return empty if no user sync', function() {
let syncs = spec.getUserSyncs({
pixelEnabled: true,
iframeEnabled: true
}, [{body: {}}]);
let expectedResponse = [];
expect(syncs).to.deep.equal(expectedResponse)
});
it('should returns pixel and iframe user sync', function() {
let syncs = spec.getUserSyncs({
pixelEnabled: true,
iframeEnabled: true
}, serverResponses);
let expectedResponse = [{type: 'image', url: 'https://pixelsync'}, {type: 'iframe', url: 'https://iframesync'}];
expect(syncs).to.deep.equal(expectedResponse)
});
it('should returns pixel only if iframe not supported user sync', function() {
let syncs = spec.getUserSyncs({
pixelEnabled: true,
iframeEnabled: false
}, serverResponses);
let expectedResponse = [{type: 'image', url: 'https://pixelsync'}];
expect(syncs).to.deep.equal(expectedResponse)
});
it('should returns iframe only if pixel not supported user sync', function() {
let syncs = spec.getUserSyncs({
pixelEnabled: false,
iframeEnabled: true
}, serverResponses);
let expectedResponse = [{type: 'iframe', url: 'https://iframesync'}];
expect(syncs).to.deep.equal(expectedResponse)
});
});
});
function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}