feat(01-01): implement WorkflowStateManager with atomic write

GREEN phase: Implement state management with:
- Atomic write pattern (temp file + os.replace)
- Backup rotation (workflow_state.json -> .bak)
- Backup fallback on corruption
- get_or_create idempotent creation

Fix test to properly create backup before corruption test.

All 20 tests pass.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 17:16:30 +08:00
parent e789d81230
commit 624cd76538
2 changed files with 165 additions and 2 deletions
+13 -2
View File
@@ -281,7 +281,7 @@ class TestBackupFallback:
state_file = tmp_path / "workflow_state.json"
backup_file = tmp_path / "workflow_state.json.bak"
# Create valid backup
# Create valid backup by saving twice (backup is created on second save)
valid_state = WorkflowState(
content_id="backup-valid-001",
platform="bilibili",
@@ -289,11 +289,22 @@ class TestBackupFallback:
)
manager.save(valid_state)
# Save again to create backup
valid_state2 = WorkflowState(
content_id="backup-valid-002",
platform="bilibili",
source_url="https://www.bilibili.com/video/BV888"
)
manager.save(valid_state2)
# Now backup exists with "backup-valid-001", main has "backup-valid-002"
assert backup_file.exists()
# Corrupt main file
with open(state_file, 'w', encoding='utf-8') as f:
f.write("{ invalid json content }")
# Should fall back to backup
# Should fall back to backup (which has backup-valid-001)
loaded = manager.load()
assert loaded is not None