diff --git a/cypress/e2e/room-directory/room-directory.spec.ts b/cypress/e2e/room-directory/room-directory.spec.ts
deleted file mode 100644
index a7fcfaf61f..0000000000
--- a/cypress/e2e/room-directory/room-directory.spec.ts
+++ /dev/null
@@ -1,106 +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 { HomeserverInstance } from "../../plugins/utils/homeserver";
-import { MatrixClient } from "../../global";
-
-describe("Room Directory", () => {
- let homeserver: HomeserverInstance;
-
- beforeEach(() => {
- cy.startHomeserver("default").then((data) => {
- homeserver = data;
-
- cy.initTestUser(homeserver, "Ray");
- cy.getBot(homeserver, { displayName: "Paul" }).as("bot");
- });
- });
-
- afterEach(() => {
- cy.stopHomeserver(homeserver);
- });
-
- it("should allow admin to add alias & publish room to directory", () => {
- cy.window({ log: false }).then((win) => {
- cy.createRoom({
- name: "Gaming",
- preset: win.matrixcs.Preset.PublicChat,
- }).as("roomId");
- });
-
- cy.viewRoomByName("Gaming");
- cy.openRoomSettings();
-
- // First add a local address `gaming`
- cy.contains(".mx_SettingsFieldset", "Local Addresses").within(() => {
- cy.findByRole("textbox").type("gaming");
- cy.findByRole("button", { name: "Add" }).click();
- cy.findByText("#gaming:localhost").should("have.class", "mx_EditableItem_item").should("exist");
- });
-
- // Publish into the public rooms directory
- cy.contains(".mx_SettingsFieldset", "Published Addresses").within(() => {
- cy.get("#canonicalAlias").find(":selected").findByText("#gaming:localhost");
- cy.findByLabelText("Publish this room to the public in localhost's room directory?")
- .click()
- .should("have.attr", "aria-checked", "true");
- });
-
- cy.closeDialog();
-
- cy.all([cy.get("@bot"), cy.get("@roomId")]).then(async ([bot, roomId]) => {
- const resp = await bot.publicRooms({});
- expect(resp.total_room_count_estimate).to.equal(1);
- expect(resp.chunk).to.have.length(1);
- expect(resp.chunk[0].room_id).to.equal(roomId);
- });
- });
-
- it("should allow finding published rooms in directory", () => {
- const name = "This is a public room";
- cy.all([cy.window({ log: false }), cy.get("@bot")]).then(([win, bot]) => {
- bot.createRoom({
- visibility: win.matrixcs.Visibility.Public,
- name,
- room_alias_name: "test1234",
- });
- });
-
- cy.findByRole("button", { name: "Explore rooms" }).click();
-
- cy.get(".mx_SpotlightDialog").within(() => {
- cy.findByRole("textbox", { name: "Search" }).type("Unknown Room");
- cy.findByText("If you can't find the room you're looking for, ask for an invite or create a new room.")
- .should("have.class", "mx_SpotlightDialog_otherSearches_messageSearchText")
- .should("exist");
- });
- cy.get(".mx_SpotlightDialog_wrapper").percySnapshotElement("Room Directory - filtered no results");
-
- cy.get(".mx_SpotlightDialog").within(() => {
- cy.findByRole("textbox", { name: "Search" }).type("{selectAll}{backspace}test1234");
- cy.findByText(name).should("have.class", "mx_SpotlightDialog_result_publicRoomName").should("exist");
- });
-
- // Disabled because flaky - see https://github.com/vector-im/element-web/issues/24881
- //cy.get(".mx_SpotlightDialog_wrapper").percySnapshotElement("Room Directory - filtered one result");
-
- cy.get(".mx_SpotlightDialog .mx_SpotlightDialog_option").findByRole("button", { name: "Join" }).click();
-
- cy.url().should("contain", `/#/room/#test1234:localhost`);
- });
-});
diff --git a/playwright/e2e/room-directory/room-directory.spec.ts b/playwright/e2e/room-directory/room-directory.spec.ts
new file mode 100644
index 0000000000..6d08650895
--- /dev/null
+++ b/playwright/e2e/room-directory/room-directory.spec.ts
@@ -0,0 +1,88 @@
+/*
+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 { Preset, Visibility } from "matrix-js-sdk/src/matrix";
+import { test, expect } from "../../element-web-test";
+
+test.describe("Room Directory", () => {
+ test.use({
+ displayName: "Ray",
+ botCreateOpts: { displayName: "Paul" },
+ });
+
+ test("should allow admin to add alias & publish room to directory", async ({ page, app, user, bot }) => {
+ const roomId = await app.client.createRoom({
+ name: "Gaming",
+ preset: "public_chat" as Preset,
+ });
+
+ await app.viewRoomByName("Gaming");
+ await app.settings.openRoomSettings();
+
+ // First add a local address `gaming`
+ const localAddresses = page.locator(".mx_SettingsFieldset", { hasText: "Local Addresses" });
+ await localAddresses.getByRole("textbox").fill("gaming");
+ await localAddresses.getByRole("button", { name: "Add" }).click();
+ await expect(localAddresses.getByText("#gaming:localhost")).toHaveClass("mx_EditableItem_item");
+
+ // Publish into the public rooms directory
+ const publishedAddresses = page.locator(".mx_SettingsFieldset", { hasText: "Published Addresses" });
+ await expect(publishedAddresses.locator("#canonicalAlias")).toHaveValue("#gaming:localhost");
+ const checkbox = publishedAddresses.getByLabel(
+ "Publish this room to the public in localhost's room directory?",
+ );
+ await checkbox.check();
+ await expect(checkbox).toBeChecked();
+
+ await app.closeDialog();
+
+ const resp = await bot.publicRooms({});
+ expect(resp.total_room_count_estimate).toEqual(1);
+ expect(resp.chunk).toHaveLength(1);
+ expect(resp.chunk[0].room_id).toEqual(roomId);
+ });
+
+ test("should allow finding published rooms in directory", async ({ page, app, user, bot }) => {
+ const name = "This is a public room";
+ await bot.createRoom({
+ visibility: "public" as Visibility,
+ name,
+ room_alias_name: "test1234",
+ });
+
+ await page.getByRole("button", { name: "Explore rooms" }).click();
+
+ const dialog = page.locator(".mx_SpotlightDialog");
+ await dialog.getByRole("textbox", { name: "Search" }).fill("Unknown Room");
+ await expect(
+ dialog.getByText("If you can't find the room you're looking for, ask for an invite or create a new room."),
+ ).toHaveClass("mx_SpotlightDialog_otherSearches_messageSearchText");
+
+ await expect(page.locator(".mx_Dialog")).toMatchScreenshot("filtered-no-results.png");
+
+ await dialog.getByRole("textbox", { name: "Search" }).fill("test1234");
+ await expect(dialog.getByText(name)).toHaveClass("mx_SpotlightDialog_result_publicRoomName");
+
+ await expect(page.locator(".mx_Dialog")).toMatchScreenshot("filtered-one-result.png");
+
+ await page
+ .locator(".mx_SpotlightDialog .mx_SpotlightDialog_option")
+ .getByRole("button", { name: "Join" })
+ .click();
+
+ await expect(page).toHaveURL("/#/room/#test1234:localhost");
+ });
+});
diff --git a/playwright/pages/client.ts b/playwright/pages/client.ts
index da669c0f2a..c1e4f7a9ed 100644
--- a/playwright/pages/client.ts
+++ b/playwright/pages/client.ts
@@ -25,6 +25,7 @@ import type {
Room,
MatrixEvent,
ReceiptType,
+ IRoomDirectoryOptions,
} from "matrix-js-sdk/src/matrix";
export class Client {
@@ -223,4 +224,11 @@ export class Client {
{ event, receiptType, unthreaded },
);
}
+
+ public async publicRooms(options?: IRoomDirectoryOptions): ReturnType {
+ const client = await this.prepareClient();
+ return await client.evaluate((client, options) => {
+ return client.publicRooms(options);
+ }, options);
+ }
}
diff --git a/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png b/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png
new file mode 100644
index 0000000000..c5c73fa3ad
Binary files /dev/null and b/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png differ
diff --git a/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png b/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png
new file mode 100644
index 0000000000..9d3954f8c1
Binary files /dev/null and b/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png differ