playable
Version:
Video player based on HTML5Video
179 lines (146 loc) • 5.51 kB
text/typescript
import 'jsdom-global/register';
import { expect } from 'chai';
import * as sinon from 'sinon';
import { KEYCODES } from '../../utils/keyboard-interceptor';
import { UIEvent } from '../../constants';
import createPlayerTestkit from '../../testkit';
import {
AMOUNT_TO_SKIP_SECONDS,
AMOUNT_TO_CHANGE_VOLUME,
} from './keyboard-control';
describe('KeyboardControl', () => {
const keyDownEvent: any = new Event('keydown');
keyDownEvent.preventDefault = sinon.spy();
let testkit: any;
let engine: any;
let eventEmitter: any;
let rootContainer: any;
let keyboardControl: any;
beforeEach(() => {
testkit = createPlayerTestkit();
eventEmitter = testkit.getModule('eventEmitter');
engine = testkit.getModule('engine');
engine._output._adapterStrategy._attachedAdapter = {
isSeekAvailable: true,
attach: () => {},
detach: () => {},
};
rootContainer = testkit.getModule('rootContainer');
keyboardControl = testkit.getModule('keyboardControl');
});
afterEach(() => {
keyDownEvent.preventDefault.resetHistory();
});
describe('as a reaction on press of key', () => {
beforeEach(() => {
sinon.spy(eventEmitter, 'emitAsync');
delete keyDownEvent.keyCode;
});
afterEach(() => {
eventEmitter.emitAsync.restore();
keyboardControl.destroy();
});
it('should do stuff if key was TAB', () => {
keyDownEvent.keyCode = KEYCODES.TAB;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
});
it('should do stuff if key was TAB', () => {
keyDownEvent.keyCode = KEYCODES.TAB;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
});
it('should do stuff if key was SPACE_BAR', () => {
sinon.stub(engine, 'togglePlayback');
keyDownEvent.keyCode = KEYCODES.SPACE_BAR;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(keyDownEvent.preventDefault.called).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(
UIEvent.TOGGLE_PLAYBACK_WITH_KEYBOARD,
),
).to.be.true;
expect(engine.togglePlayback.called).to.be.true;
engine.togglePlayback.restore();
});
it('should do stuff if key was LEFT_ARROW', () => {
sinon.stub(engine, 'seekBackward');
keyDownEvent.keyCode = KEYCODES.LEFT_ARROW;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(keyDownEvent.preventDefault.called).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.GO_BACKWARD_WITH_KEYBOARD),
).to.be.true;
expect(engine.seekBackward.calledWith(AMOUNT_TO_SKIP_SECONDS)).to.be.true;
engine.seekBackward.restore();
});
it('should do stuff if key was RIGHT_ARROW', () => {
sinon.stub(engine, 'seekForward');
keyDownEvent.keyCode = KEYCODES.RIGHT_ARROW;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(keyDownEvent.preventDefault.called).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.GO_FORWARD_WITH_KEYBOARD),
).to.be.true;
expect(engine.seekForward.calledWith(AMOUNT_TO_SKIP_SECONDS)).to.be.true;
engine.seekForward.restore();
});
it('should do stuff if key was UP_ARROW', () => {
sinon.stub(engine, 'increaseVolume');
keyDownEvent.keyCode = KEYCODES.UP_ARROW;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(keyDownEvent.preventDefault.called).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(
UIEvent.INCREASE_VOLUME_WITH_KEYBOARD,
),
).to.be.true;
expect(engine.increaseVolume.calledWith(AMOUNT_TO_CHANGE_VOLUME)).to.be
.true;
engine.increaseVolume.restore();
});
it('should do stuff if key was DOWN_ARROW', () => {
sinon.stub(engine, 'decreaseVolume');
keyDownEvent.keyCode = KEYCODES.DOWN_ARROW;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(keyDownEvent.preventDefault.called).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(UIEvent.KEYBOARD_KEYDOWN_INTERCEPTED),
).to.be.true;
expect(
eventEmitter.emitAsync.calledWith(
UIEvent.DECREASE_VOLUME_WITH_KEYBOARD,
),
).to.be.true;
expect(engine.decreaseVolume.calledWith(AMOUNT_TO_CHANGE_VOLUME)).to.be
.true;
engine.decreaseVolume.restore();
});
});
describe('after destroy', () => {
it('should not react on key down', () => {
sinon.spy(eventEmitter, 'emitAsync');
keyboardControl.destroy();
keyDownEvent.keyCode = KEYCODES.TAB;
rootContainer.getElement().dispatchEvent(keyDownEvent);
expect(eventEmitter.emitAsync.called).to.be.false;
eventEmitter.emitAsync.restore();
});
});
});