diff --git a/modules/adagioBidAdapter.js b/modules/adagioBidAdapter.js index 7ab2f0c98b1..2e4fdf5c7de 100644 --- a/modules/adagioBidAdapter.js +++ b/modules/adagioBidAdapter.js @@ -31,6 +31,7 @@ import {createEidsArray} from './userId/eids.js'; import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import {Renderer} from '../src/Renderer.js'; import {OUTSTREAM} from '../src/video.js'; +import { getGlobal } from '../src/prebidGlobal.js'; const BIDDER_CODE = 'adagio'; const LOG_PREFIX = 'Adagio:'; @@ -46,7 +47,6 @@ const MAX_SESS_DURATION = 30 * 60 * 1000; const ADAGIO_PUBKEY = 'AL16XT44Sfp+8SHVF1UdC7hydPSMVLMhsYknKDdwqq+0ToDSJrP0+Qh0ki9JJI2uYm/6VEYo8TJED9WfMkiJ4vf02CW3RvSWwc35bif2SK1L8Nn/GfFYr/2/GG/Rm0vUsv+vBHky6nuuYls20Og0HDhMgaOlXoQ/cxMuiy5QSktp'; const ADAGIO_PUBKEY_E = 65537; const CURRENCY = 'USD'; -const DEFAULT_FLOOR = 0.1; // This provide a whitelist and a basic validation // of OpenRTB 2.5 options used by the Adagio SSP. @@ -589,13 +589,13 @@ function _getFloors(bidRequest) { const info = bidRequest.getFloor({ currency: CURRENCY, mediaType, - size: [] + size }); floors.push(cleanObj({ mt: mediaType, s: isArray(size) ? `${size[0]}x${size[1]}` : undefined, - f: (!isNaN(info.floor) && info.currency === CURRENCY) ? info.floor : DEFAULT_FLOOR + f: (!isNaN(info.floor) && info.currency === CURRENCY) ? info.floor : undefined })); } @@ -869,7 +869,9 @@ function storeRequestInAdagioNS(bidRequest) { }], auctionId: bidRequest.auctionId, pageviewId: internal.getPageviewId(), - printNumber + printNumber, + localPbjs: '$$PREBID_GLOBAL$$', + localPbjsRef: getGlobal() }); // (legacy) Store internal adUnit information @@ -937,7 +939,45 @@ export const spec = { }); // Handle priceFloors module - bidRequest.floors = _getFloors(bidRequest); + const computedFloors = _getFloors(bidRequest); + if (isArray(computedFloors) && computedFloors.length) { + bidRequest.floors = computedFloors + + if (deepAccess(bidRequest, 'mediaTypes.banner')) { + const bannerObj = bidRequest.mediaTypes.banner + + const computeNewSizeArray = (sizeArr = []) => { + const size = { size: sizeArr, floor: null } + const bannerFloors = bidRequest.floors.filter(floor => floor.mt === BANNER) + const BannerSizeFloor = bannerFloors.find(floor => floor.s === sizeArr.join('x')) + size.floor = (bannerFloors) ? (BannerSizeFloor) ? BannerSizeFloor.f : bannerFloors[0].f : null + return size + } + + // `bannerSizes`, internal property name + bidRequest.mediaTypes.banner.bannerSizes = (isArray(bannerObj.sizes[0])) + ? bannerObj.sizes.map(sizeArr => { + return computeNewSizeArray(sizeArr) + }) + : computeNewSizeArray(bannerObj.sizes) + } + + if (deepAccess(bidRequest, 'mediaTypes.video')) { + const videoObj = bidRequest.mediaTypes.video + const videoFloors = bidRequest.floors.filter(floor => floor.mt === VIDEO); + const playerSize = (videoObj.playerSize && isArray(videoObj.playerSize[0])) ? videoObj.playerSize[0] : videoObj.playerSize + const videoSizeFloor = (playerSize) ? videoFloors.find(floor => floor.s === playerSize.join('x')) : undefined + + bidRequest.mediaTypes.video.floor = (videoFloors) ? videoSizeFloor ? videoSizeFloor.f : videoFloors[0].f : null + } + + if (deepAccess(bidRequest, 'mediaTypes.native')) { + const nativeFloors = bidRequest.floors.filter(floor => floor.mt === NATIVE); + if (nativeFloors.length) { + bidRequest.mediaTypes.native.floor = nativeFloors[0].f + } + } + } if (deepAccess(bidRequest, 'mediaTypes.video')) { _buildVideoBidRequest(bidRequest); diff --git a/modules/adyoulikeBidAdapter.js b/modules/adyoulikeBidAdapter.js index 6710448f00e..6fcce753596 100644 --- a/modules/adyoulikeBidAdapter.js +++ b/modules/adyoulikeBidAdapter.js @@ -350,14 +350,6 @@ function getTrackers(eventsArray, jsTrackers) { return result; } -function getVideoAd(response) { - var adJson = {}; - if (typeof response.Ad === 'string' && response.Ad.indexOf('\/\*PREBID\*\/') > 0) { - adJson = JSON.parse(response.Ad.match(/\/\*PREBID\*\/(.*)\/\*PREBID\*\//)[1]); - return deepAccess(adJson, 'Content.MainVideo.Vast'); - } -} - function getNativeAssets(response, nativeConfig) { if (typeof response.Native === 'object') { return response.Native; @@ -486,7 +478,7 @@ function createBid(response, bidRequests) { }; // retreive video response if present - const vast64 = response.Vast || getVideoAd(response); + const vast64 = response.Vast; if (vast64) { bid.width = response.Width; bid.height = response.Height; diff --git a/modules/asealBidAdapter.js b/modules/asealBidAdapter.js index 559afefa94b..855aee65f34 100644 --- a/modules/asealBidAdapter.js +++ b/modules/asealBidAdapter.js @@ -1,30 +1,77 @@ import { registerBidder } from '../src/adapters/bidderFactory.js'; import { BANNER } from '../src/mediaTypes.js'; import { config } from '../src/config.js'; +import { generateUUID, getWindowTop, getWindowSelf } from '../src/utils.js'; +import { getStorageManager } from '../src/storageManager.js'; export const BIDDER_CODE = 'aseal'; -const SUPPORTED_AD_TYPES = [BANNER]; +export const SUPPORTED_AD_TYPES = [BANNER]; export const API_ENDPOINT = 'https://tkprebid.aotter.net/prebid/adapter'; -export const HEADER_AOTTER_VERSION = 'prebid_0.0.1'; +export const WEB_SESSION_ID_KEY = '__tkwsid'; +export const HEADER_AOTTER_VERSION = 'prebid_0.0.2'; + +export const storage = getStorageManager({ bidderCode: BIDDER_CODE }); + +const getTrekWebSessionId = () => { + let wsid = + storage.localStorageIsEnabled() && + storage.getDataFromLocalStorage(WEB_SESSION_ID_KEY); + + if (!wsid) { + wsid = generateUUID(); + setTrekWebSessionId(wsid); + } + + return wsid; +}; + +const setTrekWebSessionId = (wsid) => { + if (storage.localStorageIsEnabled()) { + storage.setDataInLocalStorage(WEB_SESSION_ID_KEY, wsid); + } +}; + +const canAccessTopWindow = () => { + try { + return !!getWindowTop().location.href; + } catch (errro) { + return false; + } +}; export const spec = { code: BIDDER_CODE, aliases: ['aotter', 'trek'], supportedMediaTypes: SUPPORTED_AD_TYPES, - - isBidRequestValid: (bid) => !!bid.params.placeUid && typeof bid.params.placeUid === 'string', - + isBidRequestValid: (bid) => + !!bid.params.placeUid && typeof bid.params.placeUid === 'string', buildRequests: (validBidRequests, bidderRequest) => { if (validBidRequests.length === 0) { return []; } - const clientId = - config.getConfig('aseal.clientId') || ''; + const clientId = config.getConfig('aseal.clientId') || ''; + + const windowTop = getWindowTop(); + const windowSelf = getWindowSelf(); + + const w = canAccessTopWindow() ? windowTop : windowSelf; const data = { bids: validBidRequests, refererInfo: bidderRequest.refererInfo, + device: { + webSessionId: getTrekWebSessionId(), + }, + payload: { + meta: { + dr: w.document.referrer, + drs: windowSelf.document.referrer, + drt: (canAccessTopWindow() && windowTop.document.referrer) || '', + dt: w.document.title, + dl: w.location.href, + }, + }, }; const options = { @@ -36,14 +83,15 @@ export const spec = { }, }; - return [{ - method: 'POST', - url: API_ENDPOINT, - data, - options, - }]; + return [ + { + method: 'POST', + url: API_ENDPOINT, + data, + options, + }, + ]; }, - interpretResponse: (serverResponse, bidRequest) => { if (!Array.isArray(serverResponse.body)) { return []; diff --git a/modules/automatadBidAdapter.js b/modules/automatadBidAdapter.js index 726bbef9bd6..e3d0d87783a 100644 --- a/modules/automatadBidAdapter.js +++ b/modules/automatadBidAdapter.js @@ -18,7 +18,7 @@ export const spec = { isBidRequestValid: function (bid) { // will receive request bid. check if have necessary params for bidding - return (bid && bid.hasOwnProperty('params') && bid.params.hasOwnProperty('siteId') && bid.params.hasOwnProperty('placementId') && bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty('banner')) + return (bid && bid.hasOwnProperty('params') && bid.params.hasOwnProperty('siteId') && bid.params.siteId != null && bid.hasOwnProperty('mediaTypes') && bid.mediaTypes.hasOwnProperty('banner') && typeof bid.mediaTypes.banner == 'object') }, buildRequests: function (validBidRequests, bidderRequest) { @@ -29,16 +29,29 @@ export const spec = { const siteId = validBidRequests[0].params.siteId const impressions = validBidRequests.map(bidRequest => { - return { - id: bidRequest.bidId, - adUnitCode: bidRequest.adUnitCode, - placement: bidRequest.params.placementId, - banner: { - format: bidRequest.sizes.map(sizeArr => ({ - w: sizeArr[0], - h: sizeArr[1], - })) - }, + if (bidRequest.params.hasOwnProperty('placementId')) { + return { + id: bidRequest.bidId, + adUnitCode: bidRequest.adUnitCode, + placement: bidRequest.params.placementId, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1], + })) + }, + } + } else { + return { + id: bidRequest.bidId, + adUnitCode: bidRequest.adUnitCode, + banner: { + format: bidRequest.sizes.map(sizeArr => ({ + w: sizeArr[0], + h: sizeArr[1], + })) + }, + } } }) diff --git a/modules/automatadBidAdapter.md b/modules/automatadBidAdapter.md index 56a4b53c067..94bc707c75b 100644 --- a/modules/automatadBidAdapter.md +++ b/modules/automatadBidAdapter.md @@ -25,8 +25,8 @@ var adUnits = [ bids: [{ bidder: 'automatad', params: { - siteId: 'someValue', - placementId: 'someValue' + siteId: 'someValue', // required + placementId: 'someValue' // optional } }] } diff --git a/modules/insticatorBidAdapter.js b/modules/insticatorBidAdapter.js index 4122166a151..c967f530e75 100644 --- a/modules/insticatorBidAdapter.js +++ b/modules/insticatorBidAdapter.js @@ -72,17 +72,25 @@ function buildImpression(bidRequest) { ext.gpid = gpid; } + const instl = deepAccess(bidRequest, 'ortb2Imp.instl') + const secure = location.protocol === 'https:' ? 1 : 0; + const pos = deepAccess(bidRequest, 'mediaTypes.banner.pos'); + return { id: bidRequest.bidId, tagid: bidRequest.adUnitCode, + instl, + secure, banner: { format, + pos, }, ext, }; } function buildDevice() { + const deviceConfig = config.getConfig('device'); const device = { w: window.innerWidth, h: window.innerHeight, @@ -93,8 +101,6 @@ function buildDevice() { }, }; - const deviceConfig = config.getConfig('device'); - if (typeof deviceConfig === 'object') { Object.assign(device, deviceConfig); } @@ -115,13 +121,17 @@ function buildRegs(bidderRequest) { return {}; } -function buildUser() { +function buildUser(bid) { const userId = getUserId() || generateUUID(); + const yob = deepAccess(bid, 'params.user.yob') + const gender = deepAccess(bid, 'params.user.gender') setUserId(userId); return { id: userId, + yob, + gender, }; } @@ -158,7 +168,7 @@ function buildRequest(validBidRequests, bidderRequest) { }, device: buildDevice(), regs: buildRegs(bidderRequest), - user: buildUser(), + user: buildUser(validBidRequests[0]), imp: validBidRequests.map((bidRequest) => buildImpression(bidRequest)), ext: { insticator: { diff --git a/modules/jwplayerRtdProvider.js b/modules/jwplayerRtdProvider.js index 11337b2240f..9097a9627be 100644 --- a/modules/jwplayerRtdProvider.js +++ b/modules/jwplayerRtdProvider.js @@ -155,8 +155,10 @@ export function enrichAdUnits(adUnits, ortb2Fragments = {}) { if (!vat) { return; } - const contentId = getContentId(vat.mediaID); - const contentData = getContentData(vat.segments); + const mediaId = vat.mediaID; + const contentId = getContentId(mediaId); + const contentSegments = getContentSegments(vat.segments); + const contentData = getContentData(mediaId, contentSegments); const targeting = formatTargetingResponse(vat); enrichBids(ortb2Fragments.bidder || {}, adUnit.bids, targeting, contentId, contentData); }; @@ -263,7 +265,7 @@ export function getContentId(mediaID) { return 'jw_' + mediaID; } -export function getContentData(segments) { +export function getContentSegments(segments) { if (!segments || !segments.length) { return; } @@ -276,13 +278,29 @@ export function getContentData(segments) { return convertedSegments; }, []); - return { - name: 'jwplayer', - ext: { - segtax: 502 - }, - segment: formattedSegments + return formattedSegments; +} + +export function getContentData(mediaId, segments) { + if (!mediaId && !segments) { + return; + } + + const contentData = { + name: 'jwplayer.com', + ext: {} }; + + if (mediaId) { + contentData.ext.cids = [mediaId]; + } + + if (segments) { + contentData.segment = segments; + contentData.ext.segtax = 502; + } + + return contentData; } export function addOrtbSiteContent(bidderOrtb2, bid, contentId, contentData) { diff --git a/modules/jwplayerRtdProvider.md b/modules/jwplayerRtdProvider.md index 77f65909040..479829196ed 100644 --- a/modules/jwplayerRtdProvider.md +++ b/modules/jwplayerRtdProvider.md @@ -95,9 +95,10 @@ Example: content: { id: 'jw_abc123', data: [{ - name: 'jwplayer', + name: 'jwplayer.com', ext: { - segtax: 502 + segtax: 502, + cids: ['abc123'] }, segment: [{ id: '123' @@ -117,8 +118,9 @@ where: - `content` is an object containing metadata for the media. It may contain the following information: - `id` is a unique identifier for the specific media asset - `data` is an array containing segment taxonomy objects that have the following parameters: - - `name` is the `jwplayer` string indicating the provider name + - `name` is the `jwplayer.com` string indicating the provider name - `ext.segtax` whose `502` value is the unique identifier for JW Player's proprietary taxonomy + - `ext.cids` is an array containing the list of extended content ids as defined in [oRTB's community extensions](https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/extensions/community_extensions/extended-content-ids.md#example---content-id-and-seller-defined-context). - `segment` is an array containing the segment taxonomy values as an object where: - `id` is the string representation of the data segment value. diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js index e5dc24d1812..1fc42099f04 100644 --- a/modules/prebidServerBidAdapter/index.js +++ b/modules/prebidServerBidAdapter/index.js @@ -558,13 +558,16 @@ Object.assign(ORTB2.prototype, { const nativeParams = adUnit.nativeParams; let nativeAssets; if (nativeParams) { + let idCounter = -1; try { nativeAssets = nativeAssetCache[impressionId] = Object.keys(nativeParams).reduce((assets, type) => { let params = nativeParams[type]; function newAsset(obj) { + idCounter++; return Object.assign({ - required: params.required ? 1 : 0 + required: params.required ? 1 : 0, + id: (isNumber(params.id)) ? idCounter = params.id : idCounter }, obj ? cleanObj(obj) : {}); } diff --git a/modules/pubnxBidAdapter.md b/modules/pubnxBidAdapter.md deleted file mode 100644 index 6c843322402..00000000000 --- a/modules/pubnxBidAdapter.md +++ /dev/null @@ -1,31 +0,0 @@ -# Overview - -``` -Module Name: PubNX Bidder Adapter -Module Type: Bidder Adapter -Maintainer: prebid-team@pubnx.com -``` - -# Description - -Connects to PubNX exchange for bids. -PubNX Bidder adapter supports Banner ads. -Use bidder code ```pubnx``` for all PubNX traffic. - -# Test Parameters -``` -var adUnits = [ - // Banner adUnit - { - code: 'banner-div', - sizes: [[300, 250], [300,600]], // a display size(s) - bids: [{ - bidder: 'pubnx', - params: { - placementId: 'PNX-HB-G396432V4809F3' - } - }] - }, -]; -``` - diff --git a/test/spec/modules/adagioBidAdapter_spec.js b/test/spec/modules/adagioBidAdapter_spec.js index 45631251a4a..282033a8d49 100644 --- a/test/spec/modules/adagioBidAdapter_spec.js +++ b/test/spec/modules/adagioBidAdapter_spec.js @@ -677,6 +677,11 @@ describe('Adagio bid adapter', () => { expect(requests[0].data.adUnits[0].floors[0]).to.deep.equal({f: 1, mt: 'banner', s: '300x250'}); expect(requests[0].data.adUnits[0].floors[1]).to.deep.equal({f: 1, mt: 'banner', s: '300x600'}); expect(requests[0].data.adUnits[0].floors[2]).to.deep.equal({f: 1, mt: 'video', s: '600x480'}); + + expect(requests[0].data.adUnits[0].mediaTypes.banner.sizes.length).to.equal(2); + expect(requests[0].data.adUnits[0].mediaTypes.banner.bannerSizes[0]).to.deep.equal({size: [300, 250], floor: 1}); + expect(requests[0].data.adUnits[0].mediaTypes.banner.bannerSizes[1]).to.deep.equal({size: [300, 600], floor: 1}); + expect(requests[0].data.adUnits[0].mediaTypes.video.floor).to.equal(1); }); it('should get and set floor by mediatype if no size provided (ex native, video)', function() { @@ -700,6 +705,9 @@ describe('Adagio bid adapter', () => { expect(requests[0].data.adUnits[0].floors.length).to.equal(2); expect(requests[0].data.adUnits[0].floors[0]).to.deep.equal({f: 1, mt: 'video'}); expect(requests[0].data.adUnits[0].floors[1]).to.deep.equal({f: 1, mt: 'native'}); + + expect(requests[0].data.adUnits[0].mediaTypes.video.floor).to.equal(1); + expect(requests[0].data.adUnits[0].mediaTypes.native.floor).to.equal(1); }); it('should get and set floor with default value if no floors found', function() { @@ -713,12 +721,13 @@ describe('Adagio bid adapter', () => { }).withParams().build(); const bidderRequest = new BidderRequestBuilder().build(); bid01.getFloor = () => { - return { floor: NaN, currency: 'USD' } + return { floor: NaN, currency: 'USD', mt: 'video' } } const requests = spec.buildRequests([bid01], bidderRequest); expect(requests[0].data.adUnits[0].floors.length).to.equal(1); - expect(requests[0].data.adUnits[0].floors[0]).to.deep.equal({f: 0.1, mt: 'video'}); + expect(requests[0].data.adUnits[0].floors[0]).to.deep.equal({mt: 'video'}); + expect(requests[0].data.adUnits[0].mediaTypes.video.floor).to.be.undefined; }); }); }); diff --git a/test/spec/modules/asealBidAdapter_spec.js b/test/spec/modules/asealBidAdapter_spec.js index ef74dd3fc05..2dc1b47b7d0 100644 --- a/test/spec/modules/asealBidAdapter_spec.js +++ b/test/spec/modules/asealBidAdapter_spec.js @@ -1,120 +1,187 @@ import { expect } from 'chai'; -import { spec, BIDDER_CODE, API_ENDPOINT, HEADER_AOTTER_VERSION } from 'modules/asealBidAdapter.js'; +import { + spec, + BIDDER_CODE, + API_ENDPOINT, + HEADER_AOTTER_VERSION, + WEB_SESSION_ID_KEY, +} from 'modules/asealBidAdapter.js'; +import { getRefererInfo } from 'src/refererDetection.js'; import { newBidder } from 'src/adapters/bidderFactory.js'; import { config } from 'src/config.js'; +import * as utils from 'src/utils.js'; +import { storage } from 'modules/asealBidAdapter.js'; -const TEST_CLIENT_ID = 'TEST_CLIENT_ID' +const TEST_CLIENT_ID = 'TEST_CLIENT_ID'; +const TEST_WEB_SESSION_ID = 'TEST_WEB_SESSION_ID'; describe('asealBidAdapter', () => { const adapter = newBidder(spec); + let localStorageIsEnabledStub; + let getDataFromLocalStorageStub; + let sandbox; + let w; + + beforeEach((done) => { + localStorageIsEnabledStub = sinon.stub(storage, 'localStorageIsEnabled'); + getDataFromLocalStorageStub = sinon.stub( + storage, + 'getDataFromLocalStorage' + ); + + w = { + document: { + title: 'Aseal', + referrer: 'https://aseal.in/', + href: 'https://aseal.in/', + }, + location: { + href: 'https://aseal.in/', + }, + }; + + sandbox = sinon.sandbox.create(); + sandbox.stub(utils, 'getWindowTop').returns(w); + sandbox.stub(utils, 'getWindowSelf').returns(w); + done(); + }); + + afterEach(() => { + localStorageIsEnabledStub.restore(); + getDataFromLocalStorageStub.restore(); + sandbox.restore(); + config.resetConfig(); + }); + describe('inherited functions', () => { it('exists and is a function', () => { - expect(adapter.callBids).to.exist.and.to.be.a('function') - }) + expect(adapter.callBids).to.exist.and.to.be.a('function'); + }); }); describe('isBidRequestValid', () => { const bid = { bidder: 'aseal', params: { - placeUid: '123' - } + placeUid: '123', + }, }; it('should return true when required params found', () => { - expect(spec.isBidRequestValid(bid)).to.equal(true) + expect(spec.isBidRequestValid(bid)).to.equal(true); }); it('should return false when required param placeUid is not passed', () => { bid.params = { - placeUid: '' - } - expect(spec.isBidRequestValid(bid)).to.equal(false) + placeUid: '', + }; + expect(spec.isBidRequestValid(bid)).to.equal(false); }); it('should return false when required param placeUid is wrong type', () => { bid.params = { - placeUid: null - } - expect(spec.isBidRequestValid(bid)).to.equal(false) + placeUid: null, + }; + expect(spec.isBidRequestValid(bid)).to.equal(false); }); it('should return false when required params are not passed', () => { let bid = Object.assign({}, bid); delete bid.params; bid.params = {}; - expect(spec.isBidRequestValid(bid)).to.equal(false) - }) + expect(spec.isBidRequestValid(bid)).to.equal(false); + }); }); describe('buildRequests', () => { - afterEach(() => { - config.resetConfig(); - }); - it('should return an empty array when there are no bid requests', () => { - const bidRequests = [] - const request = spec.buildRequests(bidRequests) + const bidRequests = []; + const request = spec.buildRequests(bidRequests); - expect(request).to.be.an('array').that.is.empty + expect(request).to.be.an('array').that.is.empty; }); it('should send `x-aotter-clientid` header as empty string when user not set config `clientId`', () => { - const bidRequests = [{ - bidder: BIDDER_CODE, - params: { - placeUid: '123' - } - }] - - const bidderRequest = {} + const bidRequests = [ + { + bidder: BIDDER_CODE, + params: { + placeUid: '123', + }, + }, + ]; + + const bidderRequest = {}; const request = spec.buildRequests(bidRequests, bidderRequest)[0]; - expect(request.options.customHeaders['x-aotter-clientid']).equal('') - }) + expect(request.options.customHeaders['x-aotter-clientid']).equal(''); + }); it('should send bid requests to ENDPOINT via POST', () => { - const bidRequests = [{ - bidder: BIDDER_CODE, - params: { - placeUid: '123' - } - }] + const bidRequests = [ + { + bidder: BIDDER_CODE, + params: { + placeUid: '123', + }, + }, + ]; const bidderRequest = { - refererInfo: { - referer: 'https://aseal.in/', - } - } + refererInfo: getRefererInfo(), + }; config.setConfig({ aseal: { - clientId: TEST_CLIENT_ID - } + clientId: TEST_CLIENT_ID, + }, }); + + localStorageIsEnabledStub.returns(true); + getDataFromLocalStorageStub + .withArgs(WEB_SESSION_ID_KEY) + .returns(TEST_WEB_SESSION_ID); + const request = spec.buildRequests(bidRequests, bidderRequest)[0]; + utils.getWindowTop.restore(); + utils.getWindowSelf.restore(); + + sandbox.stub(utils, 'getWindowTop').returns(w); + sandbox.stub(utils, 'getWindowSelf').returns(w); + + const payload = { + meta: { + dr: w.document.referrer, + drs: w.document.referrer, + drt: w.document.referrer, + dt: w.document.title, + dl: w.location.href, + }, + }; + expect(request.url).to.equal(API_ENDPOINT); - expect(request.method).to.equal('POST') + expect(request.method).to.equal('POST'); expect(request.options).deep.equal({ contentType: 'application/json', withCredentials: true, customHeaders: { 'x-aotter-clientid': TEST_CLIENT_ID, 'x-aotter-version': HEADER_AOTTER_VERSION, - } + }, }); - expect(request.data).deep.equal({ - bids: bidRequests, - refererInfo: bidderRequest.refererInfo, + expect(request.data.bids).deep.equal(bidRequests); + expect(request.data.payload).deep.equal(payload); + expect(request.data.device).deep.equal({ + webSessionId: TEST_WEB_SESSION_ID, }); }); }); describe('interpretResponse', () => { it('should return an empty array when there are no bids', () => { - const serverResponse = {} + const serverResponse = {}; const response = spec.interpretResponse(serverResponse); expect(response).is.an('array').that.is.empty; @@ -122,23 +189,25 @@ describe('asealBidAdapter', () => { it('should get correct bid response', () => { const serverResponse = { - body: [{ - requestId: '2ef08f145b7a4f', - cpm: 3, - width: 300, - height: 250, - creativeId: '123abc', - dealId: '123abc', - currency: 'USD', - netRevenue: false, - mediaType: 'banner', - ttl: 300, - ad: '' - }] - } + body: [ + { + requestId: '2ef08f145b7a4f', + cpm: 3, + width: 300, + height: 250, + creativeId: '123abc', + dealId: '123abc', + currency: 'USD', + netRevenue: false, + mediaType: 'banner', + ttl: 300, + ad: '', + }, + ], + }; const response = spec.interpretResponse(serverResponse); expect(response).deep.equal(serverResponse.body); }); - }) + }); }); diff --git a/test/spec/modules/automatadBidAdapter_spec.js b/test/spec/modules/automatadBidAdapter_spec.js index 4a15209822b..09bfb96e8b9 100644 --- a/test/spec/modules/automatadBidAdapter_spec.js +++ b/test/spec/modules/automatadBidAdapter_spec.js @@ -5,7 +5,25 @@ import { newBidder } from 'src/adapters/bidderFactory.js' describe('automatadBidAdapter', function () { const adapter = newBidder(spec) - let bidRequest = { + let bidRequestRequiredParams = { + bidder: 'automatad', + params: {siteId: '123ad'}, + mediaTypes: { + banner: { + sizes: [[300, 600]], + } + }, + adUnitCode: 'some-ad-unit-code', + transactionId: '1465569e-52cc-4c36-88a1-7174cfef4b44', + sizes: [[300, 600]], + bidId: '123abc', + bidderRequestId: '3213887463c059', + auctionId: 'abc-123', + src: 'client', + bidRequestsCount: 1 + } + + let bidRequestAllParams = { bidder: 'automatad', params: {siteId: '123ad', placementId: '123abc345'}, mediaTypes: { @@ -59,10 +77,14 @@ describe('automatadBidAdapter', function () { }) describe('isBidRequestValid', function () { - let inValidBid = Object.assign({}, bidRequest) + let inValidBid = Object.assign({}, bidRequestRequiredParams) delete inValidBid.params it('should return true if all params present', function () { - expect(spec.isBidRequestValid(bidRequest)).to.equal(true) + expect(spec.isBidRequestValid(bidRequestAllParams)).to.equal(true) + }) + + it('should return true if only required params present', function() { + expect(spec.isBidRequestValid(bidRequestRequiredParams)).to.equal(true) }) it('should return false if any parameter missing', function () { @@ -71,7 +93,7 @@ describe('automatadBidAdapter', function () { }) describe('buildRequests', function () { - let req = spec.buildRequests([ bidRequest ], { refererInfo: { } }) + let req = spec.buildRequests([ bidRequestRequiredParams ], { refererInfo: { } }) let rdata it('should return request object', function () { @@ -87,9 +109,9 @@ describe('automatadBidAdapter', function () { expect(rdata.imp.length).to.equal(1) }) - it('should include placement', function () { + it('should include siteId', function () { let r = rdata.imp[0] - expect(r.placement !== null).to.be.true + expect(r.siteId !== null).to.be.true }) it('should include media types', function () { @@ -97,11 +119,6 @@ describe('automatadBidAdapter', function () { expect(r.media_types !== null).to.be.true }) - it('should include all publisher params', function () { - let r = rdata.imp[0] - expect(r.siteID !== null && r.placementID !== null).to.be.true - }) - it('should include adunit code', function () { let r = rdata.imp[0] expect(r.adUnitCode !== null).to.be.true diff --git a/test/spec/modules/insticatorBidAdapter_spec.js b/test/spec/modules/insticatorBidAdapter_spec.js index e14207ba3e0..03e034f060a 100644 --- a/test/spec/modules/insticatorBidAdapter_spec.js +++ b/test/spec/modules/insticatorBidAdapter_spec.js @@ -1,7 +1,6 @@ import { expect } from 'chai'; import { spec, storage } from '../../../modules/insticatorBidAdapter.js'; import { newBidder } from 'src/adapters/bidderFactory.js' -import { userSync } from '../../../src/userSync.js'; const USER_ID_KEY = 'hb_insticator_uid'; const USER_ID_DUMMY_VALUE = '74f78609-a92d-4cf1-869f-1b244bbfb5d2'; @@ -18,15 +17,21 @@ describe('InsticatorBidAdapter', function () { adUnitCode: 'adunit-code', params: { adUnitId: '1a2b3c4d5e6f1a2b3c4d', + user: { + yob: 1984, + gender: 'M' + }, }, sizes: [[300, 250], [300, 600]], mediaTypes: { banner: { - sizes: [[300, 250], [300, 600]] + sizes: [[300, 250], [300, 600]], + pos: 4, } }, bidId: '30b31c1838de1e', ortb2Imp: { + instl: 1, ext: { gpid: '1111/homepage' } @@ -91,16 +96,16 @@ describe('InsticatorBidAdapter', function () { }); it('should return false if there is no adUnitId param', () => { - expect(spec.isBidRequestValid({...bidRequest, ...{params: {}}})).to.be.false; + expect(spec.isBidRequestValid({ ...bidRequest, ...{ params: {} } })).to.be.false; }); it('should return false if there is no mediaTypes', () => { - expect(spec.isBidRequestValid({...bidRequest, ...{mediaTypes: {}}})).to.be.false; + expect(spec.isBidRequestValid({ ...bidRequest, ...{ mediaTypes: {} } })).to.be.false; }); it('should return false if there are no banner sizes and no sizes', () => { bidRequest.mediaTypes.banner = {}; - expect(spec.isBidRequestValid({...bidRequest, ...{sizes: {}}})).to.be.false; + expect(spec.isBidRequestValid({ ...bidRequest, ...{ sizes: {} } })).to.be.false; }); it('should return true if there is sizes and no banner sizes', () => { @@ -109,7 +114,7 @@ describe('InsticatorBidAdapter', function () { it('should return true if there is banner sizes and no sizes', () => { bidRequest.mediaTypes.banner.sizes = [[300, 250], [300, 600]]; - expect(spec.isBidRequestValid({...bidRequest, ...{sizes: {}}})).to.be.true; + expect(spec.isBidRequestValid({ ...bidRequest, ...{ sizes: {} } })).to.be.true; }); }); @@ -207,6 +212,10 @@ describe('InsticatorBidAdapter', function () { expect(data.regs.ext.gdprConsentString).to.equal(bidderRequest.gdprConsent.consentString); expect(data.user).to.be.an('object'); expect(data.user.id).to.equal(USER_ID_DUMMY_VALUE); + expect(data.user).to.have.property('yob'); + expect(data.user.yob).to.equal(1984); + expect(data.user).to.have.property('gender'); + expect(data.user.gender).to.equal('M'); expect(data.user.ext).to.have.property('eids'); expect(data.user.ext.eids).to.deep.equal([ { @@ -223,10 +232,12 @@ describe('InsticatorBidAdapter', function () { expect(data.imp).to.deep.equal([{ id: bidRequest.bidId, tagid: bidRequest.adUnitCode, + instl: 1, + secure: 0, banner: { format: [ - {w: 300, h: 250}, - {w: 300, h: 600}, + { w: 300, h: 250 }, + { w: 300, h: 600 }, ] }, ext: { @@ -256,7 +267,7 @@ describe('InsticatorBidAdapter', function () { expect(data.user.id).to.equal(USER_ID_STUBBED); }); it('should return empty regs object if no gdprConsent is passed', function () { - const requests = spec.buildRequests([bidRequest], {...bidderRequest, ...{gdprConsent: false}}); + const requests = spec.buildRequests([bidRequest], { ...bidderRequest, ...{ gdprConsent: false } }); const data = JSON.parse(requests[0].data); expect(data.regs).to.be.an('object').that.is.empty; }); @@ -384,14 +395,12 @@ describe('InsticatorBidAdapter', function () { width: 300, height: 200, mediaType: 'banner', - meta: { - advertiserDomains: [ - 'test1.com' - ], - test: 1 - }, ad: 'adm1', adUnitCode: 'adunit-code-1', + meta: { + advertiserDomains: ['test1.com'], + test: 1 + } }, { requestId: 'bid2', diff --git a/test/spec/modules/jwplayerRtdProvider_spec.js b/test/spec/modules/jwplayerRtdProvider_spec.js index 5ffd43668a6..ad866aadfa6 100644 --- a/test/spec/modules/jwplayerRtdProvider_spec.js +++ b/test/spec/modules/jwplayerRtdProvider_spec.js @@ -1,6 +1,6 @@ import { fetchTargetingForMediaId, getVatFromCache, extractPublisherParams, formatTargetingResponse, getVatFromPlayer, enrichAdUnits, addTargetingToBid, - fetchTargetingInformation, jwplayerSubmodule, getContentId, getContentData } from 'modules/jwplayerRtdProvider.js'; + fetchTargetingInformation, jwplayerSubmodule, getContentId, getContentSegments, getContentData } from 'modules/jwplayerRtdProvider.js'; import { server } from 'test/mocks/xhr.js'; import {addOrtbSiteContent} from '../../../modules/jwplayerRtdProvider'; @@ -498,26 +498,62 @@ describe('jwplayerRtdProvider', function() { }); }); - describe('Get Content Data', function () { + describe('Get Content Segments', function () { it('returns undefined when segments are empty', function () { - let data = getContentData(null); - expect(data).to.be.undefined; - data = getContentData(undefined); - expect(data).to.be.undefined; - data = getContentData([]); - expect(data).to.be.undefined; + let contentSegments = getContentSegments(null); + expect(contentSegments).to.be.undefined; + contentSegments = getContentSegments(undefined); + expect(contentSegments).to.be.undefined; + contentSegments = getContentSegments([]); + expect(contentSegments).to.be.undefined; }); it('returns proper format', function () { const segment1 = 'segment1'; const segment2 = 'segment2'; const segment3 = 'segment3'; - const data = getContentData([segment1, segment2, segment3]); - expect(data).to.have.property('name', 'jwplayer'); - expect(data.ext).to.have.property('segtax', 502); - expect(data.segment[0]).to.deep.equal({ id: segment1, value: segment1 }); - expect(data.segment[1]).to.deep.equal({ id: segment2, value: segment2 }); - expect(data.segment[2]).to.deep.equal({ id: segment3, value: segment3 }); + const contentSegments = getContentSegments([segment1, segment2, segment3]); + expect(contentSegments[0]).to.deep.equal({ id: segment1, value: segment1 }); + expect(contentSegments[1]).to.deep.equal({ id: segment2, value: segment2 }); + expect(contentSegments[2]).to.deep.equal({ id: segment3, value: segment3 }); + }); + }); + + describe('Get Content Data', function () { + it('should return proper format', function () { + const testMediaId = 'test_media_id'; + const testSegments = [{ id: 1 }, { id: 2 }]; + const contentData = getContentData(testMediaId, testSegments); + expect(contentData).to.have.property('name', 'jwplayer.com'); + expect(contentData.ext).to.have.property('segtax', 502); + expect(contentData.ext).to.have.property('cids'); + expect(contentData.ext.cids).to.have.length(1); + expect(contentData.ext.cids[0]).to.equal(testMediaId); + expect(contentData.segment).to.deep.equal(testSegments); + }); + + it('should only set segtax and segment when segments are provided', function () { + const testMediaId = 'test_media_id'; + const contentData = getContentData(testMediaId); + expect(contentData).to.have.property('name', 'jwplayer.com'); + expect(contentData.ext.segtax).to.be.undefined; + expect(contentData.ext).to.have.property('cids'); + expect(contentData.ext.cids).to.have.length(1); + expect(contentData.ext.cids[0]).to.equal(testMediaId); + expect(contentData.segment).to.be.undefined; + }); + + it('should only set cids when a media id is provided', function () { + const testSegments = [{ id: 1 }, { id: 2 }]; + const contentData = getContentData(null, testSegments); + expect(contentData).to.have.property('name', 'jwplayer.com'); + expect(contentData.ext).to.have.property('segtax', 502); + expect(contentData.ext).to.not.have.property('cids'); + expect(contentData.segment).to.deep.equal(testSegments); + }); + + it('should return undefined when no params are provided', function () { + expect(getContentData()).to.be.undefined; }); }); diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js index 5204df9dd49..e4706ba3514 100644 --- a/test/spec/modules/prebidServerBidAdapter_spec.js +++ b/test/spec/modules/prebidServerBidAdapter_spec.js @@ -1279,12 +1279,14 @@ describe('S2S Adapter', function () { 'assets': [ { 'required': 1, + 'id': 0, 'title': { 'len': 800 } }, { 'required': 1, + 'id': 1, 'img': { 'type': 3, 'w': 989, @@ -1293,6 +1295,7 @@ describe('S2S Adapter', function () { }, { 'required': 1, + 'id': 2, 'img': { 'type': 1, 'wmin': 10, @@ -1304,6 +1307,7 @@ describe('S2S Adapter', function () { }, { 'required': 1, + 'id': 3, 'data': { 'type': 1 }