mod e2e;
use e2e::*;
use smcp_agent::{AsyncSmcpAgent, DefaultAuthProvider, SmcpAgentConfig};
use smcp_computer::computer::{Computer, ConnectOptions, SilentSession};
use tracing::info;
#[tokio::test]
#[cfg(all(feature = "agent", feature = "computer", feature = "server"))]
async fn test_server_startup() {
tracing_subscriber::fmt()
.with_test_writer()
.with_max_level(tracing::Level::INFO)
.try_init()
.ok();
let server = TestServer::start().await.expect("Failed to start server");
info!("Server started on {}", server.url());
assert!(server.addr.port() > 0);
assert!(server.url().contains("http://127.0.0.1"));
}
#[tokio::test]
#[cfg(all(feature = "computer", feature = "server"))]
async fn test_computer_connection() {
tracing_subscriber::fmt()
.with_test_writer()
.with_max_level(tracing::Level::INFO)
.try_init()
.ok();
let server = TestServer::start().await.expect("Failed to start server");
let computer_name = generate_computer_name();
let office_id = generate_office_id();
let session = SilentSession::new("test_session");
let computer = Computer::new(
computer_name.clone(),
session,
None, None, true, true, );
computer.boot_up().await.expect("Failed to boot computer");
let auth_secret = Some("test_secret".to_string());
let headers = None;
computer
.connect_socketio(
server.url(),
ConnectOptions {
auth_payload: auth_secret.as_deref().map(auth_dict),
headers: headers.clone(),
..Default::default()
},
)
.await
.expect("Failed to connect computer to server");
computer
.join_office(&office_id, &computer_name)
.await
.expect("Failed to join office");
info!(
"Computer {} connected and joined office {}",
computer_name, office_id
);
computer
.shutdown()
.await
.expect("Failed to shutdown computer");
}
#[tokio::test]
#[cfg(all(feature = "agent", feature = "server"))]
async fn test_agent_connection() {
tracing_subscriber::fmt()
.with_test_writer()
.with_max_level(tracing::Level::INFO)
.try_init()
.ok();
let server = TestServer::start().await.expect("Failed to start server");
let agent_name = generate_agent_name();
let office_id = generate_office_id();
let auth = DefaultAuthProvider::new(agent_name.clone(), office_id.clone())
.with_api_key("test_secret".to_string());
let config = SmcpAgentConfig::default();
let mut agent = AsyncSmcpAgent::new(auth, config);
agent
.connect(server.url())
.await
.expect("Failed to connect agent");
agent
.join_office(&agent_name)
.await
.expect("Failed to join office");
info!(
"Agent {} connected and joined office {}",
agent_name, office_id
);
let _ = agent.leave_office().await;
}
#[tokio::test]
#[cfg(all(feature = "agent", feature = "computer", feature = "server"))]
async fn test_basic_integration() {
tracing_subscriber::fmt()
.with_test_writer()
.with_max_level(tracing::Level::INFO)
.try_init()
.ok();
let server = TestServer::start().await.expect("Failed to start server");
let computer_name = generate_computer_name();
let office_id = generate_office_id();
let agent_name = generate_agent_name();
let auth = DefaultAuthProvider::new(agent_name.clone(), office_id.clone())
.with_api_key("test_secret".to_string());
let config = SmcpAgentConfig::default();
let event_handler = MockEventHandler::new();
let mut agent = AsyncSmcpAgent::new(auth, config).with_event_handler(event_handler.clone());
agent
.connect(server.url())
.await
.expect("Failed to connect agent");
agent
.join_office(&agent_name)
.await
.expect("Failed to join office");
let session = SilentSession::new("test_session");
let computer = Computer::new(computer_name.clone(), session, None, None, true, true);
computer.boot_up().await.expect("Failed to boot computer");
let auth_secret = Some("test_secret".to_string());
let headers = None;
computer
.connect_socketio(
server.url(),
ConnectOptions {
auth_payload: auth_secret.as_deref().map(auth_dict),
headers: headers.clone(),
..Default::default()
},
)
.await
.expect("Failed to connect computer");
computer
.join_office(&office_id, &computer_name)
.await
.expect("Failed to join office");
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
let has_computer = event_handler.has_computer(&computer_name).await;
assert!(has_computer, "Agent did not detect computer");
let event_count = event_handler.enter_office_count().await;
println!("Enter office event count: {}", event_count);
println!("Skipping get_tools call due to known issue");
let _ = agent.leave_office().await;
computer
.shutdown()
.await
.expect("Failed to shutdown computer");
info!("Test completed successfully!");
}