mirror of https://github.com/vector-im/riot-web
				
				
				
			
		
			
				
	
	
		
			178 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /*
 | |
|  *
 | |
|  * Copyright 2024 The Matrix.org Foundation C.I.C.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  * /
 | |
|  */
 | |
| 
 | |
| import { expect, test } from ".";
 | |
| import { CommandOrControl } from "../../utils";
 | |
| 
 | |
| test.describe("Threads Activity Centre", () => {
 | |
|     test.use({
 | |
|         displayName: "Alice",
 | |
|         botCreateOpts: { displayName: "Other User" },
 | |
|         labsFlags: ["threadsActivityCentre"],
 | |
|     });
 | |
| 
 | |
|     test("should have the button correctly aligned and displayed in the space panel when expanded", async ({
 | |
|         util,
 | |
|     }) => {
 | |
|         // Open the space panel
 | |
|         await util.expandSpacePanel();
 | |
|         // The buttons in the space panel should be aligned when expanded
 | |
|         await expect(util.getSpacePanel()).toMatchScreenshot("tac-button-expanded.png");
 | |
|     });
 | |
| 
 | |
|     test("should not show indicator when there is no thread", async ({ room1, util }) => {
 | |
|         // No indicator should be shown
 | |
|         await util.assertNoTacIndicator();
 | |
| 
 | |
|         await util.goTo(room1);
 | |
|         await util.receiveMessages(room1, ["Msg1"]);
 | |
| 
 | |
|         // A message in the main timeline should not affect the indicator
 | |
|         await util.assertNoTacIndicator();
 | |
|     });
 | |
| 
 | |
|     test("should show a notification indicator when there is a message in a thread", async ({ room1, util, msg }) => {
 | |
|         await util.goTo(room1);
 | |
|         await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
 | |
| 
 | |
|         // The indicator should be shown
 | |
|         await util.assertNotificationTac();
 | |
|     });
 | |
| 
 | |
|     test("should show a highlight indicator when there is a mention in a thread", async ({ room1, util, msg }) => {
 | |
|         await util.goTo(room1);
 | |
|         await util.receiveMessages(room1, [
 | |
|             "Msg1",
 | |
|             msg.threadedOff("Msg1", {
 | |
|                 "body": "User",
 | |
|                 "format": "org.matrix.custom.html",
 | |
|                 "formatted_body": "<a href='https://matrix.to/#/@user:localhost'>User</a>",
 | |
|                 "m.mentions": {
 | |
|                     user_ids: ["@user:localhost"],
 | |
|                 },
 | |
|             }),
 | |
|         ]);
 | |
| 
 | |
|         // The indicator should be shown
 | |
|         await util.assertHighlightIndicator();
 | |
|     });
 | |
| 
 | |
|     test("should show the rooms with unread threads", async ({ room1, room2, util, msg }) => {
 | |
|         await util.goTo(room2);
 | |
|         await util.populateThreads(room1, room2, msg);
 | |
|         // The indicator should be shown
 | |
|         await util.assertHighlightIndicator();
 | |
| 
 | |
|         // Verify that we have the expected rooms in the TAC
 | |
|         await util.openTac();
 | |
|         await util.assertRoomsInTac([
 | |
|             { room: room2.name, notificationLevel: "highlight" },
 | |
|             { room: room1.name, notificationLevel: "notification" },
 | |
|         ]);
 | |
| 
 | |
|         // Verify that we don't have a visual regression
 | |
|         await expect(util.getTacPanel()).toMatchScreenshot("tac-panel-mix-unread.png");
 | |
|     });
 | |
| 
 | |
|     test("should update with a thread is read", async ({ room1, room2, util, msg }) => {
 | |
|         await util.goTo(room2);
 | |
|         await util.populateThreads(room1, room2, msg);
 | |
| 
 | |
|         // Click on the first room in TAC
 | |
|         await util.openTac();
 | |
|         await util.clickRoomInTac(room2.name);
 | |
| 
 | |
|         // Verify that the thread panel is opened after a click on the room in the TAC
 | |
|         await util.assertThreadPanelIsOpened();
 | |
| 
 | |
|         // Open a thread and mark it as read
 | |
|         // The room 2 doesn't have a mention anymore in its unread, so the highest notification level is notification
 | |
|         await util.openThread("Msg1");
 | |
|         await util.assertNotificationTac();
 | |
|         await util.openTac();
 | |
|         await util.assertRoomsInTac([
 | |
|             { room: room1.name, notificationLevel: "notification" },
 | |
|             { room: room2.name, notificationLevel: "notification" },
 | |
|         ]);
 | |
|         await expect(util.getTacPanel()).toMatchScreenshot("tac-panel-notification-unread.png");
 | |
|     });
 | |
| 
 | |
|     test("should order by recency after notification level", async ({ room1, room2, util, msg }) => {
 | |
|         await util.goTo(room2);
 | |
|         await util.populateThreads(room1, room2, msg, false);
 | |
| 
 | |
|         await util.openTac();
 | |
|         await util.assertRoomsInTac([
 | |
|             { room: room1.name, notificationLevel: "notification" },
 | |
|             { room: room2.name, notificationLevel: "notification" },
 | |
|         ]);
 | |
|     });
 | |
| 
 | |
|     test("should block the Spotlight to open when the TAC is opened", async ({ util, page }) => {
 | |
|         const toggleSpotlight = () => page.keyboard.press(`${CommandOrControl}+k`);
 | |
| 
 | |
|         // Sanity check
 | |
|         // Open and close the spotlight
 | |
|         await toggleSpotlight();
 | |
|         await expect(page.locator(".mx_SpotlightDialog")).toBeVisible();
 | |
|         await toggleSpotlight();
 | |
| 
 | |
|         await util.openTac();
 | |
|         // The spotlight should not be opened
 | |
|         await toggleSpotlight();
 | |
|         await expect(page.locator(".mx_SpotlightDialog")).not.toBeVisible();
 | |
|     });
 | |
| 
 | |
|     test("should have the correct hover state", async ({ util, page }) => {
 | |
|         await util.hoverTacButton();
 | |
|         await expect(util.getSpacePanel()).toMatchScreenshot("tac-hovered.png");
 | |
| 
 | |
|         // Expand the space panel, hover the button and take a screenshot
 | |
|         await util.expandSpacePanel();
 | |
|         await util.hoverTacButton();
 | |
|         await expect(util.getSpacePanel()).toMatchScreenshot("tac-hovered-expanded.png");
 | |
|     });
 | |
| 
 | |
|     test("should mark all threads as read", async ({ room1, room2, util, msg, page }) => {
 | |
|         await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
 | |
| 
 | |
|         await util.assertNotificationTac();
 | |
| 
 | |
|         await util.openTac();
 | |
|         await util.clickRoomInTac(room1.name);
 | |
| 
 | |
|         util.clickMarkAllThreadsRead();
 | |
| 
 | |
|         await util.assertNoTacIndicator();
 | |
|     });
 | |
| 
 | |
|     test("should focus the thread panel close button when clicking an item in the TAC", async ({
 | |
|         room1,
 | |
|         room2,
 | |
|         util,
 | |
|         msg,
 | |
|     }) => {
 | |
|         await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
 | |
| 
 | |
|         await util.openTac();
 | |
|         await util.clickRoomInTac(room1.name);
 | |
| 
 | |
|         await util.assertThreadPanelFocused();
 | |
|     });
 | |
| });
 |