Migrate analytics-toast.spec.ts from Cypress to Playwright (#11939)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
parent
6f50405e34
commit
40aa5ad0fb
4 changed files with 119 additions and 98 deletions
|
@ -1,98 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// <reference types="cypress" />
|
|
||||||
|
|
||||||
import { HomeserverInstance } from "../../plugins/utils/homeserver";
|
|
||||||
import Chainable = Cypress.Chainable;
|
|
||||||
|
|
||||||
function assertNoToasts(): void {
|
|
||||||
cy.get(".mx_Toast_toast").should("not.exist");
|
|
||||||
}
|
|
||||||
|
|
||||||
function getToast(expectedTitle: string): Chainable<JQuery> {
|
|
||||||
return cy.contains(".mx_Toast_toast h2", expectedTitle).should("exist").closest(".mx_Toast_toast");
|
|
||||||
}
|
|
||||||
|
|
||||||
function acceptToast(expectedTitle: string): void {
|
|
||||||
getToast(expectedTitle).within(() => {
|
|
||||||
cy.get(".mx_Toast_buttons .mx_AccessibleButton_kind_primary").click();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function rejectToast(expectedTitle: string): void {
|
|
||||||
getToast(expectedTitle).within(() => {
|
|
||||||
cy.get(".mx_Toast_buttons .mx_AccessibleButton_kind_danger_outline").click();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("Analytics Toast", () => {
|
|
||||||
let homeserver: HomeserverInstance;
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
cy.stopHomeserver(homeserver);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should not show an analytics toast if config has nothing about posthog", () => {
|
|
||||||
cy.intercept("/config.json?cachebuster=*", (req) => {
|
|
||||||
req.continue((res) => {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
const { posthog, ...body } = res.body;
|
|
||||||
res.send(200, body);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
cy.startHomeserver("default").then((data) => {
|
|
||||||
homeserver = data;
|
|
||||||
cy.initTestUser(homeserver, "Tod");
|
|
||||||
});
|
|
||||||
|
|
||||||
rejectToast("Notifications");
|
|
||||||
assertNoToasts();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("with posthog enabled", () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.intercept("/config.json?cachebuster=*", (req) => {
|
|
||||||
req.continue((res) => {
|
|
||||||
res.send(200, {
|
|
||||||
...res.body,
|
|
||||||
posthog: {
|
|
||||||
project_api_key: "foo",
|
|
||||||
api_host: "bar",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
cy.startHomeserver("default").then((data) => {
|
|
||||||
homeserver = data;
|
|
||||||
cy.initTestUser(homeserver, "Tod");
|
|
||||||
rejectToast("Notifications");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should show an analytics toast which can be accepted", () => {
|
|
||||||
acceptToast("Help improve Element");
|
|
||||||
assertNoToasts();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should show an analytics toast which can be rejected", () => {
|
|
||||||
rejectToast("Help improve Element");
|
|
||||||
assertNoToasts();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
53
playwright/e2e/toasts/analytics-toast.spec.ts
Normal file
53
playwright/e2e/toasts/analytics-toast.spec.ts
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
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 { test } from "../../element-web-test";
|
||||||
|
|
||||||
|
test.describe("Analytics Toast", () => {
|
||||||
|
test.use({
|
||||||
|
displayName: "Tod",
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should not show an analytics toast if config has nothing about posthog", async ({ user, toasts }) => {
|
||||||
|
await toasts.rejectToast("Notifications");
|
||||||
|
await toasts.assertNoToasts();
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe("with posthog enabled", () => {
|
||||||
|
test.use({
|
||||||
|
config: {
|
||||||
|
posthog: {
|
||||||
|
project_api_key: "foo",
|
||||||
|
api_host: "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
test.beforeEach(async ({ user, toasts }) => {
|
||||||
|
await toasts.rejectToast("Notifications");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should show an analytics toast which can be accepted", async ({ user, toasts }) => {
|
||||||
|
await toasts.acceptToast("Help improve Element");
|
||||||
|
await toasts.assertNoToasts();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("should show an analytics toast which can be rejected", async ({ user, toasts }) => {
|
||||||
|
await toasts.rejectToast("Help improve Element");
|
||||||
|
await toasts.assertNoToasts();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -24,6 +24,7 @@ import { Credentials, HomeserverInstance, StartHomeserverOpts } from "./plugins/
|
||||||
import { Synapse } from "./plugins/synapse";
|
import { Synapse } from "./plugins/synapse";
|
||||||
import { Instance } from "./plugins/mailhog";
|
import { Instance } from "./plugins/mailhog";
|
||||||
import { OAuthServer } from "./plugins/oauth_server";
|
import { OAuthServer } from "./plugins/oauth_server";
|
||||||
|
import { Toasts } from "./pages/toasts";
|
||||||
|
|
||||||
const CONFIG_JSON: Partial<IConfigOptions> = {
|
const CONFIG_JSON: Partial<IConfigOptions> = {
|
||||||
// This is deliberately quite a minimal config.json, so that we can test that the default settings
|
// This is deliberately quite a minimal config.json, so that we can test that the default settings
|
||||||
|
@ -60,6 +61,7 @@ export const test = base.extend<
|
||||||
};
|
};
|
||||||
displayName?: string;
|
displayName?: string;
|
||||||
mailhog?: { api: mailhog.API; instance: Instance };
|
mailhog?: { api: mailhog.API; instance: Instance };
|
||||||
|
toasts: Toasts;
|
||||||
}
|
}
|
||||||
>({
|
>({
|
||||||
crypto: ["legacy", { option: true }],
|
crypto: ["legacy", { option: true }],
|
||||||
|
@ -147,6 +149,10 @@ export const test = base.extend<
|
||||||
|
|
||||||
expect(results.violations).toEqual([]);
|
expect(results.violations).toEqual([]);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
toasts: async ({ page }, use) => {
|
||||||
|
await use(new Toasts(page));
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
test.use({});
|
test.use({});
|
||||||
|
|
60
playwright/pages/toasts.ts
Normal file
60
playwright/pages/toasts.ts
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
Copyright 2023 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 { Page, expect, Locator } from "@playwright/test";
|
||||||
|
|
||||||
|
export class Toasts {
|
||||||
|
public constructor(private readonly page: Page) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that a toast with the given title exists, and return it
|
||||||
|
*
|
||||||
|
* @param expectedTitle - Expected title of the toast
|
||||||
|
* @returns the Locator for the matching toast
|
||||||
|
*/
|
||||||
|
public async getToast(expectedTitle: string): Promise<Locator> {
|
||||||
|
const toast = this.page.locator(".mx_Toast_toast", { hasText: expectedTitle }).first();
|
||||||
|
await expect(toast).toBeVisible();
|
||||||
|
return toast;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that no toasts exist
|
||||||
|
*/
|
||||||
|
public async assertNoToasts(): Promise<void> {
|
||||||
|
await expect(this.page.locator(".mx_Toast_toast")).not.toBeVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accept a toast with the given title, only works for the first toast in the stack
|
||||||
|
*
|
||||||
|
* @param expectedTitle - Expected title of the toast
|
||||||
|
*/
|
||||||
|
public async acceptToast(expectedTitle: string): Promise<void> {
|
||||||
|
const toast = await this.getToast(expectedTitle);
|
||||||
|
await toast.locator(".mx_Toast_buttons .mx_AccessibleButton_kind_primary").click();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reject a toast with the given title, only works for the first toast in the stack
|
||||||
|
*
|
||||||
|
* @param expectedTitle - Expected title of the toast
|
||||||
|
*/
|
||||||
|
public async rejectToast(expectedTitle: string): Promise<void> {
|
||||||
|
const toast = await this.getToast(expectedTitle);
|
||||||
|
await toast.locator(".mx_Toast_buttons .mx_AccessibleButton_kind_danger_outline").click();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue