dramaling-vocab-learning/frontend/store/review/__tests__/useTestQueueStore.simple.te...

152 lines
4.4 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest'
// 簡化版測試,避免路徑依賴問題
describe('useTestQueueStore - 基礎邏輯測試', () => {
beforeEach(() => {
vi.clearAllMocks()
})
describe('優先級計算邏輯', () => {
// 複製核心邏輯進行測試
const calculateTestPriority = (test: {
isCompleted: boolean
isSkipped: boolean
isIncorrect: boolean
lastAttemptAt?: number
skippedAt?: number
}): number => {
const now = Date.now()
let priority = 0
if (!test.isCompleted && !test.isSkipped && !test.isIncorrect) {
priority = 100
} else if (test.isIncorrect) {
priority = 20
if (test.lastAttemptAt && (now - test.lastAttemptAt) < 60000) {
priority = 15
}
} else if (test.isSkipped) {
priority = 10
if (test.skippedAt) {
const hours = (now - test.skippedAt) / (1000 * 60 * 60)
priority += Math.min(hours * 0.5, 5)
}
}
return priority
}
it('未嘗試的測驗應該有最高優先級', () => {
const test = {
isCompleted: false,
isSkipped: false,
isIncorrect: false
}
const priority = calculateTestPriority(test)
expect(priority).toBe(100)
})
it('答錯的測驗應該有中等優先級', () => {
const test = {
isCompleted: false,
isSkipped: false,
isIncorrect: true,
lastAttemptAt: Date.now() - 120000 // 2分鐘前
}
const priority = calculateTestPriority(test)
expect(priority).toBe(20)
})
it('最近答錯的測驗優先級應該稍低', () => {
const test = {
isCompleted: false,
isSkipped: false,
isIncorrect: true,
lastAttemptAt: Date.now() - 30000 // 30秒前
}
const priority = calculateTestPriority(test)
expect(priority).toBe(15)
})
it('跳過的測驗應該有最低優先級', () => {
const test = {
isCompleted: false,
isSkipped: true,
isIncorrect: false,
skippedAt: Date.now() - (2 * 60 * 60 * 1000) // 2小時前
}
const priority = calculateTestPriority(test)
expect(priority).toBeCloseTo(11, 1) // 10 + (2 * 0.5) = 11
})
})
describe('測驗類型名稱映射', () => {
const getTestTypeName = (testType: string): string => {
const names: Record<string, string> = {
'flip-memory': '翻卡記憶',
'vocab-choice': '詞彙選擇',
'sentence-fill': '例句填空',
'sentence-reorder': '例句重組',
'vocab-listening': '詞彙聽力',
'sentence-listening': '例句聽力',
'sentence-speaking': '例句口說'
}
return names[testType] || testType
}
it('應該正確映射所有測驗類型名稱', () => {
expect(getTestTypeName('flip-memory')).toBe('翻卡記憶')
expect(getTestTypeName('vocab-choice')).toBe('詞彙選擇')
expect(getTestTypeName('sentence-fill')).toBe('例句填空')
expect(getTestTypeName('unknown')).toBe('unknown')
})
})
describe('測驗項目重排序邏輯', () => {
const reorderTestItems = (testItems: Array<{
id: string
priority: number
order: number
}>) => {
return testItems.sort((a, b) => {
if (b.priority !== a.priority) {
return b.priority - a.priority
}
return a.order - b.order
})
}
it('應該按優先級高到低排序', () => {
const items = [
{ id: '1', priority: 10, order: 1 },
{ id: '2', priority: 100, order: 2 },
{ id: '3', priority: 20, order: 3 }
]
const sorted = reorderTestItems(items)
expect(sorted[0].id).toBe('2') // 優先級 100
expect(sorted[1].id).toBe('3') // 優先級 20
expect(sorted[2].id).toBe('1') // 優先級 10
})
it('相同優先級應該按原始順序排列', () => {
const items = [
{ id: '1', priority: 50, order: 1 },
{ id: '2', priority: 50, order: 2 },
{ id: '3', priority: 50, order: 3 }
]
const sorted = reorderTestItems(items)
expect(sorted[0].id).toBe('1')
expect(sorted[1].id).toBe('2')
expect(sorted[2].id).toBe('3')
})
})
})