use std::sync::Arc;
use crate::config::Config;
use crate::tests::agent_service_mocks::{
MockProvider, MockProviderWithTools, create_test_service_with_provider,
};
#[tokio::test]
async fn reload_clears_a_chain_that_config_no_longer_declares() {
let (mut svc, _sid) = create_test_service_with_provider(Arc::new(MockProvider)).await;
svc.set_fallback_providers_for_test(vec![Arc::new(MockProviderWithTools::new())]);
assert!(
svc.has_fallback_provider(),
"precondition: the runtime is holding a chain"
);
svc.reload_fallback_providers(&Config::default()).await;
assert!(
!svc.has_fallback_provider(),
"#1249: a provider removed from config must stop receiving traffic \
without a restart"
);
assert!(svc.fallback_chain_snapshot().is_empty());
}
#[tokio::test]
async fn snapshot_reflects_the_current_chain() {
let (mut svc, _sid) = create_test_service_with_provider(Arc::new(MockProvider)).await;
assert!(
svc.fallback_chain_snapshot().is_empty(),
"test config carries no fallbacks"
);
svc.set_fallback_providers_for_test(vec![Arc::new(MockProviderWithTools::new())]);
assert_eq!(svc.fallback_chain_snapshot().len(), 1);
svc.set_fallback_providers_for_test(vec![]);
assert!(svc.fallback_chain_snapshot().is_empty());
}
#[tokio::test]
async fn session_swap_wraps_the_reloaded_chain() {
let (mut svc, sid) = create_test_service_with_provider(Arc::new(MockProvider)).await;
svc.set_fallback_providers_for_test(vec![Arc::new(MockProviderWithTools::new())]);
svc.swap_provider_for_session(sid, Arc::new(MockProvider), "mock-model");
assert!(
svc.provider_for_session(sid).is_fallback_chain(),
"precondition: a chain exists, so the swap wraps"
);
svc.reload_fallback_providers(&Config::default()).await;
svc.swap_provider_for_session(sid, Arc::new(MockProvider), "mock-model");
assert!(
!svc.provider_for_session(sid).is_fallback_chain(),
"#1249: with the chain removed there is nothing to wrap — the session \
must not keep cascading into providers the config no longer lists"
);
}