234 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /*
 | |
|  * 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 { Locator, Page } from "@playwright/test";
 | |
| 
 | |
| import { ElementAppPage } from "../../../pages/ElementAppPage";
 | |
| import { test as base, expect } from "../../../element-web-test";
 | |
| import { SettingLevel } from "../../../../src/settings/SettingLevel";
 | |
| import { Layout } from "../../../../src/settings/enums/Layout";
 | |
| 
 | |
| export { expect };
 | |
| 
 | |
| /**
 | |
|  * Set up for the appearance tab test
 | |
|  */
 | |
| export const test = base.extend<{
 | |
|     util: Helpers;
 | |
| }>({
 | |
|     util: async ({ page, app }, use) => {
 | |
|         await use(new Helpers(page, app));
 | |
|     },
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * A collection of helper functions for the appearance tab test
 | |
|  * The goal is to make easier to get and interact with the button, input, or other elements of the appearance tab
 | |
|  */
 | |
| class Helpers {
 | |
|     private CUSTOM_THEME_URL = "http://custom.theme";
 | |
|     private CUSTOM_THEME = {
 | |
|         name: "Custom theme",
 | |
|         isDark: false,
 | |
|         colors: {},
 | |
|     };
 | |
| 
 | |
|     constructor(
 | |
|         private page: Page,
 | |
|         private app: ElementAppPage,
 | |
|     ) {}
 | |
| 
 | |
|     /**
 | |
|      * Open the appearance tab
 | |
|      */
 | |
|     openAppearanceTab() {
 | |
|         return this.app.settings.openUserSettings("Appearance");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Compare screenshot and hide the matrix chat
 | |
|      * @param locator
 | |
|      * @param screenshot
 | |
|      */
 | |
|     assertScreenshot(locator: Locator, screenshot: `${string}.png`) {
 | |
|         return expect(locator).toMatchScreenshot(screenshot, {
 | |
|             css: `
 | |
|                    #matrixchat {
 | |
|                         display: none;
 | |
|                     }
 | |
|                 `,
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     // Theme Panel
 | |
| 
 | |
|     /**
 | |
|      * Disable in the settings the system theme
 | |
|      */
 | |
|     disableSystemTheme() {
 | |
|         return this.app.settings.setValue("use_system_theme", null, SettingLevel.DEVICE, false);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the theme section
 | |
|      */
 | |
|     getThemePanel() {
 | |
|         return this.page.getByTestId("themePanel");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the system theme toggle
 | |
|      */
 | |
|     getMatchSystemThemeCheckbox() {
 | |
|         return this.getThemePanel().getByRole("checkbox", { name: "Match system theme" });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the theme radio button
 | |
|      * @param theme - the theme to select
 | |
|      * @private
 | |
|      */
 | |
|     private getThemeRadio(theme: string) {
 | |
|         return this.getThemePanel().getByRole("radio", { name: theme });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the light theme radio button
 | |
|      */
 | |
|     getLightTheme() {
 | |
|         return this.getThemeRadio("Light");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the dark theme radio button
 | |
|      */
 | |
|     getDarkTheme() {
 | |
|         return this.getThemeRadio("Dark");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the custom theme radio button
 | |
|      */
 | |
|     getCustomTheme() {
 | |
|         return this.getThemeRadio(this.CUSTOM_THEME.name);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the high contrast theme radio button
 | |
|      */
 | |
|     getHighContrastTheme() {
 | |
|         return this.getThemeRadio("High contrast");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Add a custom theme
 | |
|      * Mock the request to the custom and return a fake local custom theme
 | |
|      */
 | |
|     async addCustomTheme() {
 | |
|         await this.page.route(this.CUSTOM_THEME_URL, (route) =>
 | |
|             route.fulfill({ body: JSON.stringify(this.CUSTOM_THEME) }),
 | |
|         );
 | |
|         await this.page.getByRole("textbox", { name: "Add custom theme" }).fill(this.CUSTOM_THEME_URL);
 | |
|         await this.page.getByRole("button", { name: "Add custom theme" }).click();
 | |
|         await this.page.unroute(this.CUSTOM_THEME_URL);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Remove the custom theme
 | |
|      */
 | |
|     removeCustomTheme() {
 | |
|         return this.getThemePanel().getByRole("listitem", { name: this.CUSTOM_THEME.name }).getByRole("button").click();
 | |
|     }
 | |
| 
 | |
|     // Message layout Panel
 | |
| 
 | |
|     /**
 | |
|      * Create and display a room named Test Room
 | |
|      */
 | |
|     async createAndDisplayRoom() {
 | |
|         await this.app.client.createRoom({ name: "Test Room" });
 | |
|         await this.app.viewRoomByName("Test Room");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Assert the room layout
 | |
|      * @param layout
 | |
|      * @private
 | |
|      */
 | |
|     private assertRoomLayout(layout: Layout) {
 | |
|         return expect(this.page.locator(`.mx_RoomView_body[data-layout=${layout}]`)).toBeVisible();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Assert the room layout is modern
 | |
|      */
 | |
|     assertModernLayout() {
 | |
|         return this.assertRoomLayout(Layout.Group);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Assert the room layout is bubble
 | |
|      */
 | |
|     assertBubbleLayout() {
 | |
|         return this.assertRoomLayout(Layout.Bubble);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the layout panel
 | |
|      */
 | |
|     getMessageLayoutPanel() {
 | |
|         return this.page.getByTestId("layoutPanel");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the layout radio button
 | |
|      * @param layoutName
 | |
|      * @private
 | |
|      */
 | |
|     private getLayout(layoutName: string) {
 | |
|         return this.getMessageLayoutPanel().getByRole("radio", { name: layoutName });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the message bubbles layout radio button
 | |
|      */
 | |
|     getBubbleLayout() {
 | |
|         return this.getLayout("Message bubbles");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the modern layout radio button
 | |
|      */
 | |
|     getModernLayout() {
 | |
|         return this.getLayout("Modern");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the IRC layout radio button
 | |
|      */
 | |
|     getIRCLayout() {
 | |
|         return this.getLayout("IRC (experimental)");
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return the compact layout checkbox
 | |
|      */
 | |
|     getCompactLayoutCheckbox() {
 | |
|         return this.getMessageLayoutPanel().getByRole("checkbox", { name: "Show compact text and messages" });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Assert the compact layout is enabled
 | |
|      */
 | |
|     assertCompactLayout() {
 | |
|         return expect(
 | |
|             this.page.locator("#matrixchat .mx_MatrixChat_wrapper.mx_MatrixChat_useCompactLayout"),
 | |
|         ).toBeVisible();
 | |
|     }
 | |
| }
 |