UNPKG

3.73 kBJavaScriptView Raw
1/*
2TODO:
3* timeupdate, adtimeupdate, contenttimeupdate
4* loadstart, adloadstart, contentloadstart
5* play, adplay, contentplay
6* loadeddata, adloadeddata, contentloadeddata
7* loadedmetadata, adloadedmetadata, contentloadedmetadata
8*/
9
10import videojs from 'video.js';
11import QUnit from 'qunit';
12import document from 'global/document';
13import '../../examples/stitched-ad-plugin/plugin.js';
14
15const originalTestTimeout = QUnit.config.testTimeout;
16
17QUnit.module('Events and Stitched Ads', {
18
19 before() {
20 QUnit.config.testTimeout = 30000;
21 },
22
23 beforeEach() {
24 this.video = document.createElement('video');
25
26 this.fixture = document.querySelector('#qunit-fixture');
27 this.fixture.appendChild(this.video);
28
29 this.player = videojs(this.video);
30 this.player.exampleStitchedAds();
31
32 this.player.src({
33 src: 'http://vjs.zencdn.net/v/oceans.webm',
34 type: 'video/webm'
35 });
36
37 // Mute the player to allow playback without user interaction
38 this.player.muted(true);
39 },
40
41 afterEach() {
42 this.player.dispose();
43 },
44
45 after() {
46 QUnit.config.testTimeout = originalTestTimeout;
47 }
48});
49
50QUnit.test('Stitched Ads', function(assert) {
51 const done = assert.async();
52
53 const seenBeforePreroll = [];
54 const seenDuringPreroll = [];
55 const seenAfterPreroll = [];
56 const seenDuringMidroll = [];
57 const seenAfterMidroll = [];
58 let currentEventLog = seenBeforePreroll;
59 let finish;
60
61 let events = [
62 'suspend',
63 'abort',
64 'error',
65 'emptied',
66 'stalled',
67 'canplay',
68 'canplaythrough',
69 'waiting',
70 'seeking',
71 'durationchange',
72 'progress',
73 'pause',
74 'ratechange',
75 'volumechange',
76 'firstplay',
77 'suspend',
78 'playing',
79 'ended'
80 ];
81
82 events = events
83 .concat(events.map(e => 'ad' + e))
84 .concat(events.map(e => 'content' + e));
85
86 const {player} = this;
87
88 player.on('adstart', () => {
89 if (currentEventLog === seenBeforePreroll) {
90 currentEventLog = seenDuringPreroll;
91 } else {
92 currentEventLog = seenDuringMidroll;
93 }
94 });
95
96 player.on('adend', () => {
97 if (currentEventLog === seenDuringPreroll) {
98 currentEventLog = seenAfterPreroll;
99 } else {
100 currentEventLog = seenAfterMidroll;
101 }
102 });
103
104 player.on(events, (e) => currentEventLog.push(e.type));
105
106 const onError = () => {
107 assert.ok(false, 'no errors');
108 finish();
109 };
110
111 const onTimeupdate = () => {
112 videojs.log(player.currentTime(), player.currentSrc());
113
114 if (player.currentTime() > 21) {
115 seenBeforePreroll.forEach(event => {
116 assert.ok(!/^ad/.test(event), event + ' has no ad prefix before preroll');
117 assert.ok(!/^content/.test(event), event + ' has no content prefix before preroll');
118 });
119
120 seenDuringPreroll.forEach(event => {
121 assert.ok(/^ad/.test(event), event + ' has ad prefix during preroll');
122 });
123
124 seenAfterPreroll.forEach(event => {
125 assert.ok(!/^ad/.test(event), event + ' has no ad prefix after preroll');
126 assert.ok(!/^content/.test(event), event + ' has no content prefix after preroll');
127 });
128
129 seenDuringMidroll.forEach(event => {
130 assert.ok(/^ad/.test(event), event + ' has ad prefix during midroll');
131 });
132
133 seenAfterMidroll.forEach(event => {
134 assert.ok(!/^ad/.test(event), event + ' has no ad prefix after midroll');
135 assert.ok(!/^content/.test(event), event + ' has no content prefix after midroll');
136 });
137
138 finish();
139 }
140 };
141
142 finish = () => {
143 player.off('timeupdate', onTimeupdate);
144 player.off(['error', 'aderror'], onError);
145 done();
146 };
147
148 player.on(['error', 'aderror'], onError);
149 player.on('timeupdate', onTimeupdate);
150 player.ready(player.play);
151});