Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 1 addition & 85 deletions modules/mobkoiBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ortbConverter } from '../libraries/ortbConverter/converter.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
import { _each, replaceMacros, deepAccess, deepSetValue, logError } from '../src/utils.js';
import { deepAccess, deepSetValue, logError } from '../src/utils.js';

const BIDDER_CODE = 'mobkoi';
const GVL_ID = 898;
Expand All @@ -13,18 +13,9 @@ const PUBLISHER_PARAMS = {
* The name of the parameter that the publisher can use to specify the ad server endpoint.
*/
PARAM_NAME_AD_SERVER_BASE_URL: 'adServerBaseUrl',
PARAM_NAME_PUBLISHER_ID: 'publisherId',
PARAM_NAME_PLACEMENT_ID: 'placementId',
}

/**
* The list of ORTB response fields that are used in the macros. Field
* replacement is self-implemented in the adapter. Use dot-notated path for
* nested fields. For example, 'ad.ext.adomain'. For more information, visit
* https://www.npmjs.com/package/dset and https://www.npmjs.com/package/dlv.
*/
const ORTB_RESPONSE_FIELDS_SUPPORT_MACROS = ['adm', 'nurl', 'lurl'];

export const converter = ortbConverter({
context: {
netRevenue: true,
Expand All @@ -35,7 +26,6 @@ export const converter = ortbConverter({
const prebidBidRequest = context.bidRequests[0];

ortbRequest.id = utils.getOrtbId(prebidBidRequest);
deepSetValue(ortbRequest, 'site.publisher.id', utils.getPublisherId(prebidBidRequest));
deepSetValue(ortbRequest, 'site.publisher.ext.adServerBaseUrl', utils.getAdServerEndpointBaseUrl(prebidBidRequest));
// We only support one impression per request.
deepSetValue(ortbRequest, 'imp.0.tagid', utils.getPlacementId(prebidBidRequest));
Expand All @@ -44,8 +34,6 @@ export const converter = ortbConverter({
return ortbRequest;
},
bidResponse(buildPrebidBidResponse, ortbBidResponse, context) {
utils.replaceAllMacrosInPlace(ortbBidResponse, context);

const prebidBid = buildPrebidBidResponse(ortbBidResponse, context);
utils.addCustomFieldsToPrebidBidResponse(prebidBid, ortbBidResponse);
return prebidBid;
Expand All @@ -61,16 +49,6 @@ export const spec = {
* Determines whether or not the given bid request is valid.
*/
isBidRequestValid(bid) {
if (
!deepAccess(bid, `params.${PUBLISHER_PARAMS.PARAM_NAME_PUBLISHER_ID}`) &&
!deepAccess(bid, 'ortb2.site.publisher.id')
) {
logError(`The ${PUBLISHER_PARAMS.PARAM_NAME_PUBLISHER_ID} field is required in the bid request. ` +
'Please follow the setup guideline to set the publisher ID field.'
);
return false;
}

if (
!deepAccess(bid, `params.${PUBLISHER_PARAMS.PARAM_NAME_PLACEMENT_ID}`)
) {
Expand Down Expand Up @@ -176,43 +154,6 @@ export const utils = {
return placementId;
},

/**
* !IMPORTANT: Make sure the implementation of this function matches utils.getPublisherId in
* both adapters.
* Extract the publisher ID from the given object.
* @param {*} prebidBidRequestOrOrtbBidRequest
* @returns string
* @throws {Error} If the publisher ID is not found in the given object.
*/
getPublisherId: function (prebidBidRequestOrOrtbBidRequest) {
// Fields that would be automatically set if the publisher set it
// via pbjs.setBidderConfig.
const ortbPath = 'site.publisher.id';
const prebidPath = `ortb2.${ortbPath}`;

// Fields that would be set by the publisher in the bid
// configuration object in ad unit.
const paramPath = 'params.publisherId';
const bidRequestFirstBidParam = `bids.0.${paramPath}`;

const publisherId =
deepAccess(prebidBidRequestOrOrtbBidRequest, paramPath) ||
deepAccess(prebidBidRequestOrOrtbBidRequest, bidRequestFirstBidParam) ||
deepAccess(prebidBidRequestOrOrtbBidRequest, prebidPath) ||
deepAccess(prebidBidRequestOrOrtbBidRequest, ortbPath);

if (!publisherId) {
throw new Error(
'Failed to obtain publisher ID from the given object. ' +
`Please set it via the "${prebidPath}" field with pbjs.setBidderConfig.\n` +
'Given object:\n' +
JSON.stringify({functionParam: prebidBidRequestOrOrtbBidRequest}, null, 3)
);
}

return publisherId;
},

/**
* !IMPORTANT: Make sure the implementation of this function matches utils.getOrtbId in
* mobkoiAnalyticsAdapter.js.
Expand Down Expand Up @@ -254,29 +195,4 @@ export const utils = {
prebidBidResponse.ortbBidResponse = ortbBidResponse;
prebidBidResponse.ortbId = ortbBidResponse.id;
},

replaceAllMacrosInPlace(ortbBidResponse, context) {
const macros = {
// ORTB macros
AUCTION_PRICE: ortbBidResponse.price,
AUCTION_IMP_ID: ortbBidResponse.impid,
AUCTION_CURRENCY: ortbBidResponse.cur,
AUCTION_BID_ID: context.bidderRequest.auctionId,

// Custom macros
BIDDING_API_BASE_URL: utils.getAdServerEndpointBaseUrl(context.bidderRequest),
CREATIVE_ID: ortbBidResponse.crid,
CAMPAIGN_ID: ortbBidResponse.cid,
ORTB_ID: ortbBidResponse.id,
PUBLISHER_ID: utils.getPublisherId(context.bidderRequest),
};

_each(ORTB_RESPONSE_FIELDS_SUPPORT_MACROS, ortbField => {
deepSetValue(
ortbBidResponse,
ortbField,
replaceMacros(deepAccess(ortbBidResponse, ortbField), macros)
);
});
},
}
93 changes: 2 additions & 91 deletions test/spec/modules/mobkoiBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
describe('Mobkoi bidding Adapter', function () {
const testAdServerBaseUrl = 'http://test.adServerBaseUrl.com';
const testRequestId = 'test-request-id';
const testPublisherId = 'mobkoiPublisherId';
const testPlacementId = 'mobkoiPlacementId';
const testBidId = 'test-bid-id';
const bidderCode = 'mobkoi';
Expand All @@ -18,7 +17,6 @@ describe('Mobkoi bidding Adapter', function () {
const getOrtb2 = () => ({
site: {
publisher: {
id: testPublisherId,
ext: { adServerBaseUrl: testAdServerBaseUrl }
}
}
Expand All @@ -34,7 +32,6 @@ describe('Mobkoi bidding Adapter', function () {
auctionId: testAuctionId,
ortb2: getOrtb2(),
params: {
publisherId: testPublisherId,
adServerBaseUrl: testAdServerBaseUrl,
placementId: testPlacementId
}
Expand Down Expand Up @@ -102,36 +99,14 @@ describe('Mobkoi bidding Adapter', function () {
bid = getBidderRequest().bids[0];
});

it('should return true when publisher id only exists in ortb2', function () {
delete bid.params.publisherId;
expect(spec.isBidRequestValid(bid)).to.equal(true);
});

it('should return true when placement id exist in ad unit params', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});

it('should return true when publisher ID only exists in ad unit params', function () {
delete bid.ortb2.site.publisher.id;
expect(spec.isBidRequestValid(bid)).to.equal(true);
});

it('should return false when publisher id is missing both in ad unit params and ortb2', function () {
delete bid.ortb2.site.publisher.id;
delete bid.params.publisherId;
expect(spec.isBidRequestValid(bid)).to.equal(false);
});

it('should return false when placement id is missing in ad unit params', function () {
delete bid.params.placementId;
expect(spec.isBidRequestValid(bid)).to.equal(false);
});

it('should return false when publisher id is empty in ad unit params and ortb2', function () {
bid.ortb2.site.publisher.id = '';
bid.params.publisherId = '';
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
});

describe('buildRequests', function () {
Expand All @@ -147,18 +122,9 @@ describe('Mobkoi bidding Adapter', function () {
const ortbData = request.data;

expect(ortbData.id).to.equal(bidderRequest.bidderRequestId);
expect(ortbData.site.publisher.id).to.equal(bidderRequest.ortb2.site.publisher.id);
});

it('should obtain publisher ID from ad unit params if the value does not exist in ortb2.', function () {
delete bidderRequest.ortb2.site.publisher.id;
const request = spec.buildRequests(bidderRequest.bids, bidderRequest);
const ortbData = request.data;

expect(ortbData.site.publisher.id).to.equal(bidderRequest.bids[0].params.publisherId);
});

it('should obtain adServerBaseUrl from ad unit params if the value does not exist in ortb2.', function () {
it('should obtain adServerBaseUrl from ad unit params if the value does not exist in ortb2', function () {
delete bidderRequest.ortb2.site.publisher.ext.adServerBaseUrl;
const request = spec.buildRequests(bidderRequest.bids, bidderRequest);
const ortbData = request.data;
Expand Down Expand Up @@ -226,20 +192,6 @@ describe('Mobkoi bidding Adapter', function () {
});
})

describe('getPublisherId', function () {
it('should return the publisherId from the given object', function () {
expect(utils.getPublisherId(bidderRequest)).to.equal(bidderRequest.ortb2.site.publisher.id);
});

it('should throw error when publisherId is missing', function () {
delete bidderRequest.ortb2.site.publisher.id;
delete bidderRequest.bids[0].params.publisherId;
expect(() => {
utils.getPublisherId(bidderRequest);
}).to.throw();
});
})

describe('getOrtbId', function () {
it('should return the ortbId from the prebid request object (i.e bidderRequestId)', function () {
expect(utils.getOrtbId(bidderRequest)).to.equal(bidderRequest.bidderRequestId);
Expand Down Expand Up @@ -270,46 +222,5 @@ describe('Mobkoi bidding Adapter', function () {
}).to.throw();
});
})

describe('replaceAllMacrosInPlace', function () {
let bidderResponse, bidRequest, bidderRequest;

beforeEach(function () {
bidderRequest = getBidderRequest();
bidRequest = spec.buildRequests(bidderRequest.bids, bidderRequest);
bidderResponse = getBidderResponse();
});

it('should replace all macros in adm, nurl, and lurl fields', function () {
const bid = bidderResponse.body.seatbid[0].bid[0];
bid.nurl = '${BIDDING_API_BASE_URL}/win?price=${AUCTION_PRICE}&impressionId=${AUCTION_IMP_ID}&currency=${AUCTION_CURRENCY}&campaignId=${CAMPAIGN_ID}&creativeId=${CREATIVE_ID}&publisherId=${PUBLISHER_ID}&ortbId=${ORTB_ID}';
bid.lurl = '${BIDDING_API_BASE_URL}/loss?price=${AUCTION_PRICE}&impressionId=${AUCTION_IMP_ID}&currency=${AUCTION_CURRENCY}&campaignId=${CAMPAIGN_ID}&creativeId=${CREATIVE_ID}&publisherId=${PUBLISHER_ID}&ortbId=${ORTB_ID}';
bid.adm = '<div>${AUCTION_PRICE}${AUCTION_CURRENCY}${AUCTION_IMP_ID}${AUCTION_BID_ID}${CAMPAIGN_ID}${CREATIVE_ID}${PUBLISHER_ID}${ORTB_ID}${BIDDING_API_BASE_URL}</div>';

const BIDDING_API_BASE_URL = testAdServerBaseUrl;
const AUCTION_CURRENCY = bidderResponse.body.cur;
const AUCTION_BID_ID = bidderRequest.auctionId;
const AUCTION_PRICE = bid.price;
const AUCTION_IMP_ID = bid.impid;
const CREATIVE_ID = bid.crid;
const CAMPAIGN_ID = bid.cid;
const PUBLISHER_ID = bidderRequest.ortb2.site.publisher.id;
const ORTB_ID = bidderResponse.body.id;

const context = {
bidRequest,
bidderRequest
}
utils.replaceAllMacrosInPlace(bid, context);

expect(bid.adm).to.equal(`<div>${AUCTION_PRICE}${AUCTION_CURRENCY}${AUCTION_IMP_ID}${AUCTION_BID_ID}${CAMPAIGN_ID}${CREATIVE_ID}${PUBLISHER_ID}${ORTB_ID}${BIDDING_API_BASE_URL}</div>`);
expect(bid.lurl).to.equal(
`${BIDDING_API_BASE_URL}/loss?price=${AUCTION_PRICE}&impressionId=${AUCTION_IMP_ID}&currency=${AUCTION_CURRENCY}&campaignId=${CAMPAIGN_ID}&creativeId=${CREATIVE_ID}&publisherId=${PUBLISHER_ID}&ortbId=${ORTB_ID}`
);
expect(bid.nurl).to.equal(
`${BIDDING_API_BASE_URL}/win?price=${AUCTION_PRICE}&impressionId=${AUCTION_IMP_ID}&currency=${AUCTION_CURRENCY}&campaignId=${CAMPAIGN_ID}&creativeId=${CREATIVE_ID}&publisherId=${PUBLISHER_ID}&ortbId=${ORTB_ID}`
);
});
})
})
})
})
Loading