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); + +});