import os def test_bootstrap_idempotent(tmp_pyra_home): from pyra.config.dirs import bootstrap bootstrap() # already called by fixture; should not raise def test_bootstrap_creates_all_directories(tmp_pyra_home): assert (tmp_pyra_home / "memory" / "user").is_dir() assert (tmp_pyra_home / "memory" / "context").is_dir() assert (tmp_pyra_home / "memory" / "knowledge").is_dir() assert (tmp_pyra_home / "vault" / "secrets").is_dir() assert (tmp_pyra_home / "plugins").is_dir() assert (tmp_pyra_home / "logs").is_dir() def test_bootstrap_creates_template_files(tmp_pyra_home): from pyra.config.dirs import bootstrap bootstrap() assert (tmp_pyra_home / "memory" / "MEMORY_INDEX.md").exists() assert (tmp_pyra_home / "memory" / "user" / "profile.md").exists() def test_bootstrap_template_content(tmp_pyra_home): from pyra.config.dirs import bootstrap bootstrap() profile = (tmp_pyra_home / "memory" / "user" / "profile.md").read_text() assert "User Profile" in profile def test_bootstrap_initializes_db(tmp_pyra_home): from pyra.memory import database assert database._DB_PATH.exists() def test_bootstrap_creates_vault_lock(tmp_pyra_home): assert (tmp_pyra_home / "vault" / ".vault_lock").exists() def test_bootstrap_sets_config_permissions(tmp_pyra_home): from pyra.config.manager import save_config from pyra.config.schema import PyraConfig, ProviderConfig from pyra.config.dirs import bootstrap save_config(PyraConfig(ai=ProviderConfig(provider_id="lmstudio", model="gemma"))) bootstrap() config = tmp_pyra_home / "config.yaml" assert config.exists() if os.name != "nt": assert oct(config.stat().st_mode)[-3:] == "600"