@@ -76,5 +76,39 @@ async def sync(self, external_id: str, force_full: bool = False):
7676 assert seen ["force_full" ] is False
7777
7878
79+ def test_cloud_bisync_fails_fast_when_sync_entry_disappears (monkeypatch , config_manager ):
80+ """Bisync should raise a runtime error when validated sync config vanishes before persistence."""
81+ project_sync_command = importlib .import_module ("basic_memory.cli.commands.cloud.project_sync" )
82+
83+ config = config_manager .load_config ()
84+ config .projects .pop ("research" , None )
85+ config_manager .save_config (config )
86+
87+ monkeypatch .setattr (project_sync_command , "_require_cloud_credentials" , lambda _config : None )
88+ monkeypatch .setattr (
89+ project_sync_command ,
90+ "get_mount_info" ,
91+ lambda : _async_value (SimpleNamespace (bucket_name = "tenant-bucket" )),
92+ )
93+ monkeypatch .setattr (
94+ project_sync_command ,
95+ "_get_cloud_project" ,
96+ lambda _name : _async_value (
97+ SimpleNamespace (name = "research" , external_id = "external-project-id" , path = "research" )
98+ ),
99+ )
100+ monkeypatch .setattr (
101+ project_sync_command ,
102+ "_get_sync_project" ,
103+ lambda _name , _config , _project_data : (SimpleNamespace (name = "research" ), "/tmp/research" ),
104+ )
105+ monkeypatch .setattr (project_sync_command , "project_bisync" , lambda * args , ** kwargs : True )
106+
107+ result = runner .invoke (app , ["cloud" , "bisync" , "--name" , "research" ])
108+
109+ assert result .exit_code == 1 , result .output
110+ assert "unexpectedly missing after validation" in result .output
111+
112+
79113async def _async_value (value ):
80114 return value
0 commit comments