test(service-worker): test support for multiple apps on different subpaths of a domain (#27080)
PR Close #27080
This commit is contained in:
		
							parent
							
								
									84baa0bb08
								
							
						
					
					
						commit
						a24f4b51b3
					
				| @ -138,7 +138,7 @@ import {async_beforeEach, async_fit, async_it} from './async'; | |||||||
|       async_it('names the caches correctly', async() => { |       async_it('names the caches correctly', async() => { | ||||||
|         expect(await makeRequest(scope, '/api/test')).toEqual('version 1'); |         expect(await makeRequest(scope, '/api/test')).toEqual('version 1'); | ||||||
|         const keys = await scope.caches.keys(); |         const keys = await scope.caches.keys(); | ||||||
|         expect(keys.every(key => key.startsWith('ngsw:'))).toEqual(true); |         expect(keys.every(key => key.startsWith('ngsw:/:'))).toEqual(true); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|       async_it('caches a basic request', async() => { |       async_it('caches a basic request', async() => { | ||||||
|  | |||||||
| @ -136,6 +136,18 @@ import {async_beforeEach, async_fit, async_it} from './async'; | |||||||
|         patterns: [], |         patterns: [], | ||||||
|       } |       } | ||||||
|     ], |     ], | ||||||
|  |     dataGroups: [ | ||||||
|  |       { | ||||||
|  |         name: 'api', | ||||||
|  |         version: 42, | ||||||
|  |         maxAge: 3600000, | ||||||
|  |         maxSize: 100, | ||||||
|  |         strategy: 'performance', | ||||||
|  |         patterns: [ | ||||||
|  |           '/api/.*', | ||||||
|  |         ], | ||||||
|  |       }, | ||||||
|  |     ], | ||||||
|     navigationUrls: processNavigationUrls(''), |     navigationUrls: processNavigationUrls(''), | ||||||
|     hashTable: tmpHashTableForFs(dist), |     hashTable: tmpHashTableForFs(dist), | ||||||
|   }; |   }; | ||||||
| @ -720,6 +732,115 @@ import {async_beforeEach, async_fit, async_it} from './async'; | |||||||
|       expect(await scope.caches.keys()).not.toEqual([]); |       expect(await scope.caches.keys()).not.toEqual([]); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     describe('cache naming', () => { | ||||||
|  |       // Helpers
 | ||||||
|  |       const cacheKeysFor = (baseHref: string) => | ||||||
|  |           [`ngsw:${baseHref}:db:control`, `ngsw:${baseHref}:${manifestHash}:assets:assets:cache`, | ||||||
|  |            `ngsw:${baseHref}:db:ngsw:${baseHref}:${manifestHash}:assets:assets:meta`, | ||||||
|  |            `ngsw:${baseHref}:${manifestHash}:assets:other:cache`, | ||||||
|  |            `ngsw:${baseHref}:db:ngsw:${baseHref}:${manifestHash}:assets:other:meta`, | ||||||
|  |            `ngsw:${baseHref}:${manifestHash}:assets:lazy_prefetch:cache`, | ||||||
|  |            `ngsw:${baseHref}:db:ngsw:${baseHref}:${manifestHash}:assets:lazy_prefetch:meta`, | ||||||
|  |            `ngsw:${baseHref}:42:data:dynamic:api:cache`, | ||||||
|  |            `ngsw:${baseHref}:db:ngsw:${baseHref}:42:data:dynamic:api:lru`, | ||||||
|  |            `ngsw:${baseHref}:db:ngsw:${baseHref}:42:data:dynamic:api:age`, | ||||||
|  |       ]; | ||||||
|  | 
 | ||||||
|  |       const getClientAssignments = async(sw: SwTestHarness, baseHref: string) => { | ||||||
|  |         const cache = await sw.caches.open(`ngsw:${baseHref}:db:control`) as unknown as MockCache; | ||||||
|  |         const dehydrated = cache.dehydrate(); | ||||||
|  |         return JSON.parse(dehydrated['/assignments'].body !); | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       const initializeSwFor = | ||||||
|  |           async(baseHref: string, initialCacheState = '{}', serverState = server) => { | ||||||
|  |         const newScope = new SwTestHarnessBuilder(`http://localhost${baseHref}`) | ||||||
|  |                              .withCacheState(initialCacheState) | ||||||
|  |                              .withServerState(serverState) | ||||||
|  |                              .build(); | ||||||
|  |         const newDriver = new Driver(newScope, newScope, new CacheDatabase(newScope, newScope)); | ||||||
|  | 
 | ||||||
|  |         await makeRequest(newScope, '/foo.txt', baseHref.replace(/\//g, '_')); | ||||||
|  |         await newDriver.initialized; | ||||||
|  | 
 | ||||||
|  |         return newScope; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       async_it('includes the SW scope in all cache names', async() => { | ||||||
|  |         // Default SW with scope `/`.
 | ||||||
|  |         await makeRequest(scope, '/foo.txt'); | ||||||
|  |         await driver.initialized; | ||||||
|  |         const cacheNames = await scope.caches.keys(); | ||||||
|  | 
 | ||||||
|  |         expect(cacheNames).toEqual(cacheKeysFor('/')); | ||||||
|  |         expect(cacheNames.every(name => name.includes('/'))).toBe(true); | ||||||
|  | 
 | ||||||
|  |         // SW with scope `/foo/`.
 | ||||||
|  |         const fooScope = await initializeSwFor('/foo/'); | ||||||
|  |         const fooCacheNames = await fooScope.caches.keys(); | ||||||
|  | 
 | ||||||
|  |         expect(fooCacheNames).toEqual(cacheKeysFor('/foo/')); | ||||||
|  |         expect(fooCacheNames.every(name => name.includes('/foo/'))).toBe(true); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       async_it('does not affect caches from other scopes', async() => { | ||||||
|  |         // Create SW with scope `/foo/`.
 | ||||||
|  |         const fooScope = await initializeSwFor('/foo/'); | ||||||
|  |         const fooAssignments = await getClientAssignments(fooScope, '/foo/'); | ||||||
|  | 
 | ||||||
|  |         expect(fooAssignments).toEqual({_foo_: manifestHash}); | ||||||
|  | 
 | ||||||
|  |         // Add new SW with different scope.
 | ||||||
|  |         const barScope = await initializeSwFor('/bar/', await fooScope.caches.dehydrate()); | ||||||
|  |         const barCacheNames = await barScope.caches.keys(); | ||||||
|  |         const barAssignments = await getClientAssignments(barScope, '/bar/'); | ||||||
|  | 
 | ||||||
|  |         expect(barAssignments).toEqual({_bar_: manifestHash}); | ||||||
|  |         expect(barCacheNames).toEqual([ | ||||||
|  |           ...cacheKeysFor('/foo/'), | ||||||
|  |           ...cacheKeysFor('/bar/'), | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         // The caches for `/foo/` should be intact.
 | ||||||
|  |         const fooAssignments2 = await getClientAssignments(barScope, '/foo/'); | ||||||
|  |         expect(fooAssignments2).toEqual({_foo_: manifestHash}); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       async_it('updates existing caches for same scope', async() => { | ||||||
|  |         // Create SW with scope `/foo/`.
 | ||||||
|  |         const fooScope = await initializeSwFor('/foo/'); | ||||||
|  |         await makeRequest(fooScope, '/foo.txt', '_bar_'); | ||||||
|  |         const fooAssignments = await getClientAssignments(fooScope, '/foo/'); | ||||||
|  | 
 | ||||||
|  |         expect(fooAssignments).toEqual({ | ||||||
|  |           _foo_: manifestHash, | ||||||
|  |           _bar_: manifestHash, | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         expect(await makeRequest(fooScope, '/baz.txt', '_foo_')).toBe('this is baz'); | ||||||
|  |         expect(await makeRequest(fooScope, '/baz.txt', '_bar_')).toBe('this is baz'); | ||||||
|  | 
 | ||||||
|  |         // Add new SW with same scope.
 | ||||||
|  |         const fooScope2 = | ||||||
|  |             await initializeSwFor('/foo/', await fooScope.caches.dehydrate(), serverUpdate); | ||||||
|  |         await fooScope2.handleMessage({action: 'CHECK_FOR_UPDATES'}, '_foo_'); | ||||||
|  |         await fooScope2.handleMessage({action: 'ACTIVATE_UPDATE'}, '_foo_'); | ||||||
|  |         const fooAssignments2 = await getClientAssignments(fooScope2, '/foo/'); | ||||||
|  | 
 | ||||||
|  |         expect(fooAssignments2).toEqual({ | ||||||
|  |           _foo_: manifestUpdateHash, | ||||||
|  |           _bar_: manifestHash, | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         // Everything should still work as expected.
 | ||||||
|  |         expect(await makeRequest(fooScope2, '/foo.txt', '_foo_')).toBe('this is foo v2'); | ||||||
|  |         expect(await makeRequest(fooScope2, '/foo.txt', '_bar_')).toBe('this is foo'); | ||||||
|  | 
 | ||||||
|  |         expect(await makeRequest(fooScope2, '/baz.txt', '_foo_')).toBe('this is baz v2'); | ||||||
|  |         expect(await makeRequest(fooScope2, '/baz.txt', '_bar_')).toBe('this is baz'); | ||||||
|  |       }); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|     describe('unhashed requests', () => { |     describe('unhashed requests', () => { | ||||||
|       async_beforeEach(async() => { |       async_beforeEach(async() => { | ||||||
|         expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); |         expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user