()
| 1104 | |
| 1105 | #[tokio::test] |
| 1106 | async fn test_run_task_container_interactive() { |
| 1107 | // Test interactive mode with mock client |
| 1108 | let mock_client = Arc::new(TrackedDockerClient::default()); |
| 1109 | let ctx = AppContext::builder().build(); |
| 1110 | let manager = DockerManager::new(&ctx, mock_client.clone(), None); |
| 1111 | |
| 1112 | let task = create_test_task(true); |
| 1113 | let agent = crate::agent::ClaudeAgent::with_tsk_env(ctx.tsk_env()); |
| 1114 | let result = manager.run_task_container("tsk/base", &task, &agent).await; |
| 1115 | |
| 1116 | // Interactive mode should succeed with mock client |
| 1117 | assert!(result.is_ok()); |
| 1118 | let (output, task_result) = result.unwrap(); |
| 1119 | // Interactive mode returns empty output and a success task result |
| 1120 | assert_eq!(output, ""); |
| 1121 | assert!(task_result.success); |
| 1122 | assert_eq!(task_result.message, "Interactive session completed"); |
| 1123 | |
| 1124 | let create_calls = mock_client.create_container_calls.lock().unwrap(); |
| 1125 | assert_eq!(create_calls.len(), 2); // One for proxy, one for task container |
| 1126 | |
| 1127 | // Check task container config for interactive mode |
| 1128 | let (options, config) = &create_calls[1]; |
| 1129 | assert_eq!( |
| 1130 | options.as_ref().unwrap().name, |
| 1131 | Some("tsk-interactive-test-task-id".to_string()) |
| 1132 | ); |
| 1133 | |
| 1134 | // Check interactive-specific settings |
| 1135 | assert_eq!(config.attach_stdin, Some(true)); |
| 1136 | assert_eq!(config.attach_stdout, Some(true)); |
| 1137 | assert_eq!(config.attach_stderr, Some(true)); |
| 1138 | assert_eq!(config.tty, Some(true)); |
| 1139 | assert_eq!(config.open_stdin, Some(true)); |
| 1140 | |
| 1141 | // Check TSK environment variables are present in interactive mode too |
| 1142 | let env = config.env.as_ref().unwrap(); |
| 1143 | assert!(env.contains(&"TSK_CONTAINER=1".to_string())); |
| 1144 | assert!(env.contains(&"TSK_TASK_ID=test-task-id".to_string())); |
| 1145 | |
| 1146 | // Verify attach_container was called (indirectly through start_container_calls) |
| 1147 | let start_calls = mock_client.start_container_calls.lock().unwrap(); |
| 1148 | assert_eq!(start_calls.len(), 2); // One for proxy, one for task container |
| 1149 | |
| 1150 | // Verify cleanup happened |
| 1151 | let remove_calls = mock_client.remove_container_calls.lock().unwrap(); |
| 1152 | assert_eq!(remove_calls.len(), 2); // Task container + proxy |
| 1153 | assert_eq!(remove_calls[0].0, "test-container-id-1"); |
| 1154 | } |
| 1155 | |
| 1156 | #[tokio::test] |
| 1157 | async fn test_run_task_container_non_zero_exit() { |
nothing calls this directly
no test coverage detected