feat: complete review workflow UI

This commit is contained in:
2026-06-20 09:20:24 +08:00
parent 45ac0a98d1
commit 8ed1d45ae1
9 changed files with 629 additions and 95 deletions
+81 -5
View File
@@ -5,12 +5,25 @@ vi.mock('@/utils/request', () => ({
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
del: vi.fn(),
},
}))
import request from '@/utils/request'
import { getReviewFeed, getReportDetail, getFragmentDetail, getTaskReview } from '@/api/review'
import {
createReviewApplication,
deleteReviewApplication,
getFragmentDetail,
getReportDetail,
getReviewApplications,
getReviewFeed,
getReviewMindMap,
getReviewTaskStats,
getReviewTaskStatsByTask,
getTaskReview,
updateReviewApplication,
upsertReviewMindMap,
} from '@/api/review'
const mockedRequest = vi.mocked(request)
@@ -22,14 +35,32 @@ describe('review API', () => {
it('getReviewFeed calls GET /review/feed with limit', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
const result = await getReviewFeed(10)
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 10 })
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 10, mode: 'recent' })
expect(result).toEqual({ code: 200, data: [] })
})
it('getReviewFeed uses default limit of 30', async () => {
it('getReviewFeed uses default limit of 30 and recent mode', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
await getReviewFeed()
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 30 })
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 30, mode: 'recent' })
})
it('getReviewFeed accepts random mode', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
await getReviewFeed(50, 'random')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 50, mode: 'random' })
})
it('getReviewTaskStats calls GET /review/tasks', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
await getReviewTaskStats()
expect(mockedRequest.get).toHaveBeenCalledWith('/review/tasks')
})
it('getReviewTaskStatsByTask calls GET /review/tasks/:taskNum', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: {} })
await getReviewTaskStatsByTask('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/tasks/T001')
})
it('getReportDetail calls GET /review/report/:id', async () => {
@@ -50,4 +81,49 @@ describe('review API', () => {
await getTaskReview('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/task/T001')
})
it('review applications API calls expected endpoints', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
mockedRequest.post.mockResolvedValue({ code: 200, data: { id: 1 } })
mockedRequest.put.mockResolvedValue({ code: 200, data: { id: 1 } })
mockedRequest.del.mockResolvedValue({ code: 200 })
await getReviewApplications('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/applications/T001')
await createReviewApplication({ taskNum: 'T001', title: 'Demo', status: 'TODO' })
expect(mockedRequest.post).toHaveBeenCalledWith('/review/applications', {
taskNum: 'T001',
title: 'Demo',
status: 'TODO',
})
await updateReviewApplication(1, { title: 'Demo 2', status: 'DOING' })
expect(mockedRequest.put).toHaveBeenCalledWith('/review/applications/1', {
title: 'Demo 2',
status: 'DOING',
})
await deleteReviewApplication(1)
expect(mockedRequest.del).toHaveBeenCalledWith('/review/applications/1')
})
it('review mind map API calls expected endpoints', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: null })
mockedRequest.put.mockResolvedValue({ code: 200, data: { id: 1 } })
await getReviewMindMap('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/mind-map/T001')
await upsertReviewMindMap('T001', {
title: 'Map',
content: 'content',
contentFormat: 'TEXT',
})
expect(mockedRequest.put).toHaveBeenCalledWith('/review/mind-map/T001', {
title: 'Map',
content: 'content',
contentFormat: 'TEXT',
})
})
})