@ -20,129 +20,136 @@ import {Observable} from 'rxjs';
|
||||
import {take} from 'rxjs/operators';
|
||||
|
||||
(function() {
|
||||
// Skip environments that don't support the minimum APIs needed to run the SW tests.
|
||||
if (!SwTestHarness.envIsSupported()) {
|
||||
return;
|
||||
}
|
||||
// Skip environments that don't support the minimum APIs needed to run the SW tests.
|
||||
if (!SwTestHarness.envIsSupported()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dist = new MockFileSystemBuilder().addFile('/only.txt', 'this is only').build();
|
||||
const dist = new MockFileSystemBuilder().addFile('/only.txt', 'this is only').build();
|
||||
|
||||
const distUpdate = new MockFileSystemBuilder().addFile('/only.txt', 'this is only v2').build();
|
||||
const distUpdate = new MockFileSystemBuilder().addFile('/only.txt', 'this is only v2').build();
|
||||
|
||||
function obsToSinglePromise<T>(obs: Observable<T>): Promise<T> {
|
||||
return obs.pipe(take(1)).toPromise();
|
||||
}
|
||||
function obsToSinglePromise<T>(obs: Observable<T>): Promise<T> {
|
||||
return obs.pipe(take(1)).toPromise();
|
||||
}
|
||||
|
||||
const manifest: Manifest = {
|
||||
configVersion: 1,
|
||||
timestamp: 1234567890123,
|
||||
appData: {version: '1'},
|
||||
index: '/only.txt',
|
||||
assetGroups: [{
|
||||
name: 'assets',
|
||||
installMode: 'prefetch',
|
||||
updateMode: 'prefetch',
|
||||
urls: ['/only.txt'],
|
||||
patterns: [],
|
||||
}],
|
||||
navigationUrls: [],
|
||||
hashTable: tmpHashTableForFs(dist),
|
||||
};
|
||||
const manifest: Manifest = {
|
||||
configVersion: 1,
|
||||
timestamp: 1234567890123,
|
||||
appData: {version: '1'},
|
||||
index: '/only.txt',
|
||||
assetGroups: [{
|
||||
name: 'assets',
|
||||
installMode: 'prefetch',
|
||||
updateMode: 'prefetch',
|
||||
urls: ['/only.txt'],
|
||||
patterns: [],
|
||||
}],
|
||||
navigationUrls: [],
|
||||
hashTable: tmpHashTableForFs(dist),
|
||||
};
|
||||
|
||||
const manifestUpdate: Manifest = {
|
||||
configVersion: 1,
|
||||
timestamp: 1234567890123,
|
||||
appData: {version: '2'},
|
||||
index: '/only.txt',
|
||||
assetGroups: [{
|
||||
name: 'assets',
|
||||
installMode: 'prefetch',
|
||||
updateMode: 'prefetch',
|
||||
urls: ['/only.txt'],
|
||||
patterns: [],
|
||||
}],
|
||||
navigationUrls: [],
|
||||
hashTable: tmpHashTableForFs(distUpdate),
|
||||
};
|
||||
const manifestUpdate: Manifest = {
|
||||
configVersion: 1,
|
||||
timestamp: 1234567890123,
|
||||
appData: {version: '2'},
|
||||
index: '/only.txt',
|
||||
assetGroups: [{
|
||||
name: 'assets',
|
||||
installMode: 'prefetch',
|
||||
updateMode: 'prefetch',
|
||||
urls: ['/only.txt'],
|
||||
patterns: [],
|
||||
}],
|
||||
navigationUrls: [],
|
||||
hashTable: tmpHashTableForFs(distUpdate),
|
||||
};
|
||||
|
||||
const server = new MockServerStateBuilder().withStaticFiles(dist).withManifest(manifest).build();
|
||||
const server = new MockServerStateBuilder().withStaticFiles(dist).withManifest(manifest).build();
|
||||
|
||||
const serverUpdate =
|
||||
new MockServerStateBuilder().withStaticFiles(distUpdate).withManifest(manifestUpdate).build();
|
||||
const serverUpdate =
|
||||
new MockServerStateBuilder().withStaticFiles(distUpdate).withManifest(manifestUpdate).build();
|
||||
|
||||
|
||||
describe('ngsw + companion lib', () => {
|
||||
let mock: MockServiceWorkerContainer;
|
||||
let comm: NgswCommChannel;
|
||||
let reg: MockServiceWorkerRegistration;
|
||||
let scope: SwTestHarness;
|
||||
let driver: Driver;
|
||||
describe('ngsw + companion lib', () => {
|
||||
let mock: MockServiceWorkerContainer;
|
||||
let comm: NgswCommChannel;
|
||||
let reg: MockServiceWorkerRegistration;
|
||||
let scope: SwTestHarness;
|
||||
let driver: Driver;
|
||||
|
||||
beforeEach(async() => {
|
||||
// Fire up the client.
|
||||
mock = new MockServiceWorkerContainer();
|
||||
comm = new NgswCommChannel(mock as any);
|
||||
scope = new SwTestHarnessBuilder().withServerState(server).build();
|
||||
driver = new Driver(scope, scope, new CacheDatabase(scope, scope));
|
||||
beforeEach(async () => {
|
||||
// Fire up the client.
|
||||
mock = new MockServiceWorkerContainer();
|
||||
comm = new NgswCommChannel(mock as any);
|
||||
scope = new SwTestHarnessBuilder().withServerState(server).build();
|
||||
driver = new Driver(scope, scope, new CacheDatabase(scope, scope));
|
||||
|
||||
scope.clients.add('default');
|
||||
scope.clients.getMock('default') !.queue.subscribe(msg => { mock.sendMessage(msg); });
|
||||
|
||||
mock.messages.subscribe(msg => { scope.handleMessage(msg, 'default'); });
|
||||
mock.notificationClicks.subscribe((msg: Object) => { scope.handleMessage(msg, 'default'); });
|
||||
|
||||
mock.setupSw();
|
||||
reg = mock.mockRegistration !;
|
||||
|
||||
await Promise.all(scope.handleFetch(new MockRequest('/only.txt'), 'default'));
|
||||
await driver.initialized;
|
||||
scope.clients.add('default');
|
||||
scope.clients.getMock('default')!.queue.subscribe(msg => {
|
||||
mock.sendMessage(msg);
|
||||
});
|
||||
|
||||
it('communicates back and forth via update check', async() => {
|
||||
const update = new SwUpdate(comm);
|
||||
await update.checkForUpdate();
|
||||
mock.messages.subscribe(msg => {
|
||||
scope.handleMessage(msg, 'default');
|
||||
});
|
||||
mock.notificationClicks.subscribe((msg: Object) => {
|
||||
scope.handleMessage(msg, 'default');
|
||||
});
|
||||
|
||||
it('detects an actual update', async() => {
|
||||
const update = new SwUpdate(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
mock.setupSw();
|
||||
reg = mock.mockRegistration!;
|
||||
|
||||
const gotUpdateNotice =
|
||||
(async() => { const notice = await obsToSinglePromise(update.available); })();
|
||||
await Promise.all(scope.handleFetch(new MockRequest('/only.txt'), 'default'));
|
||||
await driver.initialized;
|
||||
});
|
||||
|
||||
await update.checkForUpdate();
|
||||
await gotUpdateNotice;
|
||||
});
|
||||
it('communicates back and forth via update check', async () => {
|
||||
const update = new SwUpdate(comm);
|
||||
await update.checkForUpdate();
|
||||
});
|
||||
|
||||
it('receives push message notifications', async() => {
|
||||
const push = new SwPush(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
it('detects an actual update', async () => {
|
||||
const update = new SwUpdate(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
|
||||
const gotPushNotice = (async() => {
|
||||
const message = await obsToSinglePromise(push.messages);
|
||||
expect(message).toEqual({
|
||||
test: 'success',
|
||||
});
|
||||
})();
|
||||
const gotUpdateNotice = (async () => {
|
||||
const notice = await obsToSinglePromise(update.available);
|
||||
})();
|
||||
|
||||
await scope.handlePush({
|
||||
await update.checkForUpdate();
|
||||
await gotUpdateNotice;
|
||||
});
|
||||
|
||||
it('receives push message notifications', async () => {
|
||||
const push = new SwPush(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
|
||||
const gotPushNotice = (async () => {
|
||||
const message = await obsToSinglePromise(push.messages);
|
||||
expect(message).toEqual({
|
||||
test: 'success',
|
||||
});
|
||||
await gotPushNotice;
|
||||
});
|
||||
|
||||
it('receives push message click events', async() => {
|
||||
const push = new SwPush(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
|
||||
const gotNotificationClick = (async() => {
|
||||
const event: any = await obsToSinglePromise(push.notificationClicks);
|
||||
expect(event.action).toEqual('clicked');
|
||||
expect(event.notification.title).toEqual('This is a test');
|
||||
})();
|
||||
|
||||
await scope.handleClick({title: 'This is a test'}, 'clicked');
|
||||
await gotNotificationClick;
|
||||
})();
|
||||
|
||||
await scope.handlePush({
|
||||
test: 'success',
|
||||
});
|
||||
await gotPushNotice;
|
||||
});
|
||||
|
||||
it('receives push message click events', async () => {
|
||||
const push = new SwPush(comm);
|
||||
scope.updateServerState(serverUpdate);
|
||||
|
||||
const gotNotificationClick = (async () => {
|
||||
const event: any = await obsToSinglePromise(push.notificationClicks);
|
||||
expect(event.action).toEqual('clicked');
|
||||
expect(event.notification.title).toEqual('This is a test');
|
||||
})();
|
||||
|
||||
await scope.handleClick({title: 'This is a test'}, 'clicked');
|
||||
await gotNotificationClick;
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
Reference in New Issue
Block a user