mirror of
https://github.com/warmbly/warmbly.git
synced 2026-10-17 00:02:47 +00:00
54 lines
2.8 KiB
TypeScript
54 lines
2.8 KiB
TypeScript
import type { Page } from "@playwright/test";
|
|
import { env } from "../lib/env.ts";
|
|
import { expect, test } from "../lib/proof.ts";
|
|
|
|
// The Advisor evaluates in the background; ask for a run so a fresh seed has findings to suggest.
|
|
async function evaluateAdvisor(page: Page) {
|
|
await page.evaluate(async (api) => {
|
|
const token = JSON.parse(localStorage.getItem("auth_token") ?? "{}").access_token;
|
|
await fetch(`${api}/v1/advisor/refresh`, { method: "POST", headers: { Authorization: `Bearer ${token}` } });
|
|
}, env.apiURL);
|
|
}
|
|
|
|
test("Remie opens as a floating window and suggests fixes for what the Advisor found", async ({ page, proof }) => {
|
|
await page.goto("/app/emails");
|
|
await expect(page.getByRole("row", { name: /dev\.outbound@warmbly\.test/ })).toBeVisible();
|
|
await evaluateAdvisor(page);
|
|
await page.reload();
|
|
await expect(page.getByRole("row", { name: /dev\.outbound@warmbly\.test/ })).toBeVisible();
|
|
await proof.chapter("Remie", "The assistant opens as a floating window with fixes for what the Advisor measured");
|
|
|
|
await page.getByRole("button", { name: "Ask Remie" }).click();
|
|
await expect(page.getByText("Hi, I'm Remie")).toBeVisible();
|
|
await expect(page.getByText("Suggested for you")).toBeVisible();
|
|
await proof.dwell(1200);
|
|
await proof.shot("remie-suggestions", { caption: "Remie floats over the page and suggests fixes found in this workspace" });
|
|
});
|
|
|
|
test("A Remie run shows live status, folded tool steps, an approval and the answer", async ({ page, proof }) => {
|
|
await page.goto("/app/emails");
|
|
await expect(page.getByRole("row", { name: /dev\.outbound@warmbly\.test/ })).toBeVisible();
|
|
await page.getByRole("button", { name: "Ask Remie" }).click();
|
|
await expect(page.getByText("Hi, I'm Remie")).toBeVisible();
|
|
await proof.chapter("A Remie run", "A scripted run (dev builds only) through the same rendering a live run uses");
|
|
|
|
const composer = page.getByPlaceholder(/Ask Remie about/);
|
|
await composer.pressSequentially("/demo", { delay: 60 });
|
|
await composer.press("Enter");
|
|
await expect(page.getByText("Reading campaign stats").first()).toBeVisible();
|
|
await proof.shot("remie-working", {
|
|
caption: "While Remie works: a live status with a timer, and each tool step as it runs",
|
|
ignore: [page.getByText(/^\d+\.\ds$/)],
|
|
});
|
|
|
|
const approve = page.getByRole("button", { name: "Approve", exact: true });
|
|
await expect(approve).toBeVisible({ timeout: 20_000 });
|
|
await proof.dwell(1500);
|
|
await proof.shot("remie-approval", { caption: "Steps fold away, the answer streams in, and a change waits for approval" });
|
|
|
|
await approve.click();
|
|
await expect(page.getByText(/is paused and nothing else was changed/)).toBeVisible({ timeout: 15_000 });
|
|
await proof.dwell(1200);
|
|
await proof.shot("remie-done", { caption: "Approved: the change runs and Remie reports back" });
|
|
});
|