98 lines
3.1 KiB
TypeScript
98 lines
3.1 KiB
TypeScript
/*
|
|
* Copyright 2024 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 { Page } from "@playwright/test";
|
|
import { GeneratedSecretStorageKey } from "matrix-js-sdk/src/crypto-api";
|
|
|
|
import { ElementAppPage } from "../../../pages/ElementAppPage";
|
|
import { test as base, expect } from "../../../element-web-test";
|
|
export { expect };
|
|
|
|
/**
|
|
* Set up for the encryption tab test
|
|
*/
|
|
export const test = base.extend<{
|
|
util: Helpers;
|
|
}>({
|
|
util: async ({ page, app, bot }, use) => {
|
|
await use(new Helpers(page, app));
|
|
},
|
|
});
|
|
|
|
class Helpers {
|
|
constructor(
|
|
private page: Page,
|
|
private app: ElementAppPage,
|
|
) {}
|
|
|
|
/**
|
|
* Open the encryption tab
|
|
*/
|
|
openEncryptionTab() {
|
|
return this.app.settings.openUserSettings("Encryption");
|
|
}
|
|
|
|
/**
|
|
* Go through the device verification flow using the recovery key.
|
|
*/
|
|
async verifyDevice(recoveryKey: GeneratedSecretStorageKey) {
|
|
// Select the security phrase
|
|
await this.page.getByRole("button", { name: "Verify with Security Key or Phrase" }).click();
|
|
await this.enterRecoveryKey(recoveryKey);
|
|
await this.page.getByRole("button", { name: "Done" }).click();
|
|
}
|
|
|
|
/**
|
|
* Fill the recovery key in the dialog
|
|
* @param recoveryKey
|
|
*/
|
|
async enterRecoveryKey(recoveryKey: GeneratedSecretStorageKey) {
|
|
// Select to use recovery key
|
|
await this.page.getByRole("button", { name: "use your Security Key" }).click();
|
|
|
|
// Fill the recovery key
|
|
const dialog = this.page.locator(".mx_Dialog");
|
|
await dialog.getByRole("textbox").fill(recoveryKey.encodedPrivateKey);
|
|
await dialog.getByRole("button", { name: "Continue" }).click();
|
|
}
|
|
|
|
/**
|
|
* Get the encryption tab content
|
|
*/
|
|
getEncryptionTabContent() {
|
|
return this.page.getByTestId("encryptionTab");
|
|
}
|
|
|
|
/**
|
|
* Delete the key backup for the given version
|
|
* @param backupVersion
|
|
*/
|
|
async deleteKeyBackup(backupVersion: string) {
|
|
const client = await this.app.client.prepareClient();
|
|
await client.evaluate(async (client, backupVersion) => {
|
|
await client.getCrypto()?.deleteKeyBackupVersion(backupVersion);
|
|
}, backupVersion);
|
|
}
|
|
|
|
/**
|
|
* Get the security key from the clipboard and fill in the input field
|
|
* Then click on the finish button
|
|
* @param screenshot
|
|
*/
|
|
async confirmRecoveryKey(screenshot: `${string}.png`) {
|
|
const dialog = this.getEncryptionTabContent();
|
|
await expect(dialog.getByText("Enter your recovery key to confirm")).toBeVisible();
|
|
await expect(dialog).toMatchScreenshot(screenshot);
|
|
|
|
const handle = await this.page.evaluateHandle(() => navigator.clipboard.readText());
|
|
const clipboardContent = await handle.jsonValue();
|
|
await dialog.getByRole("textbox").fill(clipboardContent);
|
|
await dialog.getByRole("button", { name: "Finish set up" }).click();
|
|
await expect(dialog).toMatchScreenshot("default-recovery.png");
|
|
}
|
|
}
|