mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-30 06:12:03 +00:00
259 lines
11 KiB
TypeScript
259 lines
11 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
test.describe("Interactive New Project Interview", () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto("/");
|
|
});
|
|
|
|
test("Step 1: Click 'New Project' -> 'Interactive Mode'", async ({ page }) => {
|
|
// Click the Create Project button to open the dropdown
|
|
await page.getByTestId("create-new-project").click();
|
|
|
|
// Verify the dropdown menu is visible
|
|
await expect(page.getByTestId("interactive-mode-option")).toBeVisible();
|
|
await expect(page.getByTestId("quick-setup-option")).toBeVisible();
|
|
|
|
// Click on Interactive Mode
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Verify we navigate to the interview view
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
});
|
|
|
|
test("Step 2: Chat interface appears asking 'What do you want to build?'", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Verify interview view is displayed
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
|
|
// Verify the chat interface is present
|
|
await expect(page.getByTestId("interview-messages")).toBeVisible();
|
|
await expect(page.getByTestId("interview-input")).toBeVisible();
|
|
|
|
// Verify the first question is asking what to build
|
|
await expect(page.getByText("What do you want to build?")).toBeVisible();
|
|
});
|
|
|
|
test("Step 3: User replies 'A todo app'", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Wait for interview view
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
|
|
// Type a response
|
|
await page.getByTestId("interview-input").fill("A todo app");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Verify user message appears in chat
|
|
await expect(page.getByText("A todo app")).toBeVisible();
|
|
});
|
|
|
|
test("Step 4: Agent asks clarifying questions (e.g. 'What tech stack?')", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Wait for interview view
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
|
|
// Answer first question
|
|
await page.getByTestId("interview-input").fill("A todo app with tasks and categories");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for the next question about tech stack
|
|
await expect(page.getByText("What tech stack would you like to use?")).toBeVisible({ timeout: 3000 });
|
|
});
|
|
|
|
test("Step 5: Agent generates draft app_spec.txt based on conversation", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Wait for interview view
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
|
|
// Answer all questions
|
|
// Question 1: What do you want to build?
|
|
await page.getByTestId("interview-input").fill("A todo app");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for question 2
|
|
await expect(page.getByText("What tech stack would you like to use?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 2: Tech stack
|
|
await page.getByTestId("interview-input").fill("React, TypeScript, Tailwind CSS");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for question 3
|
|
await expect(page.getByText("What are the core features you want to include?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 3: Core features
|
|
await page.getByTestId("interview-input").fill("Add tasks, Mark complete, Delete tasks, Categories");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for question 4
|
|
await expect(page.getByText("Any additional requirements or preferences?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 4: Additional requirements
|
|
await page.getByTestId("interview-input").fill("Mobile responsive, Dark mode support");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for spec generation
|
|
await expect(page.getByText("Generating specification")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Wait for project setup form to appear
|
|
await expect(page.getByTestId("project-setup-form")).toBeVisible({ timeout: 5000 });
|
|
|
|
// Verify spec preview contains expected content
|
|
await expect(page.getByTestId("spec-preview")).toBeVisible();
|
|
await expect(page.getByTestId("spec-preview")).toContainText("project_specification");
|
|
await expect(page.getByTestId("spec-preview")).toContainText("A todo app");
|
|
|
|
// Verify we can enter project name and path
|
|
await expect(page.getByTestId("interview-project-name-input")).toBeVisible();
|
|
await expect(page.getByTestId("interview-project-path-input")).toBeVisible();
|
|
});
|
|
|
|
test("shows progress indicator throughout interview", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Verify header shows question count
|
|
await expect(page.getByText("Question 1 of 4")).toBeVisible();
|
|
|
|
// Answer first question
|
|
await page.getByTestId("interview-input").fill("A todo app");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Verify progress updates
|
|
await expect(page.getByText("Question 2 of 4")).toBeVisible({ timeout: 3000 });
|
|
});
|
|
|
|
test("can navigate back to welcome view", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Verify interview view is displayed
|
|
await expect(page.getByTestId("interview-view")).toBeVisible();
|
|
|
|
// Click back button
|
|
await page.getByTestId("interview-back-button").click();
|
|
|
|
// Verify we're back at welcome view
|
|
await expect(page.getByTestId("welcome-view")).toBeVisible();
|
|
});
|
|
|
|
test("dropdown shows both Quick Setup and Interactive Mode options", async ({ page }) => {
|
|
// Click the Create Project button
|
|
await page.getByTestId("create-new-project").click();
|
|
|
|
// Verify both options are present
|
|
await expect(page.getByTestId("quick-setup-option")).toBeVisible();
|
|
await expect(page.getByText("Quick Setup")).toBeVisible();
|
|
|
|
await expect(page.getByTestId("interactive-mode-option")).toBeVisible();
|
|
await expect(page.getByText("Interactive Mode")).toBeVisible();
|
|
});
|
|
|
|
test("Quick Setup option opens the original new project dialog", async ({ page }) => {
|
|
// Click the Create Project button
|
|
await page.getByTestId("create-new-project").click();
|
|
|
|
// Click Quick Setup
|
|
await page.getByTestId("quick-setup-option").click();
|
|
|
|
// Verify the original dialog appears
|
|
await expect(page.getByTestId("new-project-dialog")).toBeVisible();
|
|
await expect(page.getByText("Create New Project")).toBeVisible();
|
|
});
|
|
|
|
test("can create project after completing interview", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Complete all interview questions
|
|
// Question 1
|
|
await page.getByTestId("interview-input").fill("A todo app");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("What tech stack would you like to use?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 2
|
|
await page.getByTestId("interview-input").fill("React, Node.js");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("What are the core features you want to include?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 3
|
|
await page.getByTestId("interview-input").fill("Add tasks, Delete tasks");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("Any additional requirements or preferences?")).toBeVisible({ timeout: 3000 });
|
|
|
|
// Question 4
|
|
await page.getByTestId("interview-input").fill("None");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for project setup form
|
|
await expect(page.getByTestId("project-setup-form")).toBeVisible({ timeout: 5000 });
|
|
|
|
// Fill in project details
|
|
await page.getByTestId("interview-project-name-input").fill("my-todo-app");
|
|
await page.getByTestId("interview-project-path-input").fill("/Users/test/projects");
|
|
|
|
// Create project button should be enabled
|
|
await expect(page.getByTestId("interview-create-project")).toBeEnabled();
|
|
|
|
// Click create project
|
|
await page.getByTestId("interview-create-project").click();
|
|
|
|
// Should navigate to board view with the new project
|
|
await expect(page.getByTestId("board-view")).toBeVisible({ timeout: 5000 });
|
|
});
|
|
|
|
test("create project button is disabled without name and path", async ({ page }) => {
|
|
// Navigate to interview view
|
|
await page.getByTestId("create-new-project").click();
|
|
await page.getByTestId("interactive-mode-option").click();
|
|
|
|
// Complete all interview questions quickly
|
|
await page.getByTestId("interview-input").fill("A todo app");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("What tech stack")).toBeVisible({ timeout: 3000 });
|
|
|
|
await page.getByTestId("interview-input").fill("React");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("core features")).toBeVisible({ timeout: 3000 });
|
|
|
|
await page.getByTestId("interview-input").fill("Tasks");
|
|
await page.getByTestId("interview-send").click();
|
|
await expect(page.getByText("additional requirements")).toBeVisible({ timeout: 3000 });
|
|
|
|
await page.getByTestId("interview-input").fill("None");
|
|
await page.getByTestId("interview-send").click();
|
|
|
|
// Wait for project setup form
|
|
await expect(page.getByTestId("project-setup-form")).toBeVisible({ timeout: 5000 });
|
|
|
|
// Create button should be disabled initially
|
|
await expect(page.getByTestId("interview-create-project")).toBeDisabled();
|
|
|
|
// Fill only name
|
|
await page.getByTestId("interview-project-name-input").fill("my-project");
|
|
await expect(page.getByTestId("interview-create-project")).toBeDisabled();
|
|
|
|
// Clear name and fill only path
|
|
await page.getByTestId("interview-project-name-input").clear();
|
|
await page.getByTestId("interview-project-path-input").fill("/some/path");
|
|
await expect(page.getByTestId("interview-create-project")).toBeDisabled();
|
|
|
|
// Fill both - should be enabled
|
|
await page.getByTestId("interview-project-name-input").fill("my-project");
|
|
await expect(page.getByTestId("interview-create-project")).toBeEnabled();
|
|
});
|
|
});
|