playable
Version:
Video player based on HTML5Video
113 lines (94 loc) • 3.55 kB
text/typescript
import 'jsdom-global/register';
import { expect } from 'chai';
import * as sinon from 'sinon';
import createPlayerTestkit from '../../../../testkit';
import { VideoEvent, EngineState } from '../../../../constants';
import { UPDATE_TIME_INTERVAL_DELAY } from './time';
describe('TimeControl', () => {
let testkit;
let control: any;
let eventEmitter: any;
beforeEach(() => {
testkit = createPlayerTestkit();
eventEmitter = testkit.getModule('eventEmitter');
control = testkit.getModule('timeControl');
});
describe('constructor', () => {
it('should create instance ', () => {
expect(control).to.exist;
expect(control.view).to.exist;
});
});
describe('API', () => {
it('should have method for setting current time', () => {
const spy = sinon.spy(control.view, 'setCurrentTime');
control._setCurrentTime();
expect(spy.called).to.be.true;
});
it('should have method for setting duration time', () => {
const spy = sinon.spy(control.view, 'setDurationTime');
control._setDurationTime();
expect(spy.called).to.be.true;
});
it('should have method for showing whole view', () => {
expect(control.show).to.exist;
control.show();
expect(control.isHidden).to.be.false;
});
it('should have method for hiding whole view', () => {
expect(control.hide).to.exist;
control.hide();
expect(control.isHidden).to.be.true;
});
it('should have method for destroying', () => {
const spy = sinon.spy(control, '_unbindEvents');
expect(control.destroy).to.exist;
control.destroy();
expect(spy.called).to.be.true;
});
});
describe('video events listeners', () => {
it('should call callback on playback state change', async function() {
const spy = sinon.spy(control, '_toggleIntervalUpdates');
control._bindEvents();
await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, {});
expect(spy.called).to.be.true;
});
it('should call callback on seek', async function() {
const spy = sinon.spy(control, '_startIntervalUpdates');
control._bindEvents();
await eventEmitter.emitAsync(VideoEvent.STATE_CHANGED, {
nextState: EngineState.SEEK_IN_PROGRESS,
});
expect(spy.called).to.be.true;
});
it('should call callback on duration update', async function() {
const spy = sinon.spy(control, '_updateDurationTime');
control._bindEvents();
await eventEmitter.emitAsync(VideoEvent.DURATION_UPDATED);
expect(spy.called).to.be.true;
});
});
describe('internal methods', () => {
it('should toggle interval updates', () => {
const startSpy = sinon.spy(control, '_startIntervalUpdates');
control._toggleIntervalUpdates({ nextState: EngineState.PLAYING });
expect(startSpy.called).to.be.true;
const stopSpy = sinon.spy(control, '_stopIntervalUpdates');
control._toggleIntervalUpdates({ nextState: EngineState.PAUSED });
expect(stopSpy.called).to.be.true;
});
it('should start interval updates', () => {
const spy = sinon.spy(window, 'setInterval');
const stopSpy = sinon.spy(control, '_stopIntervalUpdates');
control._startIntervalUpdates();
expect(
spy.calledWith(control._updateCurrentTime, UPDATE_TIME_INTERVAL_DELAY),
).to.be.true;
expect(stopSpy.called).to.be.false;
control._startIntervalUpdates();
expect(stopSpy.called).to.be.true;
spy.restore();
});
});
});