diff --git a/adapters.json b/adapters.json index dc7796ea482..f63d3dac6f2 100644 --- a/adapters.json +++ b/adapters.json @@ -7,6 +7,7 @@ "adform", "adkernel", "admedia", + "bidfluence", "vertamedia", "aol", "appnexus", @@ -29,7 +30,7 @@ "rhythmone", "rubicon", "smartyads", - "smartadserver", + "smartadserver", "sekindoUM", "sonobi", "sovrn", diff --git a/src/adapters/bidfluence.js b/src/adapters/bidfluence.js new file mode 100644 index 00000000000..e5253e09878 --- /dev/null +++ b/src/adapters/bidfluence.js @@ -0,0 +1,57 @@ +const bidmanager = require('../bidmanager.js'); +const bidfactory = require('../bidfactory.js'); +const utils = require('../utils.js'); +const adloader = require('../adloader'); + +var BidfluenceAdapter = function BidfluenceAdapter() { + + const scriptUrl = "//bidfluence.azureedge.net/forge.js"; + + $$PREBID_GLOBAL$$.bfPbjsCB = function (bfr) { + var bidRequest = utils.getBidRequest(bfr.cbID); + var bidObject = null; + if (bfr.cpm > 0) { + bidObject = bidfactory.createBid(1, bidRequest); + bidObject.bidderCode = 'bidfluence'; + bidObject.cpm = bfr.cpm; + bidObject.ad = bfr.ad; + bidObject.width = bfr.width; + bidObject.height = bfr.height; + } else { + bidObject = bidfactory.createBid(2, bidRequest); + bidObject.bidderCode = 'bidfluence'; + } + + bidmanager.addBidResponse(bfr.placementCode, bidObject); + }; + + function _callBids(params) { + var bfbids = params.bids || []; + for (var i = 0; i < bfbids.length; i++) { + var bid = bfbids[i]; + call(bid); + } + } + function call(bid) { + + var adunitId = utils.getBidIdParameter('adunitId', bid.params); + var publisherId = utils.getBidIdParameter('pubId', bid.params); + var reservePrice = utils.getBidIdParameter('reservePrice', bid.params); + var pbjsBfobj = { + placementCode: bid.placementCode, + cbID: bid.bidId + }; + + var cb = function () { + /* globals FORGE */ + FORGE.init([adunitId, publisherId, pbjsBfobj, reservePrice]); + }; + + adloader.loadScript(scriptUrl, cb); + } + return { + callBids: _callBids + }; +}; + +module.exports = BidfluenceAdapter; diff --git a/test/spec/adapters/bidfluence_spec.js b/test/spec/adapters/bidfluence_spec.js new file mode 100644 index 00000000000..75d6aa98fdf --- /dev/null +++ b/test/spec/adapters/bidfluence_spec.js @@ -0,0 +1,74 @@ +describe('Bidfluence Adapter', () => { + const expect = require('chai').expect; + const adapter = require('src/adapters/bidfluence'); + const bidmanager = require('src/bidmanager'); + + var REQUEST = { + bidderCode: "bidfluence", + sizes: [[300, 250]], + placementCode: "div-1", + bids: [{ + bidder: 'bidfluence', + params: { + pubId: "747efe9c-5f8a-4b6e-872b-8e9939816298", + adunitId: "c4bbd807-7d22-485f-80f1-ba008ef1c619" + } + }] + }; + + var RESPONSE = { + ad: "ad-code", + cpm: 0.9, + width: 300, + height: 250, + placementCode: "div-1" + }; + + var NO_RESPONSE = { + ad: "ad-code", + cpm: 0, + width: 300, + height: 250, + placementCode: "div-1" + }; + + it('Should exist and be a function', function () { + expect($$PREBID_GLOBAL$$.bfPbjsCB).to.exist.and.to.be.a('function'); + }); + + it('Shoud push a valid bid', () => { + + var stubAddBidResponse = sinon.stub(bidmanager, "addBidResponse"); + pbjs._bidsRequested.push(REQUEST); + adapter(); + $$PREBID_GLOBAL$$.bfPbjsCB(RESPONSE); + + var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; + var bidObject1 = stubAddBidResponse.getCall(0).args[1]; + + expect(bidPlacementCode1).to.equal("div-1",); + expect(bidObject1.getStatusCode()).to.equal(1); + expect(bidObject1.bidderCode).to.equal('bidfluence'); + + stubAddBidResponse.restore(); + }); + + it('Shoud push an empty bid', () => { + + var stubAddBidResponse = sinon.stub(bidmanager, "addBidResponse"); + pbjs._bidsRequested.push(REQUEST); + adapter(); + + $$PREBID_GLOBAL$$.bfPbjsCB(NO_RESPONSE); + + var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]; + var bidObject1 = stubAddBidResponse.getCall(0).args[1]; + + expect(bidPlacementCode1).to.equal("div-1",); + expect(bidObject1.getStatusCode()).to.equal(2); + expect(bidObject1.bidderCode).to.equal('bidfluence'); + + stubAddBidResponse.restore(); + + }); +});