"""Tests para register_obsidian_vault.""" import json import os from register_obsidian_vault import register_obsidian_vault def _read(cfg): with open(cfg, "r", encoding="utf-8") as f: return json.load(f) def test_registra_entrada_nueva(tmp_path): # Golden path: registra un vault nuevo en una config inexistente. cfg = str(tmp_path / "obsidian.json") vault = tmp_path / "MiVault" vault.mkdir() res = register_obsidian_vault(str(vault), open=True, config_path=cfg) assert res["registered"] is True assert res["already"] is False assert res["open"] is True assert len(res["id"]) == 16 assert res["path"] == str(vault) data = _read(cfg) assert res["id"] in data["vaults"] entry = data["vaults"][res["id"]] assert entry["path"] == str(vault) assert entry["open"] is True assert isinstance(entry["ts"], int) and entry["ts"] > 0 def test_segundo_registro_mismo_path_no_duplica_y_devuelve_already(tmp_path): # Edge: idempotencia por path. La segunda llamada no crea otra entrada. cfg = str(tmp_path / "obsidian.json") vault = tmp_path / "MiVault" vault.mkdir() r1 = register_obsidian_vault(str(vault), open=True, config_path=cfg) r2 = register_obsidian_vault(str(vault), open=True, config_path=cfg) assert r2["already"] is True assert r2["registered"] is False assert r2["id"] == r1["id"] data = _read(cfg) assert len(data["vaults"]) == 1 def test_actualiza_flag_open_de_entrada_existente(tmp_path): # Edge: misma ruta pero flag open distinto -> actualiza y reescribe. cfg = str(tmp_path / "obsidian.json") vault = tmp_path / "MiVault" vault.mkdir() register_obsidian_vault(str(vault), open=False, config_path=cfg) r2 = register_obsidian_vault(str(vault), open=True, config_path=cfg) assert r2["already"] is True assert r2["open"] is True data = _read(cfg) assert data["vaults"][r2["id"]]["open"] is True def test_preserva_claves_extra_de_nivel_superior(tmp_path): # Edge: claves ajenas a "vaults" deben sobrevivir a la escritura. cfg = str(tmp_path / "obsidian.json") with open(cfg, "w", encoding="utf-8") as f: json.dump( { "appVersionLastUsed": "1.5.3", "updateDisabled": True, "vaults": { "0000000000000000": {"path": "/otro/Vault", "ts": 111, "open": False} }, }, f, ) vault = tmp_path / "Nuevo" vault.mkdir() register_obsidian_vault(str(vault), open=True, config_path=cfg) data = _read(cfg) assert data["appVersionLastUsed"] == "1.5.3" assert data["updateDisabled"] is True # La entrada previa de otro vault se conserva. assert "0000000000000000" in data["vaults"] assert len(data["vaults"]) == 2 def test_crea_config_y_directorios_si_no_existe(tmp_path): # Edge: la config y sus directorios padre no existen y se crean. cfg = str(tmp_path / "sub" / "dir" / "obsidian.json") vault = tmp_path / "MiVault" vault.mkdir() res = register_obsidian_vault(str(vault), config_path=cfg) assert res["registered"] is True assert os.path.isfile(cfg) # Sin archivo previo no hay backup. assert res["backup_path"] == "" def test_hace_backup_bak_antes_de_sobreescribir(tmp_path): # Edge: una segunda escritura sobre config existente genera backup .bak. cfg = str(tmp_path / "obsidian.json") v1 = tmp_path / "V1" v1.mkdir() v2 = tmp_path / "V2" v2.mkdir() register_obsidian_vault(str(v1), config_path=cfg) # crea config res = register_obsidian_vault(str(v2), config_path=cfg) # ahora si hay backup assert res["backup_path"] == cfg + ".bak" assert os.path.isfile(cfg + ".bak")