/* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. 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 from "react"; import { render, cleanup } from "jest-matrix-react"; import { type MatrixClient } from "matrix-js-sdk/src/matrix"; import userEvent from "@testing-library/user-event"; import { MatrixError } from "matrix-js-sdk/src/matrix"; import { type MockedObject } from "jest-mock"; import SpaceCreateMenu from "../../../../../src/components/views/spaces/SpaceCreateMenu"; import { getMockClientWithEventEmitter, mockClientMethodsRooms, mockClientMethodsServer, mockClientMethodsUser, withClientContextRenderOptions, } from "../../../../test-utils"; import { UIFeature } from "../../../../../src/settings/UIFeature"; import SettingsStore from "../../../../../src/settings/SettingsStore"; describe("", () => { let client: MockedObject; beforeEach(() => { client = getMockClientWithEventEmitter({ ...mockClientMethodsUser(), ...mockClientMethodsServer(), ...mockClientMethodsRooms(), createRoom: jest.fn(), getRoomIdForAlias: jest.fn().mockImplementation(async () => { throw new MatrixError({ errcode: "M_NOT_FOUND", error: "Test says no alias found" }, 404); }), }); }); afterEach(() => { cleanup(); jest.restoreAllMocks(); }); it("should render", async () => { const { asFragment } = render( , withClientContextRenderOptions(client), ); expect(asFragment()).toMatchSnapshot(); }); it("should be able to create a public space", async () => { const onFinished = jest.fn(); client.createRoom.mockResolvedValue({ room_id: "!room:id" }); const { getByText, getByLabelText } = render( , withClientContextRenderOptions(client), ); await userEvent.click(getByText("Public")); await userEvent.type(getByLabelText("Name"), "My Name"); await userEvent.type(getByLabelText("Address"), "foobar"); await userEvent.type(getByLabelText("Description"), "A description"); await userEvent.click(getByText("Create")); expect(onFinished).toHaveBeenCalledTimes(1); expect(client.createRoom).toHaveBeenCalledWith({ creation_content: { type: "m.space" }, initial_state: [ { content: { guest_access: "can_join" }, state_key: "", type: "m.room.guest_access" }, { content: { history_visibility: "world_readable" }, type: "m.room.history_visibility" }, ], name: "My Name", power_level_content_override: { events_default: 100, invite: 0, }, preset: "public_chat", room_alias_name: "my-namefoobar", topic: "A description", visibility: "private", }); }); it("should be prompted to automatically create a private space when configured", async () => { const realGetValue = SettingsStore.getValue; jest.spyOn(SettingsStore, "getValue").mockImplementation((name, roomId) => { if (name === UIFeature.AllowCreatingPublicSpaces) { return false; } return realGetValue(name, roomId); }); const onFinished = jest.fn(); client.createRoom.mockResolvedValue({ room_id: "!room:id" }); const { getByText, getByLabelText } = render( , withClientContextRenderOptions(client), ); await userEvent.type(getByLabelText("Name"), "My Name"); await userEvent.type(getByLabelText("Description"), "A description"); await userEvent.click(getByText("Create")); expect(onFinished).toHaveBeenCalledTimes(1); expect(client.createRoom).toHaveBeenCalledWith({ creation_content: { type: "m.space" }, initial_state: [ { content: { guest_access: "can_join" }, state_key: "", type: "m.room.guest_access" }, { content: { history_visibility: "invited" }, type: "m.room.history_visibility" }, ], name: "My Name", power_level_content_override: { events_default: 100, invite: 50, }, room_alias_name: undefined, preset: "private_chat", topic: "A description", visibility: "private", }); }); });