UNPKG

mk9-prebid

Version:

Header Bidding Management Library

342 lines (283 loc) 10.4 kB
import { expect } from 'chai'; import { resolveStatus, setSizeConfig, sizeSupported } from 'src/sizeMapping.js'; import includes from 'core-js-pure/features/array/includes.js'; let utils = require('src/utils'); let deepClone = utils.deepClone; describe('sizeMapping', function () { var testSizes = { banner: { sizes: [[970, 90], [728, 90], [300, 250], [300, 100], [80, 80]] } }; var sizeConfig = [{ 'mediaQuery': '(min-width: 1200px)', 'sizesSupported': [ [970, 90], [728, 90], [300, 250] ] }, { 'mediaQuery': '(min-width: 768px) and (max-width: 1199px)', 'sizesSupported': [ [728, 90], [300, 250], [300, 100] ] }, { 'mediaQuery': '(min-width: 0px) and (max-width: 767px)', 'sizesSupported': [] }]; var sizeConfigWithLabels = [{ 'mediaQuery': '(min-width: 1200px)', 'labels': ['desktop'] }, { 'mediaQuery': '(min-width: 768px) and (max-width: 1199px)', 'sizesSupported': [ [728, 90], [300, 250] ], 'labels': ['tablet', 'phone'] }, { 'mediaQuery': '(min-width: 0px) and (max-width: 767px)', 'sizesSupported': [ [300, 250], [300, 100] ], 'labels': ['phone'] }]; let sandbox, matchMediaOverride; beforeEach(function () { setSizeConfig(sizeConfig); sandbox = sinon.sandbox.create(); matchMediaOverride = {matches: false}; sandbox.stub(utils.getWindowTop(), 'matchMedia').callsFake((...args) => { if (typeof matchMediaOverride === 'function') { return matchMediaOverride.apply(utils.getWindowTop(), args); } return matchMediaOverride; }); }); afterEach(function () { setSizeConfig([]); sandbox.restore(); }); describe('when handling sizes', function () { it('should allow us to validate a single size', function() { matchMediaOverride = (str) => str === '(min-width: 1200px)' ? {matches: true} : {matches: false}; expect(sizeSupported([300, 250])).to.equal(true); expect(sizeSupported([80, 80])).to.equal(false); }); it('should log a warning when mediaQuery property missing from sizeConfig', function () { let errorConfig = deepClone(sizeConfig); delete errorConfig[0].mediaQuery; sandbox.stub(utils, 'logWarn'); resolveStatus(undefined, testSizes, undefined, errorConfig); expect(utils.logWarn.firstCall.args[0]).to.match(/missing.+?mediaQuery/); }); it('should log a warning message when mediaQuery property is declared as an empty string', function() { const errorConfig = deepClone(sizeConfig); errorConfig[0].mediaQuery = ''; sandbox.stub(utils, 'logWarn'); resolveStatus(undefined, testSizes, undefined, errorConfig); expect(utils.logWarn.firstCall.args[0]).to.match(/missing.+?mediaQuery/); }); it('should allow deprecated adUnit.sizes', function() { matchMediaOverride = (str) => str === '(min-width: 1200px)' ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, undefined, testSizes.banner.sizes, sizeConfig); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [[970, 90], [728, 90], [300, 250]] } }); }); it('when one mediaQuery block matches, it should filter the adUnit.sizes passed in', function () { matchMediaOverride = (str) => str === '(min-width: 1200px)' ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, testSizes, undefined, sizeConfig); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [[970, 90], [728, 90], [300, 250]] } }); }); it('when multiple mediaQuery block matches, it should filter a union of the matched sizesSupported', function () { matchMediaOverride = (str) => includes([ '(min-width: 1200px)', '(min-width: 768px) and (max-width: 1199px)' ], str) ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, testSizes, undefined, sizeConfig); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [[970, 90], [728, 90], [300, 250], [300, 100]] } }); }); it('if no mediaQueries match, it should allow all sizes specified', function () { matchMediaOverride = () => ({matches: false}); let status = resolveStatus(undefined, testSizes, undefined, sizeConfig); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal(testSizes); }); it('if a mediaQuery matches and has sizesSupported: [], it should filter all sizes', function () { matchMediaOverride = (str) => str === '(min-width: 0px) and (max-width: 767px)' ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, testSizes, undefined, sizeConfig); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [] } }); }); it('should filter all banner sizes and should disable the adUnit even if other mediaTypes are present', function () { matchMediaOverride = (str) => str === '(min-width: 0px) and (max-width: 767px)' ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, Object.assign({}, testSizes, { native: { type: 'image' } }), undefined, sizeConfig); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [] }, native: { type: 'image' } }); }); it('if a mediaQuery matches and no sizesSupported specified, it should not affect adUnit.sizes', function () { matchMediaOverride = (str) => str === '(min-width: 1200px)' ? {matches: true} : {matches: false}; let status = resolveStatus(undefined, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal(testSizes); }); }); describe('when handling labels', function () { it('should activate/deactivate adUnits/bidders based on sizeConfig.labels', function () { matchMediaOverride = (str) => str === '(min-width: 1200px)' ? {matches: true} : {matches: false}; let status = resolveStatus({ labels: ['desktop'] }, testSizes, undefined, sizeConfigWithLabels); expect(status).to.deep.equal({ active: true, mediaTypes: testSizes }); status = resolveStatus({ labels: ['tablet'] }, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal(testSizes); }); it('should activate/decactivate adUnits/bidders based on labels with multiformat ads', function () { matchMediaOverride = (str) => str === '(min-width: 768px) and (max-width: 1199px)' ? {matches: true} : {matches: false}; let multiFormatSizes = { banner: { sizes: [[728, 90], [300, 300]] }, native: { type: 'image' }, video: { context: 'outstream', playerSize: [300, 300] } }; let status = resolveStatus({ labels: ['tablet', 'test'], labelAll: true }, multiFormatSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [[728, 90]] }, native: { type: 'image' }, video: { context: 'outstream', playerSize: [300, 300] } }); status = resolveStatus({ labels: ['tablet'] }, multiFormatSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [[728, 90]] }, native: { type: 'image' }, video: { context: 'outstream', playerSize: [300, 300] } }); multiFormatSizes.banner.sizes.splice(0, 1, [728, 80]); status = resolveStatus({ labels: ['tablet'] }, multiFormatSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal({ banner: { sizes: [] }, native: { type: 'image' }, video: { context: 'outstream', playerSize: [300, 300] } }); delete multiFormatSizes.banner; status = resolveStatus({ labels: ['tablet'] }, multiFormatSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal({ native: { type: 'image' }, video: { context: 'outstream', playerSize: [300, 300] } }); }); it('should active/deactivate adUnits/bidders based on requestBids labels', function () { let activeLabels = ['us-visitor', 'desktop', 'smart']; let status = resolveStatus({ labels: ['uk-visitor'], // from adunit activeLabels // from requestBids.labels }, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal(testSizes); status = resolveStatus({ labels: ['us-visitor'], activeLabels }, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal(testSizes); status = resolveStatus({ labels: ['us-visitor', 'tablet'], labelAll: true, activeLabels }, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(false); expect(status.mediaTypes).to.deep.equal(testSizes); status = resolveStatus({ labels: ['us-visitor', 'desktop'], labelAll: true, activeLabels }, testSizes, undefined, sizeConfigWithLabels); expect(status.active).to.equal(true); expect(status.mediaTypes).to.deep.equal(testSizes); }); }); });