UNPKG

mk9-prebid

Version:

Header Bidding Management Library

438 lines (375 loc) 14.7 kB
import {expect} from 'chai'; import {spec} from 'modules/h12mediaBidAdapter'; import {newBidder} from 'src/adapters/bidderFactory'; import * as utils from 'src/utils'; describe('H12 Media Adapter', function () { const DEFAULT_CURRENCY = 'USD'; const DEFAULT_TTL = 360; const DEFAULT_NET_REVENUE = false; const adapter = newBidder('spec'); const validBid = { adUnitCode: 'div-gpt-ad-1460505748561-0', mediaTypes: { banner: { sizes: [[300, 250], [300, 600]], } }, bidder: 'h12media', bidId: '1c5e8a1a84522d', bidderRequestId: '1d0c4017f02458', auctionId: '9adc85ed-43ee-4a78-816b-52b7e578f313', params: { pubid: 123321, pubsubid: 'pubsubtestid', }, }; const validBid2 = { adUnitCode: 'div-gpt-ad-1460505748561-1', mediaTypes: { banner: {} }, bidder: 'h12media', bidId: '2c5e8a1a84522d', bidderRequestId: '2d0c4017f02458', auctionId: '9adc85ed-43ee-4a78-816b-52b7e578f314', params: { pubid: 123321, size: '100x200' }, }; const invalidBid = { adUnitCode: 'div-gpt-ad-1460505748561-2', mediaTypes: { banner: { sizes: [[300, 250], [300, 600]], } }, bidder: 'h12media', bidId: '3c5e8a1a84522d', bidderRequestId: '3d0c4017f02458', auctionId: '9adc85ed-43ee-4a78-816b-52b7e578f315', }; const bidderRequest = { refererInfo: { referer: 'https://localhost' }, gdprConsent: { gdprApplies: 1, consentString: 'concentDataString', vendorData: { vendorConsents: { '90': 1 }, }, }, uspConsent: 'consentUspString' }; const serverResponse = { currency: 'EUR', netRevenue: true, ttl: 500, bid: { bidId: validBid.bidId, cpm: 0.33, width: 300, height: 600, creativeId: '335566', ad: '<div>my ad</div>', meta: { advertiserId: '54321', advertiserName: 'My advertiser', advertiserDomains: ['test.com'] } }, usersync: [ {url: 'https://cookiesync.3rdpartypartner.com/?3rdparty_partner_user_id={user_id}&partner_id=h12media&gdpr_applies={gdpr}&gdpr_consent_string={gdpr_cs}', type: 'image'}, {url: 'https://cookiesync.3rdpartypartner.com/?3rdparty_partner_user_id={user_id}&partner_id=h12media&gdpr_applies={gdpr}&gdpr_consent_string={gdpr_cs}', type: 'iframe'} ], }; const serverResponse2 = { bid: { bidId: validBid2.bidId, cpm: 0.33, width: 300, height: 600, creativeId: '335566', ad: '<div>my ad 2</div>', } }; function removeElement(id) { if (document.getElementById(id)) { document.body.removeChild(document.getElementById(id)); } } function createElement(id) { const div = document.createElement('div'); div.id = id; div.style.width = '50px'; div.style.height = '50px'; if (frameElement) { frameElement.style.width = '100px'; frameElement.style.height = '100px'; } div.style.background = 'black'; document.body.appendChild(div); return div; } function createElementVisible(id) { const element = createElement(id); sandbox.stub(element, 'getBoundingClientRect').returns({ x: 10, y: 10, }); return element; } function createElementInvisible(id) { const element = document.createElement('div'); element.id = id; document.body.appendChild(element); element.style.display = 'none'; return element; } function createElementHidden(id) { const element = createElement(id); document.body.appendChild(element); element.style.visibility = 'hidden'; sandbox.stub(element, 'getBoundingClientRect').returns({ x: 100, y: 100, }); return element; } let sandbox; beforeEach(function () { sandbox = sinon.sandbox.create(); sandbox.stub(frameElement, 'getBoundingClientRect').returns({ left: 10, top: 10, }); }); afterEach(function () { removeElement(validBid.adUnitCode); removeElement(validBid2.adUnitCode); removeElement(invalidBid.adUnitCode); sandbox.restore(); }); after(function() { sandbox.reset(); }) describe('inherited functions', function () { it('exists and is a function', function () { expect(adapter.callBids).to.exist.and.to.be.a('function'); }); }); describe('isBidRequestValid', function () { it('should return true when bid is valid', function () { expect(spec.isBidRequestValid(validBid)).to.equal(true); }); it('should return false when bid does not have pubid parameter', function () { expect(spec.isBidRequestValid(invalidBid)).to.equal(false); }); }); describe('buildRequests', function () { it('should return adUnit size', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.include({adunitSize: validBid.mediaTypes.banner.sizes}); }); it('should return empty bid size', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData2 = requests[1].data.bidrequest; expect(requestsData2).to.deep.include({adunitSize: []}); }); it('should return pubsubid from params', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData = requests[0].data.bidrequest; const requestsData2 = requests[1].data.bidrequest; expect(requestsData).to.include({pubsubid: 'pubsubtestid'}); expect(requestsData2).to.include({pubsubid: ''}); }); it('should return empty for incorrect pubsubid from params', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const bidWithPub = {...validBid}; bidWithPub.params.pubsubid = 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii'; // More than 32 chars const requests = spec.buildRequests([bidWithPub], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.include({pubsubid: ''}); }); it('should return bid size from params', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData = requests[0].data.bidrequest; const requestsData2 = requests[1].data.bidrequest; expect(requestsData).to.include({size: ''}); expect(requestsData2).to.include({size: validBid2.params.size}); }); it('should return GDPR info', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData = requests[0].data; const requestsData2 = requests[1].data; expect(requestsData).to.include({gdpr: true, gdpr_cs: bidderRequest.gdprConsent.consentString}); expect(requestsData2).to.include({gdpr: true, gdpr_cs: bidderRequest.gdprConsent.consentString}); }); it('should not have error on empty GDPR', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const bidderRequestWithoutGDRP = {...bidderRequest, gdprConsent: null}; const requests = spec.buildRequests([validBid, validBid2], bidderRequestWithoutGDRP); const requestsData = requests[0].data; const requestsData2 = requests[1].data; expect(requestsData).to.include({gdpr: false}); expect(requestsData2).to.include({gdpr: false}); }); it('should not have error on empty USP', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const bidderRequestWithoutUSP = {...bidderRequest, uspConsent: null}; const requests = spec.buildRequests([validBid, validBid2], bidderRequestWithoutUSP); const requestsData = requests[0].data; const requestsData2 = requests[1].data; expect(requestsData).to.include({usp: false}); expect(requestsData2).to.include({usp: false}); }); it('should create single POST', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); expect(requests[0].method).to.equal('POST'); expect(requests[1].method).to.equal('POST'); }); }); describe('creative viewability', function () { it('should return coords', function () { createElementVisible(validBid.adUnitCode); const requests = spec.buildRequests([validBid], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.deep.include({coords: {x: 10, y: 10}}); }); it('should define iframe', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const requests = spec.buildRequests([validBid, validBid2], bidderRequest); const requestsData = requests[0].data; const requestsData2 = requests[1].data; expect(requestsData).to.include({isiframe: true}); expect(requestsData2).to.include({isiframe: true}); }); it('should define visible element', function () { createElementVisible(validBid.adUnitCode); const requests = spec.buildRequests([validBid], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.include({ishidden: false}); }); it('should define invisible element', function () { createElementInvisible(validBid.adUnitCode); const requests = spec.buildRequests([validBid], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.include({ishidden: true}); }); it('should define hidden element', function () { createElementHidden(validBid.adUnitCode); const requests = spec.buildRequests([validBid], bidderRequest); const requestsData = requests[0].data.bidrequest; expect(requestsData).to.include({ishidden: true}); }); }); describe('interpretResponse', function () { it('should return no bids if the response is not valid', function () { const bidResponse = spec.interpretResponse({ body: null }, validBid); expect(bidResponse.length).to.equal(0); }); it('should return no bids if the response is empty', function () { const bidResponse = spec.interpretResponse({ body: [] }, { validBid }); expect(bidResponse).to.be.empty; }); it('should return valid bid responses', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const request = spec.buildRequests([validBid, validBid2], bidderRequest); const bidResponse = spec.interpretResponse({body: serverResponse}, request[0]); expect(bidResponse[0]).to.deep.include({ requestId: validBid.bidId, ad: serverResponse.bid.ad, mediaType: 'banner', creativeId: serverResponse.bid.creativeId, cpm: serverResponse.bid.cpm, width: serverResponse.bid.width, height: serverResponse.bid.height, currency: 'EUR', netRevenue: true, ttl: 500, meta: serverResponse.bid.meta, pubid: validBid.params.pubid }); }); it('should return default bid params', function () { createElementVisible(validBid.adUnitCode); createElementVisible(validBid2.adUnitCode); const request = spec.buildRequests([validBid, validBid2], bidderRequest); const bidResponse = spec.interpretResponse({body: serverResponse2}, request[0]); expect(bidResponse[0]).to.deep.include({ requestId: validBid2.bidId, ad: serverResponse2.bid.ad, mediaType: 'banner', creativeId: serverResponse2.bid.creativeId, cpm: serverResponse2.bid.cpm, width: serverResponse2.bid.width, height: serverResponse2.bid.height, meta: serverResponse2.bid.meta, pubid: validBid2.params.pubid, currency: DEFAULT_CURRENCY, netRevenue: DEFAULT_NET_REVENUE, ttl: DEFAULT_TTL, }); }); }); describe('getUserSyncs', function () { let syncOptions beforeEach(function () { syncOptions = { enabledBidders: ['h12media'], pixelEnabled: true, iframeEnabled: true } }); it('should success with usersync pixel url', function () { const result = { type: 'image', url: `https://cookiesync.3rdpartypartner.com/?3rdparty_partner_user_id={user_id}&partner_id=h12media&gdpr_applies=${bidderRequest.gdprConsent.gdprApplies}&gdpr_consent_string=${bidderRequest.gdprConsent.consentString}`, }; const syncs = spec.getUserSyncs(syncOptions, [{body: serverResponse}], bidderRequest.gdprConsent); expect(syncs).to.deep.include(result); }); it('should success with usersync iframe url', function () { const result = { type: 'iframe', url: `https://cookiesync.3rdpartypartner.com/?3rdparty_partner_user_id={user_id}&partner_id=h12media&gdpr_applies=${bidderRequest.gdprConsent.gdprApplies}&gdpr_consent_string=${bidderRequest.gdprConsent.consentString}`, }; const syncs = spec.getUserSyncs(syncOptions, [{body: serverResponse}], bidderRequest.gdprConsent); expect(syncs).to.deep.include(result); }); it('should success without GDRP', function () { const result = { type: 'iframe', url: `https://cookiesync.3rdpartypartner.com/?3rdparty_partner_user_id={user_id}&partner_id=h12media&gdpr_applies=false&gdpr_consent_string=`, }; expect(spec.getUserSyncs(syncOptions, [{body: serverResponse}], null)).to.deep.include(result); }); it('should success without usersync url', function () { expect(spec.getUserSyncs(syncOptions, [{body: serverResponse2}], bidderRequest.gdprConsent)).to.deep.equal([]); }); it('should return empty usersync on empty response', function () { expect(spec.getUserSyncs(syncOptions, [{body: {}}])).to.deep.equal([]); }); }); });