test_todo.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. """
  2. Todo类的单元测试
  3. """
  4. import pytest
  5. from todo.todo import Todo, TodoItem
  6. class TestTodoItem:
  7. """TodoItem类测试"""
  8. def test_create_todo_item(self):
  9. """测试创建TodoItem"""
  10. item = TodoItem(id=1, title="测试任务")
  11. assert item.id == 1
  12. assert item.title == "测试任务"
  13. assert item.completed is False
  14. assert item.created_at is not None
  15. def test_todo_item_to_dict(self):
  16. """测试TodoItem转字典"""
  17. item = TodoItem(id=1, title="测试任务", completed=True)
  18. data = item.to_dict()
  19. assert data["id"] == 1
  20. assert data["title"] == "测试任务"
  21. assert data["completed"] is True
  22. assert "created_at" in data
  23. def test_todo_item_from_dict(self):
  24. """测试从字典创建TodoItem"""
  25. data = {
  26. "id": 1,
  27. "title": "测试任务",
  28. "completed": True,
  29. "created_at": "2024-02-08 10:00:00"
  30. }
  31. item = TodoItem.from_dict(data)
  32. assert item.id == 1
  33. assert item.title == "测试任务"
  34. assert item.completed is True
  35. assert item.created_at == "2024-02-08 10:00:00"
  36. def test_todo_item_repr(self):
  37. """测试TodoItem字符串表示"""
  38. item = TodoItem(id=1, title="测试任务")
  39. assert "1" in repr(item)
  40. assert "测试任务" in repr(item)
  41. class TestTodo:
  42. """Todo类测试"""
  43. def test_create_todo(self):
  44. """测试创建Todo对象"""
  45. todo = Todo()
  46. assert len(todo.items) == 0
  47. assert todo.next_id == 1
  48. def test_add_todo_item(self):
  49. """测试添加待办事项"""
  50. todo = Todo()
  51. item = todo.add("买菜")
  52. assert item.id == 1
  53. assert item.title == "买菜"
  54. assert len(todo.items) == 1
  55. assert todo.next_id == 2
  56. def test_add_multiple_items(self):
  57. """测试添加多个待办事项"""
  58. todo = Todo()
  59. todo.add("任务1")
  60. todo.add("任务2")
  61. todo.add("任务3")
  62. assert len(todo.items) == 3
  63. assert todo.next_id == 4
  64. def test_add_empty_title_raises_error(self):
  65. """测试添加空标题抛出异常"""
  66. todo = Todo()
  67. with pytest.raises(ValueError):
  68. todo.add("")
  69. with pytest.raises(ValueError):
  70. todo.add(" ")
  71. def test_add_strips_whitespace(self):
  72. """测试添加时去除空白字符"""
  73. todo = Todo()
  74. item = todo.add(" 买菜 ")
  75. assert item.title == "买菜"
  76. def test_delete_todo_item(self):
  77. """测试删除待办事项"""
  78. todo = Todo()
  79. todo.add("任务1")
  80. todo.add("任务2")
  81. assert todo.delete(1) is True
  82. assert len(todo.items) == 1
  83. assert todo.items[0].id == 2
  84. def test_delete_nonexistent_item(self):
  85. """测试删除不存在的事项"""
  86. todo = Todo()
  87. assert todo.delete(999) is False
  88. def test_complete_todo_item(self):
  89. """测试标记完成"""
  90. todo = Todo()
  91. item = todo.add("任务1")
  92. assert item.completed is False
  93. assert todo.complete(1) is True
  94. assert item.completed is True
  95. def test_complete_nonexistent_item(self):
  96. """测试标记不存在的事项为完成"""
  97. todo = Todo()
  98. assert todo.complete(999) is False
  99. def test_uncomplete_todo_item(self):
  100. """测试标记未完成"""
  101. todo = Todo()
  102. item = todo.add("任务1")
  103. todo.complete(1)
  104. assert item.completed is True
  105. assert todo.uncomplete(1) is True
  106. assert item.completed is False
  107. def test_get_by_id(self):
  108. """测试根据ID获取事项"""
  109. todo = Todo()
  110. todo.add("任务1")
  111. todo.add("任务2")
  112. item = todo.get_by_id(2)
  113. assert item is not None
  114. assert item.title == "任务2"
  115. assert todo.get_by_id(999) is None
  116. def test_get_all(self):
  117. """测试获取所有事项"""
  118. todo = Todo()
  119. todo.add("任务1")
  120. todo.add("任务2")
  121. items = todo.get_all()
  122. assert len(items) == 2
  123. # 确保返回的是副本
  124. items.clear()
  125. assert len(todo.items) == 2
  126. def test_get_pending(self):
  127. """测试获取未完成事项"""
  128. todo = Todo()
  129. todo.add("任务1")
  130. todo.add("任务2")
  131. todo.add("任务3")
  132. todo.complete(2)
  133. pending = todo.get_pending()
  134. assert len(pending) == 2
  135. assert all(not item.completed for item in pending)
  136. def test_get_completed(self):
  137. """测试获取已完成事项"""
  138. todo = Todo()
  139. todo.add("任务1")
  140. todo.add("任务2")
  141. todo.add("任务3")
  142. todo.complete(1)
  143. todo.complete(3)
  144. completed = todo.get_completed()
  145. assert len(completed) == 2
  146. assert all(item.completed for item in completed)
  147. def test_clear_completed(self):
  148. """测试清除已完成事项"""
  149. todo = Todo()
  150. todo.add("任务1")
  151. todo.add("任务2")
  152. todo.add("任务3")
  153. todo.complete(1)
  154. todo.complete(2)
  155. count = todo.clear_completed()
  156. assert count == 2
  157. assert len(todo.items) == 1
  158. assert todo.items[0].id == 3
  159. def test_to_dict(self):
  160. """测试转换为字典"""
  161. todo = Todo()
  162. todo.add("任务1")
  163. todo.add("任务2")
  164. data = todo.to_dict()
  165. assert "todos" in data
  166. assert "next_id" in data
  167. assert len(data["todos"]) == 2
  168. assert data["next_id"] == 3
  169. def test_from_dict(self):
  170. """测试从字典加载"""
  171. data = {
  172. "todos": [
  173. {"id": 1, "title": "任务1", "completed": False, "created_at": "2024-02-08 10:00:00"},
  174. {"id": 2, "title": "任务2", "completed": True, "created_at": "2024-02-08 11:00:00"}
  175. ],
  176. "next_id": 3
  177. }
  178. todo = Todo()
  179. todo.from_dict(data)
  180. assert len(todo.items) == 2
  181. assert todo.next_id == 3
  182. assert todo.items[0].title == "任务1"
  183. assert todo.items[1].completed is True