Files
element-web/apps/web/test/unit-tests/components/views/dialogs/invite/UnknownIdentityUsersWarningDialog-test.tsx
Richard van der Hoff cd515444a8 Confirm before inviting unknown users to a DM/room (#33171)
* InviteDialog: factor out startDmOrSendInvites

Factor out the logic of calling `startDm` or `inviteUsers` to a helper
function. We're going to need to call this from a second location soon, so this
is useful groundwork.

* Add `UnknownIdentityUsersWarningDialog`

* Add unit tests

* Update playwright tests

* Convert if/else to switch statement

* Convert helper functions to React components

* Factor out "onRemove" callback

* Add clarifying comment
2026-04-22 20:05:31 +00:00

105 lines
3.8 KiB
TypeScript

/*
Copyright 2026 Element Creations Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import React, { type ComponentProps } from "react";
import { render, type RenderResult } from "jest-matrix-react";
import { getAllByRole, getAllByText, getByText } from "@testing-library/dom";
import UnknownIdentityUsersWarningDialog from "../../../../../../src/components/views/dialogs/invite/UnknownIdentityUsersWarningDialog.tsx";
import { InviteKind } from "../../../../../../src/components/views/dialogs/InviteDialogTypes.ts";
import { DirectoryMember, ThreepidMember } from "../../../../../../src/utils/direct-messages.ts";
import { getMockClientWithEventEmitter, mockClientMethodsUser } from "../../../../../test-utils";
describe("UnknownIdentityUsersWarningDialog", () => {
beforeEach(() => {
getMockClientWithEventEmitter({
...mockClientMethodsUser(),
});
});
afterEach(() => {
jest.restoreAllMocks();
});
it("should show entries for each user", () => {
const result = renderComponent({
users: [
new DirectoryMember({ user_id: "@alice:example.com" }),
new DirectoryMember({
user_id: "@bob:example.net",
display_name: "Bob",
avatar_url: "mxc://example.com/abc",
}),
new ThreepidMember("charlie@example.com"),
],
});
const list = result.getByTestId("userlist");
const entries = getAllByRole(list, "option");
expect(entries).toHaveLength(3);
// No displayname so mxid is displayed twice
expect(getAllByText(entries[0], "@alice:example.com")).toHaveLength(2);
getByText(entries[1], "Bob");
getByText(entries[2], "charlie@example.com");
});
describe("in DM mode", () => {
const kind = InviteKind.Dm;
it("shows a 'Continue' button", () => {
const onContinue = jest.fn();
const result = renderComponent({ kind, onContinue });
const continueButton = result.getByRole("button", { name: "Continue" });
continueButton.click();
expect(onContinue).toHaveBeenCalled();
});
it("shows a 'Cancel' button", () => {
const onCancel = jest.fn();
const result = renderComponent({ kind, onCancel });
const cancelButton = result.getByRole("button", { name: "Cancel" });
cancelButton.click();
expect(onCancel).toHaveBeenCalled();
});
});
describe("in Invite mode", () => {
const kind = InviteKind.Invite;
it("shows an 'Invite' button", () => {
const onContinue = jest.fn();
const result = renderComponent({ kind, onContinue });
const continueButton = result.getByRole("button", { name: "Invite" });
continueButton.click();
expect(onContinue).toHaveBeenCalled();
});
it("shows a 'Remove' button", () => {
const onRemove = jest.fn();
const result = renderComponent({ kind, onRemove });
const removeButton = result.getByRole("button", { name: "Remove" });
removeButton.click();
expect(onRemove).toHaveBeenCalled();
});
});
});
function renderComponent(props: Partial<ComponentProps<typeof UnknownIdentityUsersWarningDialog>>): RenderResult {
const props1: ComponentProps<typeof UnknownIdentityUsersWarningDialog> = {
onContinue: () => {},
onCancel: () => {},
onRemove: () => {},
screenName: undefined,
kind: InviteKind.Dm,
users: [],
...props,
};
return render(<UnknownIdentityUsersWarningDialog {...props1} />);
}