-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test(dev tools): add tests for crypto component
- Loading branch information
1 parent
f77d04b
commit bbaf5e1
Showing
3 changed files
with
385 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
94 changes: 94 additions & 0 deletions
94
test/unit-tests/components/views/dialogs/devtools/Crypto-test.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/* | ||
* Copyright 2025 New Vector 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 from "react"; | ||
import { MatrixClient } from "matrix-js-sdk/src/matrix"; | ||
import { render, screen, waitFor } from "jest-matrix-react"; | ||
import { KeyBackupInfo } from "matrix-js-sdk/src/crypto-api"; | ||
|
||
import { createTestClient, withClientContextRenderOptions } from "../../../../../test-utils"; | ||
import { Crypto } from "../../../../../../src/components/views/dialogs/devtools/Crypto"; | ||
|
||
describe("<Crypto />", () => { | ||
let matrixClient: MatrixClient; | ||
beforeEach(() => { | ||
matrixClient = createTestClient(); | ||
}); | ||
|
||
function renderComponent() { | ||
return render(<Crypto onBack={jest.fn} />, withClientContextRenderOptions(matrixClient)); | ||
} | ||
|
||
it("should display message if crypto is not available", async () => { | ||
jest.spyOn(matrixClient, "getCrypto").mockReturnValue(undefined); | ||
renderComponent(); | ||
expect(screen.getByText("Cryptographic module is not available")).toBeInTheDocument(); | ||
}); | ||
|
||
describe("<KeyStorage />", () => { | ||
it("should display loading spinner while loading", async () => { | ||
jest.spyOn(matrixClient.getCrypto()!, "getKeyBackupInfo").mockImplementation(() => new Promise(() => {})); | ||
renderComponent(); | ||
await waitFor(() => expect(screen.getByLabelText("Loading…")).toBeInTheDocument()); | ||
}); | ||
|
||
it("should display when the key storage data are missing", async () => { | ||
renderComponent(); | ||
await waitFor(() => expect(screen.getByRole("table", { name: "Key Storage" })).toBeInTheDocument()); | ||
expect(screen.getByRole("table", { name: "Key Storage" })).toMatchSnapshot(); | ||
}); | ||
|
||
it("should display when the key storage data are available", async () => { | ||
jest.spyOn(matrixClient.getCrypto()!, "getKeyBackupInfo").mockResolvedValue({ | ||
algorithm: "m.megolm_backup.v1", | ||
version: "1", | ||
} as unknown as KeyBackupInfo); | ||
jest.spyOn(matrixClient, "isKeyBackupKeyStored").mockResolvedValue({}); | ||
jest.spyOn(matrixClient.getCrypto()!, "getSessionBackupPrivateKey").mockResolvedValue(new Uint8Array(32)); | ||
jest.spyOn(matrixClient.getCrypto()!, "getActiveSessionBackupVersion").mockResolvedValue("2"); | ||
jest.spyOn(matrixClient.secretStorage, "hasKey").mockResolvedValue(true); | ||
jest.spyOn(matrixClient.getCrypto()!, "isSecretStorageReady").mockResolvedValue(true); | ||
|
||
renderComponent(); | ||
await waitFor(() => expect(screen.getByRole("table", { name: "Key Storage" })).toBeInTheDocument()); | ||
expect(screen.getByRole("table", { name: "Key Storage" })).toMatchSnapshot(); | ||
}); | ||
}); | ||
|
||
describe("<CrossSigning />", () => { | ||
it("should display loading spinner while loading", async () => { | ||
jest.spyOn(matrixClient.getCrypto()!, "getCrossSigningStatus").mockImplementation( | ||
() => new Promise(() => {}), | ||
); | ||
renderComponent(); | ||
await waitFor(() => expect(screen.getByLabelText("Loading…")).toBeInTheDocument()); | ||
}); | ||
|
||
it("should display when the cross-signing data are missing", async () => { | ||
renderComponent(); | ||
await waitFor(() => expect(screen.getByRole("table", { name: "Cross-signing" })).toBeInTheDocument()); | ||
expect(screen.getByRole("table", { name: "Cross-signing" })).toMatchSnapshot(); | ||
}); | ||
|
||
it("should display when the cross-signing data are available", async () => { | ||
jest.spyOn(matrixClient.getCrypto()!, "getCrossSigningStatus").mockResolvedValue({ | ||
publicKeysOnDevice: true, | ||
privateKeysInSecretStorage: true, | ||
privateKeysCachedLocally: { | ||
masterKey: true, | ||
selfSigningKey: true, | ||
userSigningKey: true, | ||
}, | ||
}); | ||
jest.spyOn(matrixClient.getCrypto()!, "isCrossSigningReady").mockResolvedValue(true); | ||
|
||
renderComponent(); | ||
await waitFor(() => expect(screen.getByRole("table", { name: "Cross-signing" })).toBeInTheDocument()); | ||
expect(screen.getByRole("table", { name: "Cross-signing" })).toMatchSnapshot(); | ||
}); | ||
}); | ||
}); |
289 changes: 289 additions & 0 deletions
289
test/unit-tests/components/views/dialogs/devtools/__snapshots__/Crypto-test.tsx.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,289 @@ | ||
// Jest Snapshot v1, https://goo.gl/fbAQLP | ||
|
||
exports[`<Crypto /> <CrossSigning /> should display when the cross-signing data are available 1`] = ` | ||
<table | ||
aria-label="Cross-signing" | ||
> | ||
<thead> | ||
Cross-signing | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing status: | ||
</th> | ||
<td> | ||
Cross-signing is ready for use. | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing public keys: | ||
</th> | ||
<td> | ||
in memory | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing private keys: | ||
</th> | ||
<td> | ||
in secret storage | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Master private key: | ||
</th> | ||
<td> | ||
cached locally | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Self signing private key: | ||
</th> | ||
<td> | ||
cached locally | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
User signing private key: | ||
</th> | ||
<td> | ||
cached locally | ||
</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
`; | ||
|
||
exports[`<Crypto /> <CrossSigning /> should display when the cross-signing data are missing 1`] = ` | ||
<table | ||
aria-label="Cross-signing" | ||
> | ||
<thead> | ||
Cross-signing | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing status: | ||
</th> | ||
<td> | ||
Cross-signing is not set up. | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing public keys: | ||
</th> | ||
<td> | ||
not found | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Cross-signing private keys: | ||
</th> | ||
<td> | ||
not found in storage | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Master private key: | ||
</th> | ||
<td> | ||
not found locally | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Self signing private key: | ||
</th> | ||
<td> | ||
not found locally | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
User signing private key: | ||
</th> | ||
<td> | ||
not found locally | ||
</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
`; | ||
|
||
exports[`<Crypto /> <KeyStorage /> should display when the key storage data are available 1`] = ` | ||
<table | ||
aria-label="Key Storage" | ||
> | ||
<thead> | ||
Key Storage | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Latest backup version on server: | ||
</th> | ||
<td> | ||
1 (Algorithm: m.megolm_backup.v1) | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Backup key stored: | ||
</th> | ||
<td> | ||
in secret storage | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Active backup version: | ||
</th> | ||
<td> | ||
2 | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Backup key cached: | ||
</th> | ||
<td> | ||
cached locally, well formed | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Secret storage public key: | ||
</th> | ||
<td> | ||
in account data | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Secret storage: | ||
</th> | ||
<td> | ||
ready | ||
</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
`; | ||
|
||
exports[`<Crypto /> <KeyStorage /> should display when the key storage data are missing 1`] = ` | ||
<table | ||
aria-label="Key Storage" | ||
> | ||
<thead> | ||
Key Storage | ||
</thead> | ||
<tbody> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Latest backup version on server: | ||
</th> | ||
<td> | ||
Your keys are not being backed up from this session. | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Backup key stored: | ||
</th> | ||
<td> | ||
not stored | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Active backup version: | ||
</th> | ||
<td> | ||
None | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Backup key cached: | ||
</th> | ||
<td> | ||
not found locally, unexpected type | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Secret storage public key: | ||
</th> | ||
<td> | ||
not found | ||
</td> | ||
</tr> | ||
<tr> | ||
<th | ||
scope="row" | ||
> | ||
Secret storage: | ||
</th> | ||
<td> | ||
not ready | ||
</td> | ||
</tr> | ||
</tbody> | ||
</table> | ||
`; |