mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-01 08:13:37 +00:00
feat: enhance worktree functionality and UI integration
- Updated KanbanCard to conditionally display status badges based on feature attributes, improving visual feedback. - Enhanced WorktreeSelector to conditionally render based on the worktree feature toggle, ensuring a cleaner UI when worktrees are disabled. - Modified AddFeatureDialog and EditFeatureDialog to include branch selection only when worktrees are enabled, streamlining the feature creation process. - Refactored useBoardActions and useBoardDragDrop hooks to create worktrees only when the feature is enabled, optimizing performance. - Introduced comprehensive integration tests for worktree operations, ensuring robust functionality and error handling across various scenarios.
This commit is contained in:
188
apps/app/tests/utils/core/constants.ts
Normal file
188
apps/app/tests/utils/core/constants.ts
Normal file
@@ -0,0 +1,188 @@
|
||||
/**
|
||||
* Centralized constants for test utilities
|
||||
* This file contains all shared constants like URLs, timeouts, and selectors
|
||||
*/
|
||||
|
||||
// ============================================================================
|
||||
// API Configuration
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Base URL for the API server
|
||||
*/
|
||||
export const API_BASE_URL = "http://localhost:3008";
|
||||
|
||||
/**
|
||||
* API endpoints for worktree operations
|
||||
*/
|
||||
export const API_ENDPOINTS = {
|
||||
worktree: {
|
||||
create: `${API_BASE_URL}/api/worktree/create`,
|
||||
delete: `${API_BASE_URL}/api/worktree/delete`,
|
||||
list: `${API_BASE_URL}/api/worktree/list`,
|
||||
commit: `${API_BASE_URL}/api/worktree/commit`,
|
||||
switchBranch: `${API_BASE_URL}/api/worktree/switch-branch`,
|
||||
listBranches: `${API_BASE_URL}/api/worktree/list-branches`,
|
||||
status: `${API_BASE_URL}/api/worktree/status`,
|
||||
revert: `${API_BASE_URL}/api/worktree/revert`,
|
||||
info: `${API_BASE_URL}/api/worktree/info`,
|
||||
},
|
||||
fs: {
|
||||
browse: `${API_BASE_URL}/api/fs/browse`,
|
||||
read: `${API_BASE_URL}/api/fs/read`,
|
||||
write: `${API_BASE_URL}/api/fs/write`,
|
||||
},
|
||||
features: {
|
||||
list: `${API_BASE_URL}/api/features/list`,
|
||||
create: `${API_BASE_URL}/api/features/create`,
|
||||
update: `${API_BASE_URL}/api/features/update`,
|
||||
delete: `${API_BASE_URL}/api/features/delete`,
|
||||
},
|
||||
} as const;
|
||||
|
||||
// ============================================================================
|
||||
// Timeout Configuration
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Default timeouts in milliseconds
|
||||
*/
|
||||
export const TIMEOUTS = {
|
||||
/** Default timeout for element visibility checks */
|
||||
default: 5000,
|
||||
/** Short timeout for quick checks */
|
||||
short: 2000,
|
||||
/** Medium timeout for standard operations */
|
||||
medium: 10000,
|
||||
/** Long timeout for slow operations */
|
||||
long: 30000,
|
||||
/** Extra long timeout for very slow operations */
|
||||
extraLong: 60000,
|
||||
/** Timeout for animations to complete */
|
||||
animation: 300,
|
||||
/** Small delay for UI to settle */
|
||||
settle: 500,
|
||||
/** Delay for network operations */
|
||||
network: 1000,
|
||||
} as const;
|
||||
|
||||
// ============================================================================
|
||||
// Test ID Selectors
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Common data-testid selectors organized by component/view
|
||||
*/
|
||||
export const TEST_IDS = {
|
||||
// Sidebar & Navigation
|
||||
sidebar: "sidebar",
|
||||
navBoard: "nav-board",
|
||||
navSpec: "nav-spec",
|
||||
navContext: "nav-context",
|
||||
navAgent: "nav-agent",
|
||||
navProfiles: "nav-profiles",
|
||||
settingsButton: "settings-button",
|
||||
openProjectButton: "open-project-button",
|
||||
|
||||
// Views
|
||||
boardView: "board-view",
|
||||
specView: "spec-view",
|
||||
contextView: "context-view",
|
||||
agentView: "agent-view",
|
||||
profilesView: "profiles-view",
|
||||
settingsView: "settings-view",
|
||||
welcomeView: "welcome-view",
|
||||
setupView: "setup-view",
|
||||
|
||||
// Board View Components
|
||||
addFeatureButton: "add-feature-button",
|
||||
addFeatureDialog: "add-feature-dialog",
|
||||
confirmAddFeature: "confirm-add-feature",
|
||||
featureBranchInput: "feature-branch-input",
|
||||
featureCategoryInput: "feature-category-input",
|
||||
worktreeSelector: "worktree-selector",
|
||||
|
||||
// Spec Editor
|
||||
specEditor: "spec-editor",
|
||||
|
||||
// File Browser Dialog
|
||||
pathInput: "path-input",
|
||||
goToPathButton: "go-to-path-button",
|
||||
|
||||
// Profiles View
|
||||
addProfileButton: "add-profile-button",
|
||||
addProfileDialog: "add-profile-dialog",
|
||||
editProfileDialog: "edit-profile-dialog",
|
||||
deleteProfileConfirmDialog: "delete-profile-confirm-dialog",
|
||||
saveProfileButton: "save-profile-button",
|
||||
confirmDeleteProfileButton: "confirm-delete-profile-button",
|
||||
cancelDeleteButton: "cancel-delete-button",
|
||||
profileNameInput: "profile-name-input",
|
||||
profileDescriptionInput: "profile-description-input",
|
||||
refreshProfilesButton: "refresh-profiles-button",
|
||||
|
||||
// Context View
|
||||
contextFileList: "context-file-list",
|
||||
addContextButton: "add-context-button",
|
||||
} as const;
|
||||
|
||||
// ============================================================================
|
||||
// CSS Selectors
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Common CSS selectors for elements that don't have data-testid
|
||||
*/
|
||||
export const CSS_SELECTORS = {
|
||||
/** CodeMirror editor content area */
|
||||
codeMirrorContent: ".cm-content",
|
||||
/** Dialog elements */
|
||||
dialog: '[role="dialog"]',
|
||||
/** Sonner toast notifications */
|
||||
toast: "[data-sonner-toast]",
|
||||
toastError: '[data-sonner-toast][data-type="error"]',
|
||||
toastSuccess: '[data-sonner-toast][data-type="success"]',
|
||||
/** Command/combobox input (shadcn-ui cmdk) */
|
||||
commandInput: "[cmdk-input]",
|
||||
/** Radix dialog overlay */
|
||||
dialogOverlay: "[data-radix-dialog-overlay]",
|
||||
} as const;
|
||||
|
||||
// ============================================================================
|
||||
// Storage Keys
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* localStorage keys used by the application
|
||||
*/
|
||||
export const STORAGE_KEYS = {
|
||||
appStorage: "automaker-storage",
|
||||
setupStorage: "automaker-setup",
|
||||
} as const;
|
||||
|
||||
// ============================================================================
|
||||
// Branch Name Utilities
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Sanitize a branch name to create a valid worktree directory name
|
||||
* @param branchName - The branch name to sanitize
|
||||
* @returns Sanitized name suitable for directory paths
|
||||
*/
|
||||
export function sanitizeBranchName(branchName: string): string {
|
||||
return branchName.replace(/[^a-zA-Z0-9_-]/g, "-");
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Default Values
|
||||
// ============================================================================
|
||||
|
||||
/**
|
||||
* Default values used in test setup
|
||||
*/
|
||||
export const DEFAULTS = {
|
||||
projectName: "Test Project",
|
||||
projectPath: "/mock/test-project",
|
||||
theme: "dark" as const,
|
||||
maxConcurrency: 3,
|
||||
} as const;
|
||||
Reference in New Issue
Block a user