import chai from "chai"; import _ from "lodash"; import Long from "long"; import { BidRequestAdapter } from "../../../src/adapters/BidRequestAdapter"; chai.should(); describe("BidRequestAdapter", () => { let adapter: BidRequestAdapter; let req: any; let choiceRequest: any; let rtbRequest: any; let rtbResponse: any; before(() => { adapter = new BidRequestAdapter(); req = { headers: {}, url: "localhost", }; choiceRequest = { id: "62c64e52-c3ed-9e8e-5ea3-faa8cd0582a9", user: {}, campaigns: [], }; rtbRequest = { bid_request: {}, }; rtbResponse = { bids: [], }; }); describe("adaptToBidrequest", () => { it("should be able to adapt an empty response", () => { const message = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.app_api_key.should.equals("270028"); message.track.should.equals("bidrequest"); message.is_beeswax_context.should.equals(1); }); it("should map device related properties correctly", () => { rtbRequest.bid_request.device = { make: "dmake", model: "dmodel", osv: "osversion", connectiontype: "wifi", geo: { country: "FRA", region: "Alsace", city: "Mulhouse", lat: 1.0, lon: 0.0, }, carrier: "dcarrier", }; const message: any = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.device_type.should.equals("dmake"); message.device_name.should.equals("dmodel"); message.device_computed_type.should.equals("dmake"); message.device_os_version.should.equals("osversion"); message.external_connectivity.should.equals("wifi"); message.geoip_city.should.equals("Mulhouse"); message.geoip_state.should.equals("Alsace"); message.geoip_code.should.equals("FR"); message.geoip_location.lat.should.equals(1.0); message.geoip_location.lon.should.equals(0.0); message.geoip_isp.should.equals("dcarrier"); }); it("should map app related properties correctly", () => { rtbRequest.bid_request.app = { bundle: "appbundle", name: "appname", }; const message: any = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.app_bundle_id.should.equals("appbundle"); message.app_name.should.equals("appname"); }); it("should map ext related properties correctly", () => { rtbRequest.bid_request.ext = { auctionid_str: "auctionidentity", inventory_source: 17, }; const message: any = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); //md5 of auction identity (echo -n auctionidentity | md5sum) message.advert_id.should.equals("62c64e52-c3ed-9e8e-5ea3-faa8cd0582a9"); message.key.should.equals("62c64e52-c3ed-9e8e-5ea3-faa8cd0582a9"); message.impression_id.should.equals("auctionidentity"); message.app_exchange.should.equals("YAHOO"); }); it("should set odid of user in message", () => { choiceRequest.user = { odid: "odid" }; const message = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.odid.should.be.equals("odid"); }); it("should set campaign related values if there is a selected campaign", () => { rtbResponse.bids = [ { line_item_id: 555, bid_price_micros: 1200, }, { line_item_id: 666, bid_price_micros: 0, }, ]; choiceRequest.campaigns = [{ id: "123" }]; const message: any = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.lineitemid.should.equals(555); message.campaign_id.should.equals(123); message.best_bid.should.equals(1200); }); it("should flatten bids", () => { rtbResponse.bids = [ { line_item_id: 555, bid_price_micros: 1200, }, { line_item_id: 666, bid_price_micros: 0, }, ]; choiceRequest.campaigns = [{ id: "123" }]; const message = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.bids[555].should.equals(1200); message.bids[666].should.equals(0); }); it("should enforce integer bids", () => { rtbResponse.bids = [ { line_item_id: 555, bid_price_micros: 1201.005, }, { line_item_id: 666, bid_price_micros: new Long(1000.01), }, ]; choiceRequest.campaigns = [{ id: "123" }]; const message: any = adapter.adaptToBidRequest(choiceRequest, rtbRequest, rtbResponse); message.bids[555].should.equals(1201); message.bids[666].should.equals(1000); message.best_bid.should.equal(1201); }); }); describe("adaptToBidrequestRaw", () => { it("should be able to adapt an empty raw response", () => { adapter.adaptToBidRequestRaw(req, choiceRequest, rtbRequest); }); it("should map raw headers correctly", () => { req.headers = { host: "localhost", method: "POST", }; const message = adapter.adaptToBidRequestRaw(req, choiceRequest, rtbRequest); message.headers.should.equals('{"host":"localhost","method":"POST"}'); }); }); });