diff --git a/test/unit-tests/stores/InitialCryptoSetupStore-test.ts b/test/unit-tests/stores/InitialCryptoSetupStore-test.ts new file mode 100644 index 00000000000..64b81bade22 --- /dev/null +++ b/test/unit-tests/stores/InitialCryptoSetupStore-test.ts @@ -0,0 +1,85 @@ +/* +Copyright 2024 New Vector Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only +Please see LICENSE files in the repository root for full details. +*/ + +import { mocked } from "jest-mock"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { waitFor } from "jest-matrix-react"; + +import { createCrossSigning } from "../../../src/CreateCrossSigning"; +import { InitialCryptoSetupStore } from "../../../src/stores/InitialCryptoSetupStore"; +import { SdkContextClass } from "../../../src/contexts/SDKContext"; +import { createTestClient } from "../../test-utils"; +import { AccountPasswordStore } from "../../../src/stores/AccountPasswordStore"; + +jest.mock("../../../src/CreateCrossSigning", () => ({ + createCrossSigning: jest.fn(), +})); + +describe("InitialCryptoSetupStore", () => { + let testStore: InitialCryptoSetupStore; + let client: MatrixClient; + let stores: SdkContextClass; + + let createCrossSigningResolve: () => void; + let createCrossSigningReject: (e: Error) => void; + + beforeEach(() => { + testStore = new InitialCryptoSetupStore(); + client = createTestClient(); + stores = { + accountPasswordStore: { + getPassword: jest.fn(), + } as unknown as AccountPasswordStore, + } as unknown as SdkContextClass; + + mocked(createCrossSigning).mockImplementation(() => { + return new Promise((resolve, reject) => { + createCrossSigningResolve = resolve; + createCrossSigningReject = reject; + }); + }); + }); + + it("should call createCrossSigning when startInitialCryptoSetup is called", async () => { + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + + await waitFor(() => expect(createCrossSigning).toHaveBeenCalled()); + }); + + it("emits an update event when createCrossSigning resolves", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + createCrossSigningResolve(); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("complete"); + }); + + it("emits an update event when createCrossSigning rejects", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, false, stores, jest.fn()); + createCrossSigningReject(new Error("Test error")); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("error"); + }); + + it("should ignore failures if tokenLogin is true", async () => { + const updateSpy = jest.fn(); + testStore.on("update", updateSpy); + + testStore.startInitialCryptoSetup(client, true, stores, jest.fn()); + createCrossSigningReject(new Error("Test error")); + + await waitFor(() => expect(updateSpy).toHaveBeenCalled()); + expect(testStore.getStatus()).toBe("complete"); + }); +});