use assert_cmd::Command; use httpmock::prelude::*; use predicates::prelude::PredicateBooleanExt; #[tokio::test] async fn headless_streams_ndjson() { let server = MockServer::start_async().await; // Mock /api/chat with NDJSON lines let body = serde_json::json!({ "model": "qwen2.5", "messages": [{"role": "user", "content": "hello"}], "stream": true }); let response = concat!( r#"{"message":{"role":"assistant","content":"Hel"}}"#,"\n", r#"{"message":{"role":"assistant","content":"lo"}}"#,"\n", r#"{"done":true}"#,"\n", ); let _m = server.mock(|when, then| { when.method(POST) .path("/api/chat") .json_body(body.clone()); then.status(200) .header("content-type", "application/x-ndjson") .body(response); }); let mut cmd = Command::new(assert_cmd::cargo::cargo_bin!("owlen")); cmd.arg("--ollama-url").arg(server.base_url()) .arg("--model").arg("qwen2.5") .arg("--print") .arg("hello"); cmd.assert() .success() .stdout(predicates::str::contains("Hello").count(1).or(predicates::str::contains("Hel").and(predicates::str::contains("lo")))); }