75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import { expect, type Locator, type Page } from "@playwright/test";
|
|
import { navigateHydrated } from "./ready";
|
|
|
|
export class ReaderPage {
|
|
readonly rows: Locator;
|
|
readonly searchInput: Locator;
|
|
readonly articleTitle: Locator;
|
|
readonly workspace: Locator;
|
|
readonly emptyState: Locator;
|
|
readonly forYouLabel: Locator;
|
|
readonly mockLabel: Locator;
|
|
readonly articleExplanation: Locator;
|
|
readonly legacyFilters: Locator;
|
|
readonly editInterestsButton: Locator;
|
|
readonly backButton: Locator;
|
|
readonly clearSearchButton: Locator;
|
|
|
|
constructor(readonly page: Page) {
|
|
this.rows = page.getByTestId("inbox-article-row");
|
|
this.searchInput = page.getByRole("textbox", { name: "Search articles" });
|
|
this.articleTitle = page.getByTestId("inbox-article-title");
|
|
this.workspace = page.getByTestId("inbox-workspace");
|
|
this.emptyState = page.getByText("No articles found", { exact: true });
|
|
this.forYouLabel = page.getByText("FOR YOU", { exact: true });
|
|
this.mockLabel = page.getByText("Mock", { exact: true });
|
|
this.articleExplanation = page.getByText("Why this article", { exact: true });
|
|
this.legacyFilters = page.getByRole("button", { name: /For you|Read later|Unread only/ });
|
|
this.editInterestsButton = page.getByRole("button", { name: "Edit interests", exact: true });
|
|
this.backButton = page.getByRole("button", { name: "Back to articles" });
|
|
this.clearSearchButton = page.getByRole("button", { name: "Clear search" });
|
|
}
|
|
|
|
async goTo(search = "") {
|
|
await navigateHydrated(this.page, `/inbox${search}`);
|
|
if (new URL(this.page.url()).pathname === "/inbox")
|
|
await expect(this.searchInput).toBeVisible();
|
|
}
|
|
|
|
article(title: string) {
|
|
return this.page.getByRole("article", { name: title, exact: true });
|
|
}
|
|
|
|
articleHeading(title: string) {
|
|
return this.article(title).getByRole("heading", { name: title, exact: true });
|
|
}
|
|
|
|
articleText(title: string, text: string) {
|
|
return this.article(title).getByText(text);
|
|
}
|
|
|
|
rowTitle(index: number) {
|
|
return this.rows.nth(index).getByTestId("inbox-row-title");
|
|
}
|
|
|
|
async selectArticle(title: string) {
|
|
await this.rows.filter({ hasText: title }).click();
|
|
}
|
|
|
|
async openFirstArticle() {
|
|
await this.rows.first().click();
|
|
}
|
|
|
|
async backToArticles() {
|
|
if (await this.backButton.isVisible()) await this.backButton.click();
|
|
}
|
|
|
|
async search(query: string) {
|
|
await this.searchInput.fill(query);
|
|
}
|
|
|
|
async clearSearch() {
|
|
await this.clearSearchButton.click();
|
|
}
|
|
}
|