
Fixes all TypeScript failures caused by enabling the `--strict` flag for test source files. We also want to enable the strict options for tests as the strictness enforcement improves the overall codehealth, unveiled common issues and additionally it allows us to enable `strict` in the `tsconfig.json` that is picked up by IDE's. PR Close #30993
92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {Subject} from 'rxjs';
|
|
|
|
export const patchDecodeBase64 = (proto: {decodeBase64: typeof atob}) => {
|
|
let unpatch: () => void = () => undefined;
|
|
|
|
if ((typeof atob === 'undefined') && (typeof Buffer === 'function')) {
|
|
const oldDecodeBase64 = proto.decodeBase64;
|
|
const newDecodeBase64 = (input: string) => Buffer.from(input, 'base64').toString('binary');
|
|
|
|
proto.decodeBase64 = newDecodeBase64;
|
|
unpatch = () => { proto.decodeBase64 = oldDecodeBase64; };
|
|
}
|
|
|
|
return unpatch;
|
|
};
|
|
|
|
export class MockServiceWorkerContainer {
|
|
private onControllerChange: Function[] = [];
|
|
private onMessage: Function[] = [];
|
|
mockRegistration: MockServiceWorkerRegistration|null = null;
|
|
controller: MockServiceWorker|null = null;
|
|
messages = new Subject<any>();
|
|
notificationClicks = new Subject();
|
|
|
|
addEventListener(event: 'controllerchange'|'message', handler: Function) {
|
|
if (event === 'controllerchange') {
|
|
this.onControllerChange.push(handler);
|
|
} else if (event === 'message') {
|
|
this.onMessage.push(handler);
|
|
}
|
|
}
|
|
|
|
removeEventListener(event: 'controllerchange', handler: Function) {
|
|
if (event === 'controllerchange') {
|
|
this.onControllerChange = this.onControllerChange.filter(h => h !== handler);
|
|
} else if (event === 'message') {
|
|
this.onMessage = this.onMessage.filter(h => h !== handler);
|
|
}
|
|
}
|
|
|
|
async register(url: string): Promise<void> { return; }
|
|
|
|
async getRegistration(): Promise<ServiceWorkerRegistration> {
|
|
return this.mockRegistration as any;
|
|
}
|
|
|
|
setupSw(url: string = '/ngsw-worker.js'): void {
|
|
this.mockRegistration = new MockServiceWorkerRegistration();
|
|
this.controller = new MockServiceWorker(this, url);
|
|
this.onControllerChange.forEach(onChange => onChange(this.controller));
|
|
}
|
|
|
|
sendMessage(value: Object): void {
|
|
this.onMessage.forEach(onMessage => onMessage({
|
|
data: value,
|
|
}));
|
|
}
|
|
}
|
|
|
|
export class MockServiceWorker {
|
|
constructor(private mock: MockServiceWorkerContainer, readonly scriptURL: string) {}
|
|
|
|
postMessage(value: Object) { this.mock.messages.next(value); }
|
|
}
|
|
|
|
export class MockServiceWorkerRegistration {
|
|
pushManager: PushManager = new MockPushManager() as any;
|
|
}
|
|
|
|
export class MockPushManager {
|
|
private subscription: PushSubscription|null = null;
|
|
|
|
getSubscription(): Promise<PushSubscription|null> { return Promise.resolve(this.subscription); }
|
|
|
|
subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription> {
|
|
this.subscription = new MockPushSubscription() as any;
|
|
return Promise.resolve(this.subscription !);
|
|
}
|
|
}
|
|
|
|
export class MockPushSubscription {
|
|
unsubscribe(): Promise<boolean> { return Promise.resolve(true); }
|
|
}
|