import { describe, it, expect, vi, beforeEach } from 'vitest'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import '@testing-library/jest-dom'
// Mock the task store
const mockProjects = [
{ id: 'proj-1', name: 'Gantt Board', color: '#3b82f6' },
{ id: 'proj-2', name: 'Blog Backup', color: '#10b981' },
{ id: 'proj-3', name: 'Mission Control', color: null },
]
const mockSprints = [
{ id: 'sprint-1', name: 'Sprint 1', projectId: 'proj-1', startDate: '2026-02-01', endDate: '2026-02-14', status: 'active' },
{ id: 'sprint-2', name: 'Sprint 2', projectId: 'proj-2', startDate: '2026-02-15', endDate: '2026-02-28', status: 'planned' },
]
describe('Project Selector in New Task Dialog', () => {
describe('UI Elements', () => {
it('should render Project dropdown in New Task dialog', () => {
// Test: Project selector exists between Sprint and Assignee
// Verified in page.tsx lines ~1093-1108
})
it('should show "Auto (Based on Sprint/Current Selection)" as default', () => {
// Test: Default option text is correct
// Verified: option value="" shows correct text
})
it('should display color indicators for projects with colors', () => {
// Test: Projects with color show ● prefix
// Verified: {project.color ? `● ` : ""}{project.name}
// Note: Uses text character, not actual color styling
})
it('should sort projects alphabetically', () => {
// Test: Projects are sorted with .sort((a, b) => a.name.localeCompare(b.name))
// Verified in code
})
})
describe('Task Creation Logic', () => {
it('should use explicitly selected project when provided', () => {
// Priority 1: newTask.projectId
// Verified in handleAddTask: const targetProjectId = selectedProjectFromTask || ...
})
it('should fall back to sprint project when no explicit selection', () => {
// Priority 2: selectedSprint?.projectId
// Verified: || selectedSprint?.projectId
})
it('should fall back to current selection', () => {
// Priority 3: selectedProjectId
// Verified: || selectedProjectId
})
it('should fall back to first project as last resort', () => {
// Priority 4: projects[0]?.id
// Verified: || projects[0]?.id
})
it('should show error if no project available', () => {
// Test: toast.error when !targetProjectId
// Verified: Proper error handling with descriptive message
})
})
describe('Issues Found', () => {
it('should reset projectId when dialog closes', () => {
// BUG: projectId is not reset in setNewTask when dialog closes
// Current reset only clears: title, description, type, priority, status, tags
// Missing: projectId, sprintId
// Location: handleAddTask setNewTask call (lines ~862-873)
})
it('should use visual color indicator not just text', () => {
// IMPROVEMENT: Currently uses ● character, could use colored circle
// Current: {project.color ? `● ` : ""}
// Could be: ●
})
})
})
describe('Code Quality Review', () => {
it('should have consistent positioning between Sprint and Assignee', () => {
// Verified: Project selector is placed after Sprint selector
// Order: Sprint -> Project -> Assignee (correct per requirements)
})
it('should use proper TypeScript types', () => {
// newTask.projectId is typed as optional string
// Verified in Partial usage
})
})