taskPlan.test.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { expect, it, vi } from 'vitest'
  2. import { flushPromises, mount } from '@vue/test-utils'
  3. import TaskPlan from '@/components/workspace/TaskPlan.vue'
  4. import type { AgentAssignment, AgentGoal } from '@shared/agentTasks'
  5. const goal: AgentGoal = { id:'goal',conversationId:'group',coordinatorId:'lead',authorityRevision:1,objective:'交付报告',acceptanceCriteria:['提供来源'],acceptanceRevision:1,status:'running',origin:{conversationId:'group',runId:'run',agentId:'lead'},artifactIds:[],revision:1,automaticWakes:0,createdAt:1,updatedAt:1 }
  6. const assignment = (id: string, status: AgentAssignment['status']): AgentAssignment => ({ id,goalId:'goal',conversationId:'group',agentId:'writer',title:`步骤 ${id}`,brief:'完成步骤',acceptanceCriteria:[],dependsOn:[],status,attempt:1,artifactIds:[],createdAt:1,updatedAt:1 })
  7. it('starts as a compact summary and reveals progress and results on request', async () => {
  8. const wrapper = mount(TaskPlan,{props:{goal:{...goal,result:'初稿已交付'},assignments:[assignment('一','complete'),assignment('二','running')],agents:[]}})
  9. expect(wrapper.get('header').text()).toContain('进行中')
  10. expect(wrapper.get('.task-plan__disclosure').attributes('aria-expanded')).toBe('false')
  11. expect(wrapper.find('[role=progressbar]').exists()).toBe(false)
  12. expect(wrapper.find('.result').exists()).toBe(false)
  13. await wrapper.get('.task-plan__disclosure').trigger('click')
  14. expect(wrapper.get('.task-plan__disclosure').attributes('aria-expanded')).toBe('true')
  15. expect(wrapper.get('details').attributes('open')).toBeUndefined()
  16. expect(wrapper.get('[role=progressbar]').attributes('aria-valuenow')).toBe('50')
  17. expect(wrapper.get('.task-plan__count').text()).toContain('1/2')
  18. expect(wrapper.get('.result').text()).toBe('初稿已交付')
  19. await wrapper.setProps({goal:{...goal,id:'goal-next',result:'下一项任务'}})
  20. expect(wrapper.get('.task-plan__disclosure').attributes('aria-expanded')).toBe('false')
  21. expect(wrapper.find('[role=progressbar]').exists()).toBe(false)
  22. wrapper.unmount()
  23. })
  24. it('preserves user edits across progress refreshes and reports stale-save errors without discarding the draft', async () => {
  25. const saveCriteria = vi.fn().mockRejectedValueOnce(new Error('验收要求已更新,请重新查看后修改'))
  26. const wrapper = mount(TaskPlan,{props:{goal,assignments:[],agents:[],saveCriteria}})
  27. await wrapper.get('.task-plan__disclosure').trigger('click')
  28. await wrapper.get('details').trigger('click')
  29. await wrapper.findAll('button').find(button=>button.text()==='调整验收要求')!.trigger('click')
  30. await wrapper.get('textarea').setValue('比较三种方案\n给出建议')
  31. await wrapper.setProps({goal:{...goal,revision:9,status:'review',acceptanceRevision:2,acceptanceCriteria:['另一条最新要求']}})
  32. expect(wrapper.get('textarea').element.value).toBe('比较三种方案\n给出建议')
  33. await wrapper.get('form').trigger('submit')
  34. await flushPromises()
  35. expect(saveCriteria).toHaveBeenCalledWith('goal',1,['比较三种方案','给出建议'])
  36. expect(wrapper.get('[role=alert]').text()).toContain('已更新')
  37. expect(wrapper.get('textarea').element.value).toContain('比较三种方案')
  38. await wrapper.findAll('button').find(button=>button.text()==='取消')!.trigger('click')
  39. await wrapper.findAll('button').find(button=>button.text()==='调整验收要求')!.trigger('click')
  40. expect(wrapper.get('textarea').element.value).toBe('另一条最新要求')
  41. saveCriteria.mockResolvedValue(undefined)
  42. await wrapper.get('textarea').setValue('最新要求与来源')
  43. await wrapper.get('form').trigger('submit')
  44. await flushPromises()
  45. expect(saveCriteria).toHaveBeenLastCalledWith('goal',2,['最新要求与来源'])
  46. expect(wrapper.find('textarea').exists()).toBe(false)
  47. wrapper.unmount()
  48. })