File size: 7,372 Bytes
59bd45e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | """Integration tests for storage service.
This module tests the complete workflow of saving records and appending
related data to demonstrate the storage service functionality.
Requirements: 7.1, 7.2, 7.3, 7.4, 7.5, 7.7
"""
import json
import pytest
import tempfile
import shutil
from pathlib import Path
from datetime import datetime
from app.storage import StorageService
from app.models import (
RecordData,
ParsedData,
MoodData,
InspirationData,
TodoData
)
@pytest.fixture
def temp_data_dir():
"""Create a temporary directory for test data."""
temp_dir = tempfile.mkdtemp()
yield temp_dir
shutil.rmtree(temp_dir)
@pytest.fixture
def storage_service(temp_data_dir):
"""Create a StorageService instance with temporary directory."""
return StorageService(temp_data_dir)
class TestStorageIntegration:
"""Integration tests for complete storage workflow."""
def test_complete_workflow_with_all_data(self, storage_service):
"""Test complete workflow: save record and append all related data."""
# Create a complete record
timestamp = "2024-01-01T12:00:00Z"
mood = MoodData(type="开心", intensity=8, keywords=["愉快", "放松"])
inspirations = [
InspirationData(core_idea="新项目想法", tags=["创新", "技术"], category="工作"),
InspirationData(core_idea="周末计划", tags=["休闲"], category="生活")
]
todos = [
TodoData(task="完成报告", time="明天下午", location="办公室"),
TodoData(task="买菜", time="今晚", location="超市")
]
record = RecordData(
record_id="", # Will be generated
timestamp=timestamp,
input_type="text",
original_text="今天很开心,想到一个新项目想法,还要完成报告和买菜",
parsed_data=ParsedData(
mood=mood,
inspirations=inspirations,
todos=todos
)
)
# Save record
record_id = storage_service.save_record(record)
assert record_id
# Append mood
storage_service.append_mood(mood, record_id, timestamp)
# Append inspirations
storage_service.append_inspirations(inspirations, record_id, timestamp)
# Append todos
storage_service.append_todos(todos, record_id, timestamp)
# Verify records.json
with open(storage_service.records_file, 'r', encoding='utf-8') as f:
records = json.load(f)
assert len(records) == 1
assert records[0]["record_id"] == record_id
assert records[0]["original_text"] == record.original_text
# Verify moods.json
with open(storage_service.moods_file, 'r', encoding='utf-8') as f:
moods = json.load(f)
assert len(moods) == 1
assert moods[0]["record_id"] == record_id
assert moods[0]["type"] == "开心"
assert moods[0]["intensity"] == 8
# Verify inspirations.json
with open(storage_service.inspirations_file, 'r', encoding='utf-8') as f:
all_inspirations = json.load(f)
assert len(all_inspirations) == 2
assert all_inspirations[0]["record_id"] == record_id
assert all_inspirations[0]["core_idea"] == "新项目想法"
assert all_inspirations[1]["core_idea"] == "周末计划"
# Verify todos.json
with open(storage_service.todos_file, 'r', encoding='utf-8') as f:
all_todos = json.load(f)
assert len(all_todos) == 2
assert all_todos[0]["record_id"] == record_id
assert all_todos[0]["task"] == "完成报告"
assert all_todos[1]["task"] == "买菜"
def test_multiple_records_workflow(self, storage_service):
"""Test saving multiple records and verifying data accumulation."""
# First record
record1 = RecordData(
record_id="",
timestamp="2024-01-01T12:00:00Z",
input_type="text",
original_text="今天很开心",
parsed_data=ParsedData(
mood=MoodData(type="开心", intensity=8)
)
)
record_id1 = storage_service.save_record(record1)
storage_service.append_mood(record1.parsed_data.mood, record_id1, record1.timestamp)
# Second record
record2 = RecordData(
record_id="",
timestamp="2024-01-01T13:00:00Z",
input_type="text",
original_text="有点焦虑",
parsed_data=ParsedData(
mood=MoodData(type="焦虑", intensity=6)
)
)
record_id2 = storage_service.save_record(record2)
storage_service.append_mood(record2.parsed_data.mood, record_id2, record2.timestamp)
# Verify records accumulated
with open(storage_service.records_file, 'r', encoding='utf-8') as f:
records = json.load(f)
assert len(records) == 2
# Verify moods accumulated
with open(storage_service.moods_file, 'r', encoding='utf-8') as f:
moods = json.load(f)
assert len(moods) == 2
assert moods[0]["type"] == "开心"
assert moods[1]["type"] == "焦虑"
def test_workflow_with_partial_data(self, storage_service):
"""Test workflow when only some data types are present."""
# Record with only mood (no inspirations or todos)
timestamp = "2024-01-01T12:00:00Z"
mood = MoodData(type="平静", intensity=5)
record = RecordData(
record_id="",
timestamp=timestamp,
input_type="text",
original_text="今天感觉很平静",
parsed_data=ParsedData(mood=mood)
)
record_id = storage_service.save_record(record)
storage_service.append_mood(mood, record_id, timestamp)
# Empty lists should not create files
storage_service.append_inspirations([], record_id, timestamp)
storage_service.append_todos([], record_id, timestamp)
# Verify only records.json and moods.json exist
assert storage_service.records_file.exists()
assert storage_service.moods_file.exists()
assert not storage_service.inspirations_file.exists()
assert not storage_service.todos_file.exists()
def test_unique_id_generation_across_records(self, storage_service):
"""Test that each record gets a unique ID."""
record_ids = []
for i in range(5):
record = RecordData(
record_id="",
timestamp=f"2024-01-01T{12+i}:00:00Z",
input_type="text",
original_text=f"测试文本 {i}",
parsed_data=ParsedData()
)
record_id = storage_service.save_record(record)
record_ids.append(record_id)
# All IDs should be unique
assert len(record_ids) == len(set(record_ids))
# All IDs should be valid UUIDs (36 characters with hyphens)
for record_id in record_ids:
assert len(record_id) == 36
assert record_id.count('-') == 4
|