diff options
Diffstat (limited to 'spec/frontend/lib/utils/navigation_utility_spec.js')
-rw-r--r-- | spec/frontend/lib/utils/navigation_utility_spec.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/spec/frontend/lib/utils/navigation_utility_spec.js b/spec/frontend/lib/utils/navigation_utility_spec.js index 88172f38894..6a880a0f354 100644 --- a/spec/frontend/lib/utils/navigation_utility_spec.js +++ b/spec/frontend/lib/utils/navigation_utility_spec.js @@ -1,4 +1,5 @@ import findAndFollowLink from '~/lib/utils/navigation_utility'; +import * as navigationUtils from '~/lib/utils/navigation_utility'; import { visitUrl } from '~/lib/utils/url_utility'; jest.mock('~/lib/utils/url_utility'); @@ -21,3 +22,91 @@ describe('findAndFollowLink', () => { expect(visitUrl).not.toHaveBeenCalled(); }); }); + +describe('prefetchDocument', () => { + it('creates a prefetch link tag', () => { + const linkElement = document.createElement('link'); + + jest.spyOn(document, 'createElement').mockImplementation(() => linkElement); + jest.spyOn(document.head, 'appendChild'); + + navigationUtils.prefetchDocument('index.htm'); + + expect(document.head.appendChild).toHaveBeenCalledWith(linkElement); + expect(linkElement.href).toEqual('http://test.host/index.htm'); + expect(linkElement.rel).toEqual('prefetch'); + expect(linkElement.getAttribute('as')).toEqual('document'); + }); +}); + +describe('initPrefetchLinks', () => { + let newLink; + + beforeEach(() => { + newLink = document.createElement('a'); + newLink.href = 'index_prefetch.htm'; + newLink.classList.add('js-test-prefetch-link'); + document.body.appendChild(newLink); + }); + + it('adds to all links mouse out handlers when hovered', () => { + const mouseOverEvent = new Event('mouseover'); + + jest.spyOn(newLink, 'addEventListener'); + + navigationUtils.initPrefetchLinks('.js-test-prefetch-link'); + newLink.dispatchEvent(mouseOverEvent); + + expect(newLink.addEventListener).toHaveBeenCalled(); + }); + + it('it is not fired when less then 100ms over link', () => { + const mouseOverEvent = new Event('mouseover'); + const mouseOutEvent = new Event('mouseout'); + + jest.spyOn(newLink, 'addEventListener'); + jest.spyOn(navigationUtils, 'prefetchDocument').mockImplementation(() => true); + + navigationUtils.initPrefetchLinks('.js-test-prefetch-link'); + newLink.dispatchEvent(mouseOverEvent); + newLink.dispatchEvent(mouseOutEvent); + + expect(navigationUtils.prefetchDocument).not.toHaveBeenCalled(); + }); + + describe('executes correctly when hovering long enough', () => { + const mouseOverEvent = new Event('mouseover'); + + beforeEach(() => { + jest.useFakeTimers(); + + jest.spyOn(global, 'setTimeout'); + jest.spyOn(newLink, 'removeEventListener'); + }); + + it('calls prefetchDocument which adds to document', () => { + jest.spyOn(document.head, 'appendChild'); + + navigationUtils.initPrefetchLinks('.js-test-prefetch-link'); + newLink.dispatchEvent(mouseOverEvent); + + jest.runAllTimers(); + + expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 100); + expect(document.head.appendChild).toHaveBeenCalled(); + }); + + it('removes Event Listener when fired so only done once', () => { + navigationUtils.initPrefetchLinks('.js-test-prefetch-link'); + newLink.dispatchEvent(mouseOverEvent); + + jest.runAllTimers(); + + expect(newLink.removeEventListener).toHaveBeenCalledWith( + 'mouseover', + expect.any(Function), + true, + ); + }); + }); +}); |