diff --git a/src/runtime_api.rs b/src/runtime_api.rs index 708aa99d..c8d04427 100644 --- a/src/runtime_api.rs +++ b/src/runtime_api.rs @@ -1507,15 +1507,16 @@ mod tests { } } - async fn spawn_test_server() -> Result< + async fn spawn_test_server_with_root( + root: PathBuf, + sessions_dir: PathBuf, + ) -> Result< Option<( SocketAddr, SharedRuntimeThreadManager, tokio::task::JoinHandle<()>, )>, > { - let root = std::env::temp_dir().join(format!("deepseek-runtime-api-{}", Uuid::new_v4())); - let sessions_dir = root.join("sessions"); fs::create_dir_all(&sessions_dir)?; let manager = TaskManager::start_with_executor( TaskManagerConfig { @@ -1577,6 +1578,18 @@ mod tests { Ok(Some((addr, runtime_threads, handle))) } + async fn spawn_test_server() -> Result< + Option<( + SocketAddr, + SharedRuntimeThreadManager, + tokio::task::JoinHandle<()>, + )>, + > { + let root = std::env::temp_dir().join(format!("deepseek-runtime-api-{}", Uuid::new_v4())); + let sessions_dir = root.join("sessions"); + spawn_test_server_with_root(root, sessions_dir).await + } + async fn read_first_sse_frame(resp: reqwest::Response) -> Result { let mut stream = resp.bytes_stream(); let mut buf = Vec::new(); @@ -2620,12 +2633,6 @@ mod tests { #[tokio::test] async fn session_resume_thread_creates_thread_from_saved_session() -> Result<()> { - let Some((addr, _runtime_threads, handle)) = spawn_test_server().await? else { - return Ok(()); - }; - let client = reqwest::Client::new(); - - // Write a minimal saved session file into the sessions dir used by the test server. let root = std::env::temp_dir().join(format!("deepseek-session-resume-{}", Uuid::new_v4())); let sessions_dir = root.join("sessions"); fs::create_dir_all(&sessions_dir)?; @@ -2660,10 +2667,13 @@ mod tests { serde_json::to_string_pretty(&session)?, )?; - // This test validates the shape of the error (session dir mismatch with - // the test-server sessions dir), since the test server creates its own - // temp sessions directory. The important contract is the 404 response - // for a session not present in the server's sessions dir. + let Some((addr, _runtime_threads, handle)) = + spawn_test_server_with_root(root.clone(), sessions_dir.clone()).await? + else { + return Ok(()); + }; + let client = reqwest::Client::new(); + let resp = client .post(format!( "http://{addr}/v1/sessions/{session_id}/resume-thread" @@ -2671,7 +2681,24 @@ mod tests { .json(&json!({ "model": "deepseek-chat" })) .send() .await?; - assert_eq!(resp.status(), StatusCode::NOT_FOUND); + assert_eq!(resp.status(), StatusCode::CREATED); + let resumed: serde_json::Value = resp.json().await?; + assert_eq!(resumed["session_id"], session_id); + assert_eq!(resumed["message_count"], 2); + + let thread_id = resumed["thread_id"] + .as_str() + .context("missing resumed thread id")?; + let detail: serde_json::Value = client + .get(format!("http://{addr}/v1/threads/{thread_id}")) + .send() + .await? + .error_for_status()? + .json() + .await?; + assert_eq!(detail["thread"]["id"], thread_id); + assert_eq!(detail["turns"].as_array().map_or(0, Vec::len), 1); + assert_eq!(detail["items"].as_array().map_or(0, Vec::len), 2); handle.abort(); Ok(())