/* Copyright 2024 New Vector Ltd. Copyright 2023 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 { render, RenderResult, screen } from "jest-matrix-react"; import userEvent from "@testing-library/user-event"; import { mocked, Mocked } from "jest-mock"; import { IMyDevice, MatrixClient } from "matrix-js-sdk/src/matrix"; import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; import { CryptoApi, DeviceVerificationStatus } from "matrix-js-sdk/src/crypto-api"; import dis from "../../src/dispatcher/dispatcher"; import { showToast } from "../../src/toasts/UnverifiedSessionToast"; import { filterConsole, flushPromises, stubClient } from "../test-utils"; import ToastContainer from "../../src/components/structures/ToastContainer"; import { Action } from "../../src/dispatcher/actions"; import DeviceListener from "../../src/DeviceListener"; describe("UnverifiedSessionToast", () => { const otherDevice: IMyDevice = { device_id: "ABC123", }; const otherDeviceInfo = new DeviceInfo(otherDevice.device_id); let client: Mocked; let renderResult: RenderResult; filterConsole("Dismissing unverified sessions: ABC123"); beforeAll(() => { client = mocked(stubClient()); client.getDevice.mockImplementation(async (deviceId: string) => { if (deviceId === otherDevice.device_id) { return otherDevice; } throw new Error(`Unknown device ${deviceId}`); }); client.getStoredDevice.mockImplementation((userId: string, deviceId: string) => { if (deviceId === otherDevice.device_id) { return otherDeviceInfo; } return null; }); client.getCrypto.mockReturnValue({ getDeviceVerificationStatus: jest .fn() .mockResolvedValue(new DeviceVerificationStatus({ crossSigningVerified: true })), } as unknown as CryptoApi); jest.spyOn(dis, "dispatch"); jest.spyOn(DeviceListener.sharedInstance(), "dismissUnverifiedSessions"); }); beforeEach(() => { renderResult = render(); }); describe("when rendering the toast", () => { beforeEach(async () => { showToast(otherDevice.device_id); await flushPromises(); }); const itShouldDismissTheDevice = () => { it("should dismiss the device", () => { expect(DeviceListener.sharedInstance().dismissUnverifiedSessions).toHaveBeenCalledWith([ otherDevice.device_id, ]); }); }; it("should render as expected", () => { expect(renderResult.baseElement).toMatchSnapshot(); }); describe("and confirming the login", () => { beforeEach(async () => { await userEvent.click(screen.getByRole("button", { name: "Yes, it was me" })); }); itShouldDismissTheDevice(); }); describe("and dismissing the login", () => { beforeEach(async () => { await userEvent.click(screen.getByRole("button", { name: "No" })); }); itShouldDismissTheDevice(); it("should show the device settings", () => { expect(dis.dispatch).toHaveBeenCalledWith({ action: Action.ViewUserDeviceSettings, }); }); }); }); });