From eb6101cc1bd0366e2b48c45d72d8a21a298cc162 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 4 Dec 2023 11:56:48 +0000 Subject: [PATCH] Migrate spaces.spec.ts from Cypress to Playwright (#11986) * Remove old percy media query CSS Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Stabilise soft_logout.spec.ts Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update screenshots using `toMatchScreenshot` assertion with CSS overrides Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix accidentally commented test Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Migrate spaces.spec.ts from Cypress to Playwright Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Add screenshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- cypress/e2e/spaces/spaces.spec.ts | 347 ------------------ cypress/support/views.ts | 33 -- playwright.config.ts | 1 + playwright/e2e/spaces/spaces.spec.ts | 296 +++++++++++++++ playwright/pages/ElementAppPage.ts | 14 + playwright/pages/client.ts | 13 + .../invite-teammates-dialog-linux.png | Bin 0 -> 22311 bytes .../space-create-menu-linux.png | Bin 0 -> 25206 bytes .../space-panel-collapsed-linux.png | Bin 0 -> 6022 bytes .../space-panel-expanded-linux.png | Bin 0 -> 20354 bytes 10 files changed, 324 insertions(+), 380 deletions(-) delete mode 100644 cypress/e2e/spaces/spaces.spec.ts create mode 100644 playwright/e2e/spaces/spaces.spec.ts create mode 100644 playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png create mode 100644 playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png create mode 100644 playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png create mode 100644 playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png diff --git a/cypress/e2e/spaces/spaces.spec.ts b/cypress/e2e/spaces/spaces.spec.ts deleted file mode 100644 index 6f59e74401..0000000000 --- a/cypress/e2e/spaces/spaces.spec.ts +++ /dev/null @@ -1,347 +0,0 @@ -/* -Copyright 2022 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 type { MatrixClient, Preset, ICreateRoomOpts } from "matrix-js-sdk/src/matrix"; -import { HomeserverInstance } from "../../plugins/utils/homeserver"; -import Chainable = Cypress.Chainable; -import { UserCredentials } from "../../support/login"; - -function openSpaceCreateMenu(): Chainable { - cy.findByRole("button", { name: "Create a space" }).click(); - return cy.get(".mx_SpaceCreateMenu_wrapper .mx_ContextualMenu"); -} - -function openSpaceContextMenu(spaceName: string): Chainable { - cy.getSpacePanelButton(spaceName).rightclick(); - return cy.get(".mx_SpacePanel_contextMenu"); -} - -function spaceCreateOptions(spaceName: string, roomIds: string[] = []): ICreateRoomOpts { - return { - creation_content: { - type: "m.space", - }, - initial_state: [ - { - type: "m.room.name", - content: { - name: spaceName, - }, - }, - ...roomIds.map(spaceChildInitialState), - ], - }; -} - -function spaceChildInitialState(roomId: string): ICreateRoomOpts["initial_state"]["0"] { - return { - type: "m.space.child", - state_key: roomId, - content: { - via: [roomId.split(":")[1]], - }, - }; -} - -describe("Spaces", () => { - let homeserver: HomeserverInstance; - let user: UserCredentials; - - beforeEach(() => { - cy.startHomeserver("default").then((data) => { - homeserver = data; - - cy.initTestUser(homeserver, "Sue").then((_user) => { - user = _user; - cy.mockClipboard(); - }); - }); - }); - - afterEach(() => { - cy.stopHomeserver(homeserver); - }); - - it("should allow user to create public space", () => { - openSpaceCreateMenu(); - cy.get("#mx_ContextualMenu_Container").percySnapshotElement("Space create menu"); - cy.get(".mx_SpaceCreateMenu_wrapper .mx_ContextualMenu").within(() => { - // Regex pattern due to strings of "mx_SpaceCreateMenuType_public" - cy.findByRole("button", { name: /Public/ }).click(); - - cy.get('.mx_SpaceBasicSettings_avatarContainer input[type="file"]').selectFile( - "cypress/fixtures/riot.png", - { force: true }, - ); - cy.findByRole("textbox", { name: "Name" }).type("Let's have a Riot"); - cy.findByRole("textbox", { name: "Address" }).should("have.value", "lets-have-a-riot"); - cy.findByRole("textbox", { name: "Description" }).type("This is a space to reminisce Riot.im!"); - cy.findByRole("button", { name: "Create" }).click(); - }); - - // Create the default General & Random rooms, as well as a custom "Jokes" room - cy.findByPlaceholderText("General").should("exist"); - cy.findByPlaceholderText("Random").should("exist"); - cy.findByPlaceholderText("Support").type("Jokes"); - cy.findByRole("button", { name: "Continue" }).click(); - - // Copy matrix.to link - // Regex pattern due to strings of "mx_SpacePublicShare_shareButton" - cy.findByRole("button", { name: /Share invite link/ }).realClick(); - cy.getClipboardText().should("eq", "https://matrix.to/#/#lets-have-a-riot:localhost"); - - // Go to space home - cy.findByRole("button", { name: "Go to my first room" }).click(); - - // Assert rooms exist in the room list - cy.findByRole("treeitem", { name: "General" }).should("exist"); - cy.findByRole("treeitem", { name: "Random" }).should("exist"); - cy.findByRole("treeitem", { name: "Jokes" }).should("exist"); - }); - - it("should allow user to create private space", () => { - openSpaceCreateMenu().within(() => { - // Regex pattern due to strings of "mx_SpaceCreateMenuType_private" - cy.findByRole("button", { name: /Private/ }).click(); - - cy.get('.mx_SpaceBasicSettings_avatarContainer input[type="file"]').selectFile( - "cypress/fixtures/riot.png", - { force: true }, - ); - cy.findByRole("textbox", { name: "Name" }).type("This is not a Riot"); - cy.findByRole("textbox", { name: "Address" }).should("not.exist"); - cy.findByRole("textbox", { name: "Description" }).type("This is a private space of mourning Riot.im..."); - cy.findByRole("button", { name: "Create" }).click(); - }); - - // Regex pattern due to strings of "mx_SpaceRoomView_privateScope_meAndMyTeammatesButton" - cy.findByRole("button", { name: /Me and my teammates/ }).click(); - - // Create the default General & Random rooms, as well as a custom "Projects" room - cy.findByPlaceholderText("General").should("exist"); - cy.findByPlaceholderText("Random").should("exist"); - cy.findByPlaceholderText("Support").type("Projects"); - cy.findByRole("button", { name: "Continue" }).click(); - - cy.get(".mx_SpaceRoomView h1").findByText("Invite your teammates"); - cy.get(".mx_SpaceRoomView").percySnapshotElement("Space - 'Invite your teammates' dialog"); - cy.findByRole("button", { name: "Skip for now" }).click(); - - // Assert rooms exist in the room list - cy.findByRole("treeitem", { name: "General" }).should("exist"); - cy.findByRole("treeitem", { name: "Random" }).should("exist"); - cy.findByRole("treeitem", { name: "Projects" }).should("exist"); - - // Assert rooms exist in the space explorer - cy.contains(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", "General").should("exist"); - cy.contains(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", "Random").should("exist"); - cy.contains(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", "Projects").should("exist"); - }); - - it("should allow user to create just-me space", () => { - cy.createRoom({ - name: "Sample Room", - }); - - openSpaceCreateMenu().within(() => { - // Regex pattern due to strings of "mx_SpaceCreateMenuType_private" - cy.findByRole("button", { name: /Private/ }).click(); - - cy.get('.mx_SpaceBasicSettings_avatarContainer input[type="file"]').selectFile( - "cypress/fixtures/riot.png", - { force: true }, - ); - cy.findByRole("textbox", { name: "Address" }).should("not.exist"); - cy.findByRole("textbox", { name: "Description" }).type("This is a personal space to mourn Riot.im..."); - cy.findByRole("textbox", { name: "Name" }).type("This is my Riot{enter}"); - }); - - // Regex pattern due to of strings of "mx_SpaceRoomView_privateScope_justMeButton" - cy.findByRole("button", { name: /Just me/ }).click(); - - cy.findByText("Sample Room").click({ force: true }); // force click as checkbox size is zero - - // Temporal implementation as multiple elements with the role "button" and name "Add" are found - cy.get(".mx_AddExistingToSpace_footer").within(() => { - cy.findByRole("button", { name: "Add" }).click(); - }); - - cy.get(".mx_SpaceHierarchy_list").within(() => { - // Regex pattern due to the strings of "mx_SpaceHierarchy_roomTile_joined" - cy.findByRole("treeitem", { name: /Sample Room/ }).should("exist"); - }); - }); - - it("should allow user to invite another to a space", () => { - let bot: MatrixClient; - cy.getBot(homeserver, { displayName: "BotBob" }).then((_bot) => { - bot = _bot; - }); - - cy.createSpace({ - visibility: "public" as any, - room_alias_name: "space", - }).as("spaceId"); - - openSpaceContextMenu("#space:localhost").within(() => { - cy.findByRole("menuitem", { name: "Invite" }).click(); - }); - - cy.get(".mx_SpacePublicShare").within(() => { - // Copy link first - // Regex pattern due to strings of "mx_SpacePublicShare_shareButton" - cy.findByRole("button", { name: /Share invite link/ }) - .focus() - .realClick(); - cy.getClipboardText().should("eq", "https://matrix.to/#/#space:localhost"); - // Start Matrix invite flow - // Regex pattern due to strings of "mx_SpacePublicShare_inviteButton" - cy.findByRole("button", { name: /Invite people/ }).click(); - }); - - cy.get(".mx_InviteDialog_other").within(() => { - cy.findByRole("textbox").type(bot.getUserId()); - cy.findByRole("button", { name: "Invite" }).click(); - }); - - cy.get(".mx_InviteDialog_other").should("not.exist"); - }); - - it("should show space invites at the top of the space panel", () => { - cy.createSpace({ - name: "My Space", - }); - cy.getSpacePanelButton("My Space").should("exist"); - - cy.getBot(homeserver, { displayName: "BotBob" }).then({ timeout: 10000 }, async (bot) => { - const { room_id: roomId } = await bot.createRoom(spaceCreateOptions("Space Space")); - await bot.invite(roomId, user.userId); - }); - // Assert that `Space Space` is above `My Space` due to it being an invite - cy.getSpacePanelButton("Space Space") - .should("exist") - .parent() - .next() - .findByRole("button", { name: "My Space" }) - .should("exist"); - }); - - it("should include rooms in space home", () => { - cy.createRoom({ - name: "Music", - }).as("roomId1"); - cy.createRoom({ - name: "Gaming", - }).as("roomId2"); - - const spaceName = "Spacey Mc. Space Space"; - cy.all([cy.get("@roomId1"), cy.get("@roomId2")]).then(([roomId1, roomId2]) => { - cy.createSpace({ - name: spaceName, - initial_state: [spaceChildInitialState(roomId1), spaceChildInitialState(roomId2)], - }).as("spaceId"); - }); - - cy.get("@spaceId").then(() => { - cy.viewSpaceHomeByName(spaceName); - }); - cy.get(".mx_SpaceRoomView .mx_SpaceHierarchy_list").within(() => { - // Regex pattern due to strings in "mx_SpaceHierarchy_roomTile_name" - cy.findByRole("treeitem", { name: /Music/ }).findByRole("button").should("exist"); - cy.findByRole("treeitem", { name: /Gaming/ }) - .findByRole("button") - .should("exist"); - }); - }); - - it("should render subspaces in the space panel only when expanded", () => { - cy.injectAxe(); - - cy.createSpace({ - name: "Child Space", - initial_state: [], - }).then((spaceId) => { - cy.createSpace({ - name: "Root Space", - initial_state: [spaceChildInitialState(spaceId)], - }).as("spaceId"); - }); - - // Find collapsed Space panel - cy.findByRole("tree", { name: "Spaces" }).within(() => { - cy.findByRole("button", { name: "Root Space" }).should("exist"); - cy.findByRole("button", { name: "Child Space" }).should("not.exist"); - }); - - const axeOptions = { - rules: { - // Disable this check as it triggers on nested roving tab index elements which are in practice fine - "nested-interactive": { - enabled: false, - }, - // Disable this check as it wrongly triggers on the room list container which has - // roving tab index elements with automatic scrolling - "scrollable-region-focusable": { - enabled: false, - }, - }, - }; - cy.checkA11y(undefined, axeOptions); - cy.get(".mx_SpacePanel").percySnapshotElement("Space panel collapsed", { widths: [68] }); - - cy.findByRole("tree", { name: "Spaces" }).within(() => { - // This finds the expand button with the class name "mx_SpaceButton_toggleCollapse". Note there is another - // button with the same name with different class name "mx_SpacePanel_toggleCollapse". - cy.findByRole("button", { name: "Expand" }).realHover().click(); - }); - cy.get(".mx_SpacePanel:not(.collapsed)").should("exist"); // TODO: replace :not() selector - - cy.contains(".mx_SpaceItem", "Root Space") - .should("exist") - .contains(".mx_SpaceItem", "Child Space") - .should("exist"); - - cy.checkA11y(undefined, axeOptions); - cy.get(".mx_SpacePanel").percySnapshotElement("Space panel expanded", { widths: [258] }); - }); - - it("should not soft crash when joining a room from space hierarchy which has a link in its topic", () => { - cy.getBot(homeserver, { displayName: "BotBob" }).then({ timeout: 10000 }, async (bot) => { - const { room_id: roomId } = await bot.createRoom({ - preset: "public_chat" as Preset, - name: "Test Room", - topic: "This is a topic https://github.com/matrix-org/matrix-react-sdk/pull/10060 with a link", - }); - const { room_id: spaceId } = await bot.createRoom(spaceCreateOptions("Test Space", [roomId])); - await bot.invite(spaceId, user.userId); - }); - - cy.getSpacePanelButton("Test Space").should("exist"); - cy.wait(500); // without this we can end up clicking too quickly and it ends up having no effect - cy.viewSpaceByName("Test Space"); - cy.findByRole("button", { name: "Accept" }).click(); - - // Regex pattern due to strings in "mx_SpaceHierarchy_roomTile_item" - cy.findByRole("button", { name: /Test Room/ }).realHover(); - cy.findByRole("button", { name: "Join" }).should("exist").realHover().click(); - cy.findByRole("button", { name: "View", timeout: 5000 }).should("exist").realHover().click(); - - // Assert we get shown the new room intro, and thus not the soft crash screen - cy.get(".mx_NewRoomIntro").should("exist"); - }); -}); diff --git a/cypress/support/views.ts b/cypress/support/views.ts index c610af5f8b..05a4e1e6ac 100644 --- a/cypress/support/views.ts +++ b/cypress/support/views.ts @@ -39,27 +39,6 @@ declare global { * @param id */ viewRoomById(id: string): void; - - /** - * Returns the space panel space button based on a name. The space - * must be visible in the space panel - * @param name The space name to find - */ - getSpacePanelButton(name: string): Chainable>; - - /** - * Opens the given space home by name. The space must be visible in - * the space list. - * @param name The space name to find and click on/open. - */ - viewSpaceHomeByName(name: string): Chainable>; - - /** - * Opens the given space by name. The space must be visible in the - * space list. - * @param name The space name to find and click on/open. - */ - viewSpaceByName(name: string): Chainable>; } } } @@ -85,17 +64,5 @@ Cypress.Commands.add("viewRoomById", (id: string): void => { cy.visit(`/#/room/${id}`); }); -Cypress.Commands.add("getSpacePanelButton", (name: string): Chainable> => { - return cy.findByRole("button", { name: name }).should("have.class", "mx_SpaceButton"); -}); - -Cypress.Commands.add("viewSpaceByName", (name: string): Chainable> => { - return cy.getSpacePanelButton(name).click(); -}); - -Cypress.Commands.add("viewSpaceHomeByName", (name: string): Chainable> => { - return cy.getSpacePanelButton(name).dblclick(); -}); - // Needed to make this file a module export {}; diff --git a/playwright.config.ts b/playwright.config.ts index 92046df82e..4913d63e0f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -26,6 +26,7 @@ export default defineConfig({ ignoreHTTPSErrors: true, video: "retain-on-failure", baseURL, + permissions: ["clipboard-write", "clipboard-read"], }, webServer: { command: process.env.CI ? "npx serve -p 8080 -L ../webapp" : "yarn --cwd ../element-web start", diff --git a/playwright/e2e/spaces/spaces.spec.ts b/playwright/e2e/spaces/spaces.spec.ts new file mode 100644 index 0000000000..396ca803a5 --- /dev/null +++ b/playwright/e2e/spaces/spaces.spec.ts @@ -0,0 +1,296 @@ +/* +Copyright 2022 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 type { Locator, Page } from "@playwright/test"; +import { test, expect } from "../../element-web-test"; +import type { Preset, ICreateRoomOpts } from "matrix-js-sdk/src/matrix"; +import { ElementAppPage } from "../../pages/ElementAppPage"; + +async function openSpaceCreateMenu(page: Page): Promise { + await page.getByRole("button", { name: "Create a space" }).click(); + return page.locator(".mx_SpaceCreateMenu_wrapper .mx_ContextualMenu"); +} + +async function openSpaceContextMenu(page: Page, app: ElementAppPage, spaceName: string): Promise { + const button = await app.getSpacePanelButton(spaceName); + await button.click({ button: "right" }); + return page.locator(".mx_SpacePanel_contextMenu"); +} + +function spaceCreateOptions(spaceName: string, roomIds: string[] = []): ICreateRoomOpts { + return { + creation_content: { + type: "m.space", + }, + initial_state: [ + { + type: "m.room.name", + content: { + name: spaceName, + }, + }, + ...roomIds.map(spaceChildInitialState), + ], + }; +} + +function spaceChildInitialState(roomId: string): ICreateRoomOpts["initial_state"]["0"] { + return { + type: "m.space.child", + state_key: roomId, + content: { + via: [roomId.split(":")[1]], + }, + }; +} + +test.describe("Spaces", () => { + test.use({ + displayName: "Sue", + botCreateOpts: { displayName: "BotBob" }, + }); + + test("should allow user to create public space", async ({ page, app, user }) => { + const contextMenu = await openSpaceCreateMenu(page); + await expect(contextMenu).toMatchScreenshot("space-create-menu.png"); + + await contextMenu.getByRole("button", { name: /Public/ }).click(); + + await contextMenu + .locator('.mx_SpaceBasicSettings_avatarContainer input[type="file"]') + .setInputFiles("cypress/fixtures/riot.png"); + await contextMenu.getByRole("textbox", { name: "Name" }).fill("Let's have a Riot"); + await expect(contextMenu.getByRole("textbox", { name: "Address" })).toHaveValue("lets-have-a-riot"); + await contextMenu.getByRole("textbox", { name: "Description" }).fill("This is a space to reminisce Riot.im!"); + await contextMenu.getByRole("button", { name: "Create" }).click(); + + // Create the default General & Random rooms, as well as a custom "Jokes" room + await expect(page.getByPlaceholder("General")).toBeVisible(); + await expect(page.getByPlaceholder("Random")).toBeVisible(); + await page.getByPlaceholder("Support").fill("Jokes"); + await page.getByRole("button", { name: "Continue" }).click(); + + // Copy matrix.to link + await page.getByRole("button", { name: "Share invite link" }).click(); + expect(await app.getClipboardText()).toEqual("https://matrix.to/#/#lets-have-a-riot:localhost"); + + // Go to space home + await page.getByRole("button", { name: "Go to my first room" }).click(); + + // Assert rooms exist in the room list + await expect(page.getByRole("treeitem", { name: "General" })).toBeVisible(); + await expect(page.getByRole("treeitem", { name: "Random" })).toBeVisible(); + await expect(page.getByRole("treeitem", { name: "Jokes" })).toBeVisible(); + }); + + test("should allow user to create private space", async ({ page, app, user }) => { + const menu = await openSpaceCreateMenu(page); + await menu.getByRole("button", { name: "Private" }).click(); + + await menu + .locator('.mx_SpaceBasicSettings_avatarContainer input[type="file"]') + .setInputFiles("cypress/fixtures/riot.png"); + await menu.getByRole("textbox", { name: "Name" }).fill("This is not a Riot"); + await expect(menu.getByRole("textbox", { name: "Address" })).not.toBeVisible(); + await menu.getByRole("textbox", { name: "Description" }).fill("This is a private space of mourning Riot.im..."); + await menu.getByRole("button", { name: "Create" }).click(); + + await page.getByRole("button", { name: "Me and my teammates" }).click(); + + // Create the default General & Random rooms, as well as a custom "Projects" room + await expect(page.getByPlaceholder("General")).toBeVisible(); + await expect(page.getByPlaceholder("Random")).toBeVisible(); + await page.getByPlaceholder("Support").fill("Projects"); + await page.getByRole("button", { name: "Continue" }).click(); + + await expect(page.locator(".mx_SpaceRoomView h1").getByText("Invite your teammates")).toBeVisible(); + await expect(page.locator(".mx_SpaceRoomView")).toMatchScreenshot("invite-teammates-dialog.png"); + await page.getByRole("button", { name: "Skip for now" }).click(); + + // Assert rooms exist in the room list + await expect(page.getByRole("treeitem", { name: "General", exact: true })).toBeVisible(); + await expect(page.getByRole("treeitem", { name: "Random", exact: true })).toBeVisible(); + await expect(page.getByRole("treeitem", { name: "Projects", exact: true })).toBeVisible(); + + // Assert rooms exist in the space explorer + await expect( + page.locator(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", { hasText: "General" }), + ).toBeVisible(); + await expect( + page.locator(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", { hasText: "Random" }), + ).toBeVisible(); + await expect( + page.locator(".mx_SpaceHierarchy_list .mx_SpaceHierarchy_roomTile", { hasText: "Projects" }), + ).toBeVisible(); + }); + + test("should allow user to create just-me space", async ({ page, app, user }) => { + await app.client.createRoom({ + name: "Sample Room", + }); + + const menu = await openSpaceCreateMenu(page); + await menu.getByRole("button", { name: "Private" }).click(); + + await menu + .locator('.mx_SpaceBasicSettings_avatarContainer input[type="file"]') + .setInputFiles("cypress/fixtures/riot.png"); + await expect(menu.getByRole("textbox", { name: "Address" })).not.toBeVisible(); + await menu.getByRole("textbox", { name: "Description" }).fill("This is a personal space to mourn Riot.im..."); + await menu.getByRole("textbox", { name: "Name" }).fill("This is my Riot"); + await menu.getByRole("textbox", { name: "Name" }).press("Enter"); + + await page.getByRole("button", { name: "Just me" }).click(); + + await page.getByText("Sample Room").click({ force: true }); // force click as checkbox size is zero + + // Temporal implementation as multiple elements with the role "button" and name "Add" are found + await page.locator(".mx_AddExistingToSpace_footer").getByRole("button", { name: "Add" }).click(); + + await expect( + page.locator(".mx_SpaceHierarchy_list").getByRole("treeitem", { name: "Sample Room" }), + ).toBeVisible(); + }); + + test("should allow user to invite another to a space", async ({ page, app, user, bot }) => { + await app.client.createSpace({ + visibility: "public" as any, + room_alias_name: "space", + }); + + const menu = await openSpaceContextMenu(page, app, "#space:localhost"); + await menu.getByRole("menuitem", { name: "Invite" }).click(); + + const shareDialog = page.locator(".mx_SpacePublicShare"); + // Copy link first + await shareDialog.getByRole("button", { name: "Share invite link" }).click(); + expect(await app.getClipboardText()).toEqual("https://matrix.to/#/#space:localhost"); + // Start Matrix invite flow + await shareDialog.getByRole("button", { name: "Invite people" }).click(); + + const otherSection = page.locator(".mx_InviteDialog_other"); + await otherSection.getByRole("textbox").fill(bot.credentials.userId); + await otherSection.getByRole("button", { name: "Invite" }).click(); + + await expect(page.locator(".mx_InviteDialog_other")).not.toBeVisible(); + }); + + test("should show space invites at the top of the space panel", async ({ page, app, user, bot }) => { + await app.client.createSpace({ + name: "My Space", + }); + await expect(await app.getSpacePanelButton("My Space")).toBeVisible(); + + const roomId = await bot.createRoom(spaceCreateOptions("Space Space")); + await bot.inviteUser(roomId, user.userId); + + // Assert that `Space Space` is above `My Space` due to it being an invite + const buttons = page.getByRole("tree", { name: "Spaces" }).locator(".mx_SpaceButton"); + await expect(buttons.nth(1)).toHaveAttribute("aria-label", "Space Space"); + await expect(buttons.nth(2)).toHaveAttribute("aria-label", "My Space"); + }); + + test("should include rooms in space home", async ({ page, app, user }) => { + const roomId1 = await app.client.createRoom({ + name: "Music", + }); + const roomId2 = await app.client.createRoom({ + name: "Gaming", + }); + + const spaceName = "Spacey Mc. Space Space"; + await app.client.createSpace({ + name: spaceName, + initial_state: [spaceChildInitialState(roomId1), spaceChildInitialState(roomId2)], + }); + + await app.viewSpaceHomeByName(spaceName); + + const hierarchyList = page.locator(".mx_SpaceRoomView .mx_SpaceHierarchy_list"); + await expect(hierarchyList.getByRole("treeitem", { name: "Music" }).getByRole("button")).toBeVisible(); + await expect(hierarchyList.getByRole("treeitem", { name: "Gaming" }).getByRole("button")).toBeVisible(); + }); + + test("should render subspaces in the space panel only when expanded", async ({ + page, + app, + user, + axe, + checkA11y, + }) => { + axe.disableRules([ + // Disable this check as it triggers on nested roving tab index elements which are in practice fine + "nested-interactive", + // XXX: We have some known contrast issues here + "color-contrast", + ]); + + const childSpaceId = await app.client.createSpace({ + name: "Child Space", + initial_state: [], + }); + await app.client.createSpace({ + name: "Root Space", + initial_state: [spaceChildInitialState(childSpaceId)], + }); + + // Find collapsed Space panel + const spaceTree = page.getByRole("tree", { name: "Spaces" }); + await expect(spaceTree.getByRole("button", { name: "Root Space" })).toBeVisible(); + await expect(spaceTree.getByRole("button", { name: "Child Space" })).not.toBeVisible(); + + await checkA11y(); + await expect(page.locator(".mx_SpacePanel")).toMatchScreenshot("space-panel-collapsed.png"); + + // This finds the expand button with the class name "mx_SpaceButton_toggleCollapse". Note there is another + // button with the same name with different class name "mx_SpacePanel_toggleCollapse". + await spaceTree.getByRole("button", { name: "Expand" }).click(); + await expect(page.locator(".mx_SpacePanel:not(.collapsed)")).toBeVisible(); // TODO: replace :not() selector + + const item = page.locator(".mx_SpaceItem", { hasText: "Root Space" }); + await expect(item).toBeVisible(); + await expect(item.locator(".mx_SpaceItem", { hasText: "Child Space" })).toBeVisible(); + + await checkA11y(); + await expect(page.locator(".mx_SpacePanel")).toMatchScreenshot("space-panel-expanded.png"); + }); + + test("should not soft crash when joining a room from space hierarchy which has a link in its topic", async ({ + page, + app, + user, + bot, + }) => { + const roomId = await bot.createRoom({ + preset: "public_chat" as Preset, + name: "Test Room", + topic: "This is a topic https://github.com/matrix-org/matrix-react-sdk/pull/10060 with a link", + }); + const spaceId = await bot.createRoom(spaceCreateOptions("Test Space", [roomId])); + await bot.inviteUser(spaceId, user.userId); + + await expect(await app.getSpacePanelButton("Test Space")).toBeVisible(); + await app.viewSpaceByName("Test Space"); + await page.getByRole("button", { name: "Accept" }).click(); + + await page.getByRole("button", { name: "Test Room" }).hover(); + await page.getByRole("button", { name: "Join", exact: true }).click(); + await page.getByRole("button", { name: "View", exact: true }).click(); + + // Assert we get shown the new room intro, and thus not the soft crash screen + await expect(page.locator(".mx_NewRoomIntro")).toBeVisible(); + }); +}); diff --git a/playwright/pages/ElementAppPage.ts b/playwright/pages/ElementAppPage.ts index a602aadb87..6cb6c27e90 100644 --- a/playwright/pages/ElementAppPage.ts +++ b/playwright/pages/ElementAppPage.ts @@ -117,4 +117,18 @@ export class ElementAppPage { const button = await this.getSpacePanelButton(name); return button.dblclick(); } + + /** + * Opens the given space by name. The space must be visible in the + * space list. + * @param name The space name to find and click on/open. + */ + public async viewSpaceByName(name: string): Promise { + const button = await this.getSpacePanelButton(name); + return button.click(); + } + + public async getClipboardText(): Promise { + return this.page.evaluate("navigator.clipboard.readText()"); + } } diff --git a/playwright/pages/client.ts b/playwright/pages/client.ts index 1b3c7dc092..7729442903 100644 --- a/playwright/pages/client.ts +++ b/playwright/pages/client.ts @@ -161,4 +161,17 @@ export class Client { }, ); } + + /** + * Invites the given user to the given room. + * @param roomId the id of the room to invite to + * @param userId the id of the user to invite + */ + public async inviteUser(roomId: string, userId: string): Promise { + const client = await this.prepareClient(); + await client.evaluate((client, { roomId, userId }) => client.invite(roomId, userId), { + roomId, + userId, + }); + } } diff --git a/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png b/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..5139b5b9b18d61f76dc64a867d91ae5128954787 GIT binary patch literal 22311 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 Iy7%;d1CmXG?f?J) literal 0 HcmV?d00001 diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png b/playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f8229c5dd944de88b2245981fcbb8b24a375020c GIT binary patch literal 25206 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 E1>HY87XSbN literal 0 HcmV?d00001 diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png b/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..69c021429c2da5125930fc2eaf82e08f8c517601 GIT binary patch literal 6022 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 TKj&<)4!Esna;sd&{`o%umBHb* literal 0 HcmV?d00001 diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png b/playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad317d37d9a09b39e40b1759a3f091aaa5f9664 GIT binary patch literal 20354 zcmeFZWl&sE*EQG>5+HbRw*&~m-CcsaySuvwhu{vu-66O`fZ!h7-RZ{N<}&XyQ&aQ( zc&omu`7u>*6;0FKSNfiN&faUSy*AD5+Z`i?inYmF5c+3!~^GQ1v1p`{?N1#{7A-?)m4LLW;WC2 z=ii%<-q1EgLPVTEMuL#KZZ@j=_dlChY))>)=O+u28{uhpFTE>b8r)J&Z@u7e$8RB> zZpH2wJK<@{gVxcVnhM3DFScyy`OielC_jdbf4bo=ucQB?BaIK_YQf(?jQ;397{%w< zX#@8c>Oc}YMw{50_X5__`Qz+q(yAs4FNA8S-{Ha%w>sbg7TB7b z*<6<`8cFr>Kir(C{+&f8ji2^HgNZxg#X?m=Avr?%p;#yeE)y+P%vWs5Q7(=500(_< zSH^}p_i5{QeIjYJ^H@e@cvppo!UD;n!uUv86^?2rSB3zsbwhw2RxYm3f=8R1BVT5J zJNiR1^JtyzJWGMX?cG{YYV^W@GXuRQ{YICCrCMdskMBuq5hP)i?D~&Q;O_1c(j58H zsn%kN{sz<@4@DQ$zb@@0Mfnen__ZxElt!Opou#zNq& zU!zteL6-$(B;N<`-Ip1D6A}v~5(P||ixj##D3%9*_Z@QG89_DOnLu}I@!UX;vE~1= zV?kA&eJlV4Ic#t@b|#nVjKnC<&JIX&%5{{`Htln5jpZ08T7Y1sN>d~bD<`E1sVlUD zBcg@$g3d>_oCx$BrXcer+KGv_&rm9!NuPagQc)KASouh*qE>HMa;MDe9~f~Eft_pj zsbdSSvBV@)`R*&?%+A zE4L`P9L~g5rn76wOdkrRv6(O-9na>QHk4`KZ^z)II3+h}q}U@CzxP+LGnDD-fO&pg z(NICXnsA!)=|surgCMasO8J9ZkV#8<1IpE^YfZ0F!hL;|fn(pD zeS)?Yr_Iz`t>OJvAJEy^*{M~lL|!NODSaLgRo7cFhm$vV4w;kJ@mXzq&f>^v{lv?Z zI|)FPa@paH1b ziv}Jq>;9K3csXCObg|BhT`a+$$z=EfoFiyF7#k-ZLsX*=(U#5Ti=v~!ASTvp zbvc$DTWUamUJPT;_(y){F>cYLcMR54O&1f+?^eO}s7G;nAslY^>cxHZ^3#l|Mh9aU zSoa8BJ@MQ|?w&5Nt^B<~j{gLM`_Ihy?04>y&pxtL3Qe?23j+4|<+a*7`5gV3gDL0J zsX!y~n2SEMXLtkzv;LFCL|XhBgNamL?m0*6ln9%}2yFVZ*%Uo}rgR)GLl|Dq>zxI9 zaaYRx9b4;08-e4jllu0K91K32`|t(Qf%joJ56Yla@4+97iFeStOG!yX1^^8ag)?6^`D2IYKX9s?|g% zjzSET<9+|JW=^Hk`+ZxoR*g08;lDz&@s*b5HgOo+8|%e;a1(mFC#Li-maLgdwQQmH z2nsy49kUw;o7tRhH_`z|wPvdz$GxkDE3z`R>hUoxc22Jc7SJtZbvqD+zrZEEG5O)8 z-6ev@!*SrHAE6DnO#A&ry>{4BvW7JI6zR@GhV)TuLZ8^U!hOcZe`L{>90)(e#n_j; z)h4QH5jVvk85a>QzS?b2jF~$2$}uGW)YcI{OC?uC60;}IR}1Hjb@@JX5o5hh*5-ng zOVrVRXt5K#R=PbevGP%$$9;hT0aJT)Be(Z^0)^o#pUqM|&KN~9okmaURQ|zi2fp9) zHTLG_rb8luu#Rh$7G%YvLN{fM8=qdU6DG%LzAA&$=T~E;CZore2r@C3$hdZkgOk(( zBquDbH*lkRyT&fE@uS)hg2123fv5HZ48d1E@{KtoHpIn=MX*|n>ke|O{-Zc4MFAxB zuZt#Q>A!+=ecl_>uRu-KMwZ*!ZJFYdn%UQklq#tgUe?>C*Q;i9fP*lpza6fj5!cFTqhi;{46bs<| zv|B~Y53EL-j?Rs`9G~v0z0Y^m3M96N#xs{oH5>2}iewwwZNW>ds=Eu*6kc<*bh)|J zE%uwxoQ`*sWiD1Ztb#Gb(*+8`H>b-|{sHe3&Sc>-rpV!tJ#B7lDd)tr-3yeznqTVZ z6s_V6sx5OVoQ_Dk?~bFM9w#U^En4qQPK4s}7{k0kL9tlQ{P1)+M#Z^{^|-{YH92N0 zHzC}udwCv8`leQYsN;3D(-*OiNW>9K9*R=uGJ<6~@k?UO`@Tf8gA0VqQ~;|#KTarN zD{kzghjbSo2#fOD<ZeK&D9gm8}DjXV{lW=W!7 zQ5D^H)7jI$l0J#lk6rhM<=l-(9nmCLl#zD}=sKgy-?1(J#WWHP&vHkHnfZfat8Ii7E# z9>`)_th05PGH)2wYW}g(a>-x^vF?w=>+AA+?Va50E!CRnH2O|vi`?~K?_48_)02-< z8WmCAhR|n;onxQGgHe@{GU~B*^}+YoBR+ROadZ=6-D2dDN?-H0XTx@Psv<8W7K^2y z1A>C18H~Y(#J)ee^?yGdTzih35^}ljJ{69HyR!$mvvahI>!0QjHI#n@rt``_ONJm^ zj;>>_0DeKk7bx0DmXvPH|i#ravc#Oe*)hdr~#@RNa zQ2TK_EnL|()mR0$aH@+L9IIza!!I}RAYlMRR6Bnonc}6&Na#2kG4SR2@n56NH*Fmq zPM;&1h%PE+VIm0%MfT8a)LVCgH z`*yE+t_ljBKJc}eSI`^PN^a=NZbIg)cznn6>2#U=yFGnU8GJs;y`eGo7q`=?(x#mR zll+3a@aI*I?x+|gCnISxYTG)Hm)TH)RHpz>JyoIOL&;)|sC-)VryW);u@_^vRZ*+m z8lzJ7DxEI>Me8Dg7w^QcIzQuyQ*s>gKU|%x#zdsNe3#b{Y9ApWg1H~Q&vR8-bopby zA4L9izpO*;b|1u(y+cx&0xQ-LPI;T{biKb!plu(Yf)WTWQ`^n^Y{!`m)8MjjroiL# z5UKL5lhW(v1a-H)xotVUjo71kSfAap(Yrb@?>d$HlMmWkgx?$Q*a z5c4DFIYzaf*9(QYr6@tfV<{qFO_qEIhi2`}_}dKkKf!lm3l?~~SSgj8x{MG;Sa*UvE>Fn2YW6ZwP(yRqDahAIytjE+U=KEO`&y$N-?$wh_y0`u_kudsa+Hkr@ z79RIijf;!kHYg&Ur%XGn!2U=la@xb|Z37mfXg}K=uMf03$tS_1Gk7r{q(eAslr@xtk-LpHA_!@vceCC>Vo*MB9GJL27)u_aF(}tp! z^pf+HkMpP!?QSWEgbGaUZ1y#CmF3G^6!!*eV!yVY}iEFkvF_7#}ynt=Dc;M%G=*rSROoyd+uIo{2ePg*(W!{V*- z`qa-FO>$9hAYF`-|Ds!A%vsz;DfBtT7y(*5fdrN8Jj3_5JY3v`1S%ZqXSg8LPcX9E z`))BGO-AJNEmg|1Rlccl6`bIylvB88ts6phP7wRLV!kq{2Q zJ)qF!DieZ;XU;m2cFh$ZIp#uEITuAf5dFoCc@3Ukw^RSROa;hqv@PkM$d_*{8f>N0 z*a&}s{QQuKIR0e$JkrWJ{mj@O^(2(=gcY+n3^8{JK6I8&XG-&I zu$pQ%@WG;0*LN`~tlZep?~f!B1>?ju8de6?QjWijE@p-`zp12z6!HTmbyLFYyT^2Mr1c(c_5@uyt_#!MP( zU05>dXWKDt=JHK+Z(n5d=^iJFQSZif;*n6zhp~aaHuUoGl=5&P_uYp;e^Z%XXU}=T zQ=a^-zZpzrvt>J$8s5Ia_CVB^&!0c9O>kCuf-T&)jiMk-JKUV$Hd?Ruw??IN+%MZ% zYj^Q!^46J-?;Iu+TQ9dnG#sXlR%>EfwH3)^jULZe-#eV@CReHt`TKZ*=}vb? z)FN>hBXfI0oX*bB%2X=*W7=Fr%eMzNdug;8vNe87(vYx`mO(RV;aPZ}Jd48YKG z51$7gtV#$cv)P8*DbX>zjp1#lPimxCk?b#w(|rQ9j+=V!s_Vw*iqCKv--{6nWykPT z`Ppq(evh86o-(hjtT?#c<_HhSs>a+Au^GZ-`@C>|#Ax@v&ydzltMG&|txMzcdEA6R z1dF884rYt#VUbUos`zOlvu{q#HeyNL-Q8p9d^|mGj>aZJk^2|c7&4>t#beHP=hrv( z_M+AHMx76r#vm6nmR}@;e*zFXZ~pjjvWEP*>#nElZOdByHEq+0^w4U%arI?~oil^Z z2kJb+G$xZgwNt*6)sE%b$Zq|Ox|i&22*f`n1-rxZ*5LKU$HAAVrepnPCPf{X1OO-+ z_(Li@n94}5S&1(k5|i`#14@5jp8(rynQ+>3*;myu@=tiZCOh)W?ZR2f(-UO#sI10w zI7YP`_&(F0IS>S9qy)T*WTXFfVa+LqFJaI$9b9F#`d@~C>T4&jH}DzC8q9< z175Cglx9vJYi{lLj<_?M$Tnh18%(B6H~Hmu!`?NZmetkzL(wAdt2>`d#sPs#&(5T#7uJTiM z_^->O&*JShXNf15T-1#EV3SPqUzfE+xcqimpJ2Yq1F#ZUmwhK5msA=T=pftm&aw0D z0ooCqC@~^lZ}UYQ$ZAJ~n(6U!OR-!wk(!#C>r*p6O3d9ULL8}&XQJenmlu??^Yiy4 z8-fA>!;d=&a(BRk0SD1~xiwgUT>Q6fuNVl(^%`})`nX)WZsH1Q)9skV1 zkqX2gV6l()++P}1sO8TpR(c}6K~v!J1Bm!ddmmg}Q{48)0m@<>-qpoVo%AtS$bj`q zt5i9T%?2+d2B*8uY(k^n-rpoEJ)N6Nhbo4MR|q&vhnURX_^)7D?BO~yIgLhVcqDw* zTAFHkDs=|G&e;db8_uws8SDlhc-l7AOs>&Xt|+sKEKTG_x>WA@s{e!nWXPv6$^h|bGoCT$VsMr9VrGcP3P+14<}U% zgv#X;OXG34Gkh$JR~<{AYL_sAe)rCNwb7=+1%-eIrcz95`vcO!Y(A{bQd3E za}STt!9ie*jKvpNWP+(96EdU{|@itfwtn>;TyAmTB> zxS_cHVzK-_a6?$4S;=Ly)L{`JmS3n|V+f>*$Y}7gLXD#dm-iCm+ASN~`K;M;XAlmD zIjTlShsAmk64LQ}Zw@qNshBdQG2qFhj_!rMrjMqM zj^j4!PjEojnUE;#xI>eR<$pCKiR%uV(&xxd8KV!f=L!8F*u3_GPP%nUsNISH3+Ca~6S@(YtDb?IT|Sou z#N_hS7*t7U{B)MA)JX)V7-XdcpJ2rD;dRvA>kkbKHiM3%ka=YR1%wfIOdqDBJE%P3 zV^n#>J1hH7nbBt|R*bqG(T5Yuso6X-5Uh@Aj5MY^8fDNmtf>9r+WSxEb|f=7W;ct0 z85eE6V6zywxlqo+%2Vi27(w;stP;H|058aA66FtdrZZ3^FIrR3to-OU7dk!)P%O2# z^a(dvxJ7S0Ey_Dwhn+{ZQNS9F>G`JQ$bOt@itHJ1IH#9-dXJ`E$hPzvC7{#QxLUpL zdPxu%W8H1eWJqE1(&mvKPXGja+`us%wQJA7X2ot%#qE-PS#etQ2(K@R)eQoT5bCmGpua>kZxmWcqse7Kgc@P9uAqr^26bScYeXv4LM%Z zTwZ%G0YN*kfvg!Ze4bc6wH5lgQ1att3<62C(J`x%RkV!O#v@(3-cS~H@^FMG$f-%I?`gZS#3QRm264}!S8 zikM$?fPGKHha0}aK3v6rBoy1T$5c-Hk`U8&w?q#ogJwtCevhul)x8Ep>==cAC|LcM zO&z-LL+ziM)}czYYX~fOc+s`RfODk2v`5wIzx!)INeM5fm0lT;ds57 zKM=E6@51f(dP)EGNN z@CWWTfO{zwHt1VEaTS90N28p` z1Y88$sqX^22iM+(Hrt;&*4E2}-AdHL_%9l7{mJdkXtVzc*&Q{N&Eo5wGNNRl-2R%~ z%gD2&9X9h>BVeOR$*jd^pSUfh%XOQgcs#?>pGwZk-RAkSmeK1>wAr;~H7C#)Ba7 z?47@V3=wxbA$Z9JRENuKO7_BR6z%xH%%eRa2a7V*XoDX*pQ+wIq6QD1yB&k6#45By zo{2izT&iL%A?H)P+$IrvME>Km>{(pjySUpGF}hwE=8|P7;uboG{)s4Lf58`7BYNj! zK%(KzNg7qsPxcr-X1se~07kP2&krsJVu*4PkiO`3dJnD6n6KPgzsF_`3N~tWjQTA) z!jRSSV>zQVM?PopBzQT5I779oZp2S57#}H;zm~ftJx>4B1r@-5`KslW5RJR7MT8OW zOTTuBjiPNsCF&v+ z%bnG4cTYQeFU6qS1yw~?BAFt@{iKC~%OpaxyvTtWqCuKg=)2G|u`!>uKkB6{L*e1pn+iy%>1)C{dc2iaZlF)&A zn#sqSwPbo~6~g|~8Xi?%V^#Rrxb1!j)p^=9Dqq|LO?=$Z070Q}7{8CPR7ZaYg;XpjRJm$(>$R?6W1=6MQEEQ__ZtP7vwpdkF zbZ^=ipr?FsQ##3`(S)1M_7hFF^?eDLoahqOsDOjut8U#q^SIw2uBJ-ZVKJpm(rbmg zu6$onr5Db1C9OXNA&UD7a)Y^7ROvoovlI(3slz#l$oT9_CBfy$qM;o*T77RuZjOtnTsn%DUg)!8-e)RuPxg@>MNOzC!up zWFvjodfV7h1m)L*-LX03=hB4NK=ox+E^%AgE28m%MaSBsCwQ!EPRT4p-IL=Bm*E4n z0;v?N;4K+gZ2$t23VZ5?hEQ0wf$&(&e<)ttYM11lUGxxK;91Ky{L1Es)uE!3!OtB{ zLI;7{EpmSA(vSTXq;e7;bvv9z(piTxSECb*W6dkxTdHKv)$>LWGYS}PYI>RZv)Y%` z)tPC{YI72&6Uo^=a?w;=o?K+L@3?cAiAht%9d~bI8D*PxD!Rc|!cB?BA z8UOTI-1Z2Q##BSBQu+KI(s0u33-v?E*G+w~7Is~=Y@~acQO}Ao*A;=qk~Q1*CCh7q ze3v-l#%AnsP{B{LfjyNHKEaxiXq-kYvrngDHZ^KI- zM`tm)(ap%9w=Fa`>-PaSb zlAYaissDIR@$_Dy>U0(VMbpD$178NW9Qk+vuls#Q>=^@-$RXXVkZIqdORewS? zoMPFHOh1|qTV9)3Fr_a#U80Pvb64x>n~V@)+}=br*z7uqX+JtP4{VrUu8ojGxQg5@vLH#@J4~#CdI&zRN3YcD~1$C(V)!QvVVs+J!;xQr_N znR{$A!L)^>q)+mY=`|URgJF|(e{Cgw3(2R}Mm3Su)7E6|wZFn?MKf{$uW=5!45)Q- zvamoNFu$I+OJ5wSv{F;lrTtv@6K|dhvullPF0GuHq{94&hxrf&eg)&z-)*3S=wKiE zG$Cn^eoD-G3c3eE_lMQxAa}2#!pi~71WGtbjK|m?e?oB(KVV3HA@)jfzGeMIs+Ui#hn2-I-erUW z#0`R4w0^bDx??#BZDndPRVxA;Pa)Z_Yd{FuTI)Q4TzyG_elpj*G7>`aEGH6dp869& zky#Q~4M#`Ksw1WP*P4xa`>$M0GWWxNrt*+Z7-6>W_%ErhOB$A-#=hZL?m)GFfdU3j zDA0vMXs1X*j=L9yb`w<&bP3#QvJbb1aXF0zGi^BBy~kpeAo=FD+`%OD6j`u?#WYX9 ziOLs#F>X()&GLD4HXr1Vl~^h*Oy=Uq4&Sx5zO64_7k{pzX5F?DedKDJ$`7+BAKWiGYBA$4q`S7_Nidk&%WcFf4`+X|W>ZF& zIr?hJRwz^Rueodn`0!6NIe#8dhL?zk?446{%uvG#xojRF*}d)+0%!=k;Ujxxxe`%; z=CGZF(*NZJs4|>|X`sAIkaW-D-z;drbO;A`OtA7l*d~ODvijxG9 zf8m6iVS_!_)}9$+`mB~Kzmey<0oAA6cuFmz9Zv*fnNH-d7+yZI%>SX(K}DQ$?ZK)!=uQcx6Au5wvHaE$fcmd}1{rAoO&c;i=(W~<5O zl8n~yuNWU$sw{a{Sm1p#J4QsoU*Y03ISWv#m8qvJb>L?;*6-Ew9YibH3>a`2ihc~_ zeUs0T|I1q|)#!1~=eRK59-$dLq#~oy ziQZCpul0r~$&^M&4HUNnxNlPovbH?NotgU zinONa;jzX|T0Ia*nhv|EMfx$wPiuypH!3HM zTEb8D^IrF4yEE7+_2pbxr@}n)5+J83+q^aQOSwK#

r$t7rDpIW8{UqLrS-o*)0t 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 O0000