Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>t3chguy/playwright-homeservers
parent
e4cff3fba0
commit
4142c809a3
|
@ -69,29 +69,15 @@ async function sendActionFromIntegrationManager(
|
||||||
await iframe.getByRole("button", { name: "Press to send action" }).click();
|
await iframe.getByRole("button", { name: "Press to send action" }).click();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function clickUntilGone(page: Page, selector: string, attempt = 0) {
|
|
||||||
if (attempt === 11) {
|
|
||||||
throw new Error("clickUntilGone attempt count exceeded");
|
|
||||||
}
|
|
||||||
|
|
||||||
await page.locator(selector).last().click();
|
|
||||||
|
|
||||||
const count = await page.locator(selector).count();
|
|
||||||
if (count > 0) {
|
|
||||||
return clickUntilGone(page, selector, ++attempt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function expectKickedMessage(page: Page, shouldExist: boolean) {
|
async function expectKickedMessage(page: Page, shouldExist: boolean) {
|
||||||
// Expand any event summaries, we can't use a click multiple here because clicking one might de-render others
|
await expect(async () => {
|
||||||
// This is quite horrible but seems the most stable way of clicking 0-N buttons,
|
await page.locator(".mx_GenericEventListSummary_toggle[aria-expanded=false]").last().click();
|
||||||
// one at a time with a full re-evaluation after each click
|
await expect(page.getByText(`${USER_DISPLAY_NAME} removed ${BOT_DISPLAY_NAME}: ${KICK_REASON}`)).toBeVisible({
|
||||||
await clickUntilGone(page, ".mx_GenericEventListSummary_toggle[aria-expanded=false]");
|
visible: shouldExist,
|
||||||
|
});
|
||||||
|
}).toPass();
|
||||||
|
|
||||||
// Check for the event message (or lack thereof)
|
// Check for the event message (or lack thereof)
|
||||||
await expect(page.getByText(`${USER_DISPLAY_NAME} removed ${BOT_DISPLAY_NAME}: ${KICK_REASON}`)).toBeVisible({
|
|
||||||
visible: shouldExist,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test.describe("Integration Manager: Kick", () => {
|
test.describe("Integration Manager: Kick", () => {
|
||||||
|
|
|
@ -121,7 +121,7 @@ export class Bot extends Client {
|
||||||
return logger as unknown as Logger;
|
return logger as unknown as Logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
const logger = getLogger(`cypress bot ${credentials.userId}`);
|
const logger = getLogger(`playwright bot ${credentials.userId}`);
|
||||||
|
|
||||||
const keys = {};
|
const keys = {};
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ class StaleScreenshotReporter implements Reporter {
|
||||||
private success = true;
|
private success = true;
|
||||||
|
|
||||||
public onTestEnd(test: TestCase): void {
|
public onTestEnd(test: TestCase): void {
|
||||||
|
if (!test.ok()) return;
|
||||||
for (const annotation of test.annotations) {
|
for (const annotation of test.annotations) {
|
||||||
if (annotation.type === "_screenshot") {
|
if (annotation.type === "_screenshot") {
|
||||||
this.screenshots.add(annotation.description);
|
this.screenshots.add(annotation.description);
|
||||||
|
|
|
@ -107,9 +107,8 @@ function textForMemberEvent(
|
||||||
allowJSX: boolean,
|
allowJSX: boolean,
|
||||||
showHiddenEvents?: boolean,
|
showHiddenEvents?: boolean,
|
||||||
): (() => string) | null {
|
): (() => string) | null {
|
||||||
// XXX: SYJS-16 "sender is sometimes null for join messages"
|
const senderName = getRoomMemberDisplayname(client, ev);
|
||||||
const senderName = ev.sender?.name || getRoomMemberDisplayname(client, ev);
|
const targetName = getRoomMemberDisplayname(client, ev, ev.getStateKey());
|
||||||
const targetName = ev.target?.name || getRoomMemberDisplayname(client, ev, ev.getStateKey());
|
|
||||||
const prevContent = ev.getPrevContent();
|
const prevContent = ev.getPrevContent();
|
||||||
const content = ev.getContent();
|
const content = ev.getContent();
|
||||||
const reason = content.reason;
|
const reason = content.reason;
|
||||||
|
|
|
@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { MatrixEvent } from "matrix-js-sdk/src/matrix";
|
import { MatrixEvent, RoomMember, RoomMemberEvent } from "matrix-js-sdk/src/matrix";
|
||||||
|
|
||||||
import RoomContext from "../../../contexts/RoomContext";
|
import RoomContext from "../../../contexts/RoomContext";
|
||||||
import * as TextForEvent from "../../../TextForEvent";
|
import * as TextForEvent from "../../../TextForEvent";
|
||||||
|
@ -21,6 +21,20 @@ export default class TextualEvent extends React.Component<IProps> {
|
||||||
public static contextType = RoomContext;
|
public static contextType = RoomContext;
|
||||||
declare public context: React.ContextType<typeof RoomContext>;
|
declare public context: React.ContextType<typeof RoomContext>;
|
||||||
|
|
||||||
|
public componentDidMount(): void {
|
||||||
|
MatrixClientPeg.get()?.on(RoomMemberEvent.Name, this.onMemberNameUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public componentWillUnmount(): void {
|
||||||
|
MatrixClientPeg.get()?.off(RoomMemberEvent.Name, this.onMemberNameUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onMemberNameUpdate = (event: MatrixEvent, member: RoomMember): void => {
|
||||||
|
if (member.userId === this.props.mxEvent.getSender() || member.userId === this.props.mxEvent.getStateKey()) {
|
||||||
|
this.forceUpdate();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public render(): React.ReactNode {
|
public render(): React.ReactNode {
|
||||||
const text = TextForEvent.textForEvent(
|
const text = TextForEvent.textForEvent(
|
||||||
this.props.mxEvent,
|
this.props.mxEvent,
|
||||||
|
|
Loading…
Reference in New Issue