/*
Copyright 2024 New Vector Ltd.
Copyright 2024 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
import React from "react";
import { EventTimeline, MatrixEvent, Room, RoomMember } from "matrix-js-sdk/src/matrix";
import { render, RenderOptions } from "jest-matrix-react";
import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg";
import SettingsStore from "../../../../../src/settings/SettingsStore";
import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext";
import { _t } from "../../../../../src/languageHandler";
import ShareDialog from "../../../../../src/components/views/dialogs/ShareDialog";
import { UIFeature } from "../../../../../src/settings/UIFeature";
import { stubClient } from "../../../../test-utils";
jest.mock("../../../../../src/utils/ShieldUtils");
function getWrapper(): RenderOptions {
    return {
        wrapper: ({ children }) => (
            {children}
        ),
    };
}
describe("ShareDialog", () => {
    let room: Room;
    const ROOM_ID = "!1:example.org";
    beforeEach(async () => {
        stubClient();
        room = new Room(ROOM_ID, MatrixClientPeg.get()!, "@alice:example.org");
    });
    afterEach(() => {
        jest.restoreAllMocks();
    });
    it("renders room share dialog", () => {
        const { container: withoutEvents } = render(, getWrapper());
        expect(withoutEvents).toHaveTextContent(_t("share|title_room"));
        jest.spyOn(room, "getLiveTimeline").mockReturnValue({ getEvents: () => [{} as MatrixEvent] } as EventTimeline);
        const { container: withEvents } = render(, getWrapper());
        expect(withEvents).toHaveTextContent(_t("share|permalink_most_recent"));
    });
    it("renders user share dialog", () => {
        mockRoomMembers(room, 1);
        const { container } = render(
            ,
            getWrapper(),
        );
        expect(container).toHaveTextContent(_t("share|title_user"));
    });
    it("renders link share dialog", () => {
        mockRoomMembers(room, 1);
        const { container } = render(
            ,
            getWrapper(),
        );
        expect(container).toHaveTextContent(_t("share|title_link"));
    });
    it("renders the QR code if configured", () => {
        const originalGetValue = SettingsStore.getValue;
        jest.spyOn(SettingsStore, "getValue").mockImplementation((feature) => {
            if (feature === UIFeature.ShareQRCode) return true;
            return originalGetValue(feature);
        });
        const { container } = render(, getWrapper());
        const qrCodesVisible = container.getElementsByClassName("mx_ShareDialog_qrcode_container").length > 0;
        expect(qrCodesVisible).toBe(true);
    });
    it("renders the social button if configured", () => {
        const originalGetValue = SettingsStore.getValue;
        jest.spyOn(SettingsStore, "getValue").mockImplementation((feature) => {
            if (feature === UIFeature.ShareSocial) return true;
            return originalGetValue(feature);
        });
        const { container } = render(, getWrapper());
        const qrCodesVisible = container.getElementsByClassName("mx_ShareDialog_social_container").length > 0;
        expect(qrCodesVisible).toBe(true);
    });
    it("renders custom title and subtitle", () => {
        const { container } = render(
            ,
            getWrapper(),
        );
        expect(container).toHaveTextContent("test_title_123");
        expect(container).toHaveTextContent("custom_subtitle_1234");
    });
});
/**
 *
 * @param count the number of users to create
 */
function mockRoomMembers(room: Room, count: number) {
    const members = Array(count)
        .fill(0)
        .map((_, index) => new RoomMember(room.roomId, "@alice:example.org"));
    room.currentState.setJoinedMemberCount(members.length);
    room.getJoinedMembers = jest.fn().mockReturnValue(members);
}