@@ -480,6 +480,79 @@ async def test_config_metadata_includes_registered_sandbox_providers(
480480 assert "dashboard-generic" in metadata_text
481481
482482
483+ @pytest .mark .asyncio
484+ async def test_config_abconf_clears_unavailable_sandbox_booter_for_display (
485+ app : Quart ,
486+ authenticated_header : dict ,
487+ monkeypatch : pytest .MonkeyPatch ,
488+ core_lifecycle_td : AstrBotCoreLifecycle ,
489+ ):
490+ from astrbot .core .computer import computer_client
491+ from astrbot .core .computer .sandbox_manager import SandboxManager
492+ from astrbot .core .computer .sandbox_registry import SandboxRegistry
493+
494+ manager = SandboxManager (registry = SandboxRegistry (), providers = {})
495+ monkeypatch .setattr (computer_client , "sandbox_manager" , manager )
496+ original_booter = core_lifecycle_td .astrbot_config ["provider_settings" ][
497+ "sandbox"
498+ ].get ("booter" )
499+ core_lifecycle_td .astrbot_config ["provider_settings" ]["sandbox" ]["booter" ] = (
500+ "shipyard"
501+ )
502+
503+ try :
504+ test_client = app .test_client ()
505+ response = await test_client .get (
506+ "/api/config/abconf?id=default" , headers = authenticated_header
507+ )
508+ data = await response .get_json ()
509+
510+ assert response .status_code == 200
511+ assert data ["status" ] == "ok"
512+ assert data ["data" ]["config" ]["provider_settings" ]["sandbox" ]["booter" ] == ""
513+ finally :
514+ core_lifecycle_td .astrbot_config ["provider_settings" ]["sandbox" ]["booter" ] = (
515+ original_booter
516+ )
517+
518+
519+ @pytest .mark .asyncio
520+ async def test_config_save_clears_unavailable_sandbox_booter (
521+ app : Quart ,
522+ authenticated_header : dict ,
523+ monkeypatch : pytest .MonkeyPatch ,
524+ core_lifecycle_td : AstrBotCoreLifecycle ,
525+ ):
526+ from astrbot .core .computer import computer_client
527+ from astrbot .core .computer .sandbox_manager import SandboxManager
528+ from astrbot .core .computer .sandbox_registry import SandboxRegistry
529+
530+ manager = SandboxManager (registry = SandboxRegistry (), providers = {})
531+ monkeypatch .setattr (computer_client , "sandbox_manager" , manager )
532+ original_config = copy .deepcopy (dict (core_lifecycle_td .astrbot_config ))
533+ post_config = copy .deepcopy (original_config )
534+ post_config ["provider_settings" ]["computer_use_runtime" ] = "sandbox"
535+ post_config ["provider_settings" ]["sandbox" ]["booter" ] = "shipyard"
536+
537+ try :
538+ test_client = app .test_client ()
539+ response = await test_client .post (
540+ "/api/config/astrbot/update" ,
541+ headers = authenticated_header ,
542+ json = {"conf_id" : "default" , "config" : post_config },
543+ )
544+ data = await response .get_json ()
545+
546+ assert response .status_code == 200
547+ assert data ["status" ] == "ok"
548+ assert (
549+ core_lifecycle_td .astrbot_config ["provider_settings" ]["sandbox" ]["booter" ]
550+ == ""
551+ )
552+ finally :
553+ core_lifecycle_td .astrbot_config .save_config (original_config )
554+
555+
483556@pytest .mark .asyncio
484557async def test_sandbox_dashboard_lists_managed_sandboxes (
485558 app : Quart ,
0 commit comments