MailOnline/videojs-vast-vpaid

View on GitHub
test/ads/vast/Linear.spec.js

Summary

Maintainability
D
1 day
Test Coverage
'use strict';

describe("Linear", function () {

  var Linear = require('ads/vast/Linear');
  var MediaFile = require('ads/vast/MediaFile');
  var TrackingEvent = require('ads/vast/TrackingEvent');
  var VideoClicks = require('ads/vast/VideoClicks');

  var xml = require('utils/xml');

  it("must return an instance of Linear", function () {
    var linear = new Linear(xml.toJXONTree('<Linear></Linear>'));
    assert.instanceOf(linear, Linear);
  });

  //Required Elements
  describe("duration", function () {
    it("must contain the duration specified on the xml in ms", function () {
      var linearXML = '<Linear><Duration>00:00:58</Duration></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.duration, 58000);
    });
  });

  describe("mediaFiles", function () {
    it("must be an array", function () {
      var linearXML = '<Linear><MediaFiles></MediaFiles></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.isArray(linear.mediaFiles);
    });

    it("must contain all the specified mediaFiles", function () {
      var linearXML = '<?xml version="1.0" encoding="UTF-8"?>' +
        '<Linear>' +
        '<Duration>00:00:58</Duration>' +
        '<MediaFiles>' +
        '<MediaFile id="1" delivery="progressive" type="video/x-flv" bitrate="457" width="300" height="225">' +
        '<![CDATA[http://gcdn.2mdn.net/MotifFiles/html/2215309/PID_914438_1235753019000_dcrmvideo.flv]]>' +
        '</MediaFile>' +
        '<MediaFile id="2" delivery="streaming" type="video/x-flv" bitrate="457" width="300" height="225">' +
        '<![CDATA[http://gcdn.2mdn.net/MotifFiles/html/2215309/PID_914438_1235753019000_dcrmvideo.flv]]>' +
        '</MediaFile>' +
        '</MediaFiles>' +
        '</Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));

      assert.equal(linear.mediaFiles.length, 2);
      assert.instanceOf(linear.mediaFiles[0], MediaFile);
      assert.equal(1, linear.mediaFiles[0].id);
      assert.instanceOf(linear.mediaFiles[1], MediaFile);
      assert.equal(2, linear.mediaFiles[1].id);
    });
  });

  //Optional Elements
  describe("videoClicks", function () {
    it("must be an instance of videoClicks", function () {
      var linearXML = '<Linear><VideoClicks></VideoClicks></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.instanceOf(linear.videoClicks, VideoClicks);
    });
  });

  describe("trackingEvents", function () {
    /*jshint maxlen: 500 */
    it("must be filled with all the tracking events that the xml provides", function () {
      var linearXML = '<Linear>' +
        '<TrackingEvents>' +
        '<Tracking event="firstQuartile">' +
        '<![CDATA[http://t4.liverail.com/?metric=view25&pos=0&coid=135&pid=1331&nid=1331&oid=229&olid=2291331&cid=331&tpcid=&vid=&amid=&cc=default&pp=&vi=0&vv=&sg=&tsg=&pmu=0&pau=0&psz=0&ctx=&tctx=&coty=7&adt=0&did=&buid=&scen=&mca=&mma=&mct=0&url=http%3A%2F%2Fwww.iab.net%2Fguidelines%2F508676%2Fdigitalvideo%2Fvsuite%2Fvast%2Fvast_copy%2Fvast_xml_samples&trid=54afb53ccfddf1.12174006&bidf=0.10000&bids=0.00000&bidt=1&bidh=0&bidlaf=0&sdk=0&cb=8279.195.234.241.9.0&ver=1&w=&wy=&x=&y=&xy=]]>' +
        '</Tracking>' +
        '<Tracking event="midQuartile">' +
        '<![CDATA[http://t4.liverail.com/?metric=view25&pos=0&coid=135&pid=1331&nid=1331&oid=229&olid=2291331&cid=331&tpcid=&vid=&amid=&cc=default&pp=&vi=0&vv=&sg=&tsg=&pmu=0&pau=0&psz=0&ctx=&tctx=&coty=7&adt=0&did=&buid=&scen=&mca=&mma=&mct=0&url=http%3A%2F%2Fwww.iab.net%2Fguidelines%2F508676%2Fdigitalvideo%2Fvsuite%2Fvast%2Fvast_copy%2Fvast_xml_samples&trid=54afb53ccfddf1.12174006&bidf=0.10000&bids=0.00000&bidt=1&bidh=0&bidlaf=0&sdk=0&cb=8279.195.234.241.9.0&ver=1&w=&wy=&x=&y=&xy=]]>' +
        '</Tracking>' +
        '</TrackingEvents>' +
        '</Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      var trackingEvents = linear.trackingEvents;

      //First tracking event
      var tracking = trackingEvents[0];
      assert.instanceOf(tracking, TrackingEvent);
      assert.equal(tracking.name, 'firstQuartile');

      //Second tracking event
      tracking = trackingEvents[1];
      assert.instanceOf(tracking, TrackingEvent);
      assert.equal(tracking.name, 'midQuartile');
    });

    it("must properly set progress events", function () {
      var linearXML = '<Linear>' +
        '<TrackingEvents>' +
        '<Tracking event="progress" offset="10%"><![CDATA[track.url.com]]></Tracking>' +
        '<Tracking event="progress" offset="00:01:00"><![CDATA[track.url.com]]></Tracking>' +
        '</TrackingEvents>' +
        '<Duration>00:00:00.100</Duration>' +
        '</Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      var trackingEvents = linear.trackingEvents;

      assert.isArray(trackingEvents);
      assert.equal(trackingEvents.length, 2);
      assert.equal(trackingEvents[0].name, 'progress');
      assert.equal(trackingEvents[0].uri, 'track.url.com');
      assert.equal(trackingEvents[0].offset, 10);
      assert.equal(trackingEvents[1].name, 'progress');
      assert.equal(trackingEvents[1].uri, 'track.url.com');
      assert.equal(trackingEvents[1].offset, 60000);
    });
  });

  describe("skipoffset", function () {
    it("must contain whatever is set on the xml but parsed into ms", function () {
      var linearXML = '<Linear skipoffset="00:00:05.000"></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.skipoffset, 5000);
    });

    it("must be possible to set the skipoffset as a percentage", function () {
      var linearXML = '<Linear skipoffset="10%"><Duration>00:00:01</Duration></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.skipoffset, 100);
    });

    it("must be possible to set the skipoffset as a percentage with decimals", function () {
      var linearXML = '<Linear skipoffset="10.5%"><Duration>00:00:01</Duration></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.skipoffset, 105);
    });

    it("as percentage with no linear.duration must be null", function () {
      var linearXML = '<Linear skipoffset="10%"></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.isNull(linear.skipoffset);
    });
  });

  describe("AdParameters", function () {
    it("must handle when no parameters is passed", function () {

      [true, false].map(function(xmlEncoded) {
        return '<AdParameters xmlEncoded="' + xmlEncoded + '"><![CDATA[ ]]></AdParameters>';
      }).forEach(function (adParametersString) {

        var linearXML = '<Linear skipoffset="10%">' + adParametersString + '</Linear>';
        assert.doesNotThrow(function () {
          return new Linear(xml.toJXONTree(linearXML));
        });
      });
    });

    it("must be added to the linear", function () {
      var encodedAdParameters = xml.encode('<some>data</some>');

      var linearXML = '<Linear skipoffset="10%"><AdParameters><![CDATA[' + encodedAdParameters + ']]></AdParameters></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.adParameters, encodedAdParameters);
    });

    it("with xmlEncoded to true, must decode the ad params before adding them to the linear", function () {
      var encodedAdParameters = xml.encode('<some>data</some>');

      var linearXML = '<Linear skipoffset="10%"><AdParameters xmlEncoded="true"><![CDATA[' + encodedAdParameters + ']]></AdParameters></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.adParameters, '<some>data</some>');
    });

    it("with xmlEncoded to false, must NOT decode the ad params before adding them to the linear", function () {
      var encodedAdParameters = xml.encode('<some>data</some>');

      var linearXML = '<Linear skipoffset="10%"><AdParameters xmlEncoded="false"><![CDATA[' + encodedAdParameters + ']]></AdParameters></Linear>';
      var linear = new Linear(xml.toJXONTree(linearXML));
      assert.equal(linear.adParameters, encodedAdParameters);
    });
  });

  describe("isSupported", function () {
    var linear;

    beforeEach(function () {
      var linearXML = '<Linear><MediaFiles></MediaFiles></Linear>';
      linear = new Linear(xml.toJXONTree(linearXML));
    });

    it("must return true if at least one of the mediaFiles is supported", function () {
      linear.mediaFiles = [
        {
          isSupported: function () {
            return false;
          }
        },
        {
          isSupported: function () {
            return true;
          }
        }
      ];

      assert.isTrue(linear.isSupported());
    });

    it("must return false if none of the mediaFiles are supported", function () {
      linear.mediaFiles = [
        {
          isSupported: function () {
            return false;
          }
        },
        {
          isSupported: function () {
            return false;
          }
        }
      ];

      assert.isFalse(linear.isSupported());
    });
  });
});