181 lines
5.1 KiB
TypeScript
181 lines
5.1 KiB
TypeScript
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')
|
|
})
|
|
})
|
|
})
|