|
| 1 | +import { createRequestSender, RequestSender } from '@bigcommerce/request-sender'; |
| 2 | + |
| 3 | +import BrowserSupport from './browser-support'; |
1 | 4 | import ScriptLoader from './script-loader'; |
2 | 5 |
|
3 | 6 | describe('ScriptLoader', () => { |
| 7 | + let browserSupport: BrowserSupport; |
4 | 8 | let loader: ScriptLoader; |
| 9 | + let requestSender: RequestSender; |
5 | 10 |
|
6 | 11 | beforeEach(() => { |
7 | | - loader = new ScriptLoader(); |
| 12 | + browserSupport = new BrowserSupport(); |
| 13 | + requestSender = createRequestSender(); |
| 14 | + |
| 15 | + jest.spyOn(browserSupport, 'canSupportRel') |
| 16 | + .mockReturnValue(true); |
| 17 | + |
| 18 | + jest.spyOn(requestSender, 'get') |
| 19 | + .mockReturnValue(Promise.resolve({})); |
| 20 | + |
| 21 | + loader = new ScriptLoader( |
| 22 | + browserSupport, |
| 23 | + requestSender |
| 24 | + ); |
8 | 25 | }); |
9 | 26 |
|
10 | 27 | afterEach(() => { |
@@ -36,6 +53,13 @@ describe('ScriptLoader', () => { |
36 | 53 | .toEqual('https://code.jquery.com/jquery-3.2.1.min.js'); |
37 | 54 | }); |
38 | 55 |
|
| 56 | + it('loads script synchronously by default', async () => { |
| 57 | + await loader.loadScript('https://code.jquery.com/jquery-3.2.1.min.js'); |
| 58 | + |
| 59 | + expect(script.async) |
| 60 | + .toEqual(false); |
| 61 | + }); |
| 62 | + |
39 | 63 | it('resolves promise if script is loaded', async () => { |
40 | 64 | const output = await loader.loadScript('https://code.jquery.com/jquery-3.2.1.min.js'); |
41 | 65 |
|
@@ -111,13 +135,6 @@ describe('ScriptLoader', () => { |
111 | 135 | ]; |
112 | 136 | }); |
113 | 137 |
|
114 | | - it('preloads scripts in parallel', async () => { |
115 | | - await loader.loadScripts(urls); |
116 | | - |
117 | | - expect(loader.preloadScripts) |
118 | | - .toHaveBeenCalledWith(urls); |
119 | | - }); |
120 | | - |
121 | 138 | it('loads preloaded scripts in sequence', async () => { |
122 | 139 | jest.spyOn(loader, 'loadScript') |
123 | 140 | .mockReturnValue(Promise.resolve(new Event('readystatechange'))); |
@@ -195,6 +212,19 @@ describe('ScriptLoader', () => { |
195 | 212 | .toEqual('https://cdn.foobar.com/foo.min.js'); |
196 | 213 | }); |
197 | 214 |
|
| 215 | + it('falls back to using XHR if browser does not support preload', async () => { |
| 216 | + jest.spyOn(browserSupport, 'canSupportRel') |
| 217 | + .mockImplementation(rel => rel === 'preload' ? false : true); |
| 218 | + |
| 219 | + await loader.preloadScript('https://cdn.foobar.com/foo.min.js'); |
| 220 | + |
| 221 | + expect(requestSender.get) |
| 222 | + .toHaveBeenCalledWith('https://cdn.foobar.com/foo.min.js', { |
| 223 | + credentials: false, |
| 224 | + headers: { Accept: 'application/javascript' }, |
| 225 | + }); |
| 226 | + }); |
| 227 | + |
198 | 228 | it('resolves promise if script is preloaded', async () => { |
199 | 229 | const output = await loader.preloadScript('https://cdn.foobar.com/foo.min.js'); |
200 | 230 |
|
|
0 commit comments