use std::sync::Arc;
use crate::brain::agent::service::AgentService;
use crate::brain::provider::Provider;
use crate::db::{Database, Session};
use crate::services::ServiceContext;
use crate::tests::agent_service_mocks::{MockProvider, MockProviderWithModel};
use crate::tui::app::App;
async fn app() -> App {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let context = ServiceContext::new(db.pool().clone());
let provider: Arc<dyn Provider> = Arc::new(MockProvider);
let service = Arc::new(AgentService::new_for_test(provider, context.clone()).await);
#[cfg(feature = "whatsapp")]
{
App::new(
service,
context,
Arc::new(crate::channels::whatsapp::WhatsAppState::new()),
)
}
#[cfg(not(feature = "whatsapp"))]
{
App::new(service, context)
}
}
#[tokio::test]
async fn swapped_session_reports_session_provider_not_global() {
let mut app = app().await;
let session = Session::new(Some("Swapped".to_string()), None, None);
let sid = session.id;
let swapped: Arc<dyn Provider> =
Arc::new(MockProviderWithModel::new("claude-cli", "claude-opus"));
app.agent_service
.swap_provider_for_session(sid, swapped, "claude-opus".to_string());
app.current_session = Some(session);
assert_eq!(app.provider_name_for_current_session(), "claude-cli");
assert_eq!(app.provider_model_for_current_session(), "claude-opus");
assert_eq!(app.provider_name(), "mock");
assert_eq!(app.provider_model(), "mock-model");
}
#[tokio::test]
async fn no_current_session_falls_back_to_global() {
let app = app().await;
assert!(app.current_session.is_none());
assert_eq!(app.provider_name_for_current_session(), "mock");
assert_eq!(app.provider_model_for_current_session(), "mock-model");
}
#[tokio::test]
async fn session_without_override_resolves_global_default() {
let mut app = app().await;
app.current_session = Some(Session::new(Some("Plain".to_string()), None, None));
assert_eq!(app.provider_name_for_current_session(), "mock");
assert_eq!(app.provider_model_for_current_session(), "mock-model");
}