UNPKG

playable

Version:

Video player based on HTML5Video

213 lines (163 loc) 6.59 kB
import 'jsdom-global/register'; import { expect } from 'chai'; import * as sinon from 'sinon'; import createPlayerTestkit from '../../../testkit'; import LiveIndicator from './live-indicator'; import { VideoEvent, LiveState } from '../../../constants'; describe('LiveIndicator', () => { let testkit; let engine: any; let eventEmitter: any; let liveIndicator: LiveIndicator; beforeEach(() => { testkit = createPlayerTestkit(); engine = testkit.getModule('engine'); eventEmitter = testkit.getModule('eventEmitter'); liveIndicator = testkit.getModule('liveIndicator'); }); describe('constructor', () => { it('should create instance ', () => { expect(liveIndicator).to.exist; expect(liveIndicator.view).to.exist; }); }); describe('instance', () => { it('should have method for showing/hiding liveIndicator', () => { const viewToggleSpy = sinon.spy(liveIndicator.view, 'toggle'); expect(liveIndicator.isHidden, 'hidden by default').to.be.true; liveIndicator.show(); expect(viewToggleSpy.calledWith(true)).to.be.true; expect(liveIndicator.isHidden, 'hidden after method show called').to.be .false; liveIndicator.hide(); expect(viewToggleSpy.lastCall.calledWith(false)).to.be.true; expect(liveIndicator.isHidden, 'hidden after method hide called').to.be .true; viewToggleSpy.restore(); }); it('should have method for getting view node', () => { expect(liveIndicator.getElement()).to.equal( liveIndicator.view.getElement(), ); }); it('should try to sync with live on click', () => { const engineSyncWithLiveSpy = sinon.stub(engine, 'syncWithLive'); const liveIndicatorViewNode = liveIndicator.view.getElement(); liveIndicatorViewNode.dispatchEvent(new Event('click')); expect(engineSyncWithLiveSpy.called).to.be.true; engineSyncWithLiveSpy.restore(); }); }); describe('on live state change', () => { it('should reset on `LiveState.NONE`', async function() { const viewToggleSpy = sinon.spy(liveIndicator.view, 'toggle'); const viewToggleActiveSpy = sinon.spy(liveIndicator.view, 'toggleActive'); const viewToggleEndedSpy = sinon.spy(liveIndicator.view, 'toggleEnded'); liveIndicator.show(); expect(liveIndicator.isHidden, 'hidden before `LiveState.NONE`').to.be .false; await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.NONE, }); expect(liveIndicator.isHidden, 'isHidden').to.be.true; expect(viewToggleSpy.calledWith(false), 'view.toggle called with `false`') .to.be.true; expect( viewToggleActiveSpy.calledWith(false), 'view.toggleActive called with `false`', ).to.be.true; expect( viewToggleEndedSpy.calledWith(false), 'view.toggleEnded called with `false`', ).to.be.true; viewToggleSpy.restore(); viewToggleActiveSpy.restore(); viewToggleEndedSpy.restore(); }); describe('for dynamic content', () => { beforeEach(async function() { await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.NONE, }); }); it('should show on `LiveState.INITIAL`', async function() { const viewToggleSpy = sinon.spy(liveIndicator.view, 'toggle'); expect(liveIndicator.isHidden, 'hidden before `LiveState.INITIAL`').to .be.true; await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.INITIAL, }); expect(liveIndicator.isHidden).to.be.false; expect(viewToggleSpy.calledWith(true)).to.be.true; viewToggleSpy.restore(); }); it('should activate on `LiveState.SYNC`', async function() { const viewToggleActiveSpy = sinon.spy( liveIndicator.view, 'toggleActive', ); await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.INITIAL, }); expect(liveIndicator.isHidden, 'hidden before `LiveState.SYNC`').to.be .false; expect(liveIndicator.isActive, 'active before `LiveState.SYNC`').to.be .false; await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.SYNC, }); expect(liveIndicator.isActive).to.be.true; expect(viewToggleActiveSpy.calledWith(true)).to.be.true; viewToggleActiveSpy.restore(); }); it('should deactivate on `LiveState.NOT_SYNC`', async function() { const viewToggleActiveSpy = sinon.spy( liveIndicator.view, 'toggleActive', ); await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.INITIAL, }); await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.SYNC, }); expect(liveIndicator.isActive, 'active before out of sync').to.be.true; await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.NOT_SYNC, }); expect(liveIndicator.isActive).to.be.false; expect(viewToggleActiveSpy.lastCall.calledWith(false)).to.be.true; viewToggleActiveSpy.restore(); }); it('should react to `LiveState.ENDED`', async function() { const viewToggleActiveSpy = sinon.spy( liveIndicator.view, 'toggleActive', ); const viewToggleEndedSpy = sinon.spy(liveIndicator.view, 'toggleEnded'); await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.INITIAL, }); await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.SYNC, }); expect(liveIndicator.isActive, 'active before `LiveState.ENDED`').to.be .true; await eventEmitter.emitAsync(VideoEvent.LIVE_STATE_CHANGED, { nextState: LiveState.ENDED, }); expect(liveIndicator.isActive, 'isActive').to.be.false; expect( viewToggleActiveSpy.lastCall.calledWith(false), 'view.toggleActive called with `false`', ).to.be.true; expect( viewToggleEndedSpy.lastCall.calledWith(true), 'view.toggleEnded called with `true`', ).to.be.true; viewToggleActiveSpy.restore(); viewToggleEndedSpy.restore(); }); }); }); });