Conform more code to strict null checking (#10169)

* Conform more code to strict null checking

* delint

* Iterate

* delint

* Fix bad test
This commit is contained in:
Michael Telatynski 2023-02-16 09:38:44 +00:00 committed by GitHub
parent 5123d7e641
commit e8b92b308b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
85 changed files with 283 additions and 287 deletions

View file

@ -79,7 +79,7 @@ describe("RoomView", () => {
stores.client = cli;
stores.rightPanelStore.useUnitTestClient(cli);
jest.spyOn(VoipUserMapper.sharedInstance(), "getVirtualRoomForRoom").mockResolvedValue(null);
jest.spyOn(VoipUserMapper.sharedInstance(), "getVirtualRoomForRoom").mockResolvedValue(undefined);
});
afterEach(async () => {
@ -175,7 +175,7 @@ describe("RoomView", () => {
instance = await getRoomViewInstance();
oldRoom = new Room("!old:example.com", cli, cli.getSafeUserId());
rooms.set(oldRoom.roomId, oldRoom);
jest.spyOn(room, "findPredecessor").mockReturnValue({ roomId: oldRoom.roomId, eventId: null });
jest.spyOn(room, "findPredecessor").mockReturnValue({ roomId: oldRoom.roomId });
});
it("and it has 0 unreads, getHiddenHighlightCount should return 0", async () => {

View file

@ -181,7 +181,7 @@ describe("Login", function () {
const { container, rerender } = render(getRawComponent());
await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…"));
fireEvent.click(container.querySelector(".mx_SSOButton"));
fireEvent.click(container.querySelector(".mx_SSOButton")!);
expect(platform.startSingleSignOn.mock.calls[0][0].baseUrl).toBe("https://matrix.org");
fetchMock.get("https://server2/_matrix/client/versions", {
@ -190,7 +190,7 @@ describe("Login", function () {
});
rerender(getRawComponent("https://server2"));
fireEvent.click(container.querySelector(".mx_SSOButton"));
fireEvent.click(container.querySelector(".mx_SSOButton")!);
expect(platform.startSingleSignOn.mock.calls[1][0].baseUrl).toBe("https://server2");
});

View file

@ -118,7 +118,7 @@ describe("Registration", function () {
const { container, rerender } = render(getRawComponent());
await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…"));
fireEvent.click(container.querySelector(".mx_SSOButton"));
fireEvent.click(container.querySelector(".mx_SSOButton")!);
expect(registerRequest.mock.instances[0].baseUrl).toBe("https://matrix.org");
fetchMock.get("https://server2/_matrix/client/versions", {
@ -128,7 +128,7 @@ describe("Registration", function () {
rerender(getRawComponent("https://server2"));
await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…"));
fireEvent.click(container.querySelector(".mx_SSOButton"));
fireEvent.click(container.querySelector(".mx_SSOButton")!);
expect(registerRequest.mock.instances[1].baseUrl).toBe("https://server2");
});
});

View file

@ -84,7 +84,7 @@ describe("<BeaconListItem />", () => {
const member = new RoomMember(roomId, aliceId);
member.name = `Alice`;
const room = mockClient.getRoom(roomId);
const room = mockClient.getRoom(roomId)!;
jest.spyOn(room, "getMember").mockReturnValue(member);
return beacons;
@ -185,7 +185,7 @@ describe("<BeaconListItem />", () => {
const { container } = getComponent({ beacon, onClick });
// click the beacon name
fireEvent.click(container.querySelector(".mx_BeaconStatus_description"));
fireEvent.click(container.querySelector(".mx_BeaconStatus_description")!);
expect(onClick).toHaveBeenCalled();
});
});

View file

@ -47,7 +47,7 @@ describe("<ShareLatestLocation />", () => {
const { container, asFragment } = getComponent();
expect(asFragment()).toMatchSnapshot();
fireEvent.click(container.querySelector(".mx_CopyableText_copyButton"));
fireEvent.click(container.querySelector(".mx_CopyableText_copyButton")!);
await flushPromises();
expect(copyPlaintext).toHaveBeenCalledWith("51,42");

View file

@ -575,7 +575,7 @@ function createMenu(
return mount(
<RoomContext.Provider value={context as IRoomState}>
<MessageContextMenu chevronFace={null} mxEvent={mxEvent} onFinished={jest.fn()} {...props} />
<MessageContextMenu mxEvent={mxEvent} onFinished={jest.fn()} {...props} />
</RoomContext.Provider>,
);
}

View file

@ -32,7 +32,6 @@ describe("AccessSecretStorageDialog", () => {
const defaultProps: ComponentProps<typeof AccessSecretStorageDialog> = {
onFinished: jest.fn(),
checkPrivateKey: jest.fn(),
keyInfo: undefined,
};
const renderComponent = (props = {}): void => {

View file

@ -66,11 +66,11 @@ describe("EventListSummary", function () {
}
const generateMembershipEvent = (
eventId: string,
{ senderId, userId, membership, prevMembership }: MembershipEventParams,
{ senderId, userId, membership, prevMembership }: MembershipEventParams & { userId: string },
): MatrixEvent => {
const member = new RoomMember(roomId, userId);
// Use localpart as display name;
member.name = userId.match(/@([^:]*):/)[1];
member.name = userId.match(/@([^:]*):/)![1];
jest.spyOn(member, "getAvatarUrl").mockReturnValue("avatar.jpeg");
jest.spyOn(member, "getMxcAvatarUrl").mockReturnValue("mxc://avatar.url/image.png");
const e = mkMembership({
@ -89,8 +89,8 @@ describe("EventListSummary", function () {
};
// Generate mock MatrixEvents from the array of parameters
const generateEvents = (parameters: MembershipEventParams[]) => {
const res = [];
const generateEvents = (parameters: Array<MembershipEventParams & { userId: string }>) => {
const res: MatrixEvent[] = [];
for (let i = 0; i < parameters.length; i++) {
res.push(generateMembershipEvent(`event${i}`, parameters[i]));
}
@ -108,7 +108,9 @@ describe("EventListSummary", function () {
events.forEach((e) => {
e.userId = userId;
});
eventsForUsers = eventsForUsers.concat(generateEvents(events));
eventsForUsers = eventsForUsers.concat(
generateEvents(events as Array<MembershipEventParams & { userId: string }>),
);
}
return eventsForUsers;
};

View file

@ -29,7 +29,10 @@ describe("<LearnMore />", () => {
};
const getComponent = (props = {}) => <LearnMore {...defaultProps} {...props} />;
const modalSpy = jest.spyOn(Modal, "createDialog").mockReturnValue(undefined);
const modalSpy = jest.spyOn(Modal, "createDialog").mockReturnValue({
finished: new Promise(() => {}),
close: jest.fn(),
});
beforeEach(() => {
jest.clearAllMocks();

View file

@ -36,7 +36,7 @@ describe("<TooltipTarget />", () => {
// clean up renderer tooltips
const wrapper = document.querySelector(".mx_Tooltip_wrapper");
while (wrapper?.firstChild) {
wrapper.removeChild(wrapper.lastChild);
wrapper.removeChild(wrapper.lastChild!);
}
});

View file

@ -50,10 +50,10 @@ describe("MKeyVerificationConclusion", () => {
}) => {
class MockVerificationRequest extends EventEmitter {
constructor(
public readonly pending: boolean,
public readonly cancelled: boolean,
public readonly done: boolean,
public readonly otherUserId: string,
public readonly pending?: boolean,
public readonly cancelled?: boolean,
public readonly done?: boolean,
public readonly otherUserId?: string,
) {
super();
}

View file

@ -140,7 +140,9 @@ describe("MLocationBody", () => {
});
it("opens map dialog on click", () => {
const modalSpy = jest.spyOn(Modal, "createDialog").mockReturnValue(undefined);
const modalSpy = jest
.spyOn(Modal, "createDialog")
.mockReturnValue({ finished: new Promise(() => {}), close: jest.fn() });
const component = getComponent();
act(() => {

View file

@ -63,7 +63,7 @@ describe("MessageEvent", () => {
event = mkEvent({
event: true,
type: VoiceBroadcastInfoEventType,
user: client.getUserId(),
user: client.getUserId()!,
room: room.roomId,
content: {
state: VoiceBroadcastInfoState.Started,

View file

@ -108,7 +108,7 @@ describe("<PinnedMessagesCard />", () => {
const room = pins.props().room;
const pinListener = mocked(room.currentState).on.mock.calls.find(
([eventName, listener]) => eventName === RoomStateEvent.Events,
)[1];
)![1];
await act(async () => {
// Emit the update

View file

@ -37,7 +37,7 @@ function generateRoomId() {
describe("MemberList", () => {
function createRoom(opts = {}) {
const room = new Room(generateRoomId(), null, client.getUserId());
const room = new Room(generateRoomId(), client, client.getUserId()!);
if (opts) {
Object.assign(room, opts);
}

View file

@ -370,7 +370,7 @@ describe("MessageComposer", () => {
replyToEvent = mkEvent({
event: true,
type: EventType.RoomMessage,
user: cli.getUserId(),
user: cli.getUserId()!,
content: {},
});

View file

@ -377,7 +377,7 @@ describe("RoomHeader (React Testing Library)", () => {
content,
});
room.addLiveEvents([event]);
return { event_id: event.getId() };
return { event_id: event.getId()! };
});
alice = mkRoomMember(room.roomId, "@alice:example.org");

View file

@ -21,7 +21,7 @@ import { Key } from "../../../../src/Keyboard";
import { mockPlatformPeg, unmockPlatformPeg } from "../../../test-utils/platform";
import { KeyboardKey, KeyboardShortcut } from "../../../../src/components/views/settings/KeyboardShortcut";
const renderKeyboardShortcut = (Component: React.FunctionComponentFactory<any>, props: Record<string, any>) => {
const renderKeyboardShortcut = (Component: React.FunctionComponent<any>, props: Record<string, any>) => {
return render(<Component {...props} />).container;
};

View file

@ -30,7 +30,6 @@ describe("<DeviceDetails />", () => {
};
const defaultProps: ComponentProps<typeof DeviceDetails> = {
device: baseDevice,
pusher: null,
isSigningOut: false,
onSignOutDevice: jest.fn(),
saveDeviceName: jest.fn(),

View file

@ -53,7 +53,7 @@ describe("<SelectableDeviceTile />", () => {
const { container } = render(getComponent({ onSelect }));
act(() => {
fireEvent.click(container.querySelector(`#device-tile-checkbox-${device.device_id}`));
fireEvent.click(container.querySelector(`#device-tile-checkbox-${device.device_id}`)!);
});
expect(onSelect).toHaveBeenCalled();

View file

@ -92,7 +92,7 @@ describe("deleteDevices()", () => {
// opened modal
expect(modalSpy).toHaveBeenCalled();
const [, { title, authData, aestheticsForStagePhases }] = modalSpy.mock.calls[0];
const { title, authData, aestheticsForStagePhases } = modalSpy.mock.calls[0][1]!;
// modal opened as expected
expect(title).toEqual("Authentication");

View file

@ -21,7 +21,7 @@ import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo";
import { logger } from "matrix-js-sdk/src/logger";
import { DeviceTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning";
import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest";
import { sleep } from "matrix-js-sdk/src/utils";
import { defer, sleep } from "matrix-js-sdk/src/utils";
import {
ClientEvent,
IMyDevice,
@ -927,12 +927,9 @@ describe("<SessionManagerTab />", () => {
// get a handle for resolving the delete call
// because promise flushing after the confirm modal is resolving this too
// and we want to test the loading state here
let resolveDeleteRequest: (v?: IAuthData) => void;
const resolveDeleteRequest = defer<IAuthData>();
mockClient.deleteMultipleDevices.mockImplementation(() => {
const promise = new Promise<IAuthData>((resolve) => {
resolveDeleteRequest = resolve;
});
return promise;
return resolveDeleteRequest.promise;
});
const { getByTestId } = render(getComponent());
@ -972,7 +969,7 @@ describe("<SessionManagerTab />", () => {
undefined,
);
resolveDeleteRequest?.();
resolveDeleteRequest.resolve({});
});
it("signs out of all other devices from other sessions context menu", async () => {