""" Storage类的单元测试 """ import os import json import pytest from todo.todo import Todo from todo.storage import Storage @pytest.fixture def temp_storage(tmp_path): """创建临时存储文件""" filepath = tmp_path / "test_todos.json" return Storage(str(filepath)) class TestStorage: """Storage类测试""" def test_create_storage(self, temp_storage): """测试创建Storage对象""" assert temp_storage.filepath.endswith("test_todos.json") def test_save_and_load(self, temp_storage): """测试保存和加载""" todo = Todo() todo.add("任务1") todo.add("任务2") todo.complete(1) # 保存 assert temp_storage.save(todo) is True assert temp_storage.exists() is True # 加载 loaded_todo = temp_storage.load() assert len(loaded_todo.items) == 2 assert loaded_todo.items[0].title == "任务1" assert loaded_todo.items[0].completed is True assert loaded_todo.items[1].title == "任务2" assert loaded_todo.next_id == 3 def test_load_nonexistent_file(self, temp_storage): """测试加载不存在的文件""" todo = temp_storage.load() assert len(todo.items) == 0 assert todo.next_id == 1 def test_load_invalid_json(self, temp_storage): """测试加载无效的JSON文件""" # 创建无效的JSON文件 with open(temp_storage.filepath, 'w') as f: f.write("invalid json content") todo = temp_storage.load() assert len(todo.items) == 0 assert todo.next_id == 1 def test_exists(self, temp_storage): """测试文件存在性检查""" assert temp_storage.exists() is False todo = Todo() temp_storage.save(todo) assert temp_storage.exists() is True def test_delete(self, temp_storage): """测试删除存储文件""" todo = Todo() temp_storage.save(todo) assert temp_storage.exists() is True assert temp_storage.delete() is True assert temp_storage.exists() is False def test_delete_nonexistent_file(self, temp_storage): """测试删除不存在的文件""" assert temp_storage.delete() is True def test_save_creates_valid_json(self, temp_storage): """测试保存的JSON格式正确""" todo = Todo() todo.add("任务1") temp_storage.save(todo) with open(temp_storage.filepath, 'r', encoding='utf-8') as f: data = json.load(f) assert "todos" in data assert "next_id" in data assert isinstance(data["todos"], list) assert isinstance(data["next_id"], int) def test_save_preserves_chinese_characters(self, temp_storage): """测试保存中文字符""" todo = Todo() todo.add("买菜做饭") temp_storage.save(todo) loaded_todo = temp_storage.load() assert loaded_todo.items[0].title == "买菜做饭"