mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 20:03:37 +00:00
The description field in the Add New Feature modal is now a textarea instead of an input, allowing users to enter multi-line feature descriptions more easily. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
238 lines
7.6 KiB
TypeScript
238 lines
7.6 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
test.describe("New Project Workflow", () => {
|
|
test("opens new project dialog when clicking Create Project", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// Click the New Project card
|
|
await page.getByTestId("new-project-card").click();
|
|
|
|
// Dialog should appear
|
|
await expect(page.getByTestId("new-project-dialog")).toBeVisible();
|
|
await expect(page.getByText("Create New Project")).toBeVisible();
|
|
});
|
|
|
|
test("shows project name and directory inputs", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
|
|
// Check inputs exist
|
|
await expect(page.getByTestId("project-name-input")).toBeVisible();
|
|
await expect(page.getByTestId("project-path-input")).toBeVisible();
|
|
await expect(page.getByTestId("browse-directory")).toBeVisible();
|
|
});
|
|
|
|
test("create button is disabled without name and path", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
|
|
// Create button should be disabled
|
|
await expect(page.getByTestId("confirm-create-project")).toBeDisabled();
|
|
});
|
|
|
|
test("can enter project name", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
|
|
// Enter project name
|
|
await page.getByTestId("project-name-input").fill("my-test-project");
|
|
await expect(page.getByTestId("project-name-input")).toHaveValue(
|
|
"my-test-project"
|
|
);
|
|
});
|
|
|
|
test("can close dialog with cancel button", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
await expect(page.getByTestId("new-project-dialog")).toBeVisible();
|
|
|
|
// Close with cancel
|
|
await page.getByRole("button", { name: "Cancel" }).click();
|
|
await expect(page.getByTestId("new-project-dialog")).not.toBeVisible();
|
|
});
|
|
|
|
test("create button enables when name and path are entered", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
|
|
// Create button should be disabled initially
|
|
await expect(page.getByTestId("confirm-create-project")).toBeDisabled();
|
|
|
|
// Enter project name
|
|
await page.getByTestId("project-name-input").fill("my-test-project");
|
|
|
|
// Still disabled (no path)
|
|
await expect(page.getByTestId("confirm-create-project")).toBeDisabled();
|
|
|
|
// Enter path
|
|
await page.getByTestId("project-path-input").fill("/Users/test/projects");
|
|
|
|
// Now should be enabled
|
|
await expect(page.getByTestId("confirm-create-project")).toBeEnabled();
|
|
});
|
|
|
|
test("creates project and navigates to board view", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// Open dialog
|
|
await page.getByTestId("new-project-card").click();
|
|
await expect(page.getByTestId("new-project-dialog")).toBeVisible();
|
|
|
|
// Enter project details
|
|
await page.getByTestId("project-name-input").fill("test-new-project");
|
|
await page.getByTestId("project-path-input").fill("/Users/test/projects");
|
|
|
|
// Click create
|
|
await page.getByTestId("confirm-create-project").click();
|
|
|
|
// Dialog should close
|
|
await expect(page.getByTestId("new-project-dialog")).not.toBeVisible();
|
|
|
|
// Should navigate to board view with the project
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
|
|
// Project name should be displayed in the board view header
|
|
await expect(
|
|
page.getByTestId("board-view").getByText("test-new-project")
|
|
).toBeVisible();
|
|
|
|
// Kanban columns should be visible
|
|
await expect(page.getByText("Backlog")).toBeVisible();
|
|
await expect(page.getByText("In Progress")).toBeVisible();
|
|
await expect(page.getByText("Verified")).toBeVisible();
|
|
});
|
|
|
|
test("created project appears in recent projects on welcome view", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// Create a project
|
|
await page.getByTestId("new-project-card").click();
|
|
await page.getByTestId("project-name-input").fill("recent-project-test");
|
|
await page.getByTestId("project-path-input").fill("/Users/test/projects");
|
|
await page.getByTestId("confirm-create-project").click();
|
|
|
|
// Verify we're on board view
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
|
|
// Go back to welcome view by clicking Automaker title (if there's a way)
|
|
// For now, reload the page and check recent projects
|
|
await page.goto("/");
|
|
|
|
// The project should appear in recent projects section (use role to be specific)
|
|
await expect(
|
|
page.getByRole("heading", { name: "Recent Projects" })
|
|
).toBeVisible();
|
|
await expect(
|
|
page
|
|
.getByTestId("welcome-view")
|
|
.getByText("recent-project-test", { exact: true })
|
|
).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test.describe("Open Project Workflow", () => {
|
|
test("clicking Open Project triggers directory selection", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// In web mode, clicking Open Project card will show a prompt dialog
|
|
// We can't fully test native dialogs, but we can verify the click works
|
|
await expect(page.getByTestId("open-project-card")).toBeVisible();
|
|
});
|
|
|
|
test("opens existing project and navigates to board view", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// Mock the window.prompt response
|
|
await page.evaluate(() => {
|
|
window.prompt = () => "/mock/existing-project";
|
|
});
|
|
|
|
// Click Open Project card
|
|
await page.getByTestId("open-project-card").click();
|
|
|
|
// Should navigate to board view
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
|
|
// Project name should be derived from path
|
|
await expect(
|
|
page.getByTestId("board-view").getByText("existing-project")
|
|
).toBeVisible();
|
|
});
|
|
|
|
test("opened project loads into dashboard with features", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("/");
|
|
|
|
// Mock the window.prompt response
|
|
await page.evaluate(() => {
|
|
window.prompt = () => "/mock/existing-project";
|
|
});
|
|
|
|
// Click Open Project
|
|
await page.getByTestId("open-project-card").click();
|
|
|
|
// Should show board view
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
|
|
// Should have loaded features from the mock .automaker/feature_list.json
|
|
// The mock returns "Sample Feature" in backlog
|
|
await expect(
|
|
page.getByTestId("kanban-column-backlog").getByText("Sample Feature")
|
|
).toBeVisible();
|
|
});
|
|
|
|
test("can click on recent project to reopen it", async ({ page }) => {
|
|
await page.goto("/");
|
|
|
|
// First, create a project to have it in recent projects
|
|
await page.getByTestId("new-project-card").click();
|
|
await page.getByTestId("project-name-input").fill("reopenable-project");
|
|
await page.getByTestId("project-path-input").fill("/Users/test/projects");
|
|
await page.getByTestId("confirm-create-project").click();
|
|
|
|
// Verify on board view
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
|
|
// Go back to welcome view
|
|
await page.goto("/");
|
|
|
|
// Wait for recent projects to appear
|
|
await expect(
|
|
page.getByRole("heading", { name: "Recent Projects" })
|
|
).toBeVisible();
|
|
|
|
// Click on the recent project
|
|
const recentProjectCard = page
|
|
.getByText("reopenable-project", { exact: true })
|
|
.first();
|
|
await recentProjectCard.click();
|
|
|
|
// Should navigate to board view with that project
|
|
await expect(page.getByTestId("board-view")).toBeVisible();
|
|
await expect(
|
|
page.getByTestId("board-view").getByText("reopenable-project")
|
|
).toBeVisible();
|
|
});
|
|
});
|