Write additional tests (#22802)

* Write additional tests

* Make Sonar happier
This commit is contained in:
Michael Telatynski 2022-07-11 13:22:37 +01:00 committed by GitHub
parent a4f9e7adad
commit 017dfb6606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 87 additions and 40 deletions

View File

@ -54,7 +54,7 @@ export default class Favicon {
private isReady = false; private isReady = false;
// callback to run once isReady is asserted, allows for a badge to be queued for when it can be shown // callback to run once isReady is asserted, allows for a badge to be queued for when it can be shown
private readyCb = () => {}; private readyCb?: () => void;
constructor(params: Partial<IParams> = {}) { constructor(params: Partial<IParams> = {}) {
this.params = { ...defaults, ...params }; this.params = { ...defaults, ...params };
@ -180,7 +180,7 @@ export default class Favicon {
private ready() { private ready() {
if (this.isReady) return; if (this.isReady) return;
this.isReady = true; this.isReady = true;
this.readyCb(); this.readyCb?.();
} }
private setIcon(canvas) { private setIcon(canvas) {
@ -230,9 +230,9 @@ export default class Favicon {
private static getLinks() { private static getLinks() {
const icons: HTMLLinkElement[] = []; const icons: HTMLLinkElement[] = [];
const links = window.document.getElementsByTagName("head")[0].getElementsByTagName("link"); const links = window.document.getElementsByTagName("head")[0].getElementsByTagName("link");
for (let i = 0; i < links.length; i++) { for (const link of links) {
if ((/(^|\s)icon(\s|$)/i).test(links[i].getAttribute("rel"))) { if ((/(^|\s)icon(\s|$)/i).test(link.getAttribute("rel"))) {
icons.push(links[i]); icons.push(link);
} }
} }
return icons; return icons;

View File

@ -92,8 +92,8 @@ export function loadOlm(): Promise<void> {
locateFile: () => olmWasmPath, locateFile: () => olmWasmPath,
}).then(() => { }).then(() => {
logger.log("Using WebAssembly Olm"); logger.log("Using WebAssembly Olm");
}).catch((e) => { }).catch((wasmLoadError) => {
logger.log("Failed to load Olm: trying legacy version", e); logger.log("Failed to load Olm: trying legacy version", wasmLoadError);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const s = document.createElement('script'); const s = document.createElement('script');
s.src = 'olm_legacy.js'; // XXX: This should be cache-busted too s.src = 'olm_legacy.js'; // XXX: This should be cache-busted too
@ -106,8 +106,8 @@ export function loadOlm(): Promise<void> {
return window.Olm.init(); return window.Olm.init();
}).then(() => { }).then(() => {
logger.log("Using legacy Olm"); logger.log("Using legacy Olm");
}).catch((e) => { }).catch((legacyLoadError) => {
logger.log("Both WebAssembly and asm.js Olm failed!", e); logger.log("Both WebAssembly and asm.js Olm failed!", legacyLoadError);
}); });
}); });
} }

View File

@ -48,7 +48,7 @@ export class IPCManager {
return deferred.promise; return deferred.promise;
} }
private onIpcReply = (ev: {}, payload: IPCPayload): void => { private onIpcReply = (_ev: {}, payload: IPCPayload): void => {
if (payload.id === undefined) { if (payload.id === undefined) {
logger.warn("Ignoring IPC reply with no ID"); logger.warn("Ignoring IPC reply with no ID");
return; return;

View File

@ -47,7 +47,8 @@ export default abstract class VectorBasePlatform extends BasePlatform {
if (this._favicon) { if (this._favicon) {
return this._favicon; return this._favicon;
} }
return this._favicon = new Favicon(); this._favicon = new Favicon();
return this._favicon;
} }
private updateFavicon() { private updateFavicon() {

View File

@ -80,7 +80,7 @@ export default class WebPlatform extends VectorBasePlatform {
// annoyingly, the latest spec says this returns a // annoyingly, the latest spec says this returns a
// promise, but this is only supported in Chrome 46 // promise, but this is only supported in Chrome 46
// and Firefox 47, so adapt the callback API. // and Firefox 47, so adapt the callback API.
return new Promise(function(resolve, reject) { return new Promise(function(resolve) {
window.Notification.requestPermission((result) => { window.Notification.requestPermission((result) => {
resolve(result); resolve(result);
}); });

View File

@ -39,7 +39,7 @@ export function initRageshake() {
logger.log("To fix line numbers in Chrome: " + logger.log("To fix line numbers in Chrome: " +
"Meatball menu → Settings → Ignore list → Add /rageshake\\.js$"); "Meatball menu → Settings → Ignore list → Add /rageshake\\.js$");
window.addEventListener('beforeunload', (e) => { window.addEventListener('beforeunload', () => {
logger.log('element-web closing'); logger.log('element-web closing');
// try to flush the logs to indexeddb // try to flush the logs to indexeddb
rageshake.flush(); rageshake.flush();

View File

@ -41,7 +41,7 @@ function routeUrl(location: Location) {
(window.matrixChat as MatrixChatType).showScreen(s.screen, s.params); (window.matrixChat as MatrixChatType).showScreen(s.screen, s.params);
} }
function onHashChange(ev: HashChangeEvent) { function onHashChange() {
if (decodeURIComponent(window.location.hash) === lastLocationHashSet) { if (decodeURIComponent(window.location.hash) === lastLocationHashSet) {
// we just set this: no need to route it! // we just set this: no need to route it!
return; return;

View File

@ -119,4 +119,12 @@ describe('getVectorConfig()', () => {
await expect(() => getVectorConfig()).rejects.toEqual({"err": "err-general", "response": undefined}); await expect(() => getVectorConfig()).rejects.toEqual({"err": "err-general", "response": undefined});
}); });
it('rejects with an error when config is invalid JSON', async () => {
setRequestMockImplementationOnce('err-specific');
setRequestMockImplementationOnce(undefined, { status: 200 }, '{"invalid": "json",}');
await expect(() => getVectorConfig()).rejects.toEqual({
err: new SyntaxError("Unexpected token } in JSON at position 19"),
});
});
}); });

View File

@ -0,0 +1,33 @@
/*
Copyright 2022 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import PWAPlatform from "../../../../src/vector/platform/PWAPlatform";
describe('PWAPlatform', () => {
beforeEach(() => {
jest.clearAllMocks();
});
describe("setNotificationCount", () => {
it("should call Navigator::setAppBadge", () => {
navigator.setAppBadge = jest.fn().mockResolvedValue(undefined);
const platform = new PWAPlatform();
expect(navigator.setAppBadge).not.toHaveBeenCalled();
platform.setNotificationCount(123);
expect(navigator.setAppBadge).toHaveBeenCalledWith(123);
});
});
});

View File

@ -30,6 +30,13 @@ describe('WebPlatform', () => {
expect(platform.getHumanReadableName()).toEqual('Web Platform'); expect(platform.getHumanReadableName()).toEqual('Web Platform');
}); });
it('registers service worker', () => {
// @ts-ignore - mocking readonly object
navigator.serviceWorker = { register: jest.fn() };
new WebPlatform();
expect(navigator.serviceWorker.register).toHaveBeenCalled();
});
describe('notification support', () => { describe('notification support', () => {
const mockNotification = { const mockNotification = {
requestPermission: jest.fn(), requestPermission: jest.fn(),
@ -109,7 +116,6 @@ describe('WebPlatform', () => {
}); });
describe('pollForUpdate()', () => { describe('pollForUpdate()', () => {
it('should return not available and call showNoUpdate when current version matches most recent version', async () => { it('should return not available and call showNoUpdate when current version matches most recent version', async () => {
process.env.VERSION = prodVersion; process.env.VERSION = prodVersion;
setRequestMockImplementation(undefined, { status: 200}, prodVersion); setRequestMockImplementation(undefined, { status: 200}, prodVersion);
@ -181,6 +187,5 @@ describe('WebPlatform', () => {
expect(showNoUpdate).not.toHaveBeenCalled(); expect(showNoUpdate).not.toHaveBeenCalled();
}); });
}); });
}); });
}); });