UNPKG

playable

Version:

Video player based on HTML5Video

174 lines (145 loc) 5.14 kB
import 'jsdom-global/register'; import { expect } from 'chai'; import * as sinon from 'sinon'; import EventEmitter from '../../../../modules/event-emitter/event-emitter'; import getNativeAdapterCreator from './adapters/native'; import AdapterStrategy from './adapters-strategy'; import { MediaStreamDeliveryPriority, MediaStreamType, } from '../../../../constants'; describe('AdapterStrategy', () => { const video = document.createElement('video'); let strategy: any; let eventEmitter: any; let playbackAdapters; beforeEach(() => { eventEmitter = new EventEmitter(); // @ts-ignore strategy = new AdapterStrategy(eventEmitter, video); }); it('should do nothing if src not passed', () => { strategy.connectAdapter(); expect(strategy.attachedAdapter).to.be.null; }); it('should generate list of available stream creator in env on construction', () => { const availableStream = getNativeAdapterCreator( MediaStreamType.HLS, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ); const unavailableStream = getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ); availableStream.isSupported = () => true; unavailableStream.isSupported = () => false; const newStrategy: any = new AdapterStrategy(eventEmitter, video, [ availableStream, unavailableStream, ]); expect(newStrategy._availableAdapters.length).to.be.equal(1); expect(newStrategy._availableAdapters[0].constructor).to.be.equal( availableStream, ); }); it('should choose proper media stream for proper format', () => { playbackAdapters = [ getNativeAdapterCreator( MediaStreamType.HLS, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), getNativeAdapterCreator( MediaStreamType.MP4, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), ]; playbackAdapters.forEach(adapter => strategy._availableAdapters.push(new adapter(strategy._eventEmitter)), ); strategy.connectAdapter('http://www.dash.com/dash.mpd'); expect(strategy.attachedAdapter.mediaStreamType).to.be.equal( MediaStreamType.DASH, ); strategy.connectAdapter('http://www.hls.com/hls.m3u8'); expect(strategy.attachedAdapter.mediaStreamType).to.be.equal( MediaStreamType.HLS, ); strategy.connectAdapter({ url: 'http://www.mp4.com/mp4.mp4', type: MediaStreamType.MP4, }); }); it('should choose proper media stream based on priority', () => { playbackAdapters = [ getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE, ), getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), ]; playbackAdapters.forEach(adapter => strategy._availableAdapters.push(new adapter(strategy._eventEmitter)), ); strategy.connectAdapter('http://www.dash.com/dash.mpd'); expect(strategy.attachedAdapter.mediaStreamDeliveryPriority).to.be.equal( MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ); playbackAdapters = [ getNativeAdapterCreator( MediaStreamType.HLS, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), getNativeAdapterCreator( MediaStreamType.HLS, MediaStreamDeliveryPriority.NATIVE_PROGRESSIVE, ), ]; playbackAdapters.forEach(adapter => strategy._availableAdapters.push(new adapter(strategy._eventEmitter)), ); strategy.connectAdapter('http://www.hls.com/hls.m3u8'); expect(strategy.attachedAdapter.mediaStreamDeliveryPriority).to.be.equal( MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ); }); it('should detach current stream on changing of stream and destroy', () => { playbackAdapters = [ getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), ]; playbackAdapters.forEach(adapter => strategy._availableAdapters.push(new adapter(strategy._eventEmitter)), ); strategy.connectAdapter('http://www.dash.com/dash.mpd'); const attachedAdapter = strategy.attachedAdapter; sinon.spy(attachedAdapter, 'detach'); strategy.connectAdapter('http://www.dash.com/dash2.mpd'); expect(attachedAdapter.detach.called).to.be.true; }); it('should detach current stream on destroy', () => { playbackAdapters = [ getNativeAdapterCreator( MediaStreamType.DASH, MediaStreamDeliveryPriority.NATIVE_ADAPTIVE, ), ]; // @ts-ignore playbackAdapters.forEach(adapter => strategy._availableAdapters.push(new adapter(strategy._eventEmitter)), ); strategy.connectAdapter('http://www.dash.com/dash.mpd'); const attachedAdapter = strategy.attachedAdapter; sinon.spy(attachedAdapter, 'detach'); strategy.destroy(); expect(attachedAdapter.detach.called).to.be.true; }); });