From 2e1838d5cb6b5410e69b2f11392909e09d57d210 Mon Sep 17 00:00:00 2001 From: Faisal Islam Date: Tue, 11 Oct 2022 15:28:46 +0600 Subject: [PATCH 1/7] Made adapter changes: - add bidders to sync url when extend mode enabled - set ConsentedProvidersSettings when extend mode enabled - dynamically generated AD_SERVER_URL when publisherId available --- modules/improvedigitalBidAdapter.js | 89 ++++++++++++++----- .../modules/improvedigitalBidAdapter_spec.js | 62 +++++++++++++ 2 files changed, 127 insertions(+), 24 deletions(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index 044c27dc9e8..e90ff2ee646 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -24,8 +24,9 @@ import {loadExternalScript} from '../src/adloader.js'; const BIDDER_CODE = 'improvedigital'; const CREATIVE_TTL = 300; -const AD_SERVER_URL = 'https://ad.360yield.com/pb'; -const BASIC_ADS_URL = 'https://ad.360yield-basic.com/pb'; +const AD_SERVER_BASE_URL = 'https://ad.360yield.com'; +const BASIC_ADS_BASE_URL = 'https://ad.360yield-basic.com'; +const PB_ENDPOINT = 'pb'; const EXTEND_URL = 'https://pbs.360yield.com/openrtb2/auction'; const IFRAME_SYNC_URL = 'https://hb.360yield.com/prebid-universal-creative/load-cookie.html'; @@ -131,20 +132,6 @@ export const spec = { deepSetValue(request, 'regs.ext.gdpr', Number(gdprConsent.gdprApplies)); } deepSetValue(request, 'user.ext.consent', gdprConsent.consentString); - - // Additional Consent String - const additionalConsent = deepAccess(gdprConsent, 'addtlConsent'); - if (additionalConsent && additionalConsent.indexOf('~') !== -1) { - // Google Ad Tech Provider IDs - const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); - if (atpIds) { - deepSetValue( - request, - 'user.ext.consented_providers_settings.consented_providers', - atpIds.split('.').map(id => parseInt(id, 10)) - ); - } - } } // Timeout @@ -238,6 +225,14 @@ export const spec = { return []; } + const bidders = new Set(); + if (this.syncStore.extendMode && serverResponses) { + serverResponses.forEach(response => { + if (!response?.body?.ext?.responsetimemillis) return; + Object.keys(response.body.ext.responsetimemillis).forEach(b => bidders.add(b)) + }) + } + const syncs = []; if ((this.syncStore.extendMode || !syncOptions.pixelEnabled) && syncOptions.iframeEnabled) { const { gdprApplies, consentString } = gdprConsent || {}; @@ -248,7 +243,8 @@ export const spec = { (this.syncStore.extendMode ? '&pbs=1' : '') + (typeof gdprApplies === 'boolean' ? `&gdpr=${Number(gdprApplies)}` : '') + (consentString ? `&gdpr_consent=${consentString}` : '') + - (uspConsent ? `&us_privacy=${encodeURIComponent(uspConsent)}` : '') + (uspConsent ? `&us_privacy=${encodeURIComponent(uspConsent)}` : '') + + (bidders.size ? `&bidders=${[...bidders].join(',')}` : '') }); } else if (syncOptions.pixelEnabled) { serverResponses.forEach(response => { @@ -276,41 +272,86 @@ const ID_REQUEST = { const extendImps = []; const adServerImps = []; - function formatRequest(imps, transactionId, extendMode) { + function setAdditionalConsent(request, extendMode) { + if (bidderRequest?.gdprConsent?.addtlConsent) { + if (extendMode) { + deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent) + } else { + // Additional Consent String + const additionalConsent = bidderRequest.gdprConsent.addtlConsent; + if (additionalConsent && additionalConsent.indexOf('~') !== -1) { + // Google Ad Tech Provider IDs + const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); + if (atpIds) { + deepSetValue( + request, + 'user.ext.consented_providers_settings.consented_providers', + atpIds.split('.').map(id => parseInt(id, 10)) + ); + } + } + } + } + } + + function adServerUrl(extendMode, publisherId) { + if (extendMode) { + return EXTEND_URL; + } + + const urlSegments = []; + urlSegments.push(hasPurpose1Consent(bidderRequest?.gdprConsent) ? AD_SERVER_BASE_URL : BASIC_ADS_BASE_URL) + if (publisherId) { + urlSegments.push(publisherId) + } + urlSegments.push(PB_ENDPOINT) + + return urlSegments.join('/'); + } + + function formatRequest(imps, {transactionId, publisherId}, extendMode) { const request = deepClone(basicRequest); request.imp = imps; request.id = getUniqueIdentifierStr(); + setAdditionalConsent(request, extendMode); if (transactionId) { deepSetValue(request, 'source.tid', transactionId); } - const adServerUrl = hasPurpose1Consent(bidderRequest?.gdprConsent) ? AD_SERVER_URL : BASIC_ADS_URL; + return { method: 'POST', - url: extendMode ? EXTEND_URL : adServerUrl, + url: adServerUrl(extendMode, publisherId), data: JSON.stringify(request), bidderRequest } }; + let publisherId = null; bidRequests.map((bidRequest) => { - const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidRequest.params); + const bidParam = bidRequest.params; + const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidParam); const imp = this.buildImp(bidRequest, extendModeEnabled); + publisherId = bidParam?.publisherId; if (singleRequestMode) { extendModeEnabled ? extendImps.push(imp) : adServerImps.push(imp); } else { - requests.push(formatRequest([imp], bidRequest.transactionId, extendModeEnabled)); + requests.push(formatRequest([imp], {transactionId: bidRequest.transactionId, publisherId}, extendModeEnabled)); } }); if (!singleRequestMode) { return requests; } + const requestOptions = { + transactionId: bidderRequest.auctionId, + publisherId, + } // In the single request mode, split imps between those going to the ad server and those going to extend server if (extendImps.length) { - requests.push(formatRequest(extendImps, bidderRequest.auctionId, true)); + requests.push(formatRequest(extendImps, requestOptions, true)); } if (adServerImps.length) { - requests.push(formatRequest(adServerImps, bidderRequest.auctionId, false)); + requests.push(formatRequest(adServerImps, requestOptions, false)); } return requests; diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index d88266af386..af31e174620 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -810,6 +810,57 @@ describe('Improve Digital Adapter Tests', function () { expect(requests[0].url).to.equal(AD_SERVER_URL); expect(requests[1].url).to.equal(EXTEND_URL); }); + + it('should add ConsentedProvidersSettings when extend mode enabled', function () { + const bidRequest = deepClone(extendBidRequest); + const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); + expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); + expect(payload.user.ext.consent).to.equal('CONSENT'); + expect(payload.user.ext.ConsentedProvidersSettings.consented_providers).to.exist.and.to.deep.equal('1~1.35.41.101'); + expect(payload.user.ext.consented_providers_settings).to.not.exist; + }); + + it('should not add ConsentedProvidersSettings when extend mode disabled', function () { + const bidRequest = deepClone(simpleBidRequest); + const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); + expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); + expect(payload.user.ext.consent).to.equal('CONSENT'); + expect(payload.user.ext.ConsentedProvidersSettings).to.not.exist; + expect(payload.user.ext.consented_providers_settings.consented_providers).to.exist.and.to.deep.equal([1, 35, 41, 101]); + }); + + it('should add publisherId to request URL when available in request params', function() { + const bidRequest = deepClone(simpleBidRequest); + bidRequest.params.publisherId = 1000; + let request = spec.buildRequests([bidRequest], bidderRequest)[0]; + expect(request).to.be.an('object'); + expect(request.method).to.equal(METHOD); + expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); + expect(request.bidderRequest).to.deep.equal(bidderRequest); + + const bidRequest2 = deepClone(simpleBidRequest) + bidRequest2.params.publisherId = 1002; + getConfigStub = sinon.stub(config, 'getConfig'); + getConfigStub.withArgs('improvedigital.singleRequest').returns(true); + request = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; + expect(request.url).to.equal('https://ad.360yield.com/1002/pb'); + + const consent = deepClone(gdprConsent); + deepSetValue(consent, 'vendorData.purpose.consents.1', false); + const bidderRequestWithConsent = deepClone(bidderRequest); + bidderRequestWithConsent.gdprConsent = consent; + request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; + expect(request.url).to.equal('https://ad.360yield-basic.com/1000/pb'); + + deepSetValue(consent, 'vendorData.purpose.consents.1', true); + bidderRequestWithConsent.gdprConsent = consent; + request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; + expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); + + delete bidRequest.params.publisherId; + request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; + expect(request.url).to.equal('https://ad.360yield.com/pb'); + }); }); const serverResponse = { @@ -1347,5 +1398,16 @@ describe('Improve Digital Adapter Tests', function () { const syncs = spec.getUserSyncs({ iframeEnabled: true, pixelEnabled: true }, serverResponses); expect(syncs).to.deep.equal([{ type: 'iframe', url: basicIframeSyncUrl + '&pbs=1' }]); }); + + it('should add bidders to iframe user sync url', function () { + getConfigStub = sinon.stub(config, 'getConfig'); + getConfigStub.withArgs('improvedigital.extend').returns(true); + spec.buildRequests([simpleBidRequest], {}); + const rawResponse = deepClone(serverResponse) + deepSetValue(rawResponse, 'body.ext.responsetimemillis', {a: 1, b: 1, c: 1, d: 1, e: 1}) + let syncs = spec.getUserSyncs({ iframeEnabled: true, pixelEnabled: true }, [rawResponse]); + let url = basicIframeSyncUrl + '&pbs=1' + '&bidders=a,b,c,d,e' + expect(syncs).to.deep.equal([{ type: 'iframe', url }]); + }); }); }); From 491bc44ba4e55adceab483e8aeb213b8635fb818 Mon Sep 17 00:00:00 2001 From: Faisal Islam Date: Fri, 14 Oct 2022 15:48:56 +0600 Subject: [PATCH 2/7] Made adapter changes: - Single request mode: all placements must have the same publisherId --- modules/improvedigitalBidAdapter.js | 8 ++++++-- .../modules/improvedigitalBidAdapter_spec.js | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index e90ff2ee646..196caf2802e 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -331,11 +331,15 @@ const ID_REQUEST = { const bidParam = bidRequest.params; const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidParam); const imp = this.buildImp(bidRequest, extendModeEnabled); - publisherId = bidParam?.publisherId; if (singleRequestMode) { + if (!publisherId) { + publisherId = bidParam?.publisherId; + } else if (publisherId && bidParam?.publisherId && publisherId !== bidParam?.publisherId) { + throw new Error(`All placements must have the same publisherId. Please check your 'params.publisherId'`); + } extendModeEnabled ? extendImps.push(imp) : adServerImps.push(imp); } else { - requests.push(formatRequest([imp], {transactionId: bidRequest.transactionId, publisherId}, extendModeEnabled)); + requests.push(formatRequest([imp], {transactionId: bidRequest.transactionId, publisherId: bidParam?.publisherId}, extendModeEnabled)); } }); diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index af31e174620..1e5c7168a84 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -840,10 +840,25 @@ describe('Improve Digital Adapter Tests', function () { const bidRequest2 = deepClone(simpleBidRequest) bidRequest2.params.publisherId = 1002; + + const request1 = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; + expect(request1.url).to.equal('https://ad.360yield.com/1000/pb'); + const request2 = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[1]; + expect(request2.url).to.equal('https://ad.360yield.com/1002/pb'); + + // Enable single request mode getConfigStub = sinon.stub(config, 'getConfig'); getConfigStub.withArgs('improvedigital.singleRequest').returns(true); + try { + spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; + } catch (e) { + expect(e.name).to.exist.equal('Error') + expect(e.message).to.exist.equal(`All placements must have the same publisherId. Please check your 'params.publisherId'`) + } + + bidRequest2.params.publisherId = null; request = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; - expect(request.url).to.equal('https://ad.360yield.com/1002/pb'); + expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); const consent = deepClone(gdprConsent); deepSetValue(consent, 'vendorData.purpose.consents.1', false); From d9e3643b230f31096eadc333db29b1bcd0bb62e2 Mon Sep 17 00:00:00 2001 From: Faisal Islam Date: Tue, 18 Oct 2022 12:49:52 +0600 Subject: [PATCH 3/7] Made adapter changes: - Code refactored --- modules/improvedigitalBidAdapter.js | 46 ++++++++----------- .../modules/improvedigitalBidAdapter_spec.js | 11 +---- 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index 196caf2802e..7a5571f9f2d 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -272,25 +272,19 @@ const ID_REQUEST = { const extendImps = []; const adServerImps = []; - function setAdditionalConsent(request, extendMode) { - if (bidderRequest?.gdprConsent?.addtlConsent) { - if (extendMode) { - deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent) - } else { - // Additional Consent String - const additionalConsent = bidderRequest.gdprConsent.addtlConsent; - if (additionalConsent && additionalConsent.indexOf('~') !== -1) { - // Google Ad Tech Provider IDs - const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); - if (atpIds) { - deepSetValue( - request, - 'user.ext.consented_providers_settings.consented_providers', - atpIds.split('.').map(id => parseInt(id, 10)) - ); - } - } - } + function setAdditionalConsent(request) { + const additionalConsent = bidderRequest?.gdprConsent?.addtlConsent; + if (!additionalConsent) { + return; + } + deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', additionalConsent) + const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); + if (atpIds) { + deepSetValue( + request, + 'user.ext.consented_providers_settings.consented_providers', + atpIds.split('.').map(id => parseInt(id, 10)) + ); } } @@ -313,7 +307,7 @@ const ID_REQUEST = { const request = deepClone(basicRequest); request.imp = imps; request.id = getUniqueIdentifierStr(); - setAdditionalConsent(request, extendMode); + setAdditionalConsent(request); if (transactionId) { deepSetValue(request, 'source.tid', transactionId); } @@ -328,18 +322,18 @@ const ID_REQUEST = { let publisherId = null; bidRequests.map((bidRequest) => { - const bidParam = bidRequest.params; - const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidParam); + const bidParams = bidRequest.params; + const extendModeEnabled = this.isExtendModeEnabled(globalExtendMode, bidParams); const imp = this.buildImp(bidRequest, extendModeEnabled); if (singleRequestMode) { if (!publisherId) { - publisherId = bidParam?.publisherId; - } else if (publisherId && bidParam?.publisherId && publisherId !== bidParam?.publisherId) { - throw new Error(`All placements must have the same publisherId. Please check your 'params.publisherId'`); + publisherId = bidParams?.publisherId; + } else if (publisherId && bidParams?.publisherId && publisherId !== bidParams?.publisherId) { + throw new Error(`All Improve Digital placements in a single call must have the same publisherId. Please check your 'params.publisherId' or turn off the single request mode.`); } extendModeEnabled ? extendImps.push(imp) : adServerImps.push(imp); } else { - requests.push(formatRequest([imp], {transactionId: bidRequest.transactionId, publisherId: bidParam?.publisherId}, extendModeEnabled)); + requests.push(formatRequest([imp], {transactionId: bidRequest.transactionId, publisherId: bidParams?.publisherId}, extendModeEnabled)); } }); diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index 1e5c7168a84..625dc877ed4 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -817,15 +817,6 @@ describe('Improve Digital Adapter Tests', function () { expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); expect(payload.user.ext.consent).to.equal('CONSENT'); expect(payload.user.ext.ConsentedProvidersSettings.consented_providers).to.exist.and.to.deep.equal('1~1.35.41.101'); - expect(payload.user.ext.consented_providers_settings).to.not.exist; - }); - - it('should not add ConsentedProvidersSettings when extend mode disabled', function () { - const bidRequest = deepClone(simpleBidRequest); - const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); - expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); - expect(payload.user.ext.consent).to.equal('CONSENT'); - expect(payload.user.ext.ConsentedProvidersSettings).to.not.exist; expect(payload.user.ext.consented_providers_settings.consented_providers).to.exist.and.to.deep.equal([1, 35, 41, 101]); }); @@ -853,7 +844,7 @@ describe('Improve Digital Adapter Tests', function () { spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; } catch (e) { expect(e.name).to.exist.equal('Error') - expect(e.message).to.exist.equal(`All placements must have the same publisherId. Please check your 'params.publisherId'`) + expect(e.message).to.exist.equal(`All Improve Digital placements in a single call must have the same publisherId. Please check your 'params.publisherId' or turn off the single request mode.`) } bidRequest2.params.publisherId = null; From 773d299fc08648290cda4c1c9c69afbd61c43f53 Mon Sep 17 00:00:00 2001 From: Jozef Bartek Date: Tue, 18 Oct 2022 09:19:41 +0200 Subject: [PATCH 4/7] setAdditionalConsent changes --- modules/improvedigitalBidAdapter.js | 32 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index 7a5571f9f2d..cdb4eaac15d 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -272,19 +272,25 @@ const ID_REQUEST = { const extendImps = []; const adServerImps = []; - function setAdditionalConsent(request) { - const additionalConsent = bidderRequest?.gdprConsent?.addtlConsent; - if (!additionalConsent) { - return; - } - deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', additionalConsent) - const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); - if (atpIds) { - deepSetValue( - request, - 'user.ext.consented_providers_settings.consented_providers', - atpIds.split('.').map(id => parseInt(id, 10)) - ); + function setAdditionalConsent(request, extendMode) { + if (bidderRequest?.gdprConsent?.addtlConsent) { + if (extendMode) { + deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent) + } else { + // Additional Consent String + const additionalConsent = bidderRequest.gdprConsent.addtlConsent; + if (additionalConsent && additionalConsent.indexOf('~') !== -1) { + // Google Ad Tech Provider IDs + const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); + if (atpIds) { + deepSetValue( + request, + 'user.ext.consented_providers_settings.consented_providers', + atpIds.split('.').map(id => parseInt(id, 10)) + ); + } + } + } } } From 3a06f89b06d366be33ee1e42a145e5b4d32ce4c9 Mon Sep 17 00:00:00 2001 From: Jozef Bartek Date: Tue, 18 Oct 2022 09:20:45 +0200 Subject: [PATCH 5/7] setAdditionalConsent changes --- modules/improvedigitalBidAdapter.js | 33 +++++++++++++++-------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index cdb4eaac15d..b898e44454e 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -273,22 +273,23 @@ const ID_REQUEST = { const adServerImps = []; function setAdditionalConsent(request, extendMode) { - if (bidderRequest?.gdprConsent?.addtlConsent) { - if (extendMode) { - deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', bidderRequest.gdprConsent.addtlConsent) - } else { - // Additional Consent String - const additionalConsent = bidderRequest.gdprConsent.addtlConsent; - if (additionalConsent && additionalConsent.indexOf('~') !== -1) { - // Google Ad Tech Provider IDs - const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); - if (atpIds) { - deepSetValue( - request, - 'user.ext.consented_providers_settings.consented_providers', - atpIds.split('.').map(id => parseInt(id, 10)) - ); - } + const additionalConsent = bidderRequest?.gdprConsent?.addtlConsent; + if (!additionalConsent) { + return; + } + if (extendMode) { + deepSetValue(request, 'user.ext.ConsentedProvidersSettings.consented_providers', additionalConsent) + } else { + // Additional Consent String + if (additionalConsent && additionalConsent.indexOf('~') !== -1) { + // Google Ad Tech Provider IDs + const atpIds = additionalConsent.substring(additionalConsent.indexOf('~') + 1); + if (atpIds) { + deepSetValue( + request, + 'user.ext.consented_providers_settings.consented_providers', + atpIds.split('.').map(id => parseInt(id, 10)) + ); } } } From 917e0165c26c135ae8acd61f5cff36e3001b7c85 Mon Sep 17 00:00:00 2001 From: Faisal Islam Date: Tue, 18 Oct 2022 13:40:51 +0600 Subject: [PATCH 6/7] Made adapter changes: - Updated test cases --- modules/improvedigitalBidAdapter.js | 2 +- test/spec/modules/improvedigitalBidAdapter_spec.js | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index b898e44454e..147d5fc5902 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -314,7 +314,7 @@ const ID_REQUEST = { const request = deepClone(basicRequest); request.imp = imps; request.id = getUniqueIdentifierStr(); - setAdditionalConsent(request); + setAdditionalConsent(request, extendMode); if (transactionId) { deepSetValue(request, 'source.tid', transactionId); } diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index 625dc877ed4..d3f8d5fb5c7 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -817,6 +817,15 @@ describe('Improve Digital Adapter Tests', function () { expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); expect(payload.user.ext.consent).to.equal('CONSENT'); expect(payload.user.ext.ConsentedProvidersSettings.consented_providers).to.exist.and.to.deep.equal('1~1.35.41.101'); + expect(payload.user.ext.consented_providers_settings).to.not.exist; + }); + + it('should not add ConsentedProvidersSettings when extend mode disabled', function () { + const bidRequest = deepClone(simpleBidRequest); + const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); + expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); + expect(payload.user.ext.consent).to.equal('CONSENT'); + expect(payload.user.ext.ConsentedProvidersSettings).to.not.exist; expect(payload.user.ext.consented_providers_settings.consented_providers).to.exist.and.to.deep.equal([1, 35, 41, 101]); }); From 7bc0537361db8bf54cdd674e336dbb6c50a04257 Mon Sep 17 00:00:00 2001 From: Jozef Bartek Date: Tue, 18 Oct 2022 15:30:45 +0200 Subject: [PATCH 7/7] Updated tests --- .../modules/improvedigitalBidAdapter_spec.js | 63 ++++++++++--------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index d3f8d5fb5c7..39995332784 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -7,8 +7,11 @@ import { deepSetValue } from '../../../src/utils'; describe('Improve Digital Adapter Tests', function () { const METHOD = 'POST'; - const AD_SERVER_URL = 'https://ad.360yield.com/pb'; - const BASIC_ADS_URL = 'https://ad.360yield-basic.com/pb'; + const AD_SERVER_BASE_URL = 'https://ad.360yield.com'; + const BASIC_ADS_BASE_URL = 'https://ad.360yield-basic.com'; + const PB_ENDPOINT = 'pb'; + const AD_SERVER_URL = `${AD_SERVER_BASE_URL}/${PB_ENDPOINT}`; + const BASIC_ADS_URL = `${BASIC_ADS_BASE_URL}/${PB_ENDPOINT}`; const EXTEND_URL = 'https://pbs.360yield.com/openrtb2/auction'; const IFRAME_SYNC_URL = 'https://hb.360yield.com/prebid-universal-creative/load-cookie.html'; const INSTREAM_TYPE = 1; @@ -374,6 +377,7 @@ describe('Improve Digital Adapter Tests', function () { const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); expect(payload.user.ext.consent).to.equal('CONSENT'); + expect(payload.user.ext.ConsentedProvidersSettings).to.not.exist; expect(payload.user.ext.consented_providers_settings.consented_providers).to.exist.and.to.deep.equal([1, 35, 41, 101]); }); @@ -385,6 +389,15 @@ describe('Improve Digital Adapter Tests', function () { expect(payload.user.ext.consented_providers_settings).to.not.exist; }); + it('should add ConsentedProvidersSettings when extend mode enabled', function () { + const bidRequest = deepClone(extendBidRequest); + const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); + expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); + expect(payload.user.ext.consent).to.equal('CONSENT'); + expect(payload.user.ext.ConsentedProvidersSettings.consented_providers).to.exist.and.to.equal('1~1.35.41.101'); + expect(payload.user.ext.consented_providers_settings).to.not.exist; + }); + it('should add CCPA consent string', function () { const bidRequest = Object.assign({}, simpleBidRequest); const request = spec.buildRequests([bidRequest], {...bidderRequest, ...{ uspConsent: '1YYY' }}); @@ -811,40 +824,32 @@ describe('Improve Digital Adapter Tests', function () { expect(requests[1].url).to.equal(EXTEND_URL); }); - it('should add ConsentedProvidersSettings when extend mode enabled', function () { - const bidRequest = deepClone(extendBidRequest); - const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); - expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); - expect(payload.user.ext.consent).to.equal('CONSENT'); - expect(payload.user.ext.ConsentedProvidersSettings.consented_providers).to.exist.and.to.deep.equal('1~1.35.41.101'); - expect(payload.user.ext.consented_providers_settings).to.not.exist; - }); - - it('should not add ConsentedProvidersSettings when extend mode disabled', function () { - const bidRequest = deepClone(simpleBidRequest); - const payload = JSON.parse(spec.buildRequests([bidRequest], bidderRequestGdpr)[0].data); - expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1); - expect(payload.user.ext.consent).to.equal('CONSENT'); - expect(payload.user.ext.ConsentedProvidersSettings).to.not.exist; - expect(payload.user.ext.consented_providers_settings.consented_providers).to.exist.and.to.deep.equal([1, 35, 41, 101]); - }); - it('should add publisherId to request URL when available in request params', function() { + function formatPublisherUrl(baseUrl, publisherId) { + return `${baseUrl}/${publisherId}/${PB_ENDPOINT}`; + } const bidRequest = deepClone(simpleBidRequest); bidRequest.params.publisherId = 1000; let request = spec.buildRequests([bidRequest], bidderRequest)[0]; expect(request).to.be.an('object'); - expect(request.method).to.equal(METHOD); - expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); - expect(request.bidderRequest).to.deep.equal(bidderRequest); + sinon.assert.match(request, { + method: METHOD, + url: formatPublisherUrl(AD_SERVER_BASE_URL, 1000), + bidderRequest + }); const bidRequest2 = deepClone(simpleBidRequest) bidRequest2.params.publisherId = 1002; + const bidRequest3 = deepClone(extendBidRequest) + bidRequest3.params.publisherId = 1002; + const request1 = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; - expect(request1.url).to.equal('https://ad.360yield.com/1000/pb'); + expect(request1.url).to.equal(formatPublisherUrl(AD_SERVER_BASE_URL, 1000)); const request2 = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[1]; - expect(request2.url).to.equal('https://ad.360yield.com/1002/pb'); + expect(request2.url).to.equal(formatPublisherUrl(AD_SERVER_BASE_URL, 1002)); + const request3 = spec.buildRequests([bidRequest, bidRequest3], bidderRequest)[1]; + expect(request3.url).to.equal(EXTEND_URL); // Enable single request mode getConfigStub = sinon.stub(config, 'getConfig'); @@ -858,23 +863,23 @@ describe('Improve Digital Adapter Tests', function () { bidRequest2.params.publisherId = null; request = spec.buildRequests([bidRequest, bidRequest2], bidderRequest)[0]; - expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); + expect(request.url).to.equal(formatPublisherUrl(AD_SERVER_BASE_URL, 1000)); const consent = deepClone(gdprConsent); deepSetValue(consent, 'vendorData.purpose.consents.1', false); const bidderRequestWithConsent = deepClone(bidderRequest); bidderRequestWithConsent.gdprConsent = consent; request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; - expect(request.url).to.equal('https://ad.360yield-basic.com/1000/pb'); + expect(request.url).to.equal(formatPublisherUrl(BASIC_ADS_BASE_URL, 1000)); deepSetValue(consent, 'vendorData.purpose.consents.1', true); bidderRequestWithConsent.gdprConsent = consent; request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; - expect(request.url).to.equal('https://ad.360yield.com/1000/pb'); + expect(request.url).to.equal(formatPublisherUrl(AD_SERVER_BASE_URL, 1000)); delete bidRequest.params.publisherId; request = spec.buildRequests([bidRequest], bidderRequestWithConsent)[0]; - expect(request.url).to.equal('https://ad.360yield.com/pb'); + expect(request.url).to.equal(AD_SERVER_URL); }); });