From ca85c21d8991dfdee34e297342c6110dfc1203c8 Mon Sep 17 00:00:00 2001 From: robertrmartinez Date: Thu, 16 Sep 2021 12:27:04 -0700 Subject: [PATCH] description not message --- modules/rubiconAnalyticsAdapter.js | 24 +-- .../modules/rubiconAnalyticsAdapter_spec.js | 171 ++++++++++-------- test/spec/modules/rubiconAnalyticsSchema.json | 7 +- 3 files changed, 112 insertions(+), 90 deletions(-) diff --git a/modules/rubiconAnalyticsAdapter.js b/modules/rubiconAnalyticsAdapter.js index d25401ee70f..0425925d132 100644 --- a/modules/rubiconAnalyticsAdapter.js +++ b/modules/rubiconAnalyticsAdapter.js @@ -43,7 +43,7 @@ const { } = CONSTANTS; let serverConfig; -config.getConfig('s2sConfig', ({s2sConfig}) => { +config.getConfig('s2sConfig', ({ s2sConfig }) => { serverConfig = s2sConfig; }); @@ -74,7 +74,7 @@ config.getConfig('rubicon', config => { export function getHostNameFromReferer(referer) { try { - rubiconAdapter.referrerHostname = utils.parseUrl(referer, {noDecodeWholeURL: true}).hostname; + rubiconAdapter.referrerHostname = utils.parseUrl(referer, { noDecodeWholeURL: true }).hostname; } catch (e) { utils.logError('Rubicon Analytics: Unable to parse hostname from supplied url: ', referer, e); rubiconAdapter.referrerHostname = ''; @@ -371,7 +371,7 @@ export function parseBidResponse(bid, previousBidResponse, auctionFloorData) { 'dimensions', () => { const width = bid.width || bid.playerWidth; const height = bid.height || bid.playerHeight; - return (width && height) ? {width, height} : undefined; + return (width && height) ? { width, height } : undefined; }, // Handling use case where pbs sends back 0 or '0' bidIds 'pbsBidId', pbsBidId => pbsBidId == 0 ? utils.generateUUID() : pbsBidId, @@ -472,7 +472,7 @@ function updateRpaCookie() { // possible that decodedRpaCookie is undefined, and if it is, we probably are blocked by storage or some other exception if (Object.keys(decodedRpaCookie).length) { decodedRpaCookie.lastSeen = currentTime; - decodedRpaCookie.fpkvs = {...decodedRpaCookie.fpkvs, ...getFpkvs()}; + decodedRpaCookie.fpkvs = { ...decodedRpaCookie.fpkvs, ...getFpkvs() }; decodedRpaCookie.pvid = rubiConf.pvid; setRpaCookie(decodedRpaCookie) } @@ -516,7 +516,7 @@ function subscribeToGamSlots() { }); } -let baseAdapter = adapter({analyticsType: 'endpoint'}); +let baseAdapter = adapter({ analyticsType: 'endpoint' }); let rubiconAdapter = Object.assign({}, baseAdapter, { MODULE_INITIALIZED_TIME: Date.now(), referrerHostname: '', @@ -566,7 +566,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { cache.gpt.registered = false; baseAdapter.disableAnalytics.apply(this, arguments); }, - track({eventType, args}) { + track({ eventType, args }) { switch (eventType) { case AUCTION_INIT: // set the rubicon aliases @@ -581,7 +581,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { cacheEntry.referrer = utils.deepAccess(args, 'bidderRequests.0.refererInfo.referer'); const floorData = utils.deepAccess(args, 'bidderRequests.0.bids.0.floorData'); if (floorData) { - cacheEntry.floorData = {...floorData}; + cacheEntry.floorData = { ...floorData }; } cacheEntry.gdprConsent = utils.deepAccess(args, 'bidderRequests.0.gdprConsent'); cacheEntry.session = storage.localStorageIsEnabled() && updateRpaCookie(); @@ -594,7 +594,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { cache.gpt.registered = true; window.googletag = window.googletag || {}; window.googletag.cmd = window.googletag.cmd || []; - window.googletag.cmd.push(function() { + window.googletag.cmd.push(function () { subscribeToGamSlots(); }); } @@ -674,7 +674,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { }, 'gam', () => { if (utils.deepAccess(bid, 'ortb2Imp.ext.data.adserver.name') === 'gam') { - return {adSlot: bid.ortb2Imp.ext.data.adserver.adslot} + return { adSlot: bid.ortb2Imp.ext.data.adserver.adslot } } }, 'pbAdSlot', () => utils.deepAccess(bid, 'ortb2Imp.ext.data.pbadslot'), @@ -688,7 +688,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { let auctionEntry = cache.auctions[args.auctionId]; if (!auctionEntry.bids[args.requestId] && args.originalRequestId) { - auctionEntry.bids[args.requestId] = {...auctionEntry.bids[args.originalRequestId]}; + auctionEntry.bids[args.requestId] = { ...auctionEntry.bids[args.originalRequestId] }; auctionEntry.bids[args.requestId].bidId = args.requestId; auctionEntry.bids[args.requestId].bidderDetail = args.targetingBidder; } @@ -700,7 +700,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { } // if we have not set enforcements yet set it if (!utils.deepAccess(auctionEntry, 'floorData.enforcements') && utils.deepAccess(args, 'floorData.enforcements')) { - auctionEntry.floorData.enforcements = {...args.floorData.enforcements}; + auctionEntry.floorData.enforcements = { ...args.floorData.enforcements }; } if (!bid) { utils.logError('Rubicon Anlytics Adapter Error: Could not find associated bid request for bid response with requestId: ', args.requestId); @@ -796,7 +796,7 @@ let rubiconAdapter = Object.assign({}, baseAdapter, { bid.status = 'error'; bid.error = { code: 'timeout-error', - message: 'marked by prebid.js as timeout' // will help us diff if timeout was set by PBS or PBJS + description: 'marked by prebid.js as timeout' // will help us diff if timeout was set by PBS or PBJS }; } }); diff --git a/test/spec/modules/rubiconAnalyticsAdapter_spec.js b/test/spec/modules/rubiconAnalyticsAdapter_spec.js index d8aa9ede9a5..3c6837b7d36 100644 --- a/test/spec/modules/rubiconAnalyticsAdapter_spec.js +++ b/test/spec/modules/rubiconAnalyticsAdapter_spec.js @@ -168,8 +168,8 @@ const floorMinRequest = { 'zoneId': '335918', 'userId': '12346', 'keywords': ['a', 'b', 'c'], - 'inventory': {'rating': '4-star', 'prodtype': 'tech'}, - 'visitor': {'ucat': 'new', 'lastsearch': 'iphone'}, + 'inventory': { 'rating': '4-star', 'prodtype': 'tech' }, + 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' }, 'position': 'atf' }, 'mediaTypes': { @@ -195,24 +195,24 @@ const MOCK = { 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa', 'timestamp': 1519767010567, 'auctionStatus': 'inProgress', - 'adUnits': [ { + 'adUnits': [{ 'code': '/19968336/header-bid-tag1', 'sizes': [[640, 480]], - 'bids': [ { + 'bids': [{ 'bidder': 'rubicon', 'params': { 'accountId': 1001, 'siteId': 113932, 'zoneId': 535512 } - } ], + }], 'transactionId': 'ca4af27a-6d02-4f90-949d-d5541fa12014' } ], 'adUnitCodes': ['/19968336/header-bid-tag1'], - 'bidderRequests': [ { + 'bidderRequests': [{ 'bidderCode': 'rubicon', 'auctionId': '25c6d7f5-699a-4bfc-87c9-996f915341fa', 'bidderRequestId': '1be65d7958826a', - 'bids': [ { + 'bids': [{ 'bidder': 'rubicon', 'params': { 'accountId': 1001, 'siteId': 113932, 'zoneId': 535512 @@ -259,7 +259,7 @@ const MOCK = { 'userId': '12346', 'keywords': ['a', 'b', 'c'], 'inventory': 'test', - 'visitor': {'ucat': 'new', 'lastsearch': 'iphone'}, + 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' }, 'position': 'btf', 'video': { 'language': 'en', @@ -296,8 +296,8 @@ const MOCK = { 'zoneId': '335918', 'userId': '12346', 'keywords': ['a', 'b', 'c'], - 'inventory': {'rating': '4-star', 'prodtype': 'tech'}, - 'visitor': {'ucat': 'new', 'lastsearch': 'iphone'}, + 'inventory': { 'rating': '4-star', 'prodtype': 'tech' }, + 'visitor': { 'ucat': 'new', 'lastsearch': 'iphone' }, 'position': 'atf' }, 'mediaTypes': { @@ -655,10 +655,10 @@ describe('rubicon analytics adapter', function () { expect(utils.logError.called).to.equal(true); }); - describe('config subscribe', function() { + describe('config subscribe', function () { it('should update the pvid if user asks', function () { expect(utils.generateUUID.called).to.equal(false); - config.setConfig({rubicon: {updatePageView: true}}); + config.setConfig({ rubicon: { updatePageView: true } }); expect(utils.generateUUID.called).to.equal(true); }); it('should merge in and preserve older set configs', function () { @@ -1148,7 +1148,7 @@ describe('rubicon analytics adapter', function () { describe('with session handling', function () { const expectedPvid = STUBBED_UUID.slice(0, 8); beforeEach(function () { - config.setConfig({rubicon: {updatePageView: true}}); + config.setConfig({ rubicon: { updatePageView: true } }); }); it('should not log any session data if local storage is not enabled', function () { @@ -1172,12 +1172,14 @@ describe('rubicon analytics adapter', function () { }); it('should should pass along custom rubicon kv and pvid when defined', function () { - config.setConfig({rubicon: { - fpkvs: { - source: 'fb', - link: 'email' + config.setConfig({ + rubicon: { + fpkvs: { + source: 'fb', + link: 'email' + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); let request = server.requests[0]; @@ -1187,22 +1189,24 @@ describe('rubicon analytics adapter', function () { let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE); expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8); expectedMessage.fpkvs = [ - {key: 'source', value: 'fb'}, - {key: 'link', value: 'email'} + { key: 'source', value: 'fb' }, + { key: 'link', value: 'email' } ] expect(message).to.deep.equal(expectedMessage); }); it('should convert kvs to strings before sending', function () { - config.setConfig({rubicon: { - fpkvs: { - number: 24, - boolean: false, - string: 'hello', - array: ['one', 2, 'three'], - object: {one: 'two'} + config.setConfig({ + rubicon: { + fpkvs: { + number: 24, + boolean: false, + string: 'hello', + array: ['one', 2, 'three'], + object: { one: 'two' } + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); let request = server.requests[0]; @@ -1212,24 +1216,26 @@ describe('rubicon analytics adapter', function () { let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE); expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8); expectedMessage.fpkvs = [ - {key: 'number', value: '24'}, - {key: 'boolean', value: 'false'}, - {key: 'string', value: 'hello'}, - {key: 'array', value: 'one,2,three'}, - {key: 'object', value: '[object Object]'} + { key: 'number', value: '24' }, + { key: 'boolean', value: 'false' }, + { key: 'string', value: 'hello' }, + { key: 'array', value: 'one,2,three' }, + { key: 'object', value: '[object Object]' } ] expect(message).to.deep.equal(expectedMessage); }); it('should use the query utm param rubicon kv value and pass updated kv and pvid when defined', function () { - sandbox.stub(utils, 'getWindowLocation').returns({'search': '?utm_source=other', 'pbjs_debug': 'true'}); + sandbox.stub(utils, 'getWindowLocation').returns({ 'search': '?utm_source=other', 'pbjs_debug': 'true' }); - config.setConfig({rubicon: { - fpkvs: { - source: 'fb', - link: 'email' + config.setConfig({ + rubicon: { + fpkvs: { + source: 'fb', + link: 'email' + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); let request = server.requests[0]; @@ -1239,8 +1245,8 @@ describe('rubicon analytics adapter', function () { let expectedMessage = utils.deepClone(ANALYTICS_MESSAGE); expectedMessage.session.pvid = STUBBED_UUID.slice(0, 8); expectedMessage.fpkvs = [ - {key: 'source', value: 'other'}, - {key: 'link', value: 'email'} + { key: 'source', value: 'other' }, + { key: 'link', value: 'email' } ] message.fpkvs.sort((left, right) => left.key < right.key); @@ -1260,11 +1266,13 @@ describe('rubicon analytics adapter', function () { }; getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage))); - config.setConfig({rubicon: { - fpkvs: { - link: 'email' // should merge this with what is in the localStorage! + config.setConfig({ + rubicon: { + fpkvs: { + link: 'email' // should merge this with what is in the localStorage! + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); let request = server.requests[0]; @@ -1279,8 +1287,8 @@ describe('rubicon analytics adapter', function () { pvid: expectedPvid } expectedMessage.fpkvs = [ - {key: 'source', value: 'tw'}, - {key: 'link', value: 'email'} + { key: 'source', value: 'tw' }, + { key: 'link', value: 'email' } ] expect(message).to.deep.equal(expectedMessage); @@ -1302,7 +1310,7 @@ describe('rubicon analytics adapter', function () { }); it('should overwrite matching localstorge value and use its remaining values', function () { - sandbox.stub(utils, 'getWindowLocation').returns({'search': '?utm_source=fb&utm_click=dog'}); + sandbox.stub(utils, 'getWindowLocation').returns({ 'search': '?utm_source=fb&utm_click=dog' }); // set some localStorage let inputlocalStorage = { @@ -1314,11 +1322,13 @@ describe('rubicon analytics adapter', function () { }; getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage))); - config.setConfig({rubicon: { - fpkvs: { - link: 'email' // should merge this with what is in the localStorage! + config.setConfig({ + rubicon: { + fpkvs: { + link: 'email' // should merge this with what is in the localStorage! + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); let request = server.requests[0]; @@ -1333,9 +1343,9 @@ describe('rubicon analytics adapter', function () { pvid: expectedPvid } expectedMessage.fpkvs = [ - {key: 'source', value: 'fb'}, - {key: 'link', value: 'email'}, - {key: 'click', value: 'dog'} + { key: 'source', value: 'fb' }, + { key: 'link', value: 'email' }, + { key: 'click', value: 'dog' } ] message.fpkvs.sort((left, right) => left.key < right.key); @@ -1371,11 +1381,13 @@ describe('rubicon analytics adapter', function () { }; getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage))); - config.setConfig({rubicon: { - fpkvs: { - link: 'email' // should merge this with what is in the localStorage! + config.setConfig({ + rubicon: { + fpkvs: { + link: 'email' // should merge this with what is in the localStorage! + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); @@ -1389,7 +1401,7 @@ describe('rubicon analytics adapter', function () { // the saved fpkvs should have been thrown out since session expired expectedMessage.fpkvs = [ - {key: 'link', value: 'email'} + { key: 'link', value: 'email' } ] expect(message).to.deep.equal(expectedMessage); @@ -1421,11 +1433,13 @@ describe('rubicon analytics adapter', function () { }; getDataFromLocalStorageStub.withArgs('rpaSession').returns(btoa(JSON.stringify(inputlocalStorage))); - config.setConfig({rubicon: { - fpkvs: { - link: 'email' // should merge this with what is in the localStorage! + config.setConfig({ + rubicon: { + fpkvs: { + link: 'email' // should merge this with what is in the localStorage! + } } - }}); + }); performStandardAuction(); expect(server.requests.length).to.equal(1); @@ -1439,7 +1453,7 @@ describe('rubicon analytics adapter', function () { // the saved fpkvs should have been thrown out since session expired expectedMessage.fpkvs = [ - {key: 'link', value: 'email'} + { key: 'link', value: 'email' } ] expect(message).to.deep.equal(expectedMessage); @@ -1465,7 +1479,7 @@ describe('rubicon analytics adapter', function () { let gptSlotRenderEnded0, gptSlotRenderEnded1; beforeEach(function () { mockGpt.enable(); - gptSlot0 = mockGpt.makeSlot({code: '/19968336/header-bid-tag-0'}); + gptSlot0 = mockGpt.makeSlot({ code: '/19968336/header-bid-tag-0' }); gptSlotRenderEnded0 = { eventName: 'slotRenderEnded', params: { @@ -1477,7 +1491,7 @@ describe('rubicon analytics adapter', function () { } }; - gptSlot1 = mockGpt.makeSlot({code: '/19968336/header-bid-tag1'}); + gptSlot1 = mockGpt.makeSlot({ code: '/19968336/header-bid-tag1' }); gptSlotRenderEnded1 = { eventName: 'slotRenderEnded', params: { @@ -1913,6 +1927,7 @@ describe('rubicon analytics adapter', function () { let timedOutBid = message.auctions[0].adUnits[0].bids[0]; expect(timedOutBid.status).to.equal('error'); expect(timedOutBid.error.code).to.equal('timeout-error'); + expect(timedOutBid.error.description).to.equal('prebid.js timeout'); expect(timedOutBid).to.not.have.property('bidResponse'); }); @@ -1993,7 +2008,7 @@ describe('rubicon analytics adapter', function () { // Now add the bidResponse hook which hooks on the currenct conversion function onto the bid response let innerBid; - addBidResponseHook(function(adCodeId, bid) { + addBidResponseHook(function (adCodeId, bid) { innerBid = bid; }, 'elementId', bidCopy); @@ -2006,9 +2021,11 @@ describe('rubicon analytics adapter', function () { describe('config with integration type', () => { it('should use the integration type provided in the config instead of the default', () => { - config.setConfig({rubicon: { - int_type: 'testType' - }}) + config.setConfig({ + rubicon: { + int_type: 'testType' + } + }) rubiconAnalyticsAdapter.enableAnalytics({ options: { @@ -2030,11 +2047,13 @@ describe('rubicon analytics adapter', function () { describe('wrapper details passed in', () => { it('should correctly pass in the wrapper details if provided', () => { - config.setConfig({rubicon: { - wrapperName: '1001_wrapperName_exp.4', - wrapperFamily: '1001_wrapperName', - rule_name: 'na-mobile' - }}); + config.setConfig({ + rubicon: { + wrapperName: '1001_wrapperName_exp.4', + wrapperFamily: '1001_wrapperName', + rule_name: 'na-mobile' + } + }); rubiconAnalyticsAdapter.enableAnalytics({ options: { diff --git a/test/spec/modules/rubiconAnalyticsSchema.json b/test/spec/modules/rubiconAnalyticsSchema.json index a8fdeae5268..39a33867edd 100644 --- a/test/spec/modules/rubiconAnalyticsSchema.json +++ b/test/spec/modules/rubiconAnalyticsSchema.json @@ -263,7 +263,9 @@ }, "isSlotEmpty": { "type": "boolean", - "enum": [true] + "enum": [ + true + ] } } }, @@ -369,6 +371,7 @@ }, "error": { "type": "object", + "additionalProperties": false, "required": [ "code" ], @@ -448,4 +451,4 @@ } } } -} +} \ No newline at end of file