Initial commit
This commit is contained in:
171
api/modules/todo/__tests__/parser.test.ts
Normal file
171
api/modules/todo/__tests__/parser.test.ts
Normal file
@@ -0,0 +1,171 @@
|
||||
import { describe, it, expect } from 'vitest'
|
||||
import { parseTodoContent, generateTodoContent } from '../parser.js'
|
||||
import type { DayTodo } from '../types.js'
|
||||
|
||||
describe('parseTodoContent', () => {
|
||||
it('should parse basic todo content correctly', () => {
|
||||
const content = `## 2024-01-01
|
||||
- √ 完成工作
|
||||
- ○ 购物`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].date).toBe('2024-01-01')
|
||||
expect(result[0].items).toHaveLength(2)
|
||||
expect(result[0].items[0].content).toBe('完成工作')
|
||||
expect(result[0].items[1].content).toBe('购物')
|
||||
})
|
||||
|
||||
it('should correctly identify completed status with √', () => {
|
||||
const content = `## 2024-01-01
|
||||
- √ 已完成任务`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result[0].items[0].completed).toBe(true)
|
||||
})
|
||||
|
||||
it('should correctly identify incomplete status with ○', () => {
|
||||
const content = `## 2024-01-01
|
||||
- ○ 未完成任务`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result[0].items[0].completed).toBe(false)
|
||||
})
|
||||
|
||||
it('should parse multiple days correctly', () => {
|
||||
const content = `## 2024-01-01
|
||||
- √ 第一天任务
|
||||
|
||||
## 2024-01-02
|
||||
- ○ 第二天任务
|
||||
|
||||
## 2024-01-03
|
||||
- √ 第三天任务`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result).toHaveLength(3)
|
||||
expect(result[0].date).toBe('2024-01-01')
|
||||
expect(result[1].date).toBe('2024-01-02')
|
||||
expect(result[2].date).toBe('2024-01-03')
|
||||
expect(result[0].items[0].content).toBe('第一天任务')
|
||||
expect(result[1].items[0].content).toBe('第二天任务')
|
||||
expect(result[2].items[0].content).toBe('第三天任务')
|
||||
})
|
||||
|
||||
it('should handle empty content', () => {
|
||||
const content = ''
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result).toHaveLength(0)
|
||||
})
|
||||
|
||||
it('should ignore invalid format lines', () => {
|
||||
const content = `## 2024-01-01
|
||||
这是一行普通文本
|
||||
- 无效格式
|
||||
- x 错误的标记
|
||||
random line
|
||||
- √ 有效的任务`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].items).toHaveLength(1)
|
||||
expect(result[0].items[0].content).toBe('有效的任务')
|
||||
})
|
||||
|
||||
it('should generate unique IDs for items', () => {
|
||||
const content = `## 2024-01-01
|
||||
- √ 任务一
|
||||
- ○ 任务二
|
||||
- √ 任务三`
|
||||
|
||||
const result = parseTodoContent(content)
|
||||
|
||||
expect(result[0].items[0].id).toBe('2024-01-01-0')
|
||||
expect(result[0].items[1].id).toBe('2024-01-01-1')
|
||||
expect(result[0].items[2].id).toBe('2024-01-01-2')
|
||||
})
|
||||
})
|
||||
|
||||
describe('generateTodoContent', () => {
|
||||
it('should generate basic todo content correctly', () => {
|
||||
const dayTodos: DayTodo[] = [
|
||||
{
|
||||
date: '2024-01-01',
|
||||
items: [
|
||||
{ id: '2024-01-01-0', content: '完成工作', completed: true },
|
||||
{ id: '2024-01-01-1', content: '购物', completed: false }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
const result = generateTodoContent(dayTodos)
|
||||
|
||||
expect(result).toBe(`## 2024-01-01
|
||||
- √ 完成工作
|
||||
- ○ 购物`)
|
||||
})
|
||||
|
||||
it('should include completed status in generated content', () => {
|
||||
const dayTodos: DayTodo[] = [
|
||||
{
|
||||
date: '2024-01-01',
|
||||
items: [
|
||||
{ id: '2024-01-01-0', content: '已完成', completed: true },
|
||||
{ id: '2024-01-01-1', content: '未完成', completed: false }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
const result = generateTodoContent(dayTodos)
|
||||
|
||||
expect(result).toContain('√ 已完成')
|
||||
expect(result).toContain('○ 未完成')
|
||||
})
|
||||
|
||||
it('should sort dates in ascending order', () => {
|
||||
const dayTodos: DayTodo[] = [
|
||||
{ date: '2024-01-03', items: [{ id: '1', content: '第三天', completed: false }] },
|
||||
{ date: '2024-01-01', items: [{ id: '2', content: '第一天', completed: false }] },
|
||||
{ date: '2024-01-02', items: [{ id: '3', content: '第二天', completed: false }] }
|
||||
]
|
||||
|
||||
const result = generateTodoContent(dayTodos)
|
||||
|
||||
const firstDateIndex = result.indexOf('2024-01-01')
|
||||
const secondDateIndex = result.indexOf('2024-01-02')
|
||||
const thirdDateIndex = result.indexOf('2024-01-03')
|
||||
|
||||
expect(firstDateIndex).toBeLessThan(secondDateIndex)
|
||||
expect(secondDateIndex).toBeLessThan(thirdDateIndex)
|
||||
})
|
||||
|
||||
it('should handle empty array', () => {
|
||||
const dayTodos: DayTodo[] = []
|
||||
|
||||
const result = generateTodoContent(dayTodos)
|
||||
|
||||
expect(result).toBe('')
|
||||
})
|
||||
|
||||
it('should generate content for multiple days with sorting', () => {
|
||||
const dayTodos: DayTodo[] = [
|
||||
{ date: '2024-01-02', items: [{ id: '1', content: '第二天', completed: true }] },
|
||||
{ date: '2024-01-01', items: [{ id: '2', content: '第一天', completed: false }] }
|
||||
]
|
||||
|
||||
const result = generateTodoContent(dayTodos)
|
||||
|
||||
expect(result).toBe(`## 2024-01-01
|
||||
- ○ 第一天
|
||||
|
||||
## 2024-01-02
|
||||
- √ 第二天`)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user