diff --git a/test/utils/youtube.test.js b/test/utils/youtube.test.js
new file mode 100644
index 0000000..3cc847f
--- /dev/null
+++ b/test/utils/youtube.test.js
@@ -0,0 +1,89 @@
+import YouTube from '../../src/js/plugins/youtube';
+import DOM from '../../src/js/utils/dom';
+
+// Copy of DOM.fireEvent, but using touch offets
+const fireEvent = (target, eventType, offsetX, offsetY, touches) => {
+ const event = new CustomEvent(eventType);
+
+ event.offsetX = offsetX;
+ event.offsetY = offsetY;
+ event.touches = touches;
+
+ target.dispatchEvent(event);
+};
+
+beforeAll(() => {
+ const video = '
';
+ document.body.innerHTML = `${video}
`;
+});
+
+test('YouTube utility', () => {
+
+ const ws = document.getElementById('webslides');
+ const slides = ws.querySelectorAll('.slide');
+ const play = jest.fn();
+ const pause = jest.fn();
+ const destroy = jest.fn();
+ const create = jest.fn();
+
+ const webslides = {
+ el: ws,
+ slides: []
+ };
+ slides.forEach( slide => webslides.slides.push({el: slide}));
+
+ window.YT = {
+ Player: function(a, b) {
+ return { getIframe: () => {
+ const div = DOM.createNode('div');
+ div.innerHTML = '';
+ webslides.slides[0].el.appendChild(div);
+ return div.querySelector('iframe');
+ } }
+ }
+ }
+
+ const youtube = new YouTube(webslides);
+
+ expect(typeof window.onYouTubeIframeAPIReady).toBe('function');
+ webslides.el.querySelector('[data-youtube]').dataset = {autoplay: true, youtubeId: 'CQY3KUR3VzM'};
+
+ window.onYouTubeIframeAPIReady();
+
+ const slide = {
+ slide: {
+ player: {
+ autoplay: true,
+ play: play,
+ pause: pause,
+ destroy: destroy,
+ create: create
+ }
+ }
+ };
+
+ DOM.fireEvent(webslides.slides[0].el, 'dom:enter', slide);
+ expect(play.mock.calls.length).toBe(0);
+ expect(pause.mock.calls.length).toBe(0);
+ expect(destroy.mock.calls.length).toBe(0);
+ expect(create.mock.calls.length).toBe(1);
+
+ DOM.fireEvent(webslides.slides[0].el, 'dom:leave', slide);
+ expect(play.mock.calls.length).toBe(0);
+ expect(pause.mock.calls.length).toBe(0);
+ expect(destroy.mock.calls.length).toBe(1);
+ expect(create.mock.calls.length).toBe(1);
+
+ DOM.fireEvent(webslides.slides[0].el, 'slide:enable', slide);
+ expect(play.mock.calls.length).toBe(1);
+ expect(pause.mock.calls.length).toBe(0);
+ expect(destroy.mock.calls.length).toBe(1);
+ expect(create.mock.calls.length).toBe(1);
+
+ DOM.fireEvent(webslides.slides[0].el, 'slide:disable', slide);
+ expect(play.mock.calls.length).toBe(1);
+ expect(pause.mock.calls.length).toBe(1);
+ expect(destroy.mock.calls.length).toBe(1);
+ expect(create.mock.calls.length).toBe(1);
+
+});