From 53dc6a909b1c0a318853aa66816abfb3dead9f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Wed, 11 Sep 2024 12:00:25 +0200 Subject: [PATCH 01/16] drafy of adapter --- modules/equativBidAdapter.js | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 modules/equativBidAdapter.js diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js new file mode 100644 index 00000000000..3330b78d62f --- /dev/null +++ b/modules/equativBidAdapter.js @@ -0,0 +1,113 @@ +import {BANNER} from '../src/mediaTypes.js'; +import {ortbConverter} from '../libraries/ortbConverter/converter.js'; +import {registerBidder} from '../src/adapters/bidderFactory.js'; +import {deepAccess, deepSetValue, mergeDeep} from '../src/utils.js'; + +/** + * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid + * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest + */ + +registerBidder({ + code: 'equativ', + gvlid: 45, + supportedMediaTypes: [BANNER], + + /** + * @param bidRequests + * @param bidderRequest + * @returns {ServerRequest[]} + */ + buildRequests: (bidRequests, bidderRequest) => { + return { + data: converter.toORTB({bidderRequest, bidRequests}), + method: 'POST', + // url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169' + url: 'https://feature-ssb-engine-pips-2655-testenv.internal.smartadserver.com/api/bid?callerId=169' + }; + }, + + /** + * @param serverResponse + * @param bidRequest + * @return {Bid[]} + */ + interpretResponse: (serverResponse, bidRequest) => converter.fromORTB({request: bidRequest.data, response: serverResponse.body}), + + /** + * @param bidRequest + * @return {boolean} + */ + isBidRequestValid: (bidRequest) => { + return !(!bidRequest.params.networkId && + !deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') && + !deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') && + !deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id')); + }, + + /** + * @param syncOptions + * @param serverResponses + * @return {{type: (string), url: (*|string)}[]} + */ + getUserSyncs: (syncOptions, serverResponses) => { + if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { + return { + type: 'iframe', + url: serverResponses[0].body.cSyncUrl + }; + } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { + serverResponses[0].body.dspPixels.forEach((pixel) => { + return { + type: 'image', + url: pixel + }; + }); + } + } +}); + +const converter = ortbConverter({ + context: { + netRevenue: true, + ttl: 300 + }, + + imp(buildImp, bidRequest, context) { + const imp = buildImp(bidRequest, context); + const { siteId, pageId, formatId } = bidRequest.params; + + if (siteId || pageId || formatId) { + const bidder = {}; + + if (siteId) { + bidder.siteId = siteId; + } + + if (pageId) { + bidder.pageId = pageId; + } + + if (formatId) { + bidder.formatId = formatId; + } + + mergeDeep(imp, { + ext: { bidder } + }); + } + + return imp; + }, + + request(buildRequest, imps, bidderRequest, context) { + const bid = context.bidRequests[0]; + const req = buildRequest(imps, bidderRequest, context); + + if (bid.params.networkId) { + deepSetValue(req, 'site.publisher.id', bid.params.networkId); + } + + return req; + } +}); From 2019004d3c9e8b4e64a2a10feb5411411d2974bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Thu, 12 Sep 2024 13:33:20 +0200 Subject: [PATCH 02/16] fixes after dev test --- modules/equativBidAdapter.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 3330b78d62f..f0f48b7eb1c 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -39,10 +39,10 @@ registerBidder({ * @return {boolean} */ isBidRequestValid: (bidRequest) => { - return !(!bidRequest.params.networkId && - !deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') && - !deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') && - !deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id')); + return bidRequest.params.networkId || + deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') || + deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') || + deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id'); }, /** @@ -52,17 +52,19 @@ registerBidder({ */ getUserSyncs: (syncOptions, serverResponses) => { if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { - return { + return [{ type: 'iframe', url: serverResponses[0].body.cSyncUrl - }; + }]; } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { + const syncs = []; serverResponses[0].body.dspPixels.forEach((pixel) => { - return { + syncs.push({ type: 'image', url: pixel - }; + }); }); + return syncs; } } }); From 1bdcc06dac5fb9136c6022caa3fe9afd77d5d117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Thu, 12 Sep 2024 14:39:47 +0200 Subject: [PATCH 03/16] make world simpler --- modules/equativBidAdapter.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index f0f48b7eb1c..55e13fb9862 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -57,14 +57,10 @@ registerBidder({ url: serverResponses[0].body.cSyncUrl }]; } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { - const syncs = []; - serverResponses[0].body.dspPixels.forEach((pixel) => { - syncs.push({ - type: 'image', - url: pixel - }); - }); - return syncs; + return serverResponses[0].body.dspPixels.forEach((pixel) => ({ + type: 'image', + url: pixel + })); } } }); From 02397e2d8c509dab6faaa3b9f90df13a6a89e289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Thu, 12 Sep 2024 14:45:20 +0200 Subject: [PATCH 04/16] fix prev commit --- modules/equativBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 55e13fb9862..a19f026786a 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -57,7 +57,7 @@ registerBidder({ url: serverResponses[0].body.cSyncUrl }]; } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { - return serverResponses[0].body.dspPixels.forEach((pixel) => ({ + return serverResponses[0].body.dspPixels.map((pixel) => ({ type: 'image', url: pixel })); From fc153a753fcd0728e8ac7ef915b267a3938de356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Thu, 12 Sep 2024 14:56:06 +0200 Subject: [PATCH 05/16] return empty userSyncs array by default --- modules/equativBidAdapter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index a19f026786a..6261b8fe416 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -62,6 +62,7 @@ registerBidder({ url: pixel })); } + return []; } }); From 91f578adfc29adcf58afeb8decc1242649859d2e Mon Sep 17 00:00:00 2001 From: janzych-smart Date: Mon, 16 Sep 2024 13:44:52 +0200 Subject: [PATCH 06/16] adjustments --- modules/equativBidAdapter.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 6261b8fe416..5b012f60678 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -8,7 +8,7 @@ import {deepAccess, deepSetValue, mergeDeep} from '../src/utils.js'; * @typedef {import('../src/adapters/bidderFactory.js').ServerRequest} ServerRequest */ -registerBidder({ +export const spec = { code: 'equativ', gvlid: 45, supportedMediaTypes: [BANNER], @@ -39,10 +39,10 @@ registerBidder({ * @return {boolean} */ isBidRequestValid: (bidRequest) => { - return bidRequest.params.networkId || + return !!(deepAccess(bidRequest, 'params.networkId') || deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') || deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') || - deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id'); + deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id')); }, /** @@ -64,9 +64,9 @@ registerBidder({ } return []; } -}); +}; -const converter = ortbConverter({ +export const converter = ortbConverter({ context: { netRevenue: true, ttl: 300 @@ -110,3 +110,5 @@ const converter = ortbConverter({ return req; } }); + +registerBidder(spec); From 5850518ad4c811117aa94e8f36eaca5c8a967bb2 Mon Sep 17 00:00:00 2001 From: janzych-smart Date: Mon, 16 Sep 2024 13:45:29 +0200 Subject: [PATCH 07/16] apply prettier --- modules/equativBidAdapter.js | 44 +++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 5b012f60678..7230214cdf4 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -1,7 +1,7 @@ -import {BANNER} from '../src/mediaTypes.js'; -import {ortbConverter} from '../libraries/ortbConverter/converter.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {deepAccess, deepSetValue, mergeDeep} from '../src/utils.js'; +import { BANNER } from '../src/mediaTypes.js'; +import { ortbConverter } from '../libraries/ortbConverter/converter.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { deepAccess, deepSetValue, mergeDeep } from '../src/utils.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid @@ -20,10 +20,10 @@ export const spec = { */ buildRequests: (bidRequests, bidderRequest) => { return { - data: converter.toORTB({bidderRequest, bidRequests}), + data: converter.toORTB({ bidderRequest, bidRequests }), method: 'POST', // url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169' - url: 'https://feature-ssb-engine-pips-2655-testenv.internal.smartadserver.com/api/bid?callerId=169' + url: 'https://feature-ssb-engine-pips-2655-testenv.internal.smartadserver.com/api/bid?callerId=169', }; }, @@ -32,17 +32,23 @@ export const spec = { * @param bidRequest * @return {Bid[]} */ - interpretResponse: (serverResponse, bidRequest) => converter.fromORTB({request: bidRequest.data, response: serverResponse.body}), + interpretResponse: (serverResponse, bidRequest) => + converter.fromORTB({ + request: bidRequest.data, + response: serverResponse.body, + }), /** * @param bidRequest * @return {boolean} */ isBidRequestValid: (bidRequest) => { - return !!(deepAccess(bidRequest, 'params.networkId') || + return !!( + deepAccess(bidRequest, 'params.networkId') || deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') || deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') || - deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id')); + deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id') + ); }, /** @@ -52,24 +58,26 @@ export const spec = { */ getUserSyncs: (syncOptions, serverResponses) => { if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { - return [{ - type: 'iframe', - url: serverResponses[0].body.cSyncUrl - }]; + return [ + { + type: 'iframe', + url: serverResponses[0].body.cSyncUrl, + }, + ]; } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { return serverResponses[0].body.dspPixels.map((pixel) => ({ type: 'image', - url: pixel + url: pixel, })); } return []; - } + }, }; export const converter = ortbConverter({ context: { netRevenue: true, - ttl: 300 + ttl: 300, }, imp(buildImp, bidRequest, context) { @@ -92,7 +100,7 @@ export const converter = ortbConverter({ } mergeDeep(imp, { - ext: { bidder } + ext: { bidder }, }); } @@ -108,7 +116,7 @@ export const converter = ortbConverter({ } return req; - } + }, }); registerBidder(spec); From d887a28760d839ec905cfe20ccaa851417643c95 Mon Sep 17 00:00:00 2001 From: janzych-smart Date: Tue, 17 Sep 2024 15:45:14 +0200 Subject: [PATCH 08/16] unit tests for Equativ adapter --- modules/equativBidAdapter.js | 32 ++-- test/spec/modules/equativBidAdapter_spec.js | 202 ++++++++++++++++++++ 2 files changed, 218 insertions(+), 16 deletions(-) create mode 100644 test/spec/modules/equativBidAdapter_spec.js diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 7230214cdf4..600bf498580 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -56,22 +56,22 @@ export const spec = { * @param serverResponses * @return {{type: (string), url: (*|string)}[]} */ - getUserSyncs: (syncOptions, serverResponses) => { - if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { - return [ - { - type: 'iframe', - url: serverResponses[0].body.cSyncUrl, - }, - ]; - } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { - return serverResponses[0].body.dspPixels.map((pixel) => ({ - type: 'image', - url: pixel, - })); - } - return []; - }, + // getUserSyncs: (syncOptions, serverResponses) => { + // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { + // return [ + // { + // type: 'iframe', + // url: serverResponses[0].body.cSyncUrl, + // }, + // ]; + // } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { + // return serverResponses[0].body.dspPixels.map((pixel) => ({ + // type: 'image', + // url: pixel, + // })); + // } + // return []; + // }, }; export const converter = ortbConverter({ diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js new file mode 100644 index 00000000000..5e4416bcb7e --- /dev/null +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -0,0 +1,202 @@ +import { spec, converter } from 'modules/equativBidAdapter.js'; + +describe('Equativ bid adapter tests', function () { + const DEFAULT_BID_REQUESTS = [ + { + adUnitCode: 'eqtv_42', + bidId: 'abcd1234', + mediaTypes: { + banner: { + sizes: [ + [300, 250], + [300, 200], + ], + }, + }, + bidder: 'equativ', + params: { + siteId: '1234', + pageId: '5678', + formatId: '90', + networkId: 111, + }, + requestId: 'efgh5678', + ortb2Imp: { + ext: { + tid: 'zsfgzzg', + }, + }, + }, + ]; + + const DEFAULT_BIDDER_REQUEST = { + bidderCode: 'equativ', + bids: DEFAULT_BID_REQUESTS, + }; + + const SAMPLE_RESPONSE = { + body: { + id: '12h712u7-k22g-8124-ab7a-h268s22dy271', + seatbid: [ + { + bid: [ + { + id: '1bh7jku7-ko2g-8654-ab72-h268shvwy271', + impid: 'r12gwgf231', + price: 0.6565, + adm: '

AD

', + adomain: ['abc.com'], + cid: '1242512', + crid: '535231', + w: 300, + h: 600, + mtype: 1, + cat: ['IAB19', 'IAB19-1'], + cattax: 1, + }, + ], + seat: '4212', + }, + ], + cur: 'USD', + statuscode: 0, + }, + }; + + describe('buildRequests', () => { + it('should build correct request using ORTB converter', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + const dataFromConverter = converter.toORTB({ + bidderRequest: DEFAULT_BIDDER_REQUEST, + bidRequests: DEFAULT_BID_REQUESTS, + }); + expect(request).to.deep.equal({ + data: { ...dataFromConverter, id: request.data.id }, + method: 'POST', + url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169', + }); + }); + + it('should add ext.bidder to imp object when siteId is defined', () => { + const bidRequests = [ + { ...DEFAULT_BID_REQUESTS[0], params: { siteId: 123 } }, + ]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.imp[0].ext.bidder).to.deep.equal({ + siteId: 123, + }); + }); + + it('should add ext.bidder to imp object when pageId is defined', () => { + const bidRequests = [ + { ...DEFAULT_BID_REQUESTS[0], params: { pageId: 123 } }, + ]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.imp[0].ext.bidder).to.deep.equal({ + pageId: 123, + }); + }); + + it('should add ext.bidder to imp object when formatId is defined', () => { + const bidRequests = [ + { ...DEFAULT_BID_REQUESTS[0], params: { formatId: 123 } }, + ]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.imp[0].ext.bidder).to.deep.equal({ + formatId: 123, + }); + }); + + it('should not add ext.bidder to imp object when siteId, pageId, formatId are not defined', () => { + const bidRequests = [{ ...DEFAULT_BID_REQUESTS[0], params: {} }]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.imp[0].ext.bidder).to.be.undefined; + }); + + it('should add site.publisher.id param', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + expect(request.data.site.publisher.id).to.equal(111); + }); + }); + + describe('interpretResponse', () => { + it('should return data returned by ORTB converter', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + const bids = spec.interpretResponse(SAMPLE_RESPONSE, request); + expect(bids).to.deep.equal( + converter.fromORTB({ + request: request.data, + response: SAMPLE_RESPONSE.body, + }) + ); + }); + }); + + describe('isBidRequestValid', () => { + it('should return true if params.networkId is set', () => { + const bidRequest = { + params: { + networkId: 123, + }, + }; + expect(spec.isBidRequestValid(bidRequest)).to.equal(true); + }); + + it('should return true if ortb2Imp.site.publisher.id is set', () => { + const bidRequest = { + ortb2Imp: { + site: { + publisher: { + id: 123, + }, + }, + }, + }; + expect(spec.isBidRequestValid(bidRequest)).to.equal(true); + }); + + it('should return true if ortb2Imp.app.publisher.id is set', () => { + const bidRequest = { + ortb2Imp: { + app: { + publisher: { + id: 123, + }, + }, + }, + }; + expect(spec.isBidRequestValid(bidRequest)).to.equal(true); + }); + + it('should return true if ortb2Imp.dooh.publisher.id is set', () => { + const bidRequest = { + ortb2Imp: { + dooh: { + publisher: { + id: 123, + }, + }, + }, + }; + expect(spec.isBidRequestValid(bidRequest)).to.equal(true); + }); + + it('should return false if networkId is not set', () => { + const bidRequest = {}; + expect(spec.isBidRequestValid(bidRequest)).to.equal(false); + }); + }); +}); From dad29d97e40b74e105b3f900cca16a225d06ccd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Fri, 20 Sep 2024 11:53:21 +0200 Subject: [PATCH 09/16] add dsp user sync --- modules/equativBidAdapter.js | 38 ++++++++++----------- test/spec/modules/equativBidAdapter_spec.js | 37 ++++++++++++++++++-- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 600bf498580..828ca74eea2 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -22,8 +22,7 @@ export const spec = { return { data: converter.toORTB({ bidderRequest, bidRequests }), method: 'POST', - // url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169' - url: 'https://feature-ssb-engine-pips-2655-testenv.internal.smartadserver.com/api/bid?callerId=169', + url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169', }; }, @@ -53,25 +52,24 @@ export const spec = { /** * @param syncOptions - * @param serverResponses - * @return {{type: (string), url: (*|string)}[]} + * @param serverResponse + * @return {{type: string, url: string}[]} */ - // getUserSyncs: (syncOptions, serverResponses) => { - // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { - // return [ - // { - // type: 'iframe', - // url: serverResponses[0].body.cSyncUrl, - // }, - // ]; - // } else if (syncOptions.pixelEnabled && serverResponses[0]?.body.dspPixels) { - // return serverResponses[0].body.dspPixels.map((pixel) => ({ - // type: 'image', - // url: pixel, - // })); - // } - // return []; - // }, + getUserSyncs: (syncOptions, serverResponse) => { + // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { + // return [ + // { + // type: 'iframe', + // url: serverResponses[0].body.cSyncUrl, + // }, + // ]; + // } + return (syncOptions.pixelEnabled && serverResponse.body.dspPixels) + ? serverResponse.body.dspPixels.map((pixel) => ({ + type: 'image', + url: pixel, + })) : []; + }, }; export const converter = ortbConverter({ diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index 5e4416bcb7e..e92fd1666fa 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -15,9 +15,6 @@ describe('Equativ bid adapter tests', function () { }, bidder: 'equativ', params: { - siteId: '1234', - pageId: '5678', - formatId: '90', networkId: 111, }, requestId: 'efgh5678', @@ -63,6 +60,13 @@ describe('Equativ bid adapter tests', function () { }, }; + const RESPONSE_WITH_DSP_PIXELS = { + ...SAMPLE_RESPONSE, + body: { + dspPixels: ['1st-pixel', '2nd-pixel', '3rd-pixel'] + } + }; + describe('buildRequests', () => { it('should build correct request using ORTB converter', () => { const request = spec.buildRequests( @@ -129,6 +133,33 @@ describe('Equativ bid adapter tests', function () { }); }); + describe('getUserSyncs', () => { + it('should return empty array if no pixel sync not enabled', function () { + const syncs = spec.getUserSyncs({}, RESPONSE_WITH_DSP_PIXELS); + expect(syncs).to.deep.equal([]); + }); + + it('should return empty array if no pixels available', function () { + const syncs = spec.getUserSyncs( + { pixelEnabled: true }, + SAMPLE_RESPONSE + ); + expect(syncs).to.deep.equal([]); + }); + + it('should register dsp pixels', function () { + const syncs = spec.getUserSyncs( + { pixelEnabled: true }, + RESPONSE_WITH_DSP_PIXELS + ); + expect(syncs).to.have.lengthOf(3); + expect(syncs[1]).to.deep.equal({ + type: 'image', + url: '2nd-pixel', + }); + }); + }); + describe('interpretResponse', () => { it('should return data returned by ORTB converter', () => { const request = spec.buildRequests( From 967771af9bca867ddc91de46c203a060ea7f89c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Fri, 20 Sep 2024 11:53:30 +0200 Subject: [PATCH 10/16] add readme --- modules/equativBidAdapter.md | 40 ++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 modules/equativBidAdapter.md diff --git a/modules/equativBidAdapter.md b/modules/equativBidAdapter.md new file mode 100644 index 00000000000..7d1210b9a5d --- /dev/null +++ b/modules/equativBidAdapter.md @@ -0,0 +1,40 @@ +# Overview + +``` +Module Name: Equativ Bidder Adapter (beta) +Module Type: Bidder Adapter +Maintainer: support@equativ.com +``` + +# Description + +Connect to Equativ for bids. + +The Equativ adapter requires setup and approval from the Equativ team. Please reach out to your technical account manager for more information. + +# Test Parameters + +## Web or In-app +```javascript +var adUnits = [ + { + code: '/589236/banner_1', + mediaTypes: { + banner: { + sizes: [[300, 250]] + } + }, + bids: [ + { + bidder: 'equativ', + params: { + networkId: 10, // mandatory if no ortb2Imp.(site or app).publisher.id defined + siteId: 20743, // optional + pageId: 89653, // optional + formatId: 291, // optional + } + } + ] + } +]; +``` \ No newline at end of file From 13153b2c373b81f0be1d20b6aa21adb50990466f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Fri, 20 Sep 2024 13:59:29 +0200 Subject: [PATCH 11/16] body can be undef --- modules/equativBidAdapter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 828ca74eea2..f4ddba0d840 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -64,7 +64,7 @@ export const spec = { // }, // ]; // } - return (syncOptions.pixelEnabled && serverResponse.body.dspPixels) + return (syncOptions.pixelEnabled && serverResponse.body?.dspPixels) ? serverResponse.body.dspPixels.map((pixel) => ({ type: 'image', url: pixel, From 254135e3d074211003ada6f40a28ad3f3d5329ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Wed, 25 Sep 2024 14:44:43 +0200 Subject: [PATCH 12/16] support additional br params --- modules/equativBidAdapter.js | 6 +++- test/spec/modules/equativBidAdapter_spec.js | 32 ++++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index f4ddba0d840..6b3b5cf2da3 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -22,7 +22,7 @@ export const spec = { return { data: converter.toORTB({ bidderRequest, bidRequests }), method: 'POST', - url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169', + url: 'https://ssb-global.smartadserver.com/api/bid?callerId=169' }; }, @@ -82,6 +82,10 @@ export const converter = ortbConverter({ const imp = buildImp(bidRequest, context); const { siteId, pageId, formatId } = bidRequest.params; + imp.bidfloor = imp.bidfloor || 0.0; + imp.secure = Number(window.location.protocol === 'https:'); + imp.tagid = bidRequest.adUnitCode; + if (siteId || pageId || formatId) { const bidder = {}; diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index e92fd1666fa..bd6f2410f44 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -1,6 +1,6 @@ import { spec, converter } from 'modules/equativBidAdapter.js'; -describe('Equativ bid adapter tests', function () { +describe('Equativ bid adapter tests', () => { const DEFAULT_BID_REQUESTS = [ { adUnitCode: 'eqtv_42', @@ -131,15 +131,39 @@ describe('Equativ bid adapter tests', function () { ); expect(request.data.site.publisher.id).to.equal(111); }); + + it('should send default floor of 0.0', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + expect(request.data.imp[0]).to.have.property('bidfloor').that.eq(0.0); + }); + + it('should send secure connection', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + expect(request.data.imp[0]).to.have.property('secure').that.within(0, 1); + }); + + it('should have tagid', () => { + const request = spec.buildRequests( + DEFAULT_BID_REQUESTS, + DEFAULT_BIDDER_REQUEST + ); + expect(request.data.imp[0]).to.have.property('tagid').that.eq(DEFAULT_BID_REQUESTS[0].adUnitCode); + }); }); describe('getUserSyncs', () => { - it('should return empty array if no pixel sync not enabled', function () { + it('should return empty array if no pixel sync not enabled', () => { const syncs = spec.getUserSyncs({}, RESPONSE_WITH_DSP_PIXELS); expect(syncs).to.deep.equal([]); }); - it('should return empty array if no pixels available', function () { + it('should return empty array if no pixels available', () => { const syncs = spec.getUserSyncs( { pixelEnabled: true }, SAMPLE_RESPONSE @@ -147,7 +171,7 @@ describe('Equativ bid adapter tests', function () { expect(syncs).to.deep.equal([]); }); - it('should register dsp pixels', function () { + it('should register dsp pixels', () => { const syncs = spec.getUserSyncs( { pixelEnabled: true }, RESPONSE_WITH_DSP_PIXELS From 8281f79eebb4f74ce3c3906eaf6bdf2683d28c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Fri, 27 Sep 2024 08:27:59 +0200 Subject: [PATCH 13/16] remove user sync --- modules/equativBidAdapter.js | 30 ++++++------- test/spec/modules/equativBidAdapter_spec.js | 48 ++++++++++----------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 6b3b5cf2da3..d89a6a9f461 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -55,21 +55,21 @@ export const spec = { * @param serverResponse * @return {{type: string, url: string}[]} */ - getUserSyncs: (syncOptions, serverResponse) => { - // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { - // return [ - // { - // type: 'iframe', - // url: serverResponses[0].body.cSyncUrl, - // }, - // ]; - // } - return (syncOptions.pixelEnabled && serverResponse.body?.dspPixels) - ? serverResponse.body.dspPixels.map((pixel) => ({ - type: 'image', - url: pixel, - })) : []; - }, + // getUserSyncs: (syncOptions, serverResponse) => { + // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { + // return [ + // { + // type: 'iframe', + // url: serverResponses[0].body.cSyncUrl, + // }, + // ]; + // } + // return (syncOptions.pixelEnabled && serverResponse.body?.dspPixels) + // ? serverResponse.body.dspPixels.map((pixel) => ({ + // type: 'image', + // url: pixel, + // })) : []; + // }, }; export const converter = ortbConverter({ diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index bd6f2410f44..80a31adb9b9 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -157,32 +157,32 @@ describe('Equativ bid adapter tests', () => { }); }); - describe('getUserSyncs', () => { - it('should return empty array if no pixel sync not enabled', () => { - const syncs = spec.getUserSyncs({}, RESPONSE_WITH_DSP_PIXELS); - expect(syncs).to.deep.equal([]); - }); + // describe('getUserSyncs', () => { + // it('should return empty array if no pixel sync not enabled', () => { + // const syncs = spec.getUserSyncs({}, RESPONSE_WITH_DSP_PIXELS); + // expect(syncs).to.deep.equal([]); + // }); - it('should return empty array if no pixels available', () => { - const syncs = spec.getUserSyncs( - { pixelEnabled: true }, - SAMPLE_RESPONSE - ); - expect(syncs).to.deep.equal([]); - }); + // it('should return empty array if no pixels available', () => { + // const syncs = spec.getUserSyncs( + // { pixelEnabled: true }, + // SAMPLE_RESPONSE + // ); + // expect(syncs).to.deep.equal([]); + // }); - it('should register dsp pixels', () => { - const syncs = spec.getUserSyncs( - { pixelEnabled: true }, - RESPONSE_WITH_DSP_PIXELS - ); - expect(syncs).to.have.lengthOf(3); - expect(syncs[1]).to.deep.equal({ - type: 'image', - url: '2nd-pixel', - }); - }); - }); + // it('should register dsp pixels', () => { + // const syncs = spec.getUserSyncs( + // { pixelEnabled: true }, + // RESPONSE_WITH_DSP_PIXELS + // ); + // expect(syncs).to.have.lengthOf(3); + // expect(syncs[1]).to.deep.equal({ + // type: 'image', + // url: '2nd-pixel', + // }); + // }); + // }); describe('interpretResponse', () => { it('should return data returned by ORTB converter', () => { From bc6da39bbad09d03ea2af11aa3130ca42c7936ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Tue, 8 Oct 2024 10:38:25 +0200 Subject: [PATCH 14/16] do not send dt param --- modules/equativBidAdapter.js | 2 ++ test/spec/modules/equativBidAdapter_spec.js | 21 +++++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index d89a6a9f461..80b34f86243 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -82,6 +82,8 @@ export const converter = ortbConverter({ const imp = buildImp(bidRequest, context); const { siteId, pageId, formatId } = bidRequest.params; + delete imp.dt; + imp.bidfloor = imp.bidfloor || 0.0; imp.secure = Number(window.location.protocol === 'https:'); imp.tagid = bidRequest.adUnitCode; diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index 80a31adb9b9..ae89cf8d61d 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -60,12 +60,12 @@ describe('Equativ bid adapter tests', () => { }, }; - const RESPONSE_WITH_DSP_PIXELS = { - ...SAMPLE_RESPONSE, - body: { - dspPixels: ['1st-pixel', '2nd-pixel', '3rd-pixel'] - } - }; + // const RESPONSE_WITH_DSP_PIXELS = { + // ...SAMPLE_RESPONSE, + // body: { + // dspPixels: ['1st-pixel', '2nd-pixel', '3rd-pixel'] + // } + // }; describe('buildRequests', () => { it('should build correct request using ORTB converter', () => { @@ -155,6 +155,15 @@ describe('Equativ bid adapter tests', () => { ); expect(request.data.imp[0]).to.have.property('tagid').that.eq(DEFAULT_BID_REQUESTS[0].adUnitCode); }); + + it('should remove dt', () => { + const bidRequests = [ + { ...DEFAULT_BID_REQUESTS[0], ortb2Imp: { dt: 1728377558235 } } + ]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.imp[0]).to.not.have.property('dt'); + }); }); // describe('getUserSyncs', () => { From 771d7cda2544cd9c047254fe2c344a3fa6ec7916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Wed, 9 Oct 2024 08:30:48 +0200 Subject: [PATCH 15/16] handle floors and network id --- modules/equativBidAdapter.js | 45 ++++-- modules/equativBidAdapter.md | 2 +- test/spec/modules/equativBidAdapter_spec.js | 165 +++++++++++++++++++- 3 files changed, 195 insertions(+), 17 deletions(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 80b34f86243..9b63904abf4 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -1,7 +1,7 @@ import { BANNER } from '../src/mediaTypes.js'; import { ortbConverter } from '../libraries/ortbConverter/converter.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; -import { deepAccess, deepSetValue, mergeDeep } from '../src/utils.js'; +import { deepAccess, deepSetValue, isFn, mergeDeep } from '../src/utils.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid @@ -26,10 +26,31 @@ export const spec = { }; }, + /** + * @param bidRequest + * @returns {number} + */ + getMinFloor: (bidRequest) => { + const floors = []; + + if (isFn(bidRequest.getFloor)) { + deepAccess(bidRequest, 'mediaTypes.banner.sizes').forEach(size => { + const floor = bidRequest.getFloor({ size }).floor; + if (!isNaN(floor)) { + floors.push(floor); + } else { + floors.push(0.0); + } + }); + } + + return floors.length ? Math.min(...floors) : 0.0; + }, + /** * @param serverResponse * @param bidRequest - * @return {Bid[]} + * @returns {Bid[]} */ interpretResponse: (serverResponse, bidRequest) => converter.fromORTB({ @@ -39,21 +60,21 @@ export const spec = { /** * @param bidRequest - * @return {boolean} + * @returns {boolean} */ isBidRequestValid: (bidRequest) => { return !!( deepAccess(bidRequest, 'params.networkId') || - deepAccess(bidRequest, 'ortb2Imp.site.publisher.id') || - deepAccess(bidRequest, 'ortb2Imp.app.publisher.id') || - deepAccess(bidRequest, 'ortb2Imp.dooh.publisher.id') + deepAccess(bidRequest, 'ortb2.site.publisher.id') || + deepAccess(bidRequest, 'ortb2.app.publisher.id') || + deepAccess(bidRequest, 'ortb2.dooh.publisher.id') ); }, /** * @param syncOptions * @param serverResponse - * @return {{type: string, url: string}[]} + * @returns {{type: string, url: string}[]} */ // getUserSyncs: (syncOptions, serverResponse) => { // if (syncOptions.iframeEnabled && serverResponses[0]?.body.cSyncUrl) { @@ -84,7 +105,7 @@ export const converter = ortbConverter({ delete imp.dt; - imp.bidfloor = imp.bidfloor || 0.0; + imp.bidfloor = imp.bidfloor || spec.getMinFloor(bidRequest); imp.secure = Number(window.location.protocol === 'https:'); imp.tagid = bidRequest.adUnitCode; @@ -115,7 +136,13 @@ export const converter = ortbConverter({ const bid = context.bidRequests[0]; const req = buildRequest(imps, bidderRequest, context); - if (bid.params.networkId) { + if (deepAccess(bid, 'ortb2.site.publisher')) { + deepSetValue(req, 'site.publisher.id', bid.ortb2.site.publisher.id || bid.params.networkId); + } else if (deepAccess(bid, 'ortb2.app.publisher')) { + deepSetValue(req, 'app.publisher.id', bid.ortb2.app.publisher.id || bid.params.networkId); + } else if (deepAccess(bid, 'ortb2.dooh.publisher')) { + deepSetValue(req, 'dooh.publisher.id', bid.ortb2.dooh.publisher.id || bid.params.networkId); + } else { deepSetValue(req, 'site.publisher.id', bid.params.networkId); } diff --git a/modules/equativBidAdapter.md b/modules/equativBidAdapter.md index 7d1210b9a5d..ceee6d19bdc 100644 --- a/modules/equativBidAdapter.md +++ b/modules/equativBidAdapter.md @@ -28,7 +28,7 @@ var adUnits = [ { bidder: 'equativ', params: { - networkId: 10, // mandatory if no ortb2Imp.(site or app).publisher.id defined + networkId: 13, // mandatory if no ortb2.(site or app).publisher.id set siteId: 20743, // optional pageId: 89653, // optional formatId: 291, // optional diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index ae89cf8d61d..0310b102145 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -9,7 +9,7 @@ describe('Equativ bid adapter tests', () => { banner: { sizes: [ [300, 250], - [300, 200], + [300, 600], ], }, }, @@ -132,6 +132,99 @@ describe('Equativ bid adapter tests', () => { expect(request.data.site.publisher.id).to.equal(111); }); + it('should pass ortb2.site.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + site: { + publisher: { + id: 98, + } + } + } + }]; + delete bidRequests[0].params; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.site.publisher.id).to.equal(98); + }); + + it('should pass networkId as site.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + site: { + publisher: {} + } + } + }]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.site.publisher.id).to.equal(111); + }); + + it('should pass ortb2.app.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + app: { + publisher: { + id: 27, + } + } + } + }]; + delete bidRequests[0].params; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.app.publisher.id).to.equal(27); + }); + + it('should pass networkId as app.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + app: { + publisher: {} + } + } + }]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.app.publisher.id).to.equal(111); + }); + + it('should pass ortb2.dooh.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + dooh: { + publisher: { + id: 35, + } + } + } + }]; + delete bidRequests[0].params; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.dooh.publisher.id).to.equal(35); + }); + + it('should pass networkId as dooh.publisher.id', () => { + const bidRequests = [{ + ...DEFAULT_BID_REQUESTS[0], + ortb2: { + dooh: { + publisher: {} + } + } + }]; + const bidderRequest = { ...DEFAULT_BIDDER_REQUEST, bids: bidRequests }; + const request = spec.buildRequests(bidRequests, bidderRequest); + expect(request.data.dooh.publisher.id).to.equal(111); + }); + it('should send default floor of 0.0', () => { const request = spec.buildRequests( DEFAULT_BID_REQUESTS, @@ -166,6 +259,64 @@ describe('Equativ bid adapter tests', () => { }); }); + describe('getMinFloor', () => { + it('should return floor of 0.0 if floor module not available', () => { + const bid = { + ...DEFAULT_BID_REQUESTS[0], + getFloor: false, + }; + expect(spec.getMinFloor(bid)).to.deep.eq(0.0); + }); + + it('should return proper min floor', () => { + const bid = { + ...DEFAULT_BID_REQUESTS[0], + getFloor: data => { + if (data.size[0] === 300 && data.size[1] === 250) { + return { floor: 1.13 }; + } else if (data.size[0] === 300 && data.size[1] === 600) { + return { floor: 1.39 }; + } else { + return { floor: 0.52 }; + } + } + }; + expect(spec.getMinFloor(bid)).to.deep.eq(1.13); + }); + + it('should return global media type floor if no rule for size', () => { + const bid = { + ...DEFAULT_BID_REQUESTS[0], + getFloor: data => { + if (data.size[0] === 728 && data.size[1] === 90) { + return { floor: 1.13 }; + } else if (data.size[0] === 300 && data.size[1] === 600) { + return { floor: 1.36 }; + } else { + return { floor: 0.34 }; + } + } + }; + expect(spec.getMinFloor(bid)).to.deep.eq(0.34); + }); + + it('should return floor of 0 if no rule for size', () => { + const bid = { + ...DEFAULT_BID_REQUESTS[0], + getFloor: data => { + if (data.size[0] === 728 && data.size[1] === 90) { + return { floor: 1.13 }; + } else if (data.size[0] === 300 && data.size[1] === 600) { + return { floor: 1.36 }; + } else { + return {}; + } + } + }; + expect(spec.getMinFloor(bid)).to.deep.eq(0.0); + }); + }); + // describe('getUserSyncs', () => { // it('should return empty array if no pixel sync not enabled', () => { // const syncs = spec.getUserSyncs({}, RESPONSE_WITH_DSP_PIXELS); @@ -219,9 +370,9 @@ describe('Equativ bid adapter tests', () => { expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); - it('should return true if ortb2Imp.site.publisher.id is set', () => { + it('should return true if ortb2.site.publisher.id is set', () => { const bidRequest = { - ortb2Imp: { + ortb2: { site: { publisher: { id: 123, @@ -232,9 +383,9 @@ describe('Equativ bid adapter tests', () => { expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); - it('should return true if ortb2Imp.app.publisher.id is set', () => { + it('should return true if ortb2.app.publisher.id is set', () => { const bidRequest = { - ortb2Imp: { + ortb2: { app: { publisher: { id: 123, @@ -245,9 +396,9 @@ describe('Equativ bid adapter tests', () => { expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); - it('should return true if ortb2Imp.dooh.publisher.id is set', () => { + it('should return true if ortb2.dooh.publisher.id is set', () => { const bidRequest = { - ortb2Imp: { + ortb2: { dooh: { publisher: { id: 123, From 0817fc21078057d69e3eed24cdf542795659ed54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Sok=C3=B3=C5=82?= Date: Thu, 10 Oct 2024 12:10:21 +0200 Subject: [PATCH 16/16] handle empty media types --- modules/equativBidAdapter.js | 2 +- test/spec/modules/equativBidAdapter_spec.js | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/equativBidAdapter.js b/modules/equativBidAdapter.js index 9b63904abf4..c5c96039f67 100644 --- a/modules/equativBidAdapter.js +++ b/modules/equativBidAdapter.js @@ -34,7 +34,7 @@ export const spec = { const floors = []; if (isFn(bidRequest.getFloor)) { - deepAccess(bidRequest, 'mediaTypes.banner.sizes').forEach(size => { + (deepAccess(bidRequest, 'mediaTypes.banner.sizes') || []).forEach(size => { const floor = bidRequest.getFloor({ size }).floor; if (!isNaN(floor)) { floors.push(floor); diff --git a/test/spec/modules/equativBidAdapter_spec.js b/test/spec/modules/equativBidAdapter_spec.js index 0310b102145..c2465176ac1 100644 --- a/test/spec/modules/equativBidAdapter_spec.js +++ b/test/spec/modules/equativBidAdapter_spec.js @@ -268,6 +268,14 @@ describe('Equativ bid adapter tests', () => { expect(spec.getMinFloor(bid)).to.deep.eq(0.0); }); + it('should return floor of 0.0 if mediaTypes not defined', () => { + const bid = { + getFloor: () => ({}) + }; + expect(bid.mediaTypes).to.be.undefined; + expect(spec.getMinFloor(bid)).to.deep.eq(0.0); + }); + it('should return proper min floor', () => { const bid = { ...DEFAULT_BID_REQUESTS[0],