diff --git a/test/utils/keyboard.test.js b/test/utils/keyboard.test.js
new file mode 100644
index 0000000..8843e6b
--- /dev/null
+++ b/test/utils/keyboard.test.js
@@ -0,0 +1,62 @@
+import DOM from '../../src/js/utils/dom';
+import Keyboard from '../../src/js/plugins/keyboard';
+import Keys from '../../src/js/utils/keys';
+
+const simulateKeyEvent = (el, code) => {
+ const evt = new KeyboardEvent("keydown", {
+ bubbles: true,
+ cancelableCode: true,
+ which: code,
+ shiftKey: true});
+ el.dispatchEvent(evt);
+};
+
+beforeAll(() => {
+ document.body.innerHTML = `
`;
+});
+
+test('Keyboard plugin', () => {
+ const goto = jest.fn();
+ const next = jest.fn();
+ const prev = jest.fn();
+ const ws = document.getElementById('webslides');
+ const focusable = document.getElementById('focusable');
+
+ let disabled = true;
+
+ const webslides = {
+ goToSlide: goto,
+ goNext: next,
+ goPrev: prev,
+ isVertical: false,
+ isDisabled: () => {return disabled;},
+ el: ws
+ };
+
+ const keyboard = new Keyboard(webslides);
+
+ expect(goto).not.toBeCalled();
+ expect(next).not.toBeCalled();
+ expect(prev).not.toBeCalled();
+
+ simulateKeyEvent(document, Keys.AV_PAGE);
+ expect(next.mock.calls.length).toBe(0);
+
+ disabled = false;
+ simulateKeyEvent(document, Keys.AV_PAGE);
+ expect(next.mock.calls.length).toBe(1);
+ simulateKeyEvent(document, Keys.SPACE);
+ expect(next.mock.calls.length).toBe(2);
+ simulateKeyEvent(document, Keys.RE_PAGE);
+ expect(prev.mock.calls.length).toBe(1);
+ simulateKeyEvent(document, Keys.HOME);
+ expect(goto.mock.calls.length).toBe(1);
+ simulateKeyEvent(document, Keys.DOWN);
+ expect(next.mock.calls.length).toBe(2);
+ simulateKeyEvent(document, Keys.UP);
+ expect(prev.mock.calls.length).toBe(1);
+ simulateKeyEvent(document, Keys.LEFT);
+ expect(prev.mock.calls.length).toBe(2);
+ simulateKeyEvent(document, Keys.RIGHT);
+ expect(next.mock.calls.length).toBe(3);
+});