UNPKG

playable

Version:

Video player based on HTML5Video

246 lines (190 loc) 7.61 kB
import 'jsdom-global/register'; import { expect } from 'chai'; import * as sinon from 'sinon'; import createPlayerTestkit from '../../testkit'; import DesktopFullScreen from './desktop'; import IOSFullScreen from './ios'; import { setProperty, resetProperty } from '../../testkit'; import { VideoEvent, UIEvent, EngineState } from '../../constants'; declare const navigator: any; const mockedFullscreenHelper = { isInFullScreen: false, isEnabled: true, request: sinon.spy(), exit: sinon.spy(), destroy: sinon.spy(), _reset() { this.isInFullScreen = false; this.isEnabled = true; this.request.resetHistory(); this.exit.resetHistory(); this.destroy.resetHistory(); }, }; describe('FullScreenManager', () => { let testkit: any; let fullScreenManager: any; let eventEmitter: any; let engine: any; beforeEach(() => { testkit = createPlayerTestkit(); eventEmitter = testkit.getModule('eventEmitter'); engine = testkit.getModule('engine'); fullScreenManager = testkit.getModule('fullScreenManager'); fullScreenManager._helper = mockedFullscreenHelper; }); afterEach(() => { mockedFullscreenHelper._reset(); }); describe('chosen helper', () => { afterEach(() => { resetProperty(navigator, 'userAgent'); }); it('should be for desktop if not on iOS', () => { setProperty(navigator, 'userAgent', 'Computer'); testkit = createPlayerTestkit(); fullScreenManager = testkit.getModule('fullScreenManager'); expect(fullScreenManager._helper instanceof DesktopFullScreen).to.be.true; }); it('should be for iPhone', () => { setProperty(navigator, 'userAgent', 'iPhone'); testkit = createPlayerTestkit(); fullScreenManager = testkit.getModule('fullScreenManager'); expect(fullScreenManager._helper instanceof IOSFullScreen).to.be.true; }); it('should be for iPod', () => { setProperty(navigator, 'userAgent', 'iPod'); testkit = createPlayerTestkit(); fullScreenManager = testkit.getModule('fullScreenManager'); expect(fullScreenManager._helper instanceof IOSFullScreen).to.be.true; }); it('should be for iPad', () => { setProperty(navigator, 'userAgent', 'iPad'); testkit = createPlayerTestkit(); fullScreenManager = testkit.getModule('fullScreenManager'); expect(fullScreenManager._helper instanceof IOSFullScreen).to.be.true; }); }); describe('enable state', () => { it('should be based on helper state and config', () => { expect(fullScreenManager.isEnabled).to.be.true; mockedFullscreenHelper.isEnabled = false; expect(fullScreenManager.isEnabled).to.be.false; }); it('should return false in disabled flag passed in config', () => { mockedFullscreenHelper.isEnabled = true; fullScreenManager._isEnabled = false; expect(fullScreenManager.isEnabled).to.be.false; }); }); describe('full screen state', () => { it('should return state of helper', () => { mockedFullscreenHelper.isInFullScreen = true; expect(fullScreenManager.isInFullScreen).to.be.true; }); it('should return false if disabled', () => { mockedFullscreenHelper.isEnabled = false; mockedFullscreenHelper.isInFullScreen = true; expect(fullScreenManager.isInFullScreen).to.be.false; }); }); describe('method for entering full screen', () => { it("should call helper's method for request full screen", () => { fullScreenManager.enterFullScreen(); expect(mockedFullscreenHelper.request.called).to.be.true; }); it('should do nothing if full screen is not enable', () => { mockedFullscreenHelper.isEnabled = false; fullScreenManager.enterFullScreen(); expect(mockedFullscreenHelper.request.called).to.be.false; }); }); describe('method for exiting full screen', () => { it("should call helper's method for request full screen", () => { fullScreenManager.exitFullScreen(); expect(mockedFullscreenHelper.exit.called).to.be.true; }); it('should do nothing if full screen is not enable', () => { mockedFullscreenHelper.isEnabled = false; fullScreenManager.exitFullScreen(); expect(mockedFullscreenHelper.exit.called).to.be.false; }); }); describe('due to reaction on fullscreen change', () => { it('should trigger proper event', () => { const spy: sinon.SinonSpy = sinon.spy(eventEmitter, 'emitAsync'); mockedFullscreenHelper.isInFullScreen = true; fullScreenManager._onChange({ target: fullScreenManager._element }); expect( spy.calledWith( UIEvent.FULL_SCREEN_STATE_CHANGED, mockedFullscreenHelper.isInFullScreen, ), ).to.be.true; eventEmitter.emitAsync.restore(); }); it('should not trigger if fullscreen target is not proper element', () => { const spy: sinon.SinonSpy = sinon.spy(eventEmitter, 'emitAsync'); mockedFullscreenHelper.isInFullScreen = true; fullScreenManager._onChange({ target: null }); expect( spy.calledWith( UIEvent.FULL_SCREEN_STATE_CHANGED, mockedFullscreenHelper.isInFullScreen, ), ).to.be.false; eventEmitter.emitAsync.restore(); }); it('should pause video on exit from full screen if proper config passed', () => { const spy = sinon.stub(engine, 'pause'); fullScreenManager._pauseVideoOnFullScreenExit = true; mockedFullscreenHelper.isInFullScreen = false; fullScreenManager._onChange({ target: fullScreenManager._element }); expect(spy.called).to.be.true; engine.pause.restore(); }); }); describe('due to reaction on play request', () => { it('should enter full screen if proper config passed', async function() { const spy = sinon.spy(fullScreenManager, 'enterFullScreen'); await eventEmitter.emitAsync(VideoEvent.PLAY_REQUEST); fullScreenManager._enterFullScreenOnPlay = true; mockedFullscreenHelper.isInFullScreen = false; await eventEmitter.emitAsync(VideoEvent.PLAY_REQUEST); expect(spy.calledOnce).to.be.true; fullScreenManager.enterFullScreen.restore(); }); }); describe('due to reaction on state changed', () => { describe('to end state', () => { it('should exit full screen if config passed', async function() { const spy = sinon.spy(fullScreenManager, 'exitFullScreen'); await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, { nextState: EngineState.ENDED, }); fullScreenManager._exitFullScreenOnEnd = true; mockedFullscreenHelper.isInFullScreen = true; await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, { nextState: EngineState.ENDED, }); expect(spy.calledOnce).to.be.true; fullScreenManager.exitFullScreen.restore(); }); }); describe('to pause state', () => { it('should exit full screen if config passed', async function() { const spy = sinon.spy(fullScreenManager, 'exitFullScreen'); await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, { nextState: EngineState.PAUSED, }); fullScreenManager._exitFullScreenOnPause = true; mockedFullscreenHelper.isInFullScreen = true; await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, { nextState: EngineState.PAUSED, }); expect(spy.calledOnce).to.be.true; fullScreenManager.exitFullScreen.restore(); }); }); }); });