126 lines
4.2 KiB
TypeScript
126 lines
4.2 KiB
TypeScript
import { expect, type Locator, type Page } from "@playwright/test";
|
|
import { navigateHydrated, waitForWorkspaceHydration } from "./ready";
|
|
|
|
export class VitalsPage {
|
|
readonly bodyHeading: Locator;
|
|
readonly environmentHeading: Locator;
|
|
readonly systems: Locator;
|
|
readonly history: Locator;
|
|
readonly healthMenuButton: Locator;
|
|
readonly healthNavigation: Locator;
|
|
readonly bodySystems: Locator;
|
|
readonly trendMetrics: Locator;
|
|
readonly refreshedStatus: Locator;
|
|
readonly targetTemperature: Locator;
|
|
readonly coolButton: Locator;
|
|
readonly autoButton: Locator;
|
|
readonly purifierOnButton: Locator;
|
|
readonly purifierOffButton: Locator;
|
|
|
|
constructor(readonly page: Page) {
|
|
this.bodyHeading = page.getByRole("heading", { name: "Body", exact: true });
|
|
this.environmentHeading = page.getByRole("heading", { name: "Environment", exact: true });
|
|
this.systems = page.getByTestId("vital-system-card");
|
|
this.history = page.getByTestId("vital-history");
|
|
this.healthMenuButton = page.getByRole("button", { name: "Open Health menu" });
|
|
this.healthNavigation = page.getByRole("complementary", { name: "Health navigation" });
|
|
this.bodySystems = page.getByRole("group", { name: "Body systems", exact: true });
|
|
this.trendMetrics = page.getByRole("group", { name: "Trend metric" });
|
|
this.refreshedStatus = page
|
|
.getByRole("status")
|
|
.filter({ hasText: "Sample readings refreshed" });
|
|
this.targetTemperature = page.getByRole("slider", { name: "Target temperature" });
|
|
this.coolButton = page.getByRole("button", { name: "Cool", exact: true });
|
|
this.autoButton = page.getByRole("button", { name: "Auto", exact: true });
|
|
this.purifierOnButton = page.getByRole("button", { name: "Air purifier · On" });
|
|
this.purifierOffButton = page.getByRole("button", { name: "Air purifier · Off" });
|
|
}
|
|
|
|
async goTo(search = "") {
|
|
await navigateHydrated(this.page, `/vitals${search}`);
|
|
if (new URL(this.page.url()).pathname === "/vitals") await this.waitUntilReady();
|
|
}
|
|
|
|
async reload() {
|
|
await Promise.all([waitForWorkspaceHydration(this.page), this.page.reload()]);
|
|
}
|
|
|
|
async waitUntilReady() {
|
|
await expect(this.bodyHeading.or(this.environmentHeading)).toBeVisible();
|
|
}
|
|
|
|
async navigateTo(section: "Body" | "Environment") {
|
|
if (await this.healthMenuButton.isVisible()) await this.healthMenuButton.click();
|
|
await this.healthNavigation.getByRole("button", { name: section, exact: true }).click();
|
|
}
|
|
|
|
async selectSystem(name: string) {
|
|
await this.bodySystems.getByRole("button", { name, exact: true }).click();
|
|
}
|
|
|
|
async openFirstSystem() {
|
|
await this.systems.first().click();
|
|
}
|
|
|
|
systemDialog(name: string) {
|
|
return this.page.getByRole("dialog", { name });
|
|
}
|
|
|
|
async closeSystem(name: string) {
|
|
await this.systemDialog(name)
|
|
.getByRole("button", { name: "Close", exact: true })
|
|
.last()
|
|
.click();
|
|
}
|
|
|
|
async showLabHistory() {
|
|
await this.page.getByRole("button", { name: "Lab history", exact: true }).click();
|
|
}
|
|
|
|
async showSystems() {
|
|
await this.page.getByRole("button", { name: "Systems", exact: true }).click();
|
|
}
|
|
|
|
async selectTrendPeriod(period: string) {
|
|
await this.page.getByRole("button", { name: period, exact: true }).click();
|
|
}
|
|
|
|
async selectTrendMetric(name: string) {
|
|
await this.trendMetrics.getByRole("button", { name, exact: true }).click();
|
|
}
|
|
|
|
trendChart(period: string, metric: string) {
|
|
return this.page.getByRole("img", {
|
|
name: `${period} ${metric} simulated environmental readings`,
|
|
});
|
|
}
|
|
|
|
async openMetric(name: string) {
|
|
await this.page.getByTestId("vital-metric").filter({ hasText: name }).click();
|
|
}
|
|
|
|
metricDialog(name: string) {
|
|
return this.page.getByRole("dialog", { name });
|
|
}
|
|
|
|
async closeMetric(name: string) {
|
|
await this.metricDialog(name).getByRole("button", { name: "Back to overview" }).click();
|
|
}
|
|
|
|
async syncReadings() {
|
|
await this.page.getByRole("button", { name: "Sync now", exact: true }).click();
|
|
}
|
|
|
|
async openClimateControl() {
|
|
await this.page.getByRole("button", { name: "Climate control", exact: true }).click();
|
|
}
|
|
|
|
async enableCooling() {
|
|
await this.coolButton.click();
|
|
}
|
|
|
|
async turnOffPurifier() {
|
|
await this.purifierOnButton.click();
|
|
}
|
|
}
|