test: add vitest config and unit tests

This commit is contained in:
2026-05-27 23:28:41 +08:00
parent f35f73dca0
commit 13846a0b61
13 changed files with 1087 additions and 1 deletions
+35
View File
@@ -0,0 +1,35 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
vi.mock('@/utils/request', () => ({
default: {
post: vi.fn(),
get: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
},
}))
import request from '@/utils/request'
import { login, logout } from '@/api/login'
const mockedRequest = vi.mocked(request)
describe('login API', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('login sends POST to /login with credentials', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, message: 'OK' })
const result = await login('admin', '123456')
expect(mockedRequest.post).toHaveBeenCalledWith('/login', { username: 'admin', password: '123456' })
expect(result).toEqual({ code: 200, message: 'OK' })
})
it('logout sends POST to /logout', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, message: '已退出' })
const result = await logout()
expect(mockedRequest.post).toHaveBeenCalledWith('/logout')
expect(result).toEqual({ code: 200, message: '已退出' })
})
})
+31
View File
@@ -0,0 +1,31 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
vi.mock('@/utils/request', () => ({
default: {
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
},
}))
import request from '@/utils/request'
import { createFragments } from '@/api/reportFragments'
const mockedRequest = vi.mocked(request)
describe('reportFragments API', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('createFragments sends POST with sessionNum and content', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: { id: 1 } })
const result = await createFragments('S001', '学习了递归')
expect(mockedRequest.post).toHaveBeenCalledWith('/report-fragments', {
sessionNum: 'S001',
content: '学习了递归',
})
expect(result).toEqual({ code: 200, data: { id: 1 } })
})
})
+53
View File
@@ -0,0 +1,53 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
vi.mock('@/utils/request', () => ({
default: {
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
},
}))
import request from '@/utils/request'
import { getReviewFeed, getReportDetail, getFragmentDetail, getTaskReview } from '@/api/review'
const mockedRequest = vi.mocked(request)
describe('review API', () => {
beforeEach(() => {
vi.clearAllMocks()
})
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(result).toEqual({ code: 200, data: [] })
})
it('getReviewFeed uses default limit of 30', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: [] })
await getReviewFeed()
expect(mockedRequest.get).toHaveBeenCalledWith('/review/feed', { limit: 30 })
})
it('getReportDetail calls GET /review/report/:id', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: { id: 1 } })
const result = await getReportDetail(1)
expect(mockedRequest.get).toHaveBeenCalledWith('/review/report/1')
expect(result).toEqual({ code: 200, data: { id: 1 } })
})
it('getFragmentDetail calls GET /review/fragment/:id', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: { id: 5 } })
await getFragmentDetail(5)
expect(mockedRequest.get).toHaveBeenCalledWith('/review/fragment/5')
})
it('getTaskReview calls GET /review/task/:taskNum', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: {} })
await getTaskReview('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/review/task/T001')
})
})
+85
View File
@@ -0,0 +1,85 @@
import { describe, it, expect, vi, beforeEach } from 'vitest'
vi.mock('@/utils/request', () => ({
default: {
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
},
}))
import request from '@/utils/request'
import {
continueSession,
pauseSession,
endSession,
startOrContinueStudySession,
getSessionDetail,
} from '@/api/studySessions'
const mockedRequest = vi.mocked(request)
describe('studySessions API', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('continueSession sends POST to correct endpoint', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: null })
await continueSession('S001')
expect(mockedRequest.post).toHaveBeenCalledWith('/study-sessions/S001/study-sessions/continue')
})
it('pauseSession sends POST with endTime param when provided', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: null })
const endTime = new Date('2024-01-15T10:30:00Z')
await pauseSession('S001', endTime)
expect(mockedRequest.post).toHaveBeenCalledWith(
'/study-sessions/S001/study-sessions/pause',
null,
{ params: { endTime: endTime.toISOString() } }
)
})
it('pauseSession sends POST with null params when endTime not provided', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: null })
await pauseSession('S001')
expect(mockedRequest.post).toHaveBeenCalledWith(
'/study-sessions/S001/study-sessions/pause',
null,
{ params: null }
)
})
it('endSession sends POST with default content', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: null })
await endSession('S001')
expect(mockedRequest.post).toHaveBeenCalledWith(
'/study-sessions/S001/study-sessions/ended',
{ content: '任务结束' }
)
})
it('endSession sends POST with custom content', async () => {
mockedRequest.post.mockResolvedValue({ code: 200, data: null })
await endSession('S001', '自定义结束')
expect(mockedRequest.post).toHaveBeenCalledWith(
'/study-sessions/S001/study-sessions/ended',
{ content: '自定义结束' }
)
})
it('startOrContinueStudySession sends GET to correct endpoint', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: { sessionNum: 'S002' } })
const result = await startOrContinueStudySession('T001')
expect(mockedRequest.get).toHaveBeenCalledWith('/tasks/T001/study-sessions/start-or-continue')
expect(result).toEqual({ code: 200, data: { sessionNum: 'S002' } })
})
it('getSessionDetail sends GET to correct endpoint', async () => {
mockedRequest.get.mockResolvedValue({ code: 200, data: { id: 1 } })
await getSessionDetail('S001')
expect(mockedRequest.get).toHaveBeenCalledWith('/study-sessions/S001')
})
})