use crate::brain::agent::service::AgentService;
use crate::brain::provider::Provider;
use crate::db::Database;
use crate::services::ServiceContext;
use crate::tests::agent_service_mocks::MockProvider;
use std::sync::Arc;
use uuid::Uuid;
async fn make_service() -> AgentService {
let db = Database::connect_in_memory().await.unwrap();
db.run_migrations().await.unwrap();
let pool = db.pool().clone();
let context = ServiceContext::new(pool);
let provider: Arc<dyn Provider> = Arc::new(MockProvider);
AgentService::new_for_test(provider, context).await
}
#[tokio::test]
async fn register_and_query_active_skill() {
let svc = make_service().await;
let sid = Uuid::new_v4();
svc.register_active_skill(sid, "security-audit");
let skills = svc.active_skills_for_session(sid);
assert!(skills.contains("security-audit"));
assert_eq!(skills.len(), 1);
}
#[tokio::test]
async fn multiple_skills_per_session() {
let svc = make_service().await;
let sid = Uuid::new_v4();
svc.register_active_skill(sid, "security-audit");
svc.register_active_skill(sid, "cost-estimate");
svc.register_active_skill(sid, "repo-audit");
let skills = svc.active_skills_for_session(sid);
assert_eq!(skills.len(), 3);
assert!(skills.contains("security-audit"));
assert!(skills.contains("cost-estimate"));
assert!(skills.contains("repo-audit"));
}
#[tokio::test]
async fn skills_are_session_scoped() {
let svc = make_service().await;
let sid1 = Uuid::new_v4();
let sid2 = Uuid::new_v4();
svc.register_active_skill(sid1, "security-audit");
svc.register_active_skill(sid2, "cost-estimate");
let skills1 = svc.active_skills_for_session(sid1);
let skills2 = svc.active_skills_for_session(sid2);
assert!(skills1.contains("security-audit"));
assert!(!skills1.contains("cost-estimate"));
assert!(skills2.contains("cost-estimate"));
assert!(!skills2.contains("security-audit"));
}
#[tokio::test]
async fn duplicate_skill_registration_is_idempotent() {
let svc = make_service().await;
let sid = Uuid::new_v4();
svc.register_active_skill(sid, "security-audit");
svc.register_active_skill(sid, "security-audit");
svc.register_active_skill(sid, "security-audit");
let skills = svc.active_skills_for_session(sid);
assert_eq!(skills.len(), 1);
}
#[tokio::test]
async fn unknown_session_returns_empty() {
let svc = make_service().await;
let sid = Uuid::new_v4();
let skills = svc.active_skills_for_session(sid);
assert!(skills.is_empty());
}
#[tokio::test]
async fn cleanup_on_session_removal() {
let svc = make_service().await;
let sid = Uuid::new_v4();
svc.register_active_skill(sid, "security-audit");
assert_eq!(svc.active_skills_for_session(sid).len(), 1);
svc.remove_session_provider(sid);
let skills = svc.active_skills_for_session(sid);
assert!(
skills.is_empty(),
"active skills should be cleared after session removal, got: {:?}",
skills
);
}