From a605e9d110a986d4b5f54f17c239daa80319dff6 Mon Sep 17 00:00:00 2001 From: Gros Frumos Date: Mon, 16 Mar 2026 08:53:30 +0200 Subject: [PATCH] =?UTF-8?q?kin:=20KIN-070=20=D0=9F=D1=80=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=82=D1=8C=20=D1=81=D0=B8=D0=BD=D0=BA=20?= =?UTF-8?q?=D1=81=20=D0=BE=D0=B1=D1=81=D0=B8=D0=B4=D0=B8=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC:=20Exported:=200=20decisions=20Updated:=200=20tasks=20Va?= =?UTF-8?q?ult=20path=20does=20not=20exist=20or=20is=20not=20a=20directory?= =?UTF-8?q?:=20'/Users/grosfrumos/Library/Mobile=20Documents/iCloud~md~obs?= =?UTF-8?q?idian/Documents/myvault/kin'.=20=D0=9F=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D1=83?= =?UTF-8?q?=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B8=D1=82=D1=8C=D1=81=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_obsidian_sync.py | 54 ++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) 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):