From 8f6ebed57cbbb47435f2df84862f20a4496438ca Mon Sep 17 00:00:00 2001 From: Mihai Sandu Date: Tue, 22 Mar 2022 15:20:48 +0200 Subject: [PATCH 1/4] Invibes Bid Adapter: added support for LiD generation on Invibes servers --- modules/invibesBidAdapter.js | 74 +++++++++++++++++++-- test/spec/modules/invibesBidAdapter_spec.js | 70 +++++++++++++++++-- 2 files changed, 135 insertions(+), 9 deletions(-) diff --git a/modules/invibesBidAdapter.js b/modules/invibesBidAdapter.js index e83786f3857..8567d6caeaa 100644 --- a/modules/invibesBidAdapter.js +++ b/modules/invibesBidAdapter.js @@ -9,7 +9,7 @@ const CONSTANTS = { SYNC_ENDPOINT: 'https://k.r66net.com/GetUserSync', TIME_TO_LIVE: 300, DEFAULT_CURRENCY: 'EUR', - PREBID_VERSION: 7, + PREBID_VERSION: 8, METHOD: 'GET', INVIBES_VENDOR_ID: 436, USERID_PROVIDERS: ['pubcid', 'pubProvidedId', 'uid2', 'zeotapIdPlus', 'id5id'], @@ -95,7 +95,6 @@ function buildRequest(bidRequests, bidderRequest) { invibes.optIn = invibes.optIn || readGdprConsent(bidderRequest.gdprConsent); invibes.visitId = invibes.visitId || generateRandomId(); - invibes.noCookies = invibes.noCookies || invibes.getCookie('ivNoCookie'); let lid = initDomainId(invibes.domainOptions); const currentQueryStringParams = parseQueryStringParams(); @@ -129,7 +128,9 @@ function buildRequest(bidRequests, bidderRequest) { purposes: invibes.purposes.toString(), li: invibes.legitimateInterests.toString(), - tc: invibes.gdpr_consent + tc: invibes.gdpr_consent, + canPbWriteCookie: canPrebidWriteCookies(), + IvbsCDS: invibes.getCookie('IvbsCDS') }; if (lid) { @@ -172,6 +173,15 @@ function handleResponse(responseObj, bidRequests) { responseObj = responseObj.body || responseObj; responseObj = responseObj.videoAdContentResult || responseObj; + if (responseObj.ShouldSetLId && responseObj.LId) { + if ((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents) { + invibes.optIn = responseObj.PrivacyPolicyRule; + invibes.purposes = responseObj.TcModel.PurposeConsents; + } + + invibes.setCookie('ivbsdid', JSON.stringify(responseObj.LId), 365); + } + if (typeof invibes.bidResponse === 'object') { if (responseObj.MultipositionEnabled === true) { invibes.bidResponse.AdPlacements = invibes.bidResponse.AdPlacements.concat(responseObj.AdPlacements); @@ -528,7 +538,11 @@ function readGdprConsent(gdprConsent) { return 2; } - return 0; + // no gdpr module installed. AdWeb will decide if we can read cookies. + for (index = 0; index < invibes.purposes.length; ++index) { + invibes.purposes[index] = true; + } + return 1; } function tryCopyValueToArray(value, target, length) { @@ -644,6 +658,57 @@ invibes.getCookie = function (name) { return storage.getCookie(name); }; +invibes.setCookie = function(name, value, exdays, domain) { + if (!storage.cookiesAreEnabled()) { + return; + } + + if (!invibes.optIn || !invibes.purposes[0]) { + return; + } + + if (exdays > 365) { + exdays = 365; + } + + domain = domain || detectTopmostCookieDomain(); + let exdate = new Date(); + let exms = exdays * 24 * 60 * 60 * 1000; + exdate.setTime(exdate.getTime() + exms); + + storage.setCookie(name, value, exdays ? exdate.toUTCString() : '', null, domain); +} + +let canPrebidWriteCookies = function() { + if (!storage.cookiesAreEnabled()) { + return false; + } + + let testCookie = invibes.Uid.generate(); + storage.setCookie(testCookie, testCookie, 1, null); + var valueFromCookie = storage.getCookie(testCookie); + storage.setCookie(testCookie, '', -1, null); + + return valueFromCookie && valueFromCookie === testCookie; +} + +let detectTopmostCookieDomain = function () { + let testCookie = invibes.Uid.generate(); + let hostParts = location.hostname.split('.'); + if (hostParts.length === 1) { + return location.hostname; + } + for (let i = hostParts.length - 1; i >= 0; i--) { + let domain = '.' + hostParts.slice(i).join('.'); + invibes.setCookie(testCookie, testCookie, 1, domain); + let val = invibes.getCookie(testCookie); + if (val === testCookie) { + invibes.setCookie(testCookie, testCookie, -1, domain); + return domain; + } + } +}; + let initDomainId = function (options) { let cookiePersistence = { cname: 'ivbsdid', @@ -738,7 +803,6 @@ let keywords = (function () { export function resetInvibes() { invibes.optIn = undefined; - invibes.noCookies = undefined; invibes.dom = undefined; invibes.bidResponse = undefined; invibes.domainOptions = undefined; diff --git a/test/spec/modules/invibesBidAdapter_spec.js b/test/spec/modules/invibesBidAdapter_spec.js index ae7b30c9f81..ebd097ee743 100644 --- a/test/spec/modules/invibesBidAdapter_spec.js +++ b/test/spec/modules/invibesBidAdapter_spec.js @@ -301,8 +301,32 @@ describe('invibesBidAdapter:', function () { }); it('does not have capped ids if local storage variable is correctly formatted but no opt in', function () { + let bidderRequest = { + auctionStart: Date.now(), + gdprConsent: { + vendorData: { + gdprApplies: true, + hasGlobalConsent: false, + purpose: { + consents: { + 1: false, + 2: false, + 3: false, + 4: false, + 5: false, + 6: false, + 7: false, + 8: false, + 9: false, + 10: false + } + } + } + } + }; + localStorage.ivvcap = '{"9731":[1,1768600800000]}'; - const request = spec.buildRequests(bidRequests, {auctionStart: Date.now()}); + const request = spec.buildRequests(bidRequests, bidderRequest); expect(request.data.capCounts).to.equal(''); }); @@ -496,14 +520,14 @@ describe('invibesBidAdapter:', function () { let request = spec.buildRequests(bidRequests, bidderRequest); expect(request.data.li.split(',')[1] && request.data.li.split(',')[6]).to.equal('true'); }); - it('should send oi = 0 when vendorData is null', function () { + it('should send oi = 1 when vendorData is null (calculation will be performed by ADWEB)', function () { let bidderRequest = { gdprConsent: { vendorData: null } }; let request = spec.buildRequests(bidRequests, bidderRequest); - expect(request.data.oi).to.equal(0); + expect(request.data.oi).to.equal(1); }); it('should send oi = 2 when consent was approved on tcf v2', function () { @@ -962,7 +986,29 @@ describe('invibesBidAdapter:', function () { UseAdUnitCode: true }; - var buildResponse = function(placementId, cid, blcids, creativeId) { + var buildResponse = function(placementId, cid, blcids, creativeId, ShouldSetLId) { + if (ShouldSetLId) { + return { + MultipositionEnabled: true, + AdPlacements: [{ + Ads: [{ + BidPrice: 0.5, + VideoExposedId: creativeId, + Cid: cid, + Blcids: blcids + }], + BidModel: { + BidVersion: 1, + PlacementId: placementId, + AuctionStartTime: Date.now(), + CreativeHtml: '' + } + }], + ShouldSetLId: true, + LId: 'dvdjkams6nkq' + } + } + return { MultipositionEnabled: true, AdPlacements: [{ @@ -1066,6 +1112,22 @@ describe('invibesBidAdapter:', function () { }); }); + context('AdWeb generates LIDs', function() { + it('works when no LID is not sent from AdWeb', function() { + var firstResponse = buildResponse('12345', 1, [], 123); + + var firstResult = spec.interpretResponse({body: firstResponse}, {bidRequests}); + expect(firstResult[0].creativeId).to.equal(123); + }); + + it('sets lid when AdWeb sends it', function() { + var firstResponse = buildResponse('12345', 1, [], 123, true); + + spec.interpretResponse({body: firstResponse}, {bidRequests}); + expect(global.document.cookie.indexOf('ivbsdid')).to.greaterThanOrEqual(0); + }); + }); + context('in multiposition context, with conflicting ads', function() { it('registers the second ad when no conflict', function() { var firstResponse = buildResponse('12345', 1, [1], 123); From 52af639a5dc4b611a860a1dfd3897bfdf4f585ae Mon Sep 17 00:00:00 2001 From: Mihai Sandu Date: Thu, 14 Apr 2022 14:50:34 +0300 Subject: [PATCH 2/4] Invibes Bid Adapter: replaced all cookies storing with local storage removed cookie storing logic --- modules/invibesBidAdapter.js | 131 +++++++++++------------------------ 1 file changed, 40 insertions(+), 91 deletions(-) diff --git a/modules/invibesBidAdapter.js b/modules/invibesBidAdapter.js index 8567d6caeaa..b2724720eca 100644 --- a/modules/invibesBidAdapter.js +++ b/modules/invibesBidAdapter.js @@ -95,7 +95,6 @@ function buildRequest(bidRequests, bidderRequest) { invibes.optIn = invibes.optIn || readGdprConsent(bidderRequest.gdprConsent); invibes.visitId = invibes.visitId || generateRandomId(); - let lid = initDomainId(invibes.domainOptions); const currentQueryStringParams = parseQueryStringParams(); let userIdModel = getUserIds(_userId); @@ -112,7 +111,7 @@ function buildRequest(bidRequests, bidderRequest) { location: getDocumentLocation(topWin), videoAdHtmlId: generateRandomId(), showFallback: currentQueryStringParams['advs'] === '0', - ivbsCampIdsLocal: invibes.getCookie('IvbsCampIdsLocal'), + ivbsCampIdsLocal: readFromLocalStorage('IvbsCampIdsLocal'), bidParamsJson: JSON.stringify(bidParamsJson), capCounts: getCappedCampaignsAsString(), @@ -129,10 +128,20 @@ function buildRequest(bidRequests, bidderRequest) { li: invibes.legitimateInterests.toString(), tc: invibes.gdpr_consent, - canPbWriteCookie: canPrebidWriteCookies(), - IvbsCDS: invibes.getCookie('IvbsCDS') + isLocalStorageEnabled: storage.hasLocalStorage(), }; + let lid = readFromLocalStorage('ivbsdid'); + if(!lid){ + let str = invibes.getCookie('ivbsdid'); + if(str){ + try{ + let cookieLid = JSON.parse(str); + lid = cookieLid.id ? cookieLid.id : cookieLid; + }catch(e){ + } + } + } if (lid) { data.lId = lid; } @@ -173,15 +182,17 @@ function handleResponse(responseObj, bidRequests) { responseObj = responseObj.body || responseObj; responseObj = responseObj.videoAdContentResult || responseObj; - if (responseObj.ShouldSetLId && responseObj.LId) { - if ((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents) { + if(responseObj.ShouldSetLId && responseObj.LId){ + + if((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents ){ invibes.optIn = responseObj.PrivacyPolicyRule; invibes.purposes = responseObj.TcModel.PurposeConsents; } - invibes.setCookie('ivbsdid', JSON.stringify(responseObj.LId), 365); + setInLocalStorage('ivbsdid', responseObj.LId); } + if (typeof invibes.bidResponse === 'object') { if (responseObj.MultipositionEnabled === true) { invibes.bidResponse.AdPlacements = invibes.bidResponse.AdPlacements.concat(responseObj.AdPlacements); @@ -421,6 +432,23 @@ function renderCreative(bidModel) { .replace('creativeHtml', bidModel.CreativeHtml); } +function readFromLocalStorage(key){ + if (invibes.GdprModuleInstalled && (!invibes.optIn || !invibes.purposes[0])) { + return; + } + + return storage.getDataFromLocalStorage(key) || ''; +} + +function setInLocalStorage(key, value){ + if (!invibes.optIn || !invibes.purposes[0]) { + return; + } + + storage.setDataInLocalStorage(key, value); +} + + function getCappedCampaignsAsString() { const key = 'ivvcap'; @@ -481,21 +509,17 @@ function buildSyncUrl() { syncUrl += '?visitId=' + invibes.visitId; syncUrl += '&optIn=' + invibes.optIn; - const did = invibes.getCookie('ivbsdid'); + const did = readFromLocalStorage('ivbsdid'); if (did) { syncUrl += '&ivbsdid=' + encodeURIComponent(did); } - const bks = invibes.getCookie('ivvbks'); - if (bks) { - syncUrl += '&ivvbks=' + encodeURIComponent(bks); - } - return syncUrl; } function readGdprConsent(gdprConsent) { if (gdprConsent && gdprConsent.vendorData) { + invibes.GdprModuleInstalled = true; invibes.gdpr_consent = getVendorConsentData(gdprConsent.vendorData); if (!gdprConsent.vendorData.gdprApplies || gdprConsent.vendorData.hasGlobalConsent) { @@ -538,11 +562,8 @@ function readGdprConsent(gdprConsent) { return 2; } - // no gdpr module installed. AdWeb will decide if we can read cookies. - for (index = 0; index < invibes.purposes.length; ++index) { - invibes.purposes[index] = true; - } - return 1; + invibes.GdprModuleInstalled = false; + return 0; } function tryCopyValueToArray(value, target, length) { @@ -651,85 +672,13 @@ invibes.getCookie = function (name) { return; } - if (!invibes.optIn || !invibes.purposes[0]) { + if (invibes.GdprModuleInstalled && (!invibes.optIn || !invibes.purposes[0])) { return; } return storage.getCookie(name); }; -invibes.setCookie = function(name, value, exdays, domain) { - if (!storage.cookiesAreEnabled()) { - return; - } - - if (!invibes.optIn || !invibes.purposes[0]) { - return; - } - - if (exdays > 365) { - exdays = 365; - } - - domain = domain || detectTopmostCookieDomain(); - let exdate = new Date(); - let exms = exdays * 24 * 60 * 60 * 1000; - exdate.setTime(exdate.getTime() + exms); - - storage.setCookie(name, value, exdays ? exdate.toUTCString() : '', null, domain); -} - -let canPrebidWriteCookies = function() { - if (!storage.cookiesAreEnabled()) { - return false; - } - - let testCookie = invibes.Uid.generate(); - storage.setCookie(testCookie, testCookie, 1, null); - var valueFromCookie = storage.getCookie(testCookie); - storage.setCookie(testCookie, '', -1, null); - - return valueFromCookie && valueFromCookie === testCookie; -} - -let detectTopmostCookieDomain = function () { - let testCookie = invibes.Uid.generate(); - let hostParts = location.hostname.split('.'); - if (hostParts.length === 1) { - return location.hostname; - } - for (let i = hostParts.length - 1; i >= 0; i--) { - let domain = '.' + hostParts.slice(i).join('.'); - invibes.setCookie(testCookie, testCookie, 1, domain); - let val = invibes.getCookie(testCookie); - if (val === testCookie) { - invibes.setCookie(testCookie, testCookie, -1, domain); - return domain; - } - } -}; - -let initDomainId = function (options) { - let cookiePersistence = { - cname: 'ivbsdid', - load: function () { - let str = invibes.getCookie(this.cname) || ''; - try { - return JSON.parse(str); - } catch (e) { - } - } - }; - - options = options || {}; - - var persistence = options.persistence || cookiePersistence; - - let state = persistence.load(); - - return state ? (state.id || state.tempId) : undefined; -}; - let keywords = (function () { const cap = 300; let headTag = document.getElementsByTagName('head')[0]; From 5d9d76c003a65da113cfdc71dd6db209bf015b07 Mon Sep 17 00:00:00 2001 From: Mihai Sandu Date: Thu, 14 Apr 2022 15:16:56 +0300 Subject: [PATCH 3/4] invibesBidAdapter: applied lint formatting updated unit tests to reflect reading from localStorage --- modules/invibesBidAdapter.js | 34 +++++++++++++-------- test/spec/modules/invibesBidAdapter_spec.js | 17 ++++++++--- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/modules/invibesBidAdapter.js b/modules/invibesBidAdapter.js index b2724720eca..717a886a1f6 100644 --- a/modules/invibesBidAdapter.js +++ b/modules/invibesBidAdapter.js @@ -132,14 +132,14 @@ function buildRequest(bidRequests, bidderRequest) { }; let lid = readFromLocalStorage('ivbsdid'); - if(!lid){ + if (!lid) { let str = invibes.getCookie('ivbsdid'); - if(str){ - try{ + if (str) { + try { let cookieLid = JSON.parse(str); lid = cookieLid.id ? cookieLid.id : cookieLid; - }catch(e){ - } + } catch (e) { + } } } if (lid) { @@ -182,9 +182,8 @@ function handleResponse(responseObj, bidRequests) { responseObj = responseObj.body || responseObj; responseObj = responseObj.videoAdContentResult || responseObj; - if(responseObj.ShouldSetLId && responseObj.LId){ - - if((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents ){ + if (responseObj.ShouldSetLId && responseObj.LId) { + if ((!invibes.optIn || !invibes.purposes[0]) && responseObj.PrivacyPolicyRule && responseObj.TcModel && responseObj.TcModel.PurposeConsents) { invibes.optIn = responseObj.PrivacyPolicyRule; invibes.purposes = responseObj.TcModel.PurposeConsents; } @@ -192,7 +191,6 @@ function handleResponse(responseObj, bidRequests) { setInLocalStorage('ivbsdid', responseObj.LId); } - if (typeof invibes.bidResponse === 'object') { if (responseObj.MultipositionEnabled === true) { invibes.bidResponse.AdPlacements = invibes.bidResponse.AdPlacements.concat(responseObj.AdPlacements); @@ -432,7 +430,7 @@ function renderCreative(bidModel) { .replace('creativeHtml', bidModel.CreativeHtml); } -function readFromLocalStorage(key){ +function readFromLocalStorage(key) { if (invibes.GdprModuleInstalled && (!invibes.optIn || !invibes.purposes[0])) { return; } @@ -440,7 +438,7 @@ function readFromLocalStorage(key){ return storage.getDataFromLocalStorage(key) || ''; } -function setInLocalStorage(key, value){ +function setInLocalStorage(key, value) { if (!invibes.optIn || !invibes.purposes[0]) { return; } @@ -448,7 +446,6 @@ function setInLocalStorage(key, value){ storage.setDataInLocalStorage(key, value); } - function getCappedCampaignsAsString() { const key = 'ivvcap'; @@ -509,7 +506,18 @@ function buildSyncUrl() { syncUrl += '?visitId=' + invibes.visitId; syncUrl += '&optIn=' + invibes.optIn; - const did = readFromLocalStorage('ivbsdid'); + let did = readFromLocalStorage('ivbsdid'); + if (!did) { + let str = invibes.getCookie('ivbsdid'); + if (str) { + try { + let cookieLid = JSON.parse(str); + did = cookieLid.id ? cookieLid.id : cookieLid; + } catch (e) { + } + } + } + if (did) { syncUrl += '&ivbsdid=' + encodeURIComponent(did); } diff --git a/test/spec/modules/invibesBidAdapter_spec.js b/test/spec/modules/invibesBidAdapter_spec.js index ebd097ee743..303b9b5882f 100644 --- a/test/spec/modules/invibesBidAdapter_spec.js +++ b/test/spec/modules/invibesBidAdapter_spec.js @@ -527,7 +527,7 @@ describe('invibesBidAdapter:', function () { } }; let request = spec.buildRequests(bidRequests, bidderRequest); - expect(request.data.oi).to.equal(1); + expect(request.data.oi).to.equal(0); }); it('should send oi = 2 when consent was approved on tcf v2', function () { @@ -1185,22 +1185,29 @@ describe('invibesBidAdapter:', function () { it('returns an iframe with params if enabled', function () { top.window.invibes.optIn = 1; - global.document.cookie = 'ivvbks=17639.0,1,2'; let response = spec.getUserSyncs({iframeEnabled: true}); expect(response.type).to.equal('iframe'); expect(response.url).to.include(SYNC_ENDPOINT); expect(response.url).to.include('optIn'); - expect(response.url).to.include('ivvbks'); }); it('returns an iframe with params including if enabled', function () { top.window.invibes.optIn = 1; - global.document.cookie = 'ivvbks=17639.0,1,2;ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}'; + global.document.cookie = 'ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}'; + let response = spec.getUserSyncs({iframeEnabled: true}); + expect(response.type).to.equal('iframe'); + expect(response.url).to.include(SYNC_ENDPOINT); + expect(response.url).to.include('optIn'); + expect(response.url).to.include('ivbsdid'); + }); + + it('returns an iframe with params including if enabled read from LocalStorage', function () { + top.window.invibes.optIn = 1; + localStorage.ivbsdid = 'dvdjkams6nkq'; let response = spec.getUserSyncs({iframeEnabled: true}); expect(response.type).to.equal('iframe'); expect(response.url).to.include(SYNC_ENDPOINT); expect(response.url).to.include('optIn'); - expect(response.url).to.include('ivvbks'); expect(response.url).to.include('ivbsdid'); }); From dac5ea2ffee3ee8c0278d8f218c546d4df64077d Mon Sep 17 00:00:00 2001 From: Mihai Sandu Date: Wed, 11 May 2022 11:53:55 +0300 Subject: [PATCH 4/4] Update invibesBidAdapter_spec.js updated Invibes Bid Adapter unit tests to pass for when the default storage allowed will be changed. --- test/spec/modules/invibesBidAdapter_spec.js | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/spec/modules/invibesBidAdapter_spec.js b/test/spec/modules/invibesBidAdapter_spec.js index 303b9b5882f..39d6271606a 100644 --- a/test/spec/modules/invibesBidAdapter_spec.js +++ b/test/spec/modules/invibesBidAdapter_spec.js @@ -1,4 +1,5 @@ import {expect} from 'chai'; +import { config } from 'src/config.js'; import {spec, resetInvibes, stubDomainOptions, readGdprConsent} from 'modules/invibesBidAdapter.js'; describe('invibesBidAdapter:', function () { @@ -93,6 +94,17 @@ describe('invibesBidAdapter:', function () { } }; + let SetBidderAccess = function() { + config.setConfig({ + deviceAccess: true + }); + $$PREBID_GLOBAL$$.bidderSettings = { + invibes: { + storageAllowed: true + } + }; + } + beforeEach(function () { resetInvibes(); document.cookie = ''; @@ -100,6 +112,7 @@ describe('invibesBidAdapter:', function () { }); afterEach(function () { + $$PREBID_GLOBAL$$.bidderSettings = {}; this.cStub1.restore(); }); @@ -296,7 +309,10 @@ describe('invibesBidAdapter:', function () { top.window.invibes.optIn = 1; top.window.invibes.purposes = [true, false, false, false, false, false, false, false, false, false]; localStorage.ivvcap = '{"9731":[1,1768600800000]}'; + SetBidderAccess(); + const request = spec.buildRequests(bidRequests, {auctionStart: Date.now()}); + expect(request.data.capCounts).to.equal('9731=1'); }); @@ -393,6 +409,8 @@ describe('invibesBidAdapter:', function () { top.window.invibes.purposes = [true, false, false, false, false, false, false, false, false, false]; global.document.cookie = 'ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}'; let bidderRequest = {gdprConsent: {vendorData: {vendorConsents: {436: true}}}}; + SetBidderAccess(); + let request = spec.buildRequests(bidRequests, bidderRequest); expect(request.data.lId).to.exist; }); @@ -1194,6 +1212,8 @@ describe('invibesBidAdapter:', function () { it('returns an iframe with params including if enabled', function () { top.window.invibes.optIn = 1; global.document.cookie = 'ivbsdid={"id":"dvdjkams6nkq","cr":' + Date.now() + ',"hc":0}'; + SetBidderAccess(); + let response = spec.getUserSyncs({iframeEnabled: true}); expect(response.type).to.equal('iframe'); expect(response.url).to.include(SYNC_ENDPOINT); @@ -1204,6 +1224,8 @@ describe('invibesBidAdapter:', function () { it('returns an iframe with params including if enabled read from LocalStorage', function () { top.window.invibes.optIn = 1; localStorage.ivbsdid = 'dvdjkams6nkq'; + SetBidderAccess(); + let response = spec.getUserSyncs({iframeEnabled: true}); expect(response.type).to.equal('iframe'); expect(response.url).to.include(SYNC_ENDPOINT);