import { describe, it, expect, vi, beforeEach } from 'vitest' import { ref, reactive } from 'vue' vi.mock('element-plus', () => ({ ElMessage: { success: vi.fn(), error: vi.fn(), warning: vi.fn(), info: vi.fn(), }, })) import { ElMessage } from 'element-plus' describe('TaskForm.vue logic', () => { beforeEach(() => { vi.clearAllMocks() }) describe('priorityOptions', () => { it('contains values 0-5', () => { const priorityOptions = [0, 1, 2, 3, 4, 5] expect(priorityOptions).toEqual([0, 1, 2, 3, 4, 5]) expect(priorityOptions.length).toBe(6) }) }) describe('priority state management', () => { it('initializes with all zeros', () => { const priority = reactive({ urgency: 0, importance: 0, contentDifficulty: 0, futureValue: 0, subjectivePriority: 0, }) expect(priority.urgency).toBe(0) expect(priority.importance).toBe(0) expect(priority.contentDifficulty).toBe(0) expect(priority.futureValue).toBe(0) expect(priority.subjectivePriority).toBe(0) }) it('updates individual priority fields', () => { const priority = reactive({ urgency: 0, importance: 0, contentDifficulty: 0, futureValue: 0, subjectivePriority: 0, }) priority.urgency = 3 priority.importance = 5 expect(priority.urgency).toBe(3) expect(priority.importance).toBe(5) expect(priority.contentDifficulty).toBe(0) }) }) describe('task payload construction', () => { it('builds correct create payload', () => { const taskName = ref('学习递归') const taskDescription = ref('理解递归的基本概念') const materialURL = ref('https://example.com/recursion') const priority = reactive({ urgency: 3, importance: 4, contentDifficulty: 2, futureValue: 5, subjectivePriority: 3, }) const payload = { taskName: taskName.value, taskDescription: taskDescription.value, materialURL: materialURL.value, ...priority, } expect(payload).toEqual({ taskName: '学习递归', taskDescription: '理解递归的基本概念', materialURL: 'https://example.com/recursion', urgency: 3, importance: 4, contentDifficulty: 2, futureValue: 5, subjectivePriority: 3, }) }) it('builds correct update payload with id', () => { const taskId = 42 const taskName = ref('更新后的任务') const taskDescription = ref('') const materialURL = ref('') const priority = reactive({ urgency: 1, importance: 2, contentDifficulty: 0, futureValue: 3, subjectivePriority: 4, }) const payload = { id: taskId, taskName: taskName.value, taskDescription: taskDescription.value, materialURL: materialURL.value, ...priority, } expect(payload.id).toBe(42) expect(payload.taskName).toBe('更新后的任务') }) }) describe('loadTask data mapping', () => { it('maps API response to form fields correctly', () => { const apiData = { taskName: '学习DP', taskDescription: '动态规划', materialUrl: 'https://example.com/dp', urgency: 4, importance: 5, contentDifficulty: 3, futureValue: 4, subjectivePriority: 2, } const taskName = ref('') const taskDescription = ref('') const materialURL = ref('') const priority = reactive({ urgency: 0, importance: 0, contentDifficulty: 0, futureValue: 0, subjectivePriority: 0, }) // Simulate loadTask mapping taskName.value = apiData.taskName taskDescription.value = apiData.taskDescription materialURL.value = apiData.materialURL || apiData.materialUrl || '' priority.urgency = apiData.urgency priority.importance = apiData.importance priority.contentDifficulty = apiData.contentDifficulty priority.futureValue = apiData.futureValue priority.subjectivePriority = apiData.subjectivePriority expect(taskName.value).toBe('学习DP') expect(materialURL.value).toBe('https://example.com/dp') expect(priority.urgency).toBe(4) expect(priority.importance).toBe(5) }) it('handles materialURL with camelCase variant', () => { const apiData = { materialURL: 'https://example.com/a', materialUrl: 'https://example.com/b' } const result = apiData.materialURL || apiData.materialUrl || '' expect(result).toBe('https://example.com/a') }) it('falls back to empty string when no material URL', () => { const apiData = {} as any const result = apiData.materialURL || apiData.materialUrl || '' expect(result).toBe('') }) }) describe('redirect after successful action', () => { it('navigates to study page after create/update', () => { const pushTarget = '/study' expect(pushTarget).toBe('/study') }) }) })