From cc74ca986fe25e9fdc51738db0442ce0b1b7bd0e Mon Sep 17 00:00:00 2001 From: ProDev Date: Wed, 29 May 2019 13:27:10 +0000 Subject: [PATCH 1/3] feat(unruly-bid-adapter): use bidResponse siteId when configuring the renderer --- modules/unrulyBidAdapter.js | 2 +- test/spec/modules/unrulyBidAdapter_spec.js | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js index 5647d2cd6a3..45bf8858437 100644 --- a/modules/unrulyBidAdapter.js +++ b/modules/unrulyBidAdapter.js @@ -6,7 +6,7 @@ import { VIDEO } from '../src/mediaTypes' function configureUniversalTag (exchangeRenderer) { parent.window.unruly = parent.window.unruly || {}; parent.window.unruly['native'] = parent.window.unruly['native'] || {}; - parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.siteId; + parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.config.siteId; parent.window.unruly['native'].supplyMode = 'prebid'; } diff --git a/test/spec/modules/unrulyBidAdapter_spec.js b/test/spec/modules/unrulyBidAdapter_spec.js index e39f9a8e996..3b52f65e2a4 100644 --- a/test/spec/modules/unrulyBidAdapter_spec.js +++ b/test/spec/modules/unrulyBidAdapter_spec.js @@ -18,7 +18,10 @@ describe('UnrulyAdapter', function () { 'statusCode': statusCode, 'renderer': { 'id': 'unruly_inarticle', - 'config': {}, + 'config': { + 'siteId': 123456, + 'targetingUUID': 'xxx-yyy-zzz' + }, 'url': 'https://video.unrulymedia.com/native/prebid-loader.js' }, 'adUnitCode': adUnitCode @@ -157,7 +160,13 @@ describe('UnrulyAdapter', function () { expect(fakeRenderer.setRender.called).to.be.false; const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'}); - const mockRenderer = { url: 'value: mockRendererURL' }; + const mockRenderer = { + url: 'value: mockRendererURL', + config: { + siteId: 123456, + targetingUUID: 'xxx-yyy-zzz' + } + }; mockReturnedBid.ext.renderer = mockRenderer; const mockServerResponse = createExchangeResponse(mockReturnedBid); From 35ebd6c252a17f469500a9ab7b00bf7c9fa4aaf7 Mon Sep 17 00:00:00 2001 From: Rafal Pastuszak Date: Thu, 6 Jun 2019 15:10:32 +0000 Subject: [PATCH 2/3] feat(unruly-bid-adapter): bail if siteId is missing --- modules/unrulyBidAdapter.js | 3 ++ test/spec/modules/unrulyBidAdapter_spec.js | 43 +++++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js index 45bf8858437..fa23b264722 100644 --- a/modules/unrulyBidAdapter.js +++ b/modules/unrulyBidAdapter.js @@ -4,6 +4,9 @@ import { registerBidder } from '../src/adapters/bidderFactory' import { VIDEO } from '../src/mediaTypes' function configureUniversalTag (exchangeRenderer) { + if (!exchangeRenderer.config) throw new Error('UnrulyBidAdapter: Missing renderer config.') + if (!exchangeRenderer.config.siteId) throw new Error('UnrulyBidAdapter: Missing renderer siteId.') + parent.window.unruly = parent.window.unruly || {}; parent.window.unruly['native'] = parent.window.unruly['native'] || {}; parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.config.siteId; diff --git a/test/spec/modules/unrulyBidAdapter_spec.js b/test/spec/modules/unrulyBidAdapter_spec.js index 3b52f65e2a4..6a845f9fa9a 100644 --- a/test/spec/modules/unrulyBidAdapter_spec.js +++ b/test/spec/modules/unrulyBidAdapter_spec.js @@ -182,6 +182,37 @@ describe('UnrulyAdapter', function () { sinon.assert.calledWithExactly(fakeRenderer.setRender, sinon.match.func) }); + it('should throw if bidResponse renderer config is not available', function () { + expect(Renderer.install.called).to.be.false; + expect(fakeRenderer.setRender.called).to.be.false; + + const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'}); + const mockRenderer = { + url: 'value: mockRendererURL' + }; + mockReturnedBid.ext.renderer = mockRenderer; + const mockServerResponse = createExchangeResponse(mockReturnedBid); + + expect(() => adapter.interpretResponse(mockServerResponse)) + .to.throw('UnrulyBidAdapter: Missing renderer config.'); + }); + + it('should throw if siteId is not available', function () { + expect(Renderer.install.called).to.be.false; + expect(fakeRenderer.setRender.called).to.be.false; + + const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'}); + const mockRenderer = { + url: 'value: mockRendererURL', + config: {} + }; + mockReturnedBid.ext.renderer = mockRenderer; + const mockServerResponse = createExchangeResponse(mockReturnedBid); + + expect(() => adapter.interpretResponse(mockServerResponse)) + .to.throw('UnrulyBidAdapter: Missing renderer siteId.'); + }); + it('bid is placed on the bid queue when render is called', function () { const exchangeBid = createOutStreamExchangeBid({ adUnitCode: 'video', vastUrl: 'value: vastUrl' }); const exchangeResponse = createExchangeResponse(exchangeBid); @@ -200,7 +231,7 @@ describe('UnrulyAdapter', function () { expect(sentRendererConfig.vastUrl).to.equal('value: vastUrl'); expect(sentRendererConfig.renderer).to.equal(fakeRenderer); expect(sentRendererConfig.adUnitCode).to.equal('video') - }) + }); it('should ensure that renderer is placed in Prebid supply mode', function () { const mockExchangeBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'}); @@ -246,13 +277,13 @@ describe('UnrulyAdapter', function () { type: 'iframe', url: 'https://video.unrulymedia.com/iframes/third-party-iframes.html' }) - }) + }); it('should append consent params if gdpr does apply and consent is given', () => { const mockConsent = { gdprApplies: true, consentString: 'hello' - } + }; const response = {} const syncOptions = { iframeEnabled: true } const syncs = adapter.getUserSyncs(syncOptions, response, mockConsent) @@ -260,14 +291,14 @@ describe('UnrulyAdapter', function () { type: 'iframe', url: 'https://video.unrulymedia.com/iframes/third-party-iframes.html?gdpr=1&gdpr_consent=hello' }) - }) + }); it('should append consent param if gdpr applies and no consent is given', () => { const mockConsent = { gdprApplies: true, consentString: {} - } - const response = {} + }; + const response = {}; const syncOptions = { iframeEnabled: true } const syncs = adapter.getUserSyncs(syncOptions, response, mockConsent) expect(syncs[0]).to.deep.equal({ From d97238fe1706f17b8766653e094d8e686a658c1b Mon Sep 17 00:00:00 2001 From: Rafal Pastuszak Date: Fri, 7 Jun 2019 11:29:50 +0000 Subject: [PATCH 3/3] feat(unruly-bid-adapter): log (but don't throw) when siteId is no present --- modules/unrulyBidAdapter.js | 11 ++++++- test/spec/modules/unrulyBidAdapter_spec.js | 37 +++++++++++++++++----- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js index fa23b264722..580357a1978 100644 --- a/modules/unrulyBidAdapter.js +++ b/modules/unrulyBidAdapter.js @@ -38,9 +38,18 @@ const serverResponseToBid = (bid, rendererInstance) => ({ const buildPrebidResponseAndInstallRenderer = bids => bids - .filter(serverBid => !!utils.deepAccess(serverBid, 'ext.renderer')) + .filter(serverBid => { + const hasConfig = !!utils.deepAccess(serverBid, 'ext.renderer.config'); + const hasSiteId = !!utils.deepAccess(serverBid, 'ext.renderer.config.siteId'); + + if (!hasConfig) utils.logError(new Error('UnrulyBidAdapter: Missing renderer config.')); + if (!hasSiteId) utils.logError(new Error('UnrulyBidAdapter: Missing renderer siteId.')); + + return hasSiteId + }) .map(serverBid => { const exchangeRenderer = utils.deepAccess(serverBid, 'ext.renderer'); + configureUniversalTag(exchangeRenderer); configureRendererQueue(); diff --git a/test/spec/modules/unrulyBidAdapter_spec.js b/test/spec/modules/unrulyBidAdapter_spec.js index 6a845f9fa9a..cb30fcf1a9d 100644 --- a/test/spec/modules/unrulyBidAdapter_spec.js +++ b/test/spec/modules/unrulyBidAdapter_spec.js @@ -128,10 +128,10 @@ describe('UnrulyAdapter', function () { it('should be a function', function () { expect(typeof adapter.interpretResponse).to.equal('function'); }); - it('should return empty array when serverResponse is undefined', function () { + it('should return [] when serverResponse is undefined', function () { expect(adapter.interpretResponse()).to.deep.equal([]); }); - it('should return empty array when serverResponse has no bids', function () { + it('should return [] when serverResponse has no bids', function () { const mockServerResponse = { body: { bids: [] } }; expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([]) }); @@ -182,7 +182,9 @@ describe('UnrulyAdapter', function () { sinon.assert.calledWithExactly(fakeRenderer.setRender, sinon.match.func) }); - it('should throw if bidResponse renderer config is not available', function () { + it('should return [] and log if bidResponse renderer config is not available', function () { + sinon.assert.notCalled(utils.logError) + expect(Renderer.install.called).to.be.false; expect(fakeRenderer.setRender.called).to.be.false; @@ -193,11 +195,23 @@ describe('UnrulyAdapter', function () { mockReturnedBid.ext.renderer = mockRenderer; const mockServerResponse = createExchangeResponse(mockReturnedBid); - expect(() => adapter.interpretResponse(mockServerResponse)) - .to.throw('UnrulyBidAdapter: Missing renderer config.'); + expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([]); + + const logErrorCalls = utils.logError.getCalls(); + expect(logErrorCalls.length).to.equal(2); + + const [ configErrorCall, siteIdErrorCall ] = logErrorCalls; + + expect(configErrorCall.args.length).to.equal(1); + expect(configErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer config.'); + + expect(siteIdErrorCall.args.length).to.equal(1); + expect(siteIdErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer siteId.'); }); - it('should throw if siteId is not available', function () { + it('should return [] and log if siteId is not available', function () { + sinon.assert.notCalled(utils.logError) + expect(Renderer.install.called).to.be.false; expect(fakeRenderer.setRender.called).to.be.false; @@ -209,8 +223,15 @@ describe('UnrulyAdapter', function () { mockReturnedBid.ext.renderer = mockRenderer; const mockServerResponse = createExchangeResponse(mockReturnedBid); - expect(() => adapter.interpretResponse(mockServerResponse)) - .to.throw('UnrulyBidAdapter: Missing renderer siteId.'); + expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([]); + + const logErrorCalls = utils.logError.getCalls(); + expect(logErrorCalls.length).to.equal(1); + + const [ siteIdErrorCall ] = logErrorCalls; + + expect(siteIdErrorCall.args.length).to.equal(1); + expect(siteIdErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer siteId.'); }); it('bid is placed on the bid queue when render is called', function () {