mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-31 20:03:37 +00:00
- Remove .slice(0, 5) to show all projects in dropdown - Extend keyboard shortcuts to support 1-9 (was 1-5) - Only show hotkey indicators for first 9 projects - Update tests to reflect new behavior 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
242 lines
7.4 KiB
TypeScript
242 lines
7.4 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
import {
|
|
setupMockMultipleProjects,
|
|
waitForElement,
|
|
isProjectPickerDropdownOpen,
|
|
waitForProjectPickerDropdown,
|
|
waitForProjectPickerDropdownHidden,
|
|
pressShortcut,
|
|
pressNumberKey,
|
|
isProjectHotkeyVisible,
|
|
getProjectPickerShortcut,
|
|
} from "./utils";
|
|
|
|
test.describe("Project Picker Keyboard Shortcuts", () => {
|
|
test("pressing P key opens the project picker dropdown", async ({ page }) => {
|
|
// Setup with multiple projects
|
|
await setupMockMultipleProjects(page, 3);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar to be visible
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Dropdown should initially be closed
|
|
expect(await isProjectPickerDropdownOpen(page)).toBe(false);
|
|
|
|
// Press P to open project picker
|
|
await pressShortcut(page, "p");
|
|
|
|
// Dropdown should now be open
|
|
await waitForProjectPickerDropdown(page);
|
|
expect(await isProjectPickerDropdownOpen(page)).toBe(true);
|
|
});
|
|
|
|
test("project options show hotkey indicators (1-5)", async ({ page }) => {
|
|
// Setup with 5 projects
|
|
await setupMockMultipleProjects(page, 5);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Open project picker
|
|
await pressShortcut(page, "p");
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// Check that all 5 hotkey indicators are visible
|
|
for (let i = 1; i <= 5; i++) {
|
|
expect(await isProjectHotkeyVisible(page, i)).toBe(true);
|
|
const hotkey = page.locator(`[data-testid="project-hotkey-${i}"]`);
|
|
expect(await hotkey.textContent()).toBe(i.toString());
|
|
}
|
|
});
|
|
|
|
test("pressing number key selects the corresponding project", async ({
|
|
page,
|
|
}) => {
|
|
// Setup with 3 projects
|
|
await setupMockMultipleProjects(page, 3);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Check initial project (should be Test Project 1)
|
|
const projectSelector = page.locator('[data-testid="project-selector"]');
|
|
await expect(projectSelector).toContainText("Test Project 1");
|
|
|
|
// Open project picker
|
|
await pressShortcut(page, "p");
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// Press 2 to select the second project
|
|
await pressNumberKey(page, 2);
|
|
|
|
// Dropdown should close
|
|
await waitForProjectPickerDropdownHidden(page);
|
|
|
|
// Project should now be Test Project 2
|
|
await expect(projectSelector).toContainText("Test Project 2");
|
|
});
|
|
|
|
test("pressing number key for non-existent project does nothing", async ({
|
|
page,
|
|
}) => {
|
|
// Setup with 2 projects
|
|
await setupMockMultipleProjects(page, 2);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Check initial project
|
|
const projectSelector = page.locator('[data-testid="project-selector"]');
|
|
await expect(projectSelector).toContainText("Test Project 1");
|
|
|
|
// Open project picker
|
|
await pressShortcut(page, "p");
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// Press 5 (there's no 5th project)
|
|
await pressNumberKey(page, 5);
|
|
|
|
// Dropdown should remain open
|
|
expect(await isProjectPickerDropdownOpen(page)).toBe(true);
|
|
|
|
// Project should still be Test Project 1
|
|
await expect(projectSelector).toContainText("Test Project 1");
|
|
});
|
|
|
|
test("pressing Escape closes the project picker dropdown", async ({
|
|
page,
|
|
}) => {
|
|
// Setup with multiple projects
|
|
await setupMockMultipleProjects(page, 3);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Open project picker
|
|
await pressShortcut(page, "p");
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// Press Escape
|
|
await page.keyboard.press("Escape");
|
|
|
|
// Dropdown should close
|
|
await waitForProjectPickerDropdownHidden(page);
|
|
expect(await isProjectPickerDropdownOpen(page)).toBe(false);
|
|
});
|
|
|
|
test("project selector button shows P shortcut indicator", async ({
|
|
page,
|
|
}) => {
|
|
// Setup with multiple projects
|
|
await setupMockMultipleProjects(page, 3);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar and project selector
|
|
await waitForElement(page, "sidebar");
|
|
await waitForElement(page, "project-selector");
|
|
|
|
// Check that P shortcut indicator is visible
|
|
const shortcutIndicator = await getProjectPickerShortcut(page);
|
|
await expect(shortcutIndicator).toBeVisible();
|
|
await expect(shortcutIndicator).toHaveText("P");
|
|
});
|
|
|
|
test("all projects are shown, with hotkeys for first 9", async ({ page }) => {
|
|
// Setup with 10 projects
|
|
await setupMockMultipleProjects(page, 10);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Open project picker
|
|
await pressShortcut(page, "p");
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// All 10 projects should be visible
|
|
for (let i = 1; i <= 10; i++) {
|
|
const projectOption = page.locator(`[data-testid="project-option-test-project-${i}"]`);
|
|
await expect(projectOption).toBeVisible();
|
|
}
|
|
|
|
// First 9 hotkey indicators should be visible (1-9)
|
|
for (let i = 1; i <= 9; i++) {
|
|
expect(await isProjectHotkeyVisible(page, i)).toBe(true);
|
|
}
|
|
|
|
// 10th hotkey should not exist (no keyboard shortcut for it)
|
|
const hotkey10 = page.locator('[data-testid="project-hotkey-10"]');
|
|
await expect(hotkey10).not.toBeVisible();
|
|
});
|
|
|
|
test("clicking a project option also works", async ({ page }) => {
|
|
// Setup with 3 projects
|
|
await setupMockMultipleProjects(page, 3);
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Open project picker by clicking
|
|
await page.locator('[data-testid="project-selector"]').click();
|
|
await waitForProjectPickerDropdown(page);
|
|
|
|
// Click on second project option
|
|
await page.locator('[data-testid="project-option-test-project-2"]').click();
|
|
|
|
// Dropdown should close
|
|
await waitForProjectPickerDropdownHidden(page);
|
|
|
|
// Project should now be Test Project 2
|
|
const projectSelector = page.locator('[data-testid="project-selector"]');
|
|
await expect(projectSelector).toContainText("Test Project 2");
|
|
});
|
|
|
|
test("P shortcut does not work when no projects exist", async ({ page }) => {
|
|
// Setup with empty projects
|
|
await page.addInitScript(() => {
|
|
const mockState = {
|
|
state: {
|
|
projects: [],
|
|
currentProject: null,
|
|
currentView: "welcome",
|
|
theme: "dark",
|
|
sidebarOpen: true,
|
|
apiKeys: { anthropic: "", google: "" },
|
|
chatSessions: [],
|
|
chatHistoryOpen: false,
|
|
maxConcurrency: 3,
|
|
},
|
|
version: 0,
|
|
};
|
|
localStorage.setItem("automaker-storage", JSON.stringify(mockState));
|
|
});
|
|
|
|
await page.goto("/");
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
// Wait for sidebar
|
|
await waitForElement(page, "sidebar");
|
|
|
|
// Press P - should not open any dropdown since there are no projects
|
|
await pressShortcut(page, "p");
|
|
await page.waitForTimeout(300);
|
|
|
|
// Dropdown should not be visible
|
|
expect(await isProjectPickerDropdownOpen(page)).toBe(false);
|
|
});
|
|
});
|