Conform more code to strict null checking (#10167)

* Conform more code to strict null checking

* Delint

* Iterate PR based on feedback
This commit is contained in:
Michael Telatynski
2023-02-16 17:21:44 +00:00
committed by GitHub
parent f7bea2cae5
commit 4574c665ea
103 changed files with 517 additions and 495 deletions

View File

@@ -57,7 +57,7 @@ describe("ContentMessages", () => {
uploadContent: jest.fn().mockResolvedValue({ content_uri: "mxc://server/file" }),
} as unknown as MatrixClient;
contentMessages = new ContentMessages();
prom = Promise.resolve(null);
prom = Promise.resolve<ISendEventResponse>({ event_id: "$event_id" });
});
describe("sendStickerContentToRoom", () => {
@@ -98,7 +98,7 @@ describe("ContentMessages", () => {
mocked(doMaybeLocalRoomAction).mockImplementation(
<T>(roomId: string, fn: (actualRoomId: string) => Promise<T>) => fn(roomId),
);
mocked(BlurhashEncoder.instance.getBlurhash).mockResolvedValue(undefined);
mocked(BlurhashEncoder.instance.getBlurhash).mockResolvedValue("blurhashstring");
});
it("should use m.image for image files", async () => {
@@ -134,7 +134,7 @@ describe("ContentMessages", () => {
const element = createElement(tagName);
if (tagName === "video") {
(<HTMLVideoElement>element).load = jest.fn();
(<HTMLVideoElement>element).play = () => element.onloadeddata(new Event("loadeddata"));
(<HTMLVideoElement>element).play = () => element.onloadeddata!(new Event("loadeddata"));
(<HTMLVideoElement>element).pause = jest.fn();
Object.defineProperty(element, "videoHeight", {
get() {
@@ -200,8 +200,8 @@ describe("ContentMessages", () => {
expect(upload.loaded).toBe(0);
expect(upload.total).toBe(file.size);
const { progressHandler } = mocked(client.uploadContent).mock.calls[0][1];
progressHandler({ loaded: 123, total: 1234 });
const { progressHandler } = mocked(client.uploadContent).mock.calls[0][1]!;
progressHandler!({ loaded: 123, total: 1234 });
expect(upload.loaded).toBe(123);
expect(upload.total).toBe(1234);
await prom;
@@ -256,11 +256,11 @@ describe("ContentMessages", () => {
mocked(client.uploadContent).mockReturnValue(deferred.promise);
const file1 = new File([], "file1");
const prom = contentMessages.sendContentToRoom(file1, roomId, undefined, client, undefined);
const { abortController } = mocked(client.uploadContent).mock.calls[0][1];
expect(abortController.signal.aborted).toBeFalsy();
const { abortController } = mocked(client.uploadContent).mock.calls[0][1]!;
expect(abortController!.signal.aborted).toBeFalsy();
const [upload] = contentMessages.getCurrentUploads();
contentMessages.cancelUpload(upload);
expect(abortController.signal.aborted).toBeTruthy();
expect(abortController!.signal.aborted).toBeTruthy();
deferred.resolve({} as UploadResponse);
await prom;
});
@@ -325,7 +325,7 @@ describe("uploadFile", () => {
const file = new Blob([]);
const prom = uploadFile(client, "!roomId:server", file);
mocked(client.uploadContent).mock.calls[0][1].abortController.abort();
mocked(client.uploadContent).mock.calls[0][1]!.abortController!.abort();
deferred.resolve({ content_uri: "mxc://foo/bar" });
await expect(prom).rejects.toThrowError(UploadCanceledError);
});

View File

@@ -134,12 +134,14 @@ But this is not
expect(getNestedReplyText(event, mockPermalinkGenerator)).toMatchSnapshot();
});
[
["m.room.message", MsgType.Location, LocationAssetType.Pin],
["m.room.message", MsgType.Location, LocationAssetType.Self],
[M_BEACON_INFO.name, undefined, LocationAssetType.Pin],
[M_BEACON_INFO.name, undefined, LocationAssetType.Self],
].forEach(([type, msgType, assetType]) => {
(
[
["m.room.message", MsgType.Location, LocationAssetType.Pin],
["m.room.message", MsgType.Location, LocationAssetType.Self],
[M_BEACON_INFO.name, undefined, LocationAssetType.Pin],
[M_BEACON_INFO.name, undefined, LocationAssetType.Self],
] as const
).forEach(([type, msgType, assetType]) => {
it(`should create the expected fallback text for ${assetType} ${type}/${msgType}`, () => {
const event = makeTestEvent(type, {
body: "body",

View File

@@ -49,7 +49,7 @@ describe("Terms", function () {
beforeEach(function () {
jest.clearAllMocks();
mockClient.getAccountData.mockReturnValue(null);
mockClient.getAccountData.mockReturnValue(undefined);
mockClient.getTerms.mockResolvedValue(null);
mockClient.setAccountData.mockResolvedValue({});
});
@@ -59,7 +59,7 @@ describe("Terms", function () {
});
it("should prompt for all terms & services if no account data", async function () {
mockClient.getAccountData.mockReturnValue(null);
mockClient.getAccountData.mockReturnValue(undefined);
mockClient.getTerms.mockResolvedValue({
policies: {
policy_the_first: POLICY_ONE,

View File

@@ -34,7 +34,7 @@ describe("RoomStatusBar", () => {
stubClient();
client = MatrixClientPeg.get();
room = new Room(ROOM_ID, client, client.getUserId(), {
room = new Room(ROOM_ID, client, client.getUserId()!, {
pendingEventOrdering: PendingEventOrdering.Detached,
});
event = mkEvent({
@@ -72,7 +72,7 @@ describe("RoomStatusBar", () => {
length: 2,
});
rootEvent.status = EventStatus.NOT_SENT;
room.addPendingEvent(rootEvent, rootEvent.getId());
room.addPendingEvent(rootEvent, rootEvent.getId()!);
for (const event of events) {
event.status = EventStatus.NOT_SENT;
room.addPendingEvent(event, Date.now() + Math.random() + "");

View File

@@ -99,10 +99,10 @@ describe("ThreadView", () => {
"is_falling_back": true,
"m.in_reply_to": {
event_id: rootEvent
.getThread()
.getThread()!
.lastReply((ev: MatrixEvent) => {
return ev.isRelation(THREAD_RELATION_TYPE.name);
})
})!
.getId(),
},
"rel_type": RelationType.Thread,
@@ -126,8 +126,8 @@ describe("ThreadView", () => {
const res = mkThread({
room,
client: mockClient,
authorId: mockClient.getUserId(),
participantUserIds: [mockClient.getUserId()],
authorId: mockClient.getUserId()!,
participantUserIds: [mockClient.getUserId()!],
});
rootEvent = res.rootEvent;
@@ -154,8 +154,8 @@ describe("ThreadView", () => {
const { rootEvent: rootEvent2 } = mkThread({
room,
client: mockClient,
authorId: mockClient.getUserId(),
participantUserIds: [mockClient.getUserId()],
authorId: mockClient.getUserId()!,
participantUserIds: [mockClient.getUserId()!],
});
act(() => {

View File

@@ -54,8 +54,8 @@ describe("ThreadListContextMenu", () => {
const res = mkThread({
room,
client: mockClient,
authorId: mockClient.getUserId(),
participantUserIds: [mockClient.getUserId()],
authorId: mockClient.getUserId()!,
participantUserIds: [mockClient.getUserId()!],
});
event = res.rootEvent;

View File

@@ -109,7 +109,7 @@ describe("<ExportDialog />", () => {
plainTextExporterInstance.export.mockClear();
// default setting value
ChatExportMock.getForceChatExportParameters.mockClear().mockReturnValue({});
mocked(ChatExportMock.getForceChatExportParameters!).mockClear().mockReturnValue({});
});
it("renders export dialog", () => {
@@ -145,7 +145,7 @@ describe("<ExportDialog />", () => {
});
it("exports room using values set from ForceRoomExportParameters", async () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
format: ExportFormat.PlainText,
range: ExportType.Beginning,
sizeMb: 7000,
@@ -198,7 +198,7 @@ describe("<ExportDialog />", () => {
});
it("does not render export format when set in ForceRoomExportParameters", () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
format: ExportFormat.PlainText,
});
const component = getComponent();
@@ -219,7 +219,7 @@ describe("<ExportDialog />", () => {
});
it("does not render export type when set in ForceRoomExportParameters", () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
range: ExportType.Beginning,
});
const component = getComponent();
@@ -310,7 +310,7 @@ describe("<ExportDialog />", () => {
});
it("does not render size limit input when set in ForceRoomExportParameters", () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
sizeMb: 10000,
});
const component = getComponent();
@@ -321,7 +321,7 @@ describe("<ExportDialog />", () => {
* 2000mb size limit does not apply when higher limit is configured in config
*/
it("exports when size limit set in ForceRoomExportParameters is larger than 2000", async () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
sizeMb: 10000,
});
const component = getComponent();
@@ -344,7 +344,7 @@ describe("<ExportDialog />", () => {
});
it("does not render input when set in ForceRoomExportParameters", () => {
ChatExportMock.getForceChatExportParameters.mockReturnValue({
mocked(ChatExportMock.getForceChatExportParameters!).mockReturnValue({
includeAttachments: false,
});
const component = getComponent();

View File

@@ -74,7 +74,7 @@ describe("<DevicesPanel />", () => {
const toggleDeviceSelection = (container: HTMLElement, deviceId: string) =>
act(() => {
const checkbox = container.querySelector(`#device-tile-checkbox-${deviceId}`);
const checkbox = container.querySelector(`#device-tile-checkbox-${deviceId}`)!;
fireEvent.click(checkbox);
});
@@ -204,7 +204,7 @@ describe("<DevicesPanel />", () => {
// close the modal without submission
act(() => {
const modalCloseButton = document.querySelector('[aria-label="Close dialog"]');
const modalCloseButton = document.querySelector('[aria-label="Close dialog"]')!;
fireEvent.click(modalCloseButton);
});

View File

@@ -49,6 +49,7 @@ describe("PreferencesUserSettingsTab", () => {
const client = MatrixClientPeg.get();
jest.spyOn(client, "isVersionSupported").mockImplementation(async (version: string) => {
if (version === "v1.4") return val;
return false;
});
};
@@ -61,8 +62,12 @@ describe("PreferencesUserSettingsTab", () => {
};
};
const expectSetValueToHaveBeenCalled = (name: string, roomId: string, level: SettingLevel, value: boolean) =>
expect(SettingsStore.setValue).toHaveBeenCalledWith(name, roomId, level, value);
const expectSetValueToHaveBeenCalled = (
name: string,
roomId: string | undefined,
level: SettingLevel,
value: boolean,
) => expect(SettingsStore.setValue).toHaveBeenCalledWith(name, roomId, level, value);
describe("with server support", () => {
beforeEach(() => {

View File

@@ -923,7 +923,7 @@ describe("ElementCall", () => {
jest.spyOn(Modal, "createDialog").mockReturnValue({
finished: new Promise((r) => r([sourceId])),
} as IHandle<any[]>);
jest.spyOn(PlatformPeg.get(), "supportsDesktopCapturer").mockReturnValue(true);
jest.spyOn(PlatformPeg.get()!, "supportsDesktopCapturer").mockReturnValue(true);
await call.connect();
@@ -951,7 +951,7 @@ describe("ElementCall", () => {
jest.spyOn(Modal, "createDialog").mockReturnValue({
finished: new Promise((r) => r([null])),
} as IHandle<any[]>);
jest.spyOn(PlatformPeg.get(), "supportsDesktopCapturer").mockReturnValue(true);
jest.spyOn(PlatformPeg.get()!, "supportsDesktopCapturer").mockReturnValue(true);
await call.connect();
@@ -976,7 +976,7 @@ describe("ElementCall", () => {
});
it("replies with pending: false if we don't support desktop capturer", async () => {
jest.spyOn(PlatformPeg.get(), "supportsDesktopCapturer").mockReturnValue(false);
jest.spyOn(PlatformPeg.get()!, "supportsDesktopCapturer").mockReturnValue(false);
await call.connect();

View File

@@ -31,7 +31,7 @@ describe("ImageSize", () => {
expect(size).toStrictEqual({ w: 800, h: 400 });
});
it("returns max values if content size is not specified", () => {
const size = suggestedSize(ImageSize.Normal, { w: null, h: null });
const size = suggestedSize(ImageSize.Normal, {});
expect(size).toStrictEqual({ w: 324, h: 324 });
});
it("returns integer values", () => {

View File

@@ -102,9 +102,9 @@ describe("OwnBeaconStore", () => {
};
const expireBeaconAndEmit = (store: OwnBeaconStore, beaconInfoEvent: MatrixEvent): void => {
const beacon = store.getBeaconById(getBeaconInfoIdentifier(beaconInfoEvent));
const beacon = store.getBeaconById(getBeaconInfoIdentifier(beaconInfoEvent))!;
// time travel until beacon is expired
advanceDateAndTime(beacon.beaconInfo.timeout + 100);
advanceDateAndTime(beacon.beaconInfo!.timeout + 100);
// force an update on the beacon
// @ts-ignore
@@ -118,13 +118,13 @@ describe("OwnBeaconStore", () => {
beaconInfoEvent: MatrixEvent,
isLive: boolean,
): void => {
const beacon = store.getBeaconById(getBeaconInfoIdentifier(beaconInfoEvent));
const beacon = store.getBeaconById(getBeaconInfoIdentifier(beaconInfoEvent))!;
// matches original state of event content
// except for live property
const updateEvent = makeBeaconInfoEvent(
beaconInfoEvent.getSender(),
beaconInfoEvent.getRoomId(),
{ isLive, timeout: beacon.beaconInfo.timeout },
beaconInfoEvent.getSender()!,
beaconInfoEvent.getRoomId()!,
{ isLive, timeout: beacon.beaconInfo!.timeout },
"update-event-id",
);
beacon.update(updateEvent);
@@ -236,12 +236,12 @@ describe("OwnBeaconStore", () => {
expect(mockClient.sendEvent).toHaveBeenCalledWith(
room1Id,
M_BEACON.name,
makeBeaconContent(defaultLocationUri, now, alicesRoom1BeaconInfo.getId()),
makeBeaconContent(defaultLocationUri, now, alicesRoom1BeaconInfo.getId()!),
);
expect(mockClient.sendEvent).toHaveBeenCalledWith(
room2Id,
M_BEACON.name,
makeBeaconContent(defaultLocationUri, now, alicesRoom2BeaconInfo.getId()),
makeBeaconContent(defaultLocationUri, now, alicesRoom2BeaconInfo.getId()!),
);
});
});
@@ -263,7 +263,7 @@ describe("OwnBeaconStore", () => {
it("destroys beacons", async () => {
const [room1] = makeRoomsWithStateEvents([alicesRoom1BeaconInfo]);
const store = await makeOwnBeaconStore();
const beacon = room1.currentState.beacons.get(getBeaconInfoIdentifier(alicesRoom1BeaconInfo));
const beacon = room1.currentState.beacons.get(getBeaconInfoIdentifier(alicesRoom1BeaconInfo))!;
const destroySpy = jest.spyOn(beacon, "destroy");
// @ts-ignore
store.onNotReady();
@@ -559,7 +559,7 @@ describe("OwnBeaconStore", () => {
const [room1] = makeRoomsWithStateEvents([alicesRoom1BeaconInfo, alicesRoom2BeaconInfo]);
const store = await makeOwnBeaconStore();
const room1BeaconInstance = store.beacons.get(getBeaconInfoIdentifier(alicesRoom1BeaconInfo));
const room1BeaconInstance = store.beacons.get(getBeaconInfoIdentifier(alicesRoom1BeaconInfo))!;
const beaconDestroySpy = jest.spyOn(room1BeaconInstance, "destroy");
const emitSpy = jest.spyOn(store, "emit");
@@ -610,7 +610,7 @@ describe("OwnBeaconStore", () => {
expect(store.hasLiveBeacons()).toBe(true);
const emitSpy = jest.spyOn(store, "emit");
const beacon = store.getBeaconById(getBeaconInfoIdentifier(alicesRoom1BeaconInfo));
const beacon = store.getBeaconById(getBeaconInfoIdentifier(alicesRoom1BeaconInfo))!;
beacon.destroy();
mockClient.emit(BeaconEvent.Destroy, beacon.identifier);

View File

@@ -103,10 +103,11 @@ describe("SpaceStore", () => {
const viewRoom = (roomId: string) => defaultDispatcher.dispatch({ action: Action.ViewRoom, room_id: roomId }, true);
const run = async () => {
mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId));
mocked(client).getRoomUpgradeHistory.mockImplementation((roomId) => [
rooms.find((room) => room.roomId === roomId),
]);
mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null);
mocked(client).getRoomUpgradeHistory.mockImplementation((roomId) => {
const room = rooms.find((room) => room.roomId === roomId);
return room ? [room] : [];
});
await testUtils.setupAsyncStoreWithClient(store, client);
jest.runOnlyPendingTimers();
};
@@ -312,10 +313,12 @@ describe("SpaceStore", () => {
mkSpace(space3, [invite2]);
mkSpace(space4, [room4, fav2, space2, space3]);
mocked(client).getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId));
mocked(client).getRoom.mockImplementation(
(roomId) => rooms.find((room) => room.roomId === roomId) || null,
);
[fav1, fav2, fav3].forEach((roomId) => {
client.getRoom(roomId).tags = {
client.getRoom(roomId)!.tags = {
"m.favourite": {
order: 0.5,
},
@@ -323,20 +326,20 @@ describe("SpaceStore", () => {
});
[invite1, invite2].forEach((roomId) => {
mocked(client.getRoom(roomId)).getMyMembership.mockReturnValue("invite");
mocked(client.getRoom(roomId)!).getMyMembership.mockReturnValue("invite");
});
// have dmPartner1 be in space1 with you
const mySpace1Member = new RoomMember(space1, testUserId);
mySpace1Member.membership = "join";
(rooms.find((r) => r.roomId === space1).getMembers as jest.Mock).mockReturnValue([
(rooms.find((r) => r.roomId === space1)!.getMembers as jest.Mock).mockReturnValue([
mySpace1Member,
dm1Partner,
]);
// have dmPartner2 be in space2 with you
const mySpace2Member = new RoomMember(space2, testUserId);
mySpace2Member.membership = "join";
(rooms.find((r) => r.roomId === space2).getMembers as jest.Mock).mockReturnValue([
(rooms.find((r) => r.roomId === space2)!.getMembers as jest.Mock).mockReturnValue([
mySpace2Member,
dm2Partner,
]);
@@ -349,15 +352,15 @@ describe("SpaceStore", () => {
event: true,
type: EventType.SpaceParent,
room: room2,
user: client.getUserId(),
user: client.getUserId()!,
skey: space2,
content: { via: [], canonical: true },
ts: Date.now(),
}) as MatrixEvent,
]);
mocked(cliRoom2.currentState).getStateEvents.mockImplementation(room2MockStateEvents);
mocked(cliRoom2!.currentState).getStateEvents.mockImplementation(room2MockStateEvents);
const cliSpace2 = client.getRoom(space2);
mocked(cliSpace2.currentState).maySendStateEvent.mockImplementation(
mocked(cliSpace2!.currentState).maySendStateEvent.mockImplementation(
(evType: string, userId: string) => {
if (evType === EventType.SpaceChild) {
return userId === client.getUserId();
@@ -368,13 +371,13 @@ describe("SpaceStore", () => {
// room 3 claims to be a child of space3 but is not due to invalid m.space.parent (permissions)
const cliRoom3 = client.getRoom(room3);
mocked(cliRoom3.currentState).getStateEvents.mockImplementation(
mocked(cliRoom3!.currentState).getStateEvents.mockImplementation(
testUtils.mockStateEventImplementation([
mkEvent({
event: true,
type: EventType.SpaceParent,
room: room3,
user: client.getUserId(),
user: client.getUserId()!,
skey: space3,
content: { via: [], canonical: true },
ts: Date.now(),
@@ -382,7 +385,7 @@ describe("SpaceStore", () => {
]),
);
const cliSpace3 = client.getRoom(space3);
mocked(cliSpace3.currentState).maySendStateEvent.mockImplementation(
mocked(cliSpace3!.currentState).maySendStateEvent.mockImplementation(
(evType: string, userId: string) => {
if (evType === EventType.SpaceChild) {
return false;
@@ -813,7 +816,7 @@ describe("SpaceStore", () => {
content: { membership: "join" },
ts: Date.now(),
});
const spaceRoom = client.getRoom(spaceId);
const spaceRoom = client.getRoom(spaceId)!;
mocked(spaceRoom.currentState).getStateEvents.mockImplementation(
testUtils.mockStateEventImplementation([memberEvent]),
);
@@ -929,7 +932,7 @@ describe("SpaceStore", () => {
it("switch to unknown space is a nop", async () => {
expect(store.activeSpace).toBe(MetaSpace.Home);
const space = client.getRoom(room1); // not a space
const space = client.getRoom(room1)!; // not a space
store.setActiveSpace(space.roomId);
expect(fn).not.toHaveBeenCalledWith(UPDATE_SELECTED_SPACE, space.roomId);
expect(store.activeSpace).toBe(MetaSpace.Home);
@@ -962,6 +965,7 @@ describe("SpaceStore", () => {
member.membership = "join";
return member;
}
return null;
});
client.emit(RoomStateEvent.Members, event, space.currentState, dm1Partner);
@@ -1088,7 +1092,7 @@ describe("SpaceStore", () => {
mkSpace(space1, [room1, room2, room3]);
mkSpace(space2, [room1, room2]);
const cliRoom2 = client.getRoom(room2);
const cliRoom2 = client.getRoom(room2)!;
mocked(cliRoom2.currentState).getStateEvents.mockImplementation(
testUtils.mockStateEventImplementation([
mkEvent({
@@ -1267,8 +1271,9 @@ describe("SpaceStore", () => {
case dm1Partner.userId:
return rootSpaceFriend;
}
return null;
});
expect(SpaceStore.instance.getSpaceFilteredUserIds(space1).has(dm1Partner.userId)).toBeFalsy();
expect(SpaceStore.instance.getSpaceFilteredUserIds(space1)!.has(dm1Partner.userId)).toBeFalsy();
const memberEvent = mkEvent({
event: true,
type: EventType.RoomMember,
@@ -1281,7 +1286,7 @@ describe("SpaceStore", () => {
});
client.emit(RoomStateEvent.Members, memberEvent, rootSpace.currentState, dm1Partner);
jest.runOnlyPendingTimers();
expect(SpaceStore.instance.getSpaceFilteredUserIds(space1).has(dm1Partner.userId)).toBeTruthy();
expect(SpaceStore.instance.getSpaceFilteredUserIds(space1)!.has(dm1Partner.userId)).toBeTruthy();
const dm1Room = mkRoom(dm1);
dm1Room.getMyMembership.mockReturnValue("join");
client.emit(ClientEvent.Room, dm1Room);

View File

@@ -198,10 +198,10 @@ describe("SlidingRoomListStore", () => {
return keyToListData[key] || null;
});
expect(store.getTagsForRoom(new Room(roomA, context.client!, context.client!.getUserId()))).toEqual([
expect(store.getTagsForRoom(new Room(roomA, context.client!, context.client!.getUserId()!))).toEqual([
DefaultTagID.Untagged,
]);
expect(store.getTagsForRoom(new Room(roomB, context.client!, context.client!.getUserId()))).toEqual([
expect(store.getTagsForRoom(new Room(roomB, context.client!, context.client!.getUserId()!))).toEqual([
DefaultTagID.Favourite,
DefaultTagID.Untagged,
]);
@@ -221,9 +221,9 @@ describe("SlidingRoomListStore", () => {
0: roomA,
};
const rooms = [
new Room(roomA, context.client!, context.client!.getUserId()),
new Room(roomB, context.client!, context.client!.getUserId()),
new Room(roomC, context.client!, context.client!.getUserId()),
new Room(roomA, context.client!, context.client!.getUserId()!),
new Room(roomB, context.client!, context.client!.getUserId()!),
new Room(roomC, context.client!, context.client!.getUserId()!),
];
mocked(context.client!.getRoom).mockImplementation((roomId: string) => {
switch (roomId) {
@@ -257,9 +257,9 @@ describe("SlidingRoomListStore", () => {
2: roomIdC,
0: roomIdA,
};
const roomA = new Room(roomIdA, context.client!, context.client!.getUserId());
const roomB = new Room(roomIdB, context.client!, context.client!.getUserId());
const roomC = new Room(roomIdC, context.client!, context.client!.getUserId());
const roomA = new Room(roomIdA, context.client!, context.client!.getUserId()!);
const roomB = new Room(roomIdB, context.client!, context.client!.getUserId()!);
const roomC = new Room(roomIdC, context.client!, context.client!.getUserId()!);
mocked(context.client!.getRoom).mockImplementation((roomId: string) => {
switch (roomId) {
case roomIdA:
@@ -321,8 +321,8 @@ describe("SlidingRoomListStore", () => {
const tagId = DefaultTagID.Favourite;
const joinCount = 10;
// seed the store with 2 rooms
const roomA = new Room(roomIdA, context.client!, context.client!.getUserId());
const roomC = new Room(roomIdC, context.client!, context.client!.getUserId());
const roomA = new Room(roomIdA, context.client!, context.client!.getUserId()!);
const roomC = new Room(roomIdC, context.client!, context.client!.getUserId()!);
mocked(context.client!.getRoom).mockImplementation((roomId: string) => {
switch (roomId) {
case roomIdA:

View File

@@ -29,11 +29,13 @@ import { MatrixClientPeg } from "../../../src/MatrixClientPeg";
import { SpaceFilterCondition } from "../../../src/stores/room-list/filters/SpaceFilterCondition";
import DMRoomMap from "../../../src/utils/DMRoomMap";
let filter: SpaceFilterCondition = null;
let filter: SpaceFilterCondition | null = null;
const mockRoomListStore = {
addFilter: (f: SpaceFilterCondition) => (filter = f),
removeFilter: (): void => (filter = null),
removeFilter: (): void => {
filter = null;
},
} as unknown as RoomListStoreClass;
const getUserIdForRoomId = jest.fn();
@@ -74,7 +76,7 @@ describe("SpaceWatcher", () => {
[MetaSpace.Orphans]: true,
});
client.getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId));
client.getRoom.mockImplementation((roomId) => rooms.find((room) => room.roomId === roomId) || null);
await setupAsyncStoreWithClient(store, client);
});
@@ -99,7 +101,7 @@ describe("SpaceWatcher", () => {
await setShowAllRooms(false);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Home);
expect(filter!["space"]).toBe(MetaSpace.Home);
});
it("sets filter correctly for all -> space transition", async () => {
@@ -109,7 +111,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(space1);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
});
it("removes filter for home -> all transition", async () => {
@@ -128,7 +130,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(space1);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
});
it("removes filter for space -> all transition", async () => {
@@ -137,7 +139,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(space1);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
SpaceStore.instance.setActiveSpace(MetaSpace.Home);
expect(filter).toBeNull();
@@ -149,7 +151,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(MetaSpace.Favourites);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Favourites);
expect(filter!["space"]).toBe(MetaSpace.Favourites);
SpaceStore.instance.setActiveSpace(MetaSpace.Home);
expect(filter).toBeNull();
@@ -161,7 +163,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(MetaSpace.People);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.People);
expect(filter!["space"]).toBe(MetaSpace.People);
SpaceStore.instance.setActiveSpace(MetaSpace.Home);
expect(filter).toBeNull();
@@ -173,7 +175,7 @@ describe("SpaceWatcher", () => {
SpaceStore.instance.setActiveSpace(MetaSpace.Orphans);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Orphans);
expect(filter!["space"]).toBe(MetaSpace.Orphans);
SpaceStore.instance.setActiveSpace(MetaSpace.Home);
expect(filter).toBeNull();
@@ -185,11 +187,11 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
SpaceStore.instance.setActiveSpace(MetaSpace.Home);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Home);
expect(filter!["space"]).toBe(MetaSpace.Home);
});
it("updates filter correctly for space -> orphans transition", async () => {
@@ -198,11 +200,11 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
SpaceStore.instance.setActiveSpace(MetaSpace.Orphans);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Orphans);
expect(filter!["space"]).toBe(MetaSpace.Orphans);
});
it("updates filter correctly for orphans -> people transition", async () => {
@@ -211,11 +213,11 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.Orphans);
expect(filter!["space"]).toBe(MetaSpace.Orphans);
SpaceStore.instance.setActiveSpace(MetaSpace.People);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(MetaSpace.People);
expect(filter!["space"]).toBe(MetaSpace.People);
});
it("updates filter correctly for space -> space transition", async () => {
@@ -224,11 +226,11 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
SpaceStore.instance.setActiveSpace(space2);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space2);
expect(filter!["space"]).toBe(space2);
});
it("doesn't change filter when changing showAllRooms mode to true", async () => {
@@ -237,11 +239,11 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
await setShowAllRooms(true);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
});
it("doesn't change filter when changing showAllRooms mode to false", async () => {
@@ -250,10 +252,10 @@ describe("SpaceWatcher", () => {
new SpaceWatcher(mockRoomListStore);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
await setShowAllRooms(false);
expect(filter).toBeInstanceOf(SpaceFilterCondition);
expect(filter["space"]).toBe(space1);
expect(filter!["space"]).toBe(space1);
});
});

View File

@@ -109,14 +109,14 @@ describe("VisibilityProvider", () => {
});
it("should return false if visibility customisation returns false", () => {
mocked(RoomListCustomisations.isRoomVisible).mockReturnValue(false);
mocked(RoomListCustomisations.isRoomVisible!).mockReturnValue(false);
const room = createRoom();
expect(VisibilityProvider.instance.isRoomVisible(room)).toBe(false);
expect(RoomListCustomisations.isRoomVisible).toHaveBeenCalledWith(room);
});
it("should return true if visibility customisation returns true", () => {
mocked(RoomListCustomisations.isRoomVisible).mockReturnValue(true);
mocked(RoomListCustomisations.isRoomVisible!).mockReturnValue(true);
const room = createRoom();
expect(VisibilityProvider.instance.isRoomVisible(room)).toBe(true);
expect(RoomListCustomisations.isRoomVisible).toHaveBeenCalledWith(room);

View File

@@ -80,8 +80,8 @@ describe("StopGapWidget", () => {
beforeEach(() => {
voiceBroadcastInfoEvent = mkEvent({
event: true,
room: client.getRoom("x").roomId,
user: client.getUserId(),
room: client.getRoom("x")?.roomId,
user: client.getUserId()!,
type: VoiceBroadcastInfoEventType,
content: {},
});

View File

@@ -59,22 +59,22 @@ describe("WidgetPermissionStore", () => {
});
it("should persist OIDCState.Allowed for a widget", () => {
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, null, OIDCState.Allowed);
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, roomId, OIDCState.Allowed);
// check it remembered the value
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, null)).toEqual(OIDCState.Allowed);
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, roomId)).toEqual(OIDCState.Allowed);
});
it("should persist OIDCState.Denied for a widget", () => {
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, null, OIDCState.Denied);
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, roomId, OIDCState.Denied);
// check it remembered the value
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, null)).toEqual(OIDCState.Denied);
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, roomId)).toEqual(OIDCState.Denied);
});
it("should update OIDCState for a widget", () => {
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, null, OIDCState.Allowed);
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, null, OIDCState.Denied);
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, roomId, OIDCState.Allowed);
widgetPermissionStore.setOIDCState(w, WidgetKind.Account, roomId, OIDCState.Denied);
// check it remembered the latest value
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, null)).toEqual(OIDCState.Denied);
expect(widgetPermissionStore.getOIDCState(w, WidgetKind.Account, roomId)).toEqual(OIDCState.Denied);
});
it("should scope the location for a widget when setting OIDC state", () => {

View File

@@ -197,7 +197,7 @@ export const makeRoomWithBeacons = (
locationEvents?: MatrixEvent[],
): Beacon[] => {
const room = makeRoomWithStateEvents(beaconInfoEvents, { roomId, mockClient });
const beacons = beaconInfoEvents.map((event) => room.currentState.beacons.get(getBeaconInfoIdentifier(event)));
const beacons = beaconInfoEvents.map((event) => room.currentState.beacons.get(getBeaconInfoIdentifier(event))!);
if (locationEvents) {
beacons.forEach((beacon) => {
// this filtering happens in roomState, which is bypassed here

View File

@@ -31,7 +31,7 @@ export const addTextToComposer = (container: HTMLElement, text: string) =>
getData: (type: string) => (type === "text/plain" ? text : undefined),
} as unknown as DataTransfer,
};
fireEvent.paste(container.querySelector('[role="textbox"]'), pasteEvent);
fireEvent.paste(container.querySelector('[role="textbox"]')!, pasteEvent);
});
export const addTextToComposerEnzyme = (wrapper: ReactWrapper, text: string) =>

View File

@@ -37,7 +37,7 @@ export function untilDispatch(
dispatcher = defaultDispatcher,
timeout = 1000,
): Promise<ActionPayload> {
const callerLine = new Error().stack.toString().split("\n")[2];
const callerLine = new Error().stack!.toString().split("\n")[2];
if (typeof waitForAction === "string") {
const action = waitForAction;
waitForAction = (payload) => {
@@ -89,10 +89,10 @@ export function untilDispatch(
export function untilEmission(
emitter: EventEmitter,
eventName: string,
check: (...args: any[]) => boolean = undefined,
check?: (...args: any[]) => boolean,
timeout = 1000,
): Promise<void> {
const callerLine = new Error().stack.toString().split("\n")[2];
const callerLine = new Error().stack!.toString().split("\n")[2];
return new Promise((resolve, reject) => {
let fulfilled = false;
let timeoutId: number;

View File

@@ -58,7 +58,7 @@ describe("theme", () => {
// When
await new Promise((resolve) => {
setTheme("light").then(resolve);
lightTheme.onload(void 0);
lightTheme.onload!({} as Event);
});
// Then
@@ -72,7 +72,7 @@ describe("theme", () => {
return expect(
new Promise((resolve) => {
setTheme("light").catch((e) => resolve(e));
lightTheme.onerror("call onerror");
lightTheme.onerror!("call onerror");
}),
).resolves.toBe("call onerror");
});

View File

@@ -42,7 +42,7 @@ describe("useTopic", () => {
function RoomTopic() {
const topic = useTopic(room);
return <p>{topic.text}</p>;
return <p>{topic!.text}</p>;
}
render(<RoomTopic />);

View File

@@ -85,10 +85,6 @@ describe("MegolmExportEncryption", function () {
MegolmExportEncryption = require("../../src/utils/MegolmExportEncryption");
});
afterAll(() => {
window.crypto = undefined;
});
describe("decrypt", function () {
it("should handle missing header", function () {
const input = stringToArray(`-----`);

View File

@@ -62,8 +62,6 @@ describe("geolocation utilities", () => {
const pos: GenericPosition = {
latitude: 43.2,
longitude: 12.4,
altitude: null,
accuracy: null,
timestamp: 12334,
};

View File

@@ -45,6 +45,8 @@ interface ITestContent extends IContent {
}
describe("export", function () {
const setProgressText = jest.fn();
let mockExportOptions: IExportOptions;
let mockRoom: Room;
let ts0: number;
@@ -63,7 +65,7 @@ describe("export", function () {
};
function createRoom() {
const room = new Room(generateRoomId(), null, client.getUserId());
const room = new Room(generateRoomId(), client, client.getUserId()!);
return room;
}
mockRoom = createRoom();
@@ -146,7 +148,7 @@ describe("export", function () {
}
function mkEvents() {
const matrixEvents = [];
const matrixEvents: MatrixEvent[] = [];
let i: number;
// plain text
for (i = 0; i < 10; i++) {
@@ -237,7 +239,7 @@ describe("export", function () {
});
it("checks if the icons' html corresponds to export regex", function () {
const exporter = new HTMLExporter(mockRoom, ExportType.Beginning, mockExportOptions, null);
const exporter = new HTMLExporter(mockRoom, ExportType.Beginning, mockExportOptions, setProgressText);
const fileRegex = /<span class="mx_MFileBody_info_icon">.*?<\/span>/;
expect(fileRegex.test(renderToString(exporter.getEventTile(mkFileEvent(), true)))).toBeTruthy();
});
@@ -251,7 +253,7 @@ describe("export", function () {
maxSize: 100 * 1024 * 1024,
attachmentsIncluded: true,
},
null,
setProgressText,
);
const imageRegex = /<img.+ src="mxc:\/\/test.org" alt="image.png"\/>/;
expect(imageRegex.test(renderToString(exporter.getEventTile(mkImageEvent(), true)))).toBeTruthy();
@@ -284,13 +286,13 @@ describe("export", function () {
],
];
it.each(invalidExportOptions)("%s", (_d, options) => {
expect(() => new PlainTextExporter(mockRoom, ExportType.Beginning, options, null)).toThrowError(
expect(() => new PlainTextExporter(mockRoom, ExportType.Beginning, options, setProgressText)).toThrowError(
"Invalid export options",
);
});
it("tests the file extension splitter", function () {
const exporter = new PlainTextExporter(mockRoom, ExportType.Beginning, mockExportOptions, null);
const exporter = new PlainTextExporter(mockRoom, ExportType.Beginning, mockExportOptions, setProgressText);
const fileNameWithExtensions: Record<string, [string, string]> = {
"": ["", ""],
"name": ["name", ""],
@@ -327,14 +329,14 @@ describe("export", function () {
expectedText: '<@me:here "This"> Reply',
},
];
const exporter = new PlainTextExporter(mockRoom, ExportType.Beginning, mockExportOptions, null);
const exporter = new PlainTextExporter(mockRoom, ExportType.Beginning, mockExportOptions, setProgressText);
for (const content of eventContents) {
expect(exporter.textForReplyEvent(content)).toBe(content.expectedText);
}
});
it("checks if the render to string doesn't throw any error for different types of events", function () {
const exporter = new HTMLExporter(mockRoom, ExportType.Beginning, mockExportOptions, null);
const exporter = new HTMLExporter(mockRoom, ExportType.Beginning, mockExportOptions, setProgressText);
for (const event of events) {
expect(renderToString(exporter.getEventTile(event, false))).toBeTruthy();
}

View File

@@ -83,15 +83,15 @@ describe("VoiceBroadcastRecorder", () => {
const simulateFirstChunk = (): void => {
// send headers in wrong order and multiple times to test robustness for that
voiceRecording.onDataAvailable(headers2);
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable(headers2);
voiceRecording.onDataAvailable!(headers2);
voiceRecording.onDataAvailable!(headers1);
voiceRecording.onDataAvailable!(headers1);
voiceRecording.onDataAvailable!(headers2);
// set recorder seconds to something greater than the test chunk length of 30
// @ts-ignore
voiceRecording.recorderSeconds = 42;
voiceRecording.onDataAvailable(chunk1);
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable!(chunk1);
voiceRecording.onDataAvailable!(headers1);
};
const expectOnFirstChunkRecorded = (): void => {
@@ -164,7 +164,7 @@ describe("VoiceBroadcastRecorder", () => {
describe("when the first header from recorder has been received", () => {
beforeEach(() => {
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable!(headers1);
});
itShouldNotEmitAChunkRecordedEvent();
@@ -172,8 +172,8 @@ describe("VoiceBroadcastRecorder", () => {
describe("when the second header from recorder has been received", () => {
beforeEach(() => {
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable(headers2);
voiceRecording.onDataAvailable!(headers1);
voiceRecording.onDataAvailable!(headers2);
});
itShouldNotEmitAChunkRecordedEvent();
@@ -181,9 +181,9 @@ describe("VoiceBroadcastRecorder", () => {
describe("when a third page from recorder has been received", () => {
beforeEach(() => {
voiceRecording.onDataAvailable(headers1);
voiceRecording.onDataAvailable(headers2);
voiceRecording.onDataAvailable(chunk1);
voiceRecording.onDataAvailable!(headers1);
voiceRecording.onDataAvailable!(headers2);
voiceRecording.onDataAvailable!(chunk1);
});
itShouldNotEmitAChunkRecordedEvent();
@@ -235,15 +235,15 @@ describe("VoiceBroadcastRecorder", () => {
simulateFirstChunk();
// simulate a second chunk
voiceRecording.onDataAvailable(chunk2a);
voiceRecording.onDataAvailable!(chunk2a);
// send headers again to test robustness for that
voiceRecording.onDataAvailable(headers2);
voiceRecording.onDataAvailable!(headers2);
// add another 30 seconds for the next chunk
// @ts-ignore
voiceRecording.recorderSeconds = 72;
voiceRecording.onDataAvailable(chunk2b);
voiceRecording.onDataAvailable!(chunk2b);
});
it("should emit ChunkRecorded events", () => {