""" Todo类的单元测试 """ import pytest from todo.todo import Todo, TodoItem class TestTodoItem: """TodoItem类测试""" def test_create_todo_item(self): """测试创建TodoItem""" item = TodoItem(id=1, title="测试任务") assert item.id == 1 assert item.title == "测试任务" assert item.completed is False assert item.created_at is not None def test_todo_item_to_dict(self): """测试TodoItem转字典""" item = TodoItem(id=1, title="测试任务", completed=True) data = item.to_dict() assert data["id"] == 1 assert data["title"] == "测试任务" assert data["completed"] is True assert "created_at" in data def test_todo_item_from_dict(self): """测试从字典创建TodoItem""" data = { "id": 1, "title": "测试任务", "completed": True, "created_at": "2024-02-08 10:00:00" } item = TodoItem.from_dict(data) assert item.id == 1 assert item.title == "测试任务" assert item.completed is True assert item.created_at == "2024-02-08 10:00:00" def test_todo_item_repr(self): """测试TodoItem字符串表示""" item = TodoItem(id=1, title="测试任务") assert "1" in repr(item) assert "测试任务" in repr(item) class TestTodo: """Todo类测试""" def test_create_todo(self): """测试创建Todo对象""" todo = Todo() assert len(todo.items) == 0 assert todo.next_id == 1 def test_add_todo_item(self): """测试添加待办事项""" todo = Todo() item = todo.add("买菜") assert item.id == 1 assert item.title == "买菜" assert len(todo.items) == 1 assert todo.next_id == 2 def test_add_multiple_items(self): """测试添加多个待办事项""" todo = Todo() todo.add("任务1") todo.add("任务2") todo.add("任务3") assert len(todo.items) == 3 assert todo.next_id == 4 def test_add_empty_title_raises_error(self): """测试添加空标题抛出异常""" todo = Todo() with pytest.raises(ValueError): todo.add("") with pytest.raises(ValueError): todo.add(" ") def test_add_strips_whitespace(self): """测试添加时去除空白字符""" todo = Todo() item = todo.add(" 买菜 ") assert item.title == "买菜" def test_delete_todo_item(self): """测试删除待办事项""" todo = Todo() todo.add("任务1") todo.add("任务2") assert todo.delete(1) is True assert len(todo.items) == 1 assert todo.items[0].id == 2 def test_delete_nonexistent_item(self): """测试删除不存在的事项""" todo = Todo() assert todo.delete(999) is False def test_complete_todo_item(self): """测试标记完成""" todo = Todo() item = todo.add("任务1") assert item.completed is False assert todo.complete(1) is True assert item.completed is True def test_complete_nonexistent_item(self): """测试标记不存在的事项为完成""" todo = Todo() assert todo.complete(999) is False def test_uncomplete_todo_item(self): """测试标记未完成""" todo = Todo() item = todo.add("任务1") todo.complete(1) assert item.completed is True assert todo.uncomplete(1) is True assert item.completed is False def test_get_by_id(self): """测试根据ID获取事项""" todo = Todo() todo.add("任务1") todo.add("任务2") item = todo.get_by_id(2) assert item is not None assert item.title == "任务2" assert todo.get_by_id(999) is None def test_get_all(self): """测试获取所有事项""" todo = Todo() todo.add("任务1") todo.add("任务2") items = todo.get_all() assert len(items) == 2 # 确保返回的是副本 items.clear() assert len(todo.items) == 2 def test_get_pending(self): """测试获取未完成事项""" todo = Todo() todo.add("任务1") todo.add("任务2") todo.add("任务3") todo.complete(2) pending = todo.get_pending() assert len(pending) == 2 assert all(not item.completed for item in pending) def test_get_completed(self): """测试获取已完成事项""" todo = Todo() todo.add("任务1") todo.add("任务2") todo.add("任务3") todo.complete(1) todo.complete(3) completed = todo.get_completed() assert len(completed) == 2 assert all(item.completed for item in completed) def test_clear_completed(self): """测试清除已完成事项""" todo = Todo() todo.add("任务1") todo.add("任务2") todo.add("任务3") todo.complete(1) todo.complete(2) count = todo.clear_completed() assert count == 2 assert len(todo.items) == 1 assert todo.items[0].id == 3 def test_to_dict(self): """测试转换为字典""" todo = Todo() todo.add("任务1") todo.add("任务2") data = todo.to_dict() assert "todos" in data assert "next_id" in data assert len(data["todos"]) == 2 assert data["next_id"] == 3 def test_from_dict(self): """测试从字典加载""" data = { "todos": [ {"id": 1, "title": "任务1", "completed": False, "created_at": "2024-02-08 10:00:00"}, {"id": 2, "title": "任务2", "completed": True, "created_at": "2024-02-08 11:00:00"} ], "next_id": 3 } todo = Todo() todo.from_dict(data) assert len(todo.items) == 2 assert todo.next_id == 3 assert todo.items[0].title == "任务1" assert todo.items[1].completed is True