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