George Kalpakas 22a81231f2 test(service-worker): better align mock event implementations with actual implementations (#42736)
This commit better aligns the mock event implementations used in
ServiceWorker tests (and the associated typings) with the actual
implementations (and the official TypeScript typings). This allows
verifying the ServiceWorker behavior in a slightly more realistic
environment.

This is in preparation of switching from our custom typings to the
official TypeScript typings (`lib.webworker.d.ts`).

PR Close #42736
2021-07-08 10:28:22 -07:00

125 lines
3.1 KiB
TypeScript

/**
* @license
* Copyright Google LLC 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
*/
export class MockEvent implements Event {
readonly AT_TARGET = -1;
readonly BUBBLING_PHASE = -1;
readonly CAPTURING_PHASE = -1;
readonly NONE = -1;
readonly bubbles = false;
cancelBubble = false;
readonly cancelable = false;
readonly composed = false;
readonly currentTarget = null;
readonly defaultPrevented = false;
readonly eventPhase = -1;
readonly isTrusted = false;
returnValue = false;
readonly srcElement = null;
readonly target = null;
readonly timeStamp = Date.now();
constructor(readonly type: string) {}
composedPath(): EventTarget[] {
this.notImplemented();
}
initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void {
this.notImplemented();
}
preventDefault(): void {
this.notImplemented();
}
stopImmediatePropagation(): void {
this.notImplemented();
}
stopPropagation(): void {
this.notImplemented();
}
private notImplemented(): never {
throw new Error('Method not implemented in `MockEvent`.');
}
}
export class MockExtendableEvent extends MockEvent implements ExtendableEvent {
private queue: Promise<unknown>[] = [];
get ready(): Promise<void> {
return (async () => {
while (this.queue.length > 0) {
await this.queue.shift();
}
})();
}
waitUntil(promise: Promise<unknown>): void {
this.queue.push(promise);
}
}
export class MockActivateEvent extends MockExtendableEvent {
constructor() {
super('activate');
}
}
export class MockFetchEvent extends MockExtendableEvent implements FetchEvent {
readonly preloadResponse = Promise.resolve();
response: Promise<Response|undefined> = Promise.resolve(undefined);
constructor(
readonly request: Request, readonly clientId: string, readonly resultingClientId: string) {
super('fetch');
}
respondWith(r: Response|Promise<Response>): void {
this.response = Promise.resolve(r);
}
}
export class MockInstallEvent extends MockExtendableEvent {
constructor() {
super('install');
}
}
export class MockExtendableMessageEvent extends MockExtendableEvent implements
ExtendableMessageEvent {
readonly lastEventId = '';
readonly origin = '';
readonly ports: ReadonlyArray<MessagePort> = [];
constructor(readonly data: any, readonly source: Client|MessagePort|ServiceWorker|null) {
super('message');
}
}
export class MockNotificationEvent extends MockExtendableEvent implements NotificationEvent {
readonly notification = {
...this._notification,
close: () => undefined,
} as Notification;
constructor(private _notification: Partial<Notification>, readonly action = '') {
super('notification');
}
}
export class MockPushEvent extends MockExtendableEvent implements PushEvent {
readonly data = {
json: () => this._data,
text: () => JSON.stringify(this._data),
} as PushMessageData;
constructor(private _data: object) {
super('push');
}
}