#[cfg(test)]
mod tests {
use crate::cook::coordinators::session::{DefaultSessionCoordinator, SessionCoordinator};
use crate::cook::session::SessionStatus;
use crate::storage::GlobalStorage;
use crate::unified_session::SessionManager as UnifiedSessionManager;
use std::path::PathBuf;
use std::sync::Arc;
use tempfile::TempDir;
#[tokio::test]
async fn test_start_session() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
let result = coordinator.start_session("session-test-123").await;
assert!(result.is_ok());
let info = coordinator.get_session_info().await.unwrap();
assert!(info.session_id.starts_with("session-"));
assert_eq!(info.session_id, "session-test-123");
}
#[tokio::test]
async fn test_update_status() {
let test_cases = vec![
(
"Running to Paused",
SessionStatus::InProgress,
SessionStatus::Interrupted,
),
(
"Running to Completed",
SessionStatus::InProgress,
SessionStatus::Completed,
),
(
"Running to Failed",
SessionStatus::InProgress,
SessionStatus::Failed,
),
];
for (description, initial_status, target_status) in test_cases {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator
.start_session(&format!("session-test-{}", description.replace(" ", "-")))
.await
.unwrap();
coordinator.update_status(initial_status).await.unwrap();
let result = coordinator.update_status(target_status.clone()).await;
assert!(
result.is_ok(),
"Failed to transition {}: {:?}",
description,
result.err()
);
}
}
#[tokio::test]
async fn test_track_iteration() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator.start_session("session-test-456").await.unwrap();
for i in 1..=5 {
let result = coordinator.track_iteration(i).await;
assert!(result.is_ok());
}
}
#[tokio::test]
async fn test_complete_session_success() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator.start_session("test-session").await.unwrap();
coordinator.track_iteration(1).await.unwrap();
coordinator.track_iteration(2).await.unwrap();
let result = coordinator.complete_session(true).await;
assert!(result.is_ok());
let info = coordinator.get_session_info().await.unwrap();
assert_eq!(info.status, SessionStatus::Completed);
}
#[tokio::test]
async fn test_complete_session_failure() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator.start_session("test-session").await.unwrap();
let result = coordinator.complete_session(false).await;
assert!(result.is_ok());
let info = coordinator.get_session_info().await.unwrap();
assert_eq!(info.status, SessionStatus::Failed);
}
#[tokio::test]
async fn test_get_session_info() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
let info = coordinator.get_session_info().await.unwrap();
assert_eq!(info.session_id, "unknown");
assert_eq!(info.status, SessionStatus::InProgress);
coordinator.start_session("session-my-test").await.unwrap();
coordinator
.update_status(SessionStatus::InProgress)
.await
.unwrap();
let info = coordinator.get_session_info().await.unwrap();
assert!(info.session_id.starts_with("session-"));
assert_eq!(info.status, SessionStatus::InProgress);
}
#[tokio::test]
async fn test_resume_session() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator
.start_session("session-resumable-test")
.await
.unwrap();
coordinator.track_iteration(1).await.unwrap();
coordinator.track_iteration(2).await.unwrap();
coordinator.track_iteration(3).await.unwrap();
let info = coordinator.get_session_info().await.unwrap();
let session_id = info.session_id;
let result = coordinator.resume_session(&session_id).await.unwrap();
assert!(result.is_some());
assert_eq!(result.unwrap(), 3);
coordinator.complete_session(true).await.unwrap();
let result = coordinator.resume_session(&session_id).await.unwrap();
assert!(result.is_none()); }
#[tokio::test]
async fn test_session_lifecycle() {
let temp_dir = TempDir::new().unwrap();
let storage = GlobalStorage::new_with_root(temp_dir.path().to_path_buf()).unwrap();
let session_manager = Arc::new(UnifiedSessionManager::new(storage).await.unwrap());
let working_dir = PathBuf::from("/test");
let coordinator = DefaultSessionCoordinator::new(session_manager.clone(), working_dir);
coordinator
.start_session("session-lifecycle-test")
.await
.unwrap();
coordinator
.update_status(SessionStatus::InProgress)
.await
.unwrap();
for i in 1..=10 {
coordinator.track_iteration(i).await.unwrap();
}
coordinator.complete_session(true).await.unwrap();
let info = coordinator.get_session_info().await.unwrap();
assert!(info.session_id.starts_with("session-"));
assert_eq!(info.status, SessionStatus::Completed);
}
}