#[tokio::test]
async fn test_chat_completions_system_only() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [
{"role": "system", "content": "You are a helpful assistant."}
]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_chat_completions_with_top_p() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hello"}],
"top_p": 0.9,
"temperature": 0.7
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_chat_completions_top_p_one() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hello"}],
"top_p": 1.0
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_chat_completions_no_content_type() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hello"}]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert!(
response.status() == StatusCode::OK
|| response.status() == StatusCode::NOT_FOUND
|| response.status() == StatusCode::UNSUPPORTED_MEDIA_TYPE
|| response.status() == StatusCode::INTERNAL_SERVER_ERROR
|| response.status() == StatusCode::NOT_FOUND
);
}
#[tokio::test]
async fn test_chat_completions_wrong_content_type() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hello"}]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "text/plain")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert!(
response.status() == StatusCode::OK
|| response.status() == StatusCode::NOT_FOUND
|| response.status() == StatusCode::UNSUPPORTED_MEDIA_TYPE
|| response.status() == StatusCode::INTERNAL_SERVER_ERROR
|| response.status() == StatusCode::NOT_FOUND
);
}
#[tokio::test]
async fn test_chat_completions_empty_body() {
let app = create_test_app_shared();
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::empty())
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert!(
response.status() == StatusCode::BAD_REQUEST
|| response.status() == StatusCode::UNPROCESSABLE_ENTITY
|| response.status() == StatusCode::NOT_FOUND
);
}
#[tokio::test]
async fn test_chat_completions_message_missing_role() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"content": "Hello"}]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert_eq!(
response.status(),
StatusCode::UNPROCESSABLE_ENTITY,
"Missing role should return 422"
);
}
#[tokio::test]
async fn test_chat_completions_message_missing_content() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user"}]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert_eq!(
response.status(),
StatusCode::UNPROCESSABLE_ENTITY,
"Missing content should return 422"
);
}
#[tokio::test]
async fn test_chat_completions_invalid_role() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "invalid_role", "content": "Hello"}]
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_combo_stream_greedy_min_tokens() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hi"}],
"stream": true,
"temperature": 0.0,
"max_tokens": 1
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_combo_no_stream_creative_mid_tokens() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hi"}],
"stream": false,
"temperature": 1.5,
"max_tokens": 100
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_combo_stream_default_params() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hi"}],
"stream": true,
"temperature": 0.7,
"max_tokens": 256
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}
#[tokio::test]
async fn test_chat_completions_get_method() {
let app = create_test_app_shared();
let request = Request::builder()
.method("GET")
.uri("/v1/chat/completions")
.body(Body::empty())
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert_eq!(
response.status(),
StatusCode::METHOD_NOT_ALLOWED,
"GET should return 405"
);
}
#[tokio::test]
async fn test_chat_completions_put_method() {
let app = create_test_app_shared();
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": "Hello"}]
});
let request = Request::builder()
.method("PUT")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
assert_eq!(
response.status(),
StatusCode::METHOD_NOT_ALLOWED,
"PUT should return 405"
);
}
#[tokio::test]
async fn test_chat_completions_large_content() {
let app = create_test_app_shared();
let large_content = "x".repeat(1000);
let req_body = serde_json::json!({
"model": "default",
"messages": [{"role": "user", "content": large_content}],
"max_tokens": 5
});
let request = Request::builder()
.method("POST")
.uri("/v1/chat/completions")
.header("content-type", "application/json")
.body(Body::from(serde_json::to_string(&req_body).expect("JSON serialization failed")))
.expect("test value should be present");
let response = app.oneshot(request).await.expect("test value should be present");
crate::api::test_helpers::assert_no_model_status(response.status());
}