diff --git a/tests/test_obsidian_sync.py b/tests/test_obsidian_sync.py index 642a24f..838c5a2 100644 --- a/tests/test_obsidian_sync.py +++ b/tests/test_obsidian_sync.py @@ -228,10 +228,17 @@ def test_export_frontmatter_has_yaml_delimiters(tmp_vault): # --------------------------------------------------------------------------- # 9. sync_obsidian — несуществующий vault_path → директория создаётся автоматически +# KIN-070: Регрессионный тест на автоматическое создание vault directory # --------------------------------------------------------------------------- -def test_sync_nonexistent_vault_creates_directory(db, tmp_path): - """Если vault_path не существует, sync автоматически создаёт директорию.""" +def test_kin070_sync_creates_missing_vault_directory(db, tmp_path): + """KIN-070: Если vault_path не существует, sync автоматически создаёт директорию. + + Проверяет что: + - Директория создаётся без ошибок + - sync_obsidian не падает с ошибкой + - Возвращаемый результат содержит errors=[] + """ nonexistent = tmp_path / "ghost_vault" models.update_project(db, "proj1", obsidian_vault_path=str(nonexistent)) @@ -244,7 +251,48 @@ def test_sync_nonexistent_vault_creates_directory(db, tmp_path): # --------------------------------------------------------------------------- -# 10. sync_obsidian — пустой vault → 0 экспортов, 0 обновлений, нет ошибок +# 10. sync_obsidian + decisions: несуществующий vault + decisions в БД → export success +# KIN-070: Проверяет что decisions экспортируются когда vault создаётся автоматически +# --------------------------------------------------------------------------- + +def test_kin070_sync_creates_vault_and_exports_decisions(db, tmp_path): + """KIN-070: sync экспортирует decisions и автоматически создаёт vault_path. + + Проверяет что: + - vault директория создаётся автоматически + - decisions экспортируются в .md-файлы (exported_decisions > 0) + - errors == [] (нет ошибок) + """ + nonexistent = tmp_path / "missing_vault" + models.update_project(db, "proj1", obsidian_vault_path=str(nonexistent)) + + # Создаём decision в БД + models.add_decision( + db, + project_id="proj1", + type="decision", + title="Use SQLite for sync state", + description="SQLite will be the single source of truth.", + tags=["database", "sync"], + ) + + result = sync_obsidian(db, "proj1") + + # Проверяем успешный экспорт + assert result["errors"] == [] + assert nonexistent.is_dir() # директория создана + assert result["exported_decisions"] == 1 # одно decision экспортировано + assert result["tasks_updated"] == 0 + + # Проверяем что .md-файл создан в правильной директории + decisions_dir = nonexistent / "proj1" / "decisions" + assert decisions_dir.is_dir() + md_files = list(decisions_dir.glob("*.md")) + assert len(md_files) == 1 + + +# --------------------------------------------------------------------------- +# 11. sync_obsidian — пустой vault → 0 экспортов, 0 обновлений, нет ошибок # --------------------------------------------------------------------------- def test_sync_empty_vault_no_errors(db, tmp_vault):