taskPlan.test.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  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('keeps progress and results visible while task details start collapsed', () => {
  8. const wrapper = mount(TaskPlan,{props:{goal:{...goal,result:'初稿已交付'},assignments:[assignment('一','complete'),assignment('二','running')],agents:[]}})
  9. expect(wrapper.get('details').attributes('open')).toBeUndefined()
  10. expect(wrapper.get('header').text()).toContain('进行中')
  11. expect(wrapper.get('[role=progressbar]').attributes('aria-valuenow')).toBe('50')
  12. expect(wrapper.get('.task-plan__count').text()).toContain('1/2')
  13. expect(wrapper.get('.result').text()).toBe('初稿已交付')
  14. wrapper.unmount()
  15. })
  16. it('preserves user edits across progress refreshes and reports stale-save errors without discarding the draft', async () => {
  17. const saveCriteria = vi.fn().mockRejectedValueOnce(new Error('验收要求已更新,请重新查看后修改'))
  18. const wrapper = mount(TaskPlan,{props:{goal,assignments:[],agents:[],saveCriteria}})
  19. await wrapper.get('details').trigger('click')
  20. await wrapper.findAll('button').find(button=>button.text()==='调整验收要求')!.trigger('click')
  21. await wrapper.get('textarea').setValue('比较三种方案\n给出建议')
  22. await wrapper.setProps({goal:{...goal,revision:9,status:'review',acceptanceRevision:2,acceptanceCriteria:['另一条最新要求']}})
  23. expect(wrapper.get('textarea').element.value).toBe('比较三种方案\n给出建议')
  24. await wrapper.get('form').trigger('submit')
  25. await flushPromises()
  26. expect(saveCriteria).toHaveBeenCalledWith('goal',1,['比较三种方案','给出建议'])
  27. expect(wrapper.get('[role=alert]').text()).toContain('已更新')
  28. expect(wrapper.get('textarea').element.value).toContain('比较三种方案')
  29. await wrapper.findAll('button').find(button=>button.text()==='取消')!.trigger('click')
  30. await wrapper.findAll('button').find(button=>button.text()==='调整验收要求')!.trigger('click')
  31. expect(wrapper.get('textarea').element.value).toBe('另一条最新要求')
  32. saveCriteria.mockResolvedValue(undefined)
  33. await wrapper.get('textarea').setValue('最新要求与来源')
  34. await wrapper.get('form').trigger('submit')
  35. await flushPromises()
  36. expect(saveCriteria).toHaveBeenLastCalledWith('goal',2,['最新要求与来源'])
  37. expect(wrapper.find('textarea').exists()).toBe(false)
  38. wrapper.unmount()
  39. })