mirror of
https://github.com/block/buzz.git
synced 2026-10-27 04:30:52 +00:00
158 lines
5.2 KiB
TypeScript
158 lines
5.2 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import { installMockBridge } from "../helpers/bridge";
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
await installMockBridge(page);
|
|
});
|
|
|
|
async function navigateToWorkflows(page: import("@playwright/test").Page) {
|
|
await page.goto("/");
|
|
await page.getByTestId("open-workflows-view").click();
|
|
await expect(page.getByTestId("workflows-view")).toBeVisible();
|
|
}
|
|
|
|
async function createWorkflow(
|
|
page: import("@playwright/test").Page,
|
|
name: string,
|
|
) {
|
|
await page.getByRole("button", { name: "Create Workflow" }).click();
|
|
await expect(page.getByRole("dialog")).toBeVisible();
|
|
|
|
// Fill the form — name field
|
|
await page.getByLabel("Workflow name").fill(name);
|
|
|
|
// Add a step
|
|
await page.getByRole("button", { name: "Add step" }).click();
|
|
|
|
// Submit
|
|
await page
|
|
.getByRole("dialog")
|
|
.getByRole("button", { name: "Create" })
|
|
.click();
|
|
|
|
// Wait for dialog to close
|
|
await expect(page.getByRole("dialog")).not.toBeVisible();
|
|
}
|
|
|
|
test("navigates to workflows view and shows empty state", async ({ page }) => {
|
|
await navigateToWorkflows(page);
|
|
|
|
await expect(page.getByText("No workflows yet")).toBeVisible();
|
|
await expect(
|
|
page.getByRole("button", { name: "Create your first workflow" }),
|
|
).toBeVisible();
|
|
});
|
|
|
|
test("creates a workflow via the form builder", async ({ page }) => {
|
|
const workflowName = `test_workflow_${Date.now()}`;
|
|
|
|
await navigateToWorkflows(page);
|
|
await createWorkflow(page, workflowName);
|
|
|
|
// Verify workflow appears in the list
|
|
await expect(page.getByTestId("workflows-view")).toContainText(workflowName);
|
|
});
|
|
|
|
test("edits an existing workflow", async ({ page }) => {
|
|
const originalName = `edit_test_${Date.now()}`;
|
|
const updatedName = `${originalName}_updated`;
|
|
|
|
await navigateToWorkflows(page);
|
|
await createWorkflow(page, originalName);
|
|
|
|
// Verify it exists
|
|
await expect(page.getByTestId("workflows-view")).toContainText(originalName);
|
|
|
|
// Open the dropdown menu and click Edit
|
|
await page.getByRole("button", { name: "Workflow actions" }).first().click();
|
|
await page.getByRole("menuitem", { name: "Edit" }).click();
|
|
|
|
// Dialog should open in edit mode
|
|
await expect(page.getByRole("dialog")).toBeVisible();
|
|
await expect(page.getByText("Edit Workflow")).toBeVisible();
|
|
|
|
// Change the name
|
|
const nameInput = page.getByLabel("Workflow name");
|
|
await nameInput.clear();
|
|
await nameInput.fill(updatedName);
|
|
|
|
// Save
|
|
await page.getByRole("button", { name: "Save" }).click();
|
|
await expect(page.getByRole("dialog")).not.toBeVisible();
|
|
|
|
// Verify the updated name appears
|
|
await expect(page.getByTestId("workflows-view")).toContainText(updatedName);
|
|
});
|
|
|
|
test("duplicates a workflow", async ({ page }) => {
|
|
const originalName = `dup_test_${Date.now()}`;
|
|
|
|
await navigateToWorkflows(page);
|
|
await createWorkflow(page, originalName);
|
|
|
|
// Open the dropdown menu and click Duplicate
|
|
await page.getByRole("button", { name: "Workflow actions" }).first().click();
|
|
await page.getByRole("menuitem", { name: "Duplicate" }).click();
|
|
|
|
// Dialog should open in duplicate mode with "(copy)" suffix
|
|
await expect(page.getByRole("dialog")).toBeVisible();
|
|
await expect(page.getByText("Duplicate Workflow")).toBeVisible();
|
|
|
|
// Submit the duplicate
|
|
await page.getByRole("button", { name: "Create Copy" }).click();
|
|
await expect(page.getByRole("dialog")).not.toBeVisible();
|
|
|
|
// Both the original and copy should exist
|
|
await expect(page.getByTestId("workflows-view")).toContainText(originalName);
|
|
});
|
|
|
|
test("deletes a workflow with confirmation", async ({ page }) => {
|
|
const workflowName = `delete_test_${Date.now()}`;
|
|
|
|
await navigateToWorkflows(page);
|
|
await createWorkflow(page, workflowName);
|
|
|
|
// Verify it exists
|
|
await expect(page.getByTestId("workflows-view")).toContainText(workflowName);
|
|
|
|
// Open the dropdown menu and click Delete
|
|
await page.getByRole("button", { name: "Workflow actions" }).first().click();
|
|
await page.getByRole("menuitem", { name: "Delete" }).click();
|
|
|
|
// Confirmation dialog should appear with workflow name
|
|
await expect(page.getByRole("alertdialog")).toBeVisible();
|
|
await expect(page.getByRole("alertdialog")).toContainText(workflowName);
|
|
|
|
// Confirm deletion
|
|
await page.getByRole("button", { name: "Delete" }).click();
|
|
await expect(page.getByRole("alertdialog")).not.toBeVisible();
|
|
|
|
// Verify workflow is gone — back to empty state
|
|
await expect(page.getByText("No workflows yet")).toBeVisible();
|
|
});
|
|
|
|
test("triggers a workflow from the detail panel", async ({ page }) => {
|
|
const workflowName = `trigger_test_${Date.now()}`;
|
|
|
|
await navigateToWorkflows(page);
|
|
await createWorkflow(page, workflowName);
|
|
|
|
// Click on the workflow card to open the detail panel
|
|
await page.getByRole("button", { name: `View ${workflowName}` }).click();
|
|
await expect(page.getByTestId("workflow-detail-panel")).toBeVisible();
|
|
|
|
// Click the Trigger button
|
|
await page
|
|
.getByTestId("workflow-detail-panel")
|
|
.getByRole("button", { name: "Trigger" })
|
|
.click();
|
|
|
|
// Wait for the trigger to complete (button text changes back from "Triggering...")
|
|
await expect(
|
|
page
|
|
.getByTestId("workflow-detail-panel")
|
|
.getByRole("button", { name: "Trigger" }),
|
|
).toBeVisible();
|
|
});
|