use circle_ws_lib::{spawn_circle_server, ServerConfig}; use rhailib_engine::create_heromodels_engine; use futures_util::{SinkExt, StreamExt}; use heromodels::db::hero::OurDB; use rhailib_worker::spawn_rhai_worker; use serde_json::json; use std::sync::Arc; use tokio::sync::mpsc; use tokio_tungstenite::{connect_async, tungstenite::protocol::Message}; use uuid::Uuid; #[tokio::test] async fn test_server_startup_and_play() { let circle_pk = Uuid::new_v4().to_string(); let redis_url = "redis://127.0.0.1/"; // --- Worker Setup --- let (shutdown_tx, shutdown_rx) = mpsc::channel(1); let db = Arc::new(OurDB::new("file:memdb_test_server?mode=memory&cache=shared", true).unwrap()); let engine = create_heromodels_engine(); let worker_id = Uuid::new_v4().to_string(); let worker_handle = spawn_rhai_worker( worker_id, circle_pk.to_string(), engine, redis_url.to_string(), shutdown_rx, false, ); // --- Server Setup --- let config = ServerConfig::new( "127.0.0.1".to_string(), 9997, // Using a different port to avoid conflicts redis_url.to_string(), ); let (server_task, server_handle) = spawn_circle_server(config).unwrap(); let server_join_handle = tokio::spawn(server_task); // Give server and worker a moment to start tokio::time::sleep(std::time::Duration::from_millis(500)).await; // --- Client Connection and Test --- let ws_url = format!("ws://127.0.0.1:9997/{}", circle_pk); let (mut ws_stream, _) = connect_async(ws_url).await.expect("Failed to connect"); let play_req = json!({ "jsonrpc": "2.0", "method": "play", "params": { "script": "40 + 2" }, "id": 1 }); ws_stream .send(Message::Text(play_req.to_string())) .await .unwrap(); let response = ws_stream.next().await.unwrap().unwrap(); let response_text = response.to_text().unwrap(); let response_json: serde_json::Value = serde_json::from_str(response_text).unwrap(); assert_eq!(response_json["id"], 1); assert!( response_json["result"].is_object(), "The result should be an object, but it was: {}", response_text ); assert_eq!(response_json["result"]["output"], "42"); // --- Cleanup --- server_handle.stop(true).await; let _ = server_join_handle.await; let _ = shutdown_tx.send(()).await; let _ = worker_handle.await; }