diff --git a/lib/crates/fabro-server/tests/it/api/install.rs b/lib/crates/fabro-server/tests/it/api/install.rs
index 36e6ed7b5..12996e78f 100644
--- a/lib/crates/fabro-server/tests/it/api/install.rs
+++ b/lib/crates/fabro-server/tests/it/api/install.rs
@@ -32,7 +32,7 @@ async fn configure_token_install(app: &axum::Router, token: &str) {
.body(Body::from(
r#"{"providers":[{"provider":"anthropic","api_key":"anthropic-test-key"}]}"#,
))
- .unwrap(),
+ .expect("LLM install request should build"),
)
.await
.unwrap();
@@ -49,7 +49,7 @@ async fn configure_token_install(app: &axum::Router, token: &str) {
.body(Body::from(
r#"{"canonical_url":"https://fabro.example.com"}"#,
))
- .unwrap(),
+ .expect("server install request should build"),
)
.await
.unwrap();
@@ -66,7 +66,7 @@ async fn configure_token_install(app: &axum::Router, token: &str) {
.body(Body::from(
r#"{"token":"ghp_test_token","username":"brynary"}"#,
))
- .unwrap(),
+ .expect("GitHub token install request should build"),
)
.await
.unwrap();
diff --git a/lib/crates/fabro-server/tests/it/api/routing.rs b/lib/crates/fabro-server/tests/it/api/routing.rs
index 6d69040fb..f628d0343 100644
--- a/lib/crates/fabro-server/tests/it/api/routing.rs
+++ b/lib/crates/fabro-server/tests/it/api/routing.rs
@@ -435,7 +435,7 @@ fn request_with_connect_info(path: &str, ip: IpAddr) -> Request
{
.method("GET")
.uri(path)
.body(Body::empty())
- .unwrap();
+ .expect("routing test request should build");
let mut request = request;
request
.extensions_mut()
diff --git a/lib/crates/fabro-server/tests/it/api/system.rs b/lib/crates/fabro-server/tests/it/api/system.rs
index e6bb27b98..751a13d83 100644
--- a/lib/crates/fabro-server/tests/it/api/system.rs
+++ b/lib/crates/fabro-server/tests/it/api/system.rs
@@ -56,11 +56,16 @@ async fn create_run(app: &axum::Router, manifest: serde_json::Value) -> String {
.method("POST")
.uri(api("/runs"))
.header("content-type", "application/json")
- .body(Body::from(serde_json::to_vec(&manifest).unwrap()))
- .unwrap();
+ .body(Body::from(
+ serde_json::to_vec(&manifest).expect("manifest fixture should serialize"),
+ ))
+ .expect("create-run request should build");
let response = app.clone().oneshot(request).await.unwrap();
let body = body_json(response.into_body()).await;
- body["id"].as_str().unwrap().to_string()
+ body["id"]
+ .as_str()
+ .expect("create-run response should include an id")
+ .to_string()
}
async fn start_run(app: &axum::Router, run_id: &str) {
@@ -68,7 +73,7 @@ async fn start_run(app: &axum::Router, run_id: &str) {
.method("POST")
.uri(api(&format!("/runs/{run_id}/start")))
.body(Body::empty())
- .unwrap();
+ .expect("start-run request should build");
let response = app.clone().oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
}
@@ -79,7 +84,7 @@ async fn wait_for_question(app: &axum::Router, run_id: &str) -> serde_json::Valu
.method("GET")
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
- .unwrap();
+ .expect("questions request should build");
let response = app.clone().oneshot(request).await.unwrap();
let body = body_json(response.into_body()).await;
if let Some(question) = body["data"].as_array().and_then(|items| items.first()) {
@@ -95,7 +100,7 @@ async fn load_questions(app: &axum::Router, run_id: &str) -> serde_json::Value {
.method("GET")
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
- .unwrap();
+ .expect("questions request should build");
let response = app.clone().oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
body_json(response.into_body()).await
diff --git a/lib/crates/fabro-server/tests/it/api/tcp.rs b/lib/crates/fabro-server/tests/it/api/tcp.rs
index 0ecfef85b..974e19ba3 100644
--- a/lib/crates/fabro-server/tests/it/api/tcp.rs
+++ b/lib/crates/fabro-server/tests/it/api/tcp.rs
@@ -27,8 +27,12 @@ const TEST_DEV_TOKEN: &str =
"fabro_dev_abababababababababababababababababababababababababababababababab";
async fn start_tcp_server(auth_mode: AuthMode, ip_allowlist: Arc) -> SocketAddr {
- let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
- let addr = listener.local_addr().unwrap();
+ let listener = TcpListener::bind("127.0.0.1:0")
+ .await
+ .expect("test TCP listener should bind");
+ let addr = listener
+ .local_addr()
+ .expect("test TCP listener should have a local address");
let state = create_app_state();
let router =
@@ -51,24 +55,24 @@ fn build_unix_client(path: &Path) -> fabro_http::HttpClient {
.unix_socket(path)
.no_proxy()
.build()
- .unwrap()
+ .expect("Unix test client should build")
}
fn write_test_config(tempdir: &TempDir, settings: &str) -> PathBuf {
let config_path = tempdir.path().join("settings.toml");
- std::fs::write(&config_path, settings).unwrap();
+ std::fs::write(&config_path, settings).expect("test settings should write");
std::fs::write(
ServerState::new(tempdir.path()).env_path(),
format!("FABRO_DEV_TOKEN={TEST_DEV_TOKEN}\n"),
)
- .unwrap();
+ .expect("test env file should write");
config_path
}
async fn spawn_served_listener(
settings: impl AsRef,
) -> (JoinHandle>, Bind, TempDir) {
- let tempdir = tempfile::tempdir().unwrap();
+ let tempdir = tempfile::tempdir().expect("temporary server directory should create");
let config_path = write_test_config(&tempdir, settings.as_ref());
let styles: &'static Styles = Box::leak(Box::new(Styles::new(false)));
let (tx, rx) = tokio::sync::oneshot::channel();
diff --git a/lib/crates/fabro-server/tests/it/helpers.rs b/lib/crates/fabro-server/tests/it/helpers.rs
index 5565085e9..e5143d512 100644
--- a/lib/crates/fabro-server/tests/it/helpers.rs
+++ b/lib/crates/fabro-server/tests/it/helpers.rs
@@ -78,8 +78,10 @@ pub(crate) fn api(path: &str) -> String {
}
pub(crate) async fn body_json(body: Body) -> serde_json::Value {
- let bytes = to_bytes(body, usize::MAX).await.unwrap();
- serde_json::from_slice(&bytes).unwrap()
+ let bytes = to_bytes(body, usize::MAX)
+ .await
+ .expect("response body should fit in memory");
+ serde_json::from_slice(&bytes).expect("response body should be valid JSON")
}
pub(crate) async fn create_and_start_run_from_manifest(
@@ -90,17 +92,22 @@ pub(crate) async fn create_and_start_run_from_manifest(
.method("POST")
.uri(api("/runs"))
.header("content-type", "application/json")
- .body(Body::from(serde_json::to_string(&manifest).unwrap()))
- .unwrap();
+ .body(Body::from(
+ serde_json::to_string(&manifest).expect("manifest fixture should serialize"),
+ ))
+ .expect("create-run request should build");
let response = app.clone().oneshot(req).await.unwrap();
let body = body_json(response.into_body()).await;
- let run_id = body["id"].as_str().unwrap().to_string();
+ let run_id = body["id"]
+ .as_str()
+ .expect("create-run response should include an id")
+ .to_string();
let req = Request::builder()
.method("POST")
.uri(api(&format!("/runs/{run_id}/start")))
.body(Body::empty())
- .unwrap();
+ .expect("start-run request should build");
app.clone().oneshot(req).await.unwrap();
run_id
@@ -134,7 +141,7 @@ pub(crate) async fn run_json(app: &axum::Router, run_id: &str) -> serde_json::Va
.method("GET")
.uri(api(&format!("/runs/{run_id}")))
.body(Body::empty())
- .unwrap();
+ .expect("run lookup request should build");
let response = app.clone().oneshot(req).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
body_json(response.into_body()).await
@@ -147,7 +154,10 @@ pub(crate) async fn wait_for_run_status(
) -> String {
for _ in 0..POLL_ATTEMPTS {
let body = run_json(app, run_id).await;
- let status = body["status"].as_str().unwrap().to_string();
+ let status = body["status"]
+ .as_str()
+ .expect("run response should include a string status")
+ .to_string();
if expected.iter().any(|candidate| *candidate == status) {
return status;
}
@@ -163,7 +173,10 @@ pub(crate) async fn wait_for_run_status_not_in(
) -> String {
for _ in 0..POLL_ATTEMPTS {
let body = run_json(app, run_id).await;
- let status = body["status"].as_str().unwrap().to_string();
+ let status = body["status"]
+ .as_str()
+ .expect("run response should include a string status")
+ .to_string();
if unexpected.iter().all(|candidate| *candidate != status) {
return status;
}
diff --git a/lib/crates/fabro-server/tests/it/openapi_conformance.rs b/lib/crates/fabro-server/tests/it/openapi_conformance.rs
index 7ea0cdcd8..e6ed05db4 100644
--- a/lib/crates/fabro-server/tests/it/openapi_conformance.rs
+++ b/lib/crates/fabro-server/tests/it/openapi_conformance.rs
@@ -23,14 +23,11 @@ use tower::ServiceExt;
use super::helpers::test_app_state;
fn load_spec() -> Value {
- let spec_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
- .parent()
- .unwrap()
- .parent()
- .unwrap()
- .parent()
- .unwrap()
- .join("docs/api-reference/fabro-api.yaml");
+ let repo_root = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
+ .ancestors()
+ .nth(3)
+ .expect("fabro-server crate should be nested under lib/crates/fabro-server");
+ let spec_path = repo_root.join("docs/api-reference/fabro-api.yaml");
let text = std::fs::read_to_string(&spec_path).expect("failed to read spec");
serde_yaml::from_str(&text).expect("failed to parse spec")
}
@@ -81,7 +78,9 @@ fn request_for(method: &Method, uri: &str) -> Request {
} else {
Body::empty()
};
- builder.body(body).unwrap()
+ builder
+ .body(body)
+ .expect("OpenAPI conformance request should build")
}
#[tokio::test]
diff --git a/lib/crates/fabro-server/tests/it/pagination.rs b/lib/crates/fabro-server/tests/it/pagination.rs
index 01f73247e..5215ff1e6 100644
--- a/lib/crates/fabro-server/tests/it/pagination.rs
+++ b/lib/crates/fabro-server/tests/it/pagination.rs
@@ -19,13 +19,13 @@ async fn get_json(app: axum::Router, uri: &str) -> serde_json::Value {
.uri(uri)
.header("x-fabro-demo", "1")
.body(Body::empty())
- .unwrap();
+ .expect("pagination request should build");
let response = app.clone().oneshot(req).await.unwrap();
assert_eq!(response.status(), StatusCode::OK, "GET {uri} failed");
let body = axum::body::to_bytes(response.into_body(), usize::MAX)
.await
- .unwrap();
- serde_json::from_slice(&body).unwrap()
+ .expect("pagination response body should fit in memory");
+ serde_json::from_slice(&body).expect("pagination response should be valid JSON")
}
/// Assert that a value has the paginated shape: `{ data: [...], meta: {
diff --git a/lib/crates/fabro-server/tests/it/scenario/dry_run.rs b/lib/crates/fabro-server/tests/it/scenario/dry_run.rs
index b3196dc2d..021279016 100644
--- a/lib/crates/fabro-server/tests/it/scenario/dry_run.rs
+++ b/lib/crates/fabro-server/tests/it/scenario/dry_run.rs
@@ -19,9 +19,9 @@ fn completion_request(stream: bool) -> Request {
"messages": [{"role": "user", "content": [{"kind": "text", "data": "Hello"}]}],
"stream": stream
}))
- .unwrap(),
+ .expect("completion fixture should serialize"),
))
- .unwrap()
+ .expect("completion request should build")
}
fn completion_request_with_model(stream: bool, model: &str) -> Request {
@@ -35,9 +35,9 @@ fn completion_request_with_model(stream: bool, model: &str) -> Request {
"messages": [{"role": "user", "content": [{"kind": "text", "data": "Hi"}]}],
"stream": stream
}))
- .unwrap(),
+ .expect("model completion fixture should serialize"),
))
- .unwrap()
+ .expect("completion request should build")
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
diff --git a/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs b/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs
index 3bba3c4ec..d81b4c625 100644
--- a/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs
+++ b/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs
@@ -35,10 +35,12 @@ async fn wait_for_question_id(app: &axum::Router, run_id: &str) -> String {
.method("GET")
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
- .unwrap();
+ .expect("questions request should build");
let response = app.clone().oneshot(req).await.unwrap();
let body = body_json(response.into_body()).await;
- let arr = body["data"].as_array().unwrap();
+ let arr = body["data"]
+ .as_array()
+ .expect("questions response should include a data array");
if let Some(question_id) = arr
.first()
.and_then(|item| item["id"].as_str())
@@ -57,10 +59,12 @@ async fn wait_for_question(app: &axum::Router, run_id: &str) -> serde_json::Valu
.method("GET")
.uri(api(&format!("/runs/{run_id}/questions")))
.body(Body::empty())
- .unwrap();
+ .expect("questions request should build");
let response = app.clone().oneshot(req).await.unwrap();
let body = body_json(response.into_body()).await;
- let arr = body["data"].as_array().unwrap();
+ let arr = body["data"]
+ .as_array()
+ .expect("questions response should include a data array");
if let Some(question) = arr.first() {
return question.clone();
}
diff --git a/lib/crates/fabro-server/tests/it/scenario/sse.rs b/lib/crates/fabro-server/tests/it/scenario/sse.rs
index c0946752f..87eff7c12 100644
--- a/lib/crates/fabro-server/tests/it/scenario/sse.rs
+++ b/lib/crates/fabro-server/tests/it/scenario/sse.rs
@@ -26,7 +26,7 @@ async fn wait_for_checkpoint(app: &axum::Router, run_id: &str) -> serde_json::Va
.method("GET")
.uri(api(&format!("/runs/{run_id}/checkpoint")))
.body(Body::empty())
- .unwrap();
+ .expect("checkpoint request should build");
let response = app.clone().oneshot(req).await.unwrap();
if response.status() == StatusCode::OK {
return body_json(response.into_body()).await;