2022-06-15 16:14:05 +02:00
|
|
|
|
/*
|
|
|
|
|
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.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/// <reference types="cypress" />
|
|
|
|
|
|
|
|
|
|
import { MatrixClient } from "../../global";
|
2023-01-11 00:29:56 +01:00
|
|
|
|
import { HomeserverInstance } from "../../plugins/utils/homeserver";
|
2022-06-15 16:14:05 +02:00
|
|
|
|
import Chainable = Cypress.Chainable;
|
|
|
|
|
import Loggable = Cypress.Loggable;
|
|
|
|
|
import Timeoutable = Cypress.Timeoutable;
|
|
|
|
|
import Withinable = Cypress.Withinable;
|
|
|
|
|
import Shadow = Cypress.Shadow;
|
|
|
|
|
|
2023-03-01 16:23:35 +01:00
|
|
|
|
enum Filter {
|
2022-06-15 16:14:05 +02:00
|
|
|
|
People = "people",
|
2022-12-12 12:24:14 +01:00
|
|
|
|
PublicRooms = "public_rooms",
|
2022-06-15 16:14:05 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
declare global {
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
|
|
|
namespace Cypress {
|
|
|
|
|
interface Chainable {
|
|
|
|
|
/**
|
|
|
|
|
* Opens the spotlight dialog
|
|
|
|
|
*/
|
|
|
|
|
openSpotlightDialog(
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
|
|
|
|
spotlightDialog(
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
|
|
|
|
spotlightFilter(
|
|
|
|
|
filter: Filter | null,
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
|
|
|
|
spotlightSearch(
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
|
|
|
|
spotlightResults(
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
|
|
|
|
roomHeaderName(
|
2022-12-12 12:24:14 +01:00
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
2022-06-15 16:14:05 +02:00
|
|
|
|
): Chainable<JQuery<HTMLElement>>;
|
2022-07-06 14:07:10 +02:00
|
|
|
|
startDM(name: string): Chainable<void>;
|
2022-06-15 16:14:05 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-12 12:24:14 +01:00
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"openSpotlightDialog",
|
|
|
|
|
(options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElement>> => {
|
|
|
|
|
cy.get(".mx_RoomSearch_spotlightTrigger", options).click({ force: true });
|
|
|
|
|
return cy.spotlightDialog(options);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"spotlightDialog",
|
|
|
|
|
(options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElement>> => {
|
|
|
|
|
return cy.get('[role=dialog][aria-label="Search Dialog"]', options);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"spotlightFilter",
|
|
|
|
|
(
|
|
|
|
|
filter: Filter | null,
|
|
|
|
|
options?: Partial<Loggable & Timeoutable & Withinable & Shadow>,
|
|
|
|
|
): Chainable<JQuery<HTMLElement>> => {
|
|
|
|
|
let selector: string;
|
|
|
|
|
switch (filter) {
|
|
|
|
|
case Filter.People:
|
|
|
|
|
selector = "#mx_SpotlightDialog_button_startChat";
|
|
|
|
|
break;
|
|
|
|
|
case Filter.PublicRooms:
|
|
|
|
|
selector = "#mx_SpotlightDialog_button_explorePublicRooms";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
selector = ".mx_SpotlightDialog_filter";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return cy.get(selector, options).click();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"spotlightSearch",
|
|
|
|
|
(options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElement>> => {
|
2023-04-17 16:06:20 +02:00
|
|
|
|
return cy.get(".mx_SpotlightDialog_searchBox", options).findByRole("textbox", { name: "Search" });
|
2022-12-12 12:24:14 +01:00
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"spotlightResults",
|
|
|
|
|
(options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElement>> => {
|
|
|
|
|
return cy.get(".mx_SpotlightDialog_section.mx_SpotlightDialog_results .mx_SpotlightDialog_option", options);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Cypress.Commands.add(
|
|
|
|
|
"roomHeaderName",
|
|
|
|
|
(options?: Partial<Loggable & Timeoutable & Withinable & Shadow>): Chainable<JQuery<HTMLElement>> => {
|
2023-08-01 09:32:53 +02:00
|
|
|
|
return cy.get(".mx_LegacyRoomHeader_nametext", options);
|
2022-12-12 12:24:14 +01:00
|
|
|
|
},
|
|
|
|
|
);
|
2022-06-15 16:14:05 +02:00
|
|
|
|
|
2022-07-06 14:07:10 +02:00
|
|
|
|
Cypress.Commands.add("startDM", (name: string) => {
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(name);
|
2022-08-12 00:26:25 +02:00
|
|
|
|
cy.wait(1000); // wait for the dialog code to settle
|
2022-07-06 14:07:10 +02:00
|
|
|
|
cy.get(".mx_Spinner").should("not.exist");
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", name);
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
});
|
2022-08-04 08:19:52 +02:00
|
|
|
|
// send first message to start DM
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("textbox", { name: "Send a message…" }).should("have.focus").type("Hey!{enter}");
|
2022-10-12 19:59:07 +02:00
|
|
|
|
// The DM room is created at this point, this can take a little bit of time
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.get(".mx_EventTile_body", { timeout: 30000 }).findByText("Hey!");
|
|
|
|
|
cy.findByRole("group", { name: "People" }).findByText(name);
|
2022-07-06 14:07:10 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
describe("Spotlight", () => {
|
2023-01-11 00:29:56 +01:00
|
|
|
|
let homeserver: HomeserverInstance;
|
2022-06-15 16:14:05 +02:00
|
|
|
|
|
|
|
|
|
const bot1Name = "BotBob";
|
|
|
|
|
let bot1: MatrixClient;
|
|
|
|
|
|
|
|
|
|
const bot2Name = "ByteBot";
|
|
|
|
|
let bot2: MatrixClient;
|
|
|
|
|
|
|
|
|
|
const room1Name = "247";
|
|
|
|
|
let room1Id: string;
|
|
|
|
|
|
|
|
|
|
const room2Name = "Lounge";
|
|
|
|
|
let room2Id: string;
|
|
|
|
|
|
2022-07-20 12:48:31 +02:00
|
|
|
|
const room3Name = "Public";
|
|
|
|
|
let room3Id: string;
|
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
beforeEach(() => {
|
2023-01-11 00:29:56 +01:00
|
|
|
|
cy.startHomeserver("default").then((data) => {
|
|
|
|
|
homeserver = data;
|
|
|
|
|
cy.initTestUser(homeserver, "Jim")
|
2022-12-12 12:24:14 +01:00
|
|
|
|
.then(() =>
|
2023-01-11 00:29:56 +01:00
|
|
|
|
cy.getBot(homeserver, { displayName: bot1Name }).then((_bot1) => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
bot1 = _bot1;
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
.then(() =>
|
2023-01-11 00:29:56 +01:00
|
|
|
|
cy.getBot(homeserver, { displayName: bot2Name }).then((_bot2) => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
|
|
|
bot2 = _bot2;
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
.then(() =>
|
|
|
|
|
cy.window({ log: false }).then(({ matrixcs: { Visibility } }) => {
|
2023-05-15 12:37:24 +02:00
|
|
|
|
cy.createRoom({ name: room1Name, visibility: Visibility.Public }).then(async (_room1Id) => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
room1Id = _room1Id;
|
2023-05-15 12:37:24 +02:00
|
|
|
|
await bot1.joinRoom(room1Id);
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
2022-12-12 12:24:14 +01:00
|
|
|
|
bot2.createRoom({ name: room2Name, visibility: Visibility.Public }).then(
|
|
|
|
|
({ room_id: _room2Id }) => {
|
|
|
|
|
room2Id = _room2Id;
|
|
|
|
|
bot2.invite(room2Id, bot1.getUserId());
|
2022-07-20 12:48:31 +02:00
|
|
|
|
},
|
2022-12-12 12:24:14 +01:00
|
|
|
|
);
|
|
|
|
|
bot2.createRoom({
|
|
|
|
|
name: room3Name,
|
|
|
|
|
visibility: Visibility.Public,
|
|
|
|
|
initial_state: [
|
|
|
|
|
{
|
|
|
|
|
type: "m.room.history_visibility",
|
|
|
|
|
state_key: "",
|
|
|
|
|
content: {
|
|
|
|
|
history_visibility: "world_readable",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
}).then(({ room_id: _room3Id }) => {
|
|
|
|
|
room3Id = _room3Id;
|
|
|
|
|
bot2.invite(room3Id, bot1.getUserId());
|
|
|
|
|
});
|
|
|
|
|
}),
|
|
|
|
|
)
|
2023-05-15 12:37:24 +02:00
|
|
|
|
.then(() => {
|
|
|
|
|
cy.visit("/#/room/" + room1Id);
|
|
|
|
|
cy.get(".mx_RoomSublist_skeletonUI").should("not.exist");
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
2023-05-18 23:44:37 +02:00
|
|
|
|
// wait for the room to have the right name
|
2023-08-01 09:32:53 +02:00
|
|
|
|
cy.get(".mx_LegacyRoomHeader").within(() => {
|
2023-05-18 23:44:37 +02:00
|
|
|
|
cy.findByText(room1Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
afterEach(() => {
|
2022-06-30 11:44:56 +02:00
|
|
|
|
cy.visit("/#/home");
|
2023-01-11 00:29:56 +01:00
|
|
|
|
cy.stopHomeserver(homeserver);
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should be able to add and remove filters via keyboard", () => {
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
2023-05-18 23:44:37 +02:00
|
|
|
|
cy.wait(1000); // wait for the dialog to settle, otherwise our keypresses might race with an update
|
|
|
|
|
|
|
|
|
|
// initially, publicrooms should be highlighted (because there are no other suggestions)
|
2022-06-15 16:14:05 +02:00
|
|
|
|
cy.get("#mx_SpotlightDialog_button_explorePublicRooms").should("have.attr", "aria-selected", "true");
|
2023-05-18 23:44:37 +02:00
|
|
|
|
|
|
|
|
|
// hitting enter should enable the publicrooms filter
|
2022-06-15 16:14:05 +02:00
|
|
|
|
cy.spotlightSearch().type("{enter}");
|
|
|
|
|
cy.get(".mx_SpotlightDialog_filter").should("contain", "Public rooms");
|
|
|
|
|
cy.spotlightSearch().type("{backspace}");
|
|
|
|
|
cy.get(".mx_SpotlightDialog_filter").should("not.exist");
|
|
|
|
|
|
|
|
|
|
cy.spotlightSearch().type("{downArrow}");
|
|
|
|
|
cy.spotlightSearch().type("{downArrow}");
|
|
|
|
|
cy.get("#mx_SpotlightDialog_button_startChat").should("have.attr", "aria-selected", "true");
|
|
|
|
|
cy.spotlightSearch().type("{enter}");
|
|
|
|
|
cy.get(".mx_SpotlightDialog_filter").should("contain", "People");
|
|
|
|
|
cy.spotlightSearch().type("{backspace}");
|
|
|
|
|
cy.get(".mx_SpotlightDialog_filter").should("not.exist");
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should find joined rooms", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightSearch().clear().type(room1Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room1Name);
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
cy.url().should("contain", room1Id);
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.roomHeaderName().should("contain", room1Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should find known public rooms", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.PublicRooms);
|
|
|
|
|
cy.spotlightSearch().clear().type(room1Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room1Name);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", "View");
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
cy.url().should("contain", room1Id);
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.roomHeaderName().should("contain", room1Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should find unknown public rooms", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.PublicRooms);
|
|
|
|
|
cy.spotlightSearch().clear().type(room2Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room2Name);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", "Join");
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
cy.url().should("contain", room2Id);
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.get(".mx_RoomView_MessageList").should("have.length", 1);
|
|
|
|
|
cy.roomHeaderName().should("contain", room2Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-07-20 12:48:31 +02:00
|
|
|
|
it("should find unknown public world readable rooms", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.PublicRooms);
|
|
|
|
|
cy.spotlightSearch().clear().type(room3Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room3Name);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", "View");
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
cy.url().should("contain", room3Id);
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("button", { name: "Join the discussion" }).click();
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.roomHeaderName().should("contain", room3Name);
|
|
|
|
|
});
|
2022-07-20 12:48:31 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
// TODO: We currently can’t test finding rooms on other homeservers/other protocols
|
|
|
|
|
// We obviously don’t have federation or bridges in cypress tests
|
2023-03-01 16:23:35 +01:00
|
|
|
|
it.skip("should find unknown public rooms on other homeservers", () => {
|
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.PublicRooms);
|
|
|
|
|
cy.spotlightSearch().clear().type(room3Name);
|
|
|
|
|
cy.get("[aria-haspopup=true][role=button]").click();
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.contains(".mx_GenericDropdownMenu_Option--header", "matrix.org")
|
|
|
|
|
.next("[role=menuitemradio]")
|
|
|
|
|
.click();
|
|
|
|
|
cy.wait(3_600_000);
|
|
|
|
|
})
|
|
|
|
|
.then(() =>
|
|
|
|
|
cy.spotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room3Name);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", room3Id);
|
|
|
|
|
}),
|
|
|
|
|
);
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
2023-03-01 16:23:35 +01:00
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
it("should find known people", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot1Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", bot1Name);
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.roomHeaderName().should("contain", bot1Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should find unknown people", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot2Name);
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
2023-07-18 10:26:54 +02:00
|
|
|
|
cy.spotlightResults().eq(0).should("contain", bot2Name);
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
2022-12-12 12:24:14 +01:00
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.roomHeaderName().should("contain", bot2Name);
|
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-06-30 11:44:56 +02:00
|
|
|
|
it("should find group DMs by usernames or user ids", () => {
|
|
|
|
|
// First we want to share a room with both bots to ensure we’ve got their usernames cached
|
|
|
|
|
cy.inviteUser(room1Id, bot2.getUserId());
|
|
|
|
|
|
|
|
|
|
// Starting a DM with ByteBot (will be turned into a group dm later)
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot2Name);
|
2023-07-18 10:26:54 +02:00
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", bot2Name);
|
|
|
|
|
cy.spotlightResults().eq(0).click();
|
2022-06-30 11:44:56 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-08-04 08:19:52 +02:00
|
|
|
|
// Send first message to actually start DM
|
|
|
|
|
cy.roomHeaderName().should("contain", bot2Name);
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("textbox", { name: "Send a message…" }).type("Hey!{enter}");
|
2022-08-04 08:19:52 +02:00
|
|
|
|
|
|
|
|
|
// Assert DM exists by checking for the first message and the room being in the room list
|
2022-10-12 19:59:07 +02:00
|
|
|
|
cy.contains(".mx_EventTile_body", "Hey!", { timeout: 30000 });
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("group", { name: "People" }).should("contain", bot2Name);
|
2022-08-04 08:19:52 +02:00
|
|
|
|
|
2022-06-30 11:44:56 +02:00
|
|
|
|
// Invite BotBob into existing DM with ByteBot
|
2022-08-22 12:11:24 +02:00
|
|
|
|
cy.getDmRooms(bot2.getUserId())
|
|
|
|
|
.should("have.length", 1)
|
2022-12-12 12:24:14 +01:00
|
|
|
|
.then((dmRooms) => cy.getClient().then((client) => client.getRoom(dmRooms[0])))
|
|
|
|
|
.then((groupDm) => {
|
2022-08-22 12:11:24 +02:00
|
|
|
|
cy.inviteUser(groupDm.roomId, bot1.getUserId());
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.roomHeaderName().should(($element) => expect($element.get(0).innerText).contains(groupDm.name));
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("group", { name: "People" }).should(($element) =>
|
2022-12-12 12:24:14 +01:00
|
|
|
|
expect($element.get(0).innerText).contains(groupDm.name),
|
|
|
|
|
);
|
2022-08-22 12:11:24 +02:00
|
|
|
|
|
|
|
|
|
// Search for BotBob by id, should return group DM and user
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot1.getUserId());
|
|
|
|
|
cy.wait(1000); // wait for the dialog code to settle
|
2023-07-18 10:26:54 +02:00
|
|
|
|
cy.spotlightResults().should("have.length", 2);
|
2022-09-30 10:54:47 +02:00
|
|
|
|
cy.contains(
|
|
|
|
|
".mx_SpotlightDialog_section.mx_SpotlightDialog_results .mx_SpotlightDialog_option",
|
|
|
|
|
groupDm.name,
|
2023-07-18 10:26:54 +02:00
|
|
|
|
);
|
2022-08-22 12:11:24 +02:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Search for ByteBot by id, should return group DM and user
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot2.getUserId());
|
|
|
|
|
cy.wait(1000); // wait for the dialog code to settle
|
2023-07-18 10:26:54 +02:00
|
|
|
|
cy.spotlightResults().should("have.length", 2);
|
2022-09-30 10:54:47 +02:00
|
|
|
|
cy.contains(
|
|
|
|
|
".mx_SpotlightDialog_section.mx_SpotlightDialog_results .mx_SpotlightDialog_option",
|
|
|
|
|
groupDm.name,
|
2023-07-18 10:26:54 +02:00
|
|
|
|
);
|
2022-08-22 12:11:24 +02:00
|
|
|
|
});
|
2022-06-30 11:44:56 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2022-08-12 00:26:25 +02:00
|
|
|
|
// Test against https://github.com/vector-im/element-web/issues/22851
|
|
|
|
|
it("should show each person result only once", () => {
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
|
|
|
|
|
// 2 rounds of search to simulate the bug conditions. Specifically, the first search
|
|
|
|
|
// should have 1 result (not 2) and the second search should also have 1 result (instead
|
|
|
|
|
// of the super buggy 3 described by https://github.com/vector-im/element-web/issues/22851)
|
|
|
|
|
//
|
|
|
|
|
// We search for user ID to trigger the profile lookup within the dialog.
|
|
|
|
|
for (let i = 0; i < 2; i++) {
|
|
|
|
|
cy.log("Iteration: " + i);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot1.getUserId());
|
|
|
|
|
cy.wait(1000); // wait for the dialog code to settle
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", bot1.getUserId());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
it("should allow opening group chat dialog", () => {
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.openSpotlightDialog()
|
|
|
|
|
.within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot2Name);
|
2023-07-18 10:26:54 +02:00
|
|
|
|
cy.wait(3000); // wait for the dialog code to settle
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
cy.spotlightResults().eq(0).should("contain", bot2Name);
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.get(".mx_SpotlightDialog_startGroupChat").should("contain", "Start a group chat");
|
|
|
|
|
cy.get(".mx_SpotlightDialog_startGroupChat").click();
|
|
|
|
|
})
|
|
|
|
|
.then(() => {
|
2023-04-17 16:06:20 +02:00
|
|
|
|
cy.findByRole("dialog").should("contain", "Direct Messages");
|
2022-12-12 12:24:14 +01:00
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
|
2022-07-06 14:07:10 +02:00
|
|
|
|
it("should close spotlight after starting a DM", () => {
|
|
|
|
|
cy.startDM(bot1Name);
|
|
|
|
|
cy.get(".mx_SpotlightDialog").should("have.length", 0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("should show the same user only once", () => {
|
|
|
|
|
cy.startDM(bot1Name);
|
|
|
|
|
cy.visit("/#/home");
|
|
|
|
|
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type(bot1Name);
|
2022-10-12 19:59:07 +02:00
|
|
|
|
cy.wait(3000); // wait for the dialog code to settle
|
2022-07-06 14:07:10 +02:00
|
|
|
|
cy.get(".mx_Spinner").should("not.exist");
|
|
|
|
|
cy.spotlightResults().should("have.length", 1);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2022-06-15 16:14:05 +02:00
|
|
|
|
it("should be able to navigate results via keyboard", () => {
|
|
|
|
|
cy.openSpotlightDialog().within(() => {
|
|
|
|
|
cy.spotlightFilter(Filter.People);
|
|
|
|
|
cy.spotlightSearch().clear().type("b");
|
2022-06-17 11:08:17 +02:00
|
|
|
|
// our debouncing logic only starts the search after a short timeout,
|
|
|
|
|
// so we wait a few milliseconds.
|
2022-07-13 15:43:44 +02:00
|
|
|
|
cy.wait(1000);
|
2022-12-12 12:24:14 +01:00
|
|
|
|
cy.get(".mx_Spinner")
|
|
|
|
|
.should("not.exist")
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults()
|
|
|
|
|
.should("have.length", 2)
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults().eq(0).should("have.attr", "aria-selected", "true");
|
|
|
|
|
cy.spotlightResults().eq(1).should("have.attr", "aria-selected", "false");
|
|
|
|
|
});
|
|
|
|
|
cy.spotlightSearch()
|
|
|
|
|
.type("{downArrow}")
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults().eq(0).should("have.attr", "aria-selected", "false");
|
|
|
|
|
cy.spotlightResults().eq(1).should("have.attr", "aria-selected", "true");
|
|
|
|
|
});
|
|
|
|
|
cy.spotlightSearch()
|
|
|
|
|
.type("{downArrow}")
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults().eq(0).should("have.attr", "aria-selected", "false");
|
|
|
|
|
cy.spotlightResults().eq(1).should("have.attr", "aria-selected", "false");
|
|
|
|
|
});
|
|
|
|
|
cy.spotlightSearch()
|
|
|
|
|
.type("{upArrow}")
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults().eq(0).should("have.attr", "aria-selected", "false");
|
|
|
|
|
cy.spotlightResults().eq(1).should("have.attr", "aria-selected", "true");
|
|
|
|
|
});
|
|
|
|
|
cy.spotlightSearch()
|
|
|
|
|
.type("{upArrow}")
|
|
|
|
|
.then(() => {
|
|
|
|
|
cy.spotlightResults().eq(0).should("have.attr", "aria-selected", "true");
|
|
|
|
|
cy.spotlightResults().eq(1).should("have.attr", "aria-selected", "false");
|
|
|
|
|
});
|
2022-06-17 11:08:17 +02:00
|
|
|
|
});
|
2022-06-15 16:14:05 +02:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|