|
|
|
@ -53,7 +53,9 @@ async fn non_admin_cannot_post_providers() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "gemini",
|
|
|
|
"provider_name": "gemini",
|
|
|
|
"display_name": "Test",
|
|
|
|
"display_name": "Test",
|
|
|
|
"models": [{"model_id": "m1", "display_name": "Model 1"}]
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [{"model_id": "m1", "display_name": "Model 1"}],
|
|
|
|
|
|
|
|
"models_websearch": [{"model_id": "m1", "display_name": "Model 1"}]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
let (status, resp) = app
|
|
|
|
let (status, resp) = app
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
@ -170,10 +172,11 @@ async fn list_providers_returns_seeded_providers() {
|
|
|
|
assert!(names.contains(&"openai"), "Should contain openai");
|
|
|
|
assert!(names.contains(&"openai"), "Should contain openai");
|
|
|
|
assert!(names.contains(&"anthropic"), "Should contain anthropic");
|
|
|
|
assert!(names.contains(&"anthropic"), "Should contain anthropic");
|
|
|
|
|
|
|
|
|
|
|
|
// Each provider should have an id, models, and is_enabled
|
|
|
|
// Each provider should have an id, models_scraping, models_websearch, and is_enabled
|
|
|
|
for p in providers {
|
|
|
|
for p in providers {
|
|
|
|
assert!(p["id"].is_string(), "Provider should have an id");
|
|
|
|
assert!(p["id"].is_string(), "Provider should have an id");
|
|
|
|
assert!(p["models"].is_array(), "Provider should have models array");
|
|
|
|
assert!(p["models_scraping"].is_array(), "Provider should have models_scraping array");
|
|
|
|
|
|
|
|
assert!(p["models_websearch"].is_array(), "Provider should have models_websearch array");
|
|
|
|
assert!(p["is_enabled"].is_boolean(), "Provider should have is_enabled flag");
|
|
|
|
assert!(p["is_enabled"].is_boolean(), "Provider should have is_enabled flag");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -191,7 +194,9 @@ async fn create_provider_with_invalid_name_returns_422() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "unknown_provider",
|
|
|
|
"provider_name": "unknown_provider",
|
|
|
|
"display_name": "Unknown",
|
|
|
|
"display_name": "Unknown",
|
|
|
|
"models": [{"model_id": "m1", "display_name": "Model 1"}]
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [{"model_id": "m1", "display_name": "Model 1"}],
|
|
|
|
|
|
|
|
"models_websearch": [{"model_id": "m1", "display_name": "Model 1"}]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
let (status, resp) = app
|
|
|
|
let (status, resp) = app
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
@ -215,7 +220,9 @@ async fn create_provider_with_duplicate_name_returns_error() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "gemini",
|
|
|
|
"provider_name": "gemini",
|
|
|
|
"display_name": "Google Gemini Duplicate",
|
|
|
|
"display_name": "Google Gemini Duplicate",
|
|
|
|
"models": [{"model_id": "gemini-test", "display_name": "Gemini Test"}]
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [{"model_id": "gemini-test", "display_name": "Gemini Test"}],
|
|
|
|
|
|
|
|
"models_websearch": [{"model_id": "gemini-test", "display_name": "Gemini Test"}]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
let (status, resp) = app
|
|
|
|
let (status, resp) = app
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
@ -255,7 +262,10 @@ async fn update_provider_changes_display_name_and_models() {
|
|
|
|
// Update display_name and models
|
|
|
|
// Update display_name and models
|
|
|
|
let update_body = serde_json::json!({
|
|
|
|
let update_body = serde_json::json!({
|
|
|
|
"display_name": "Google Gemini Updated",
|
|
|
|
"display_name": "Google Gemini Updated",
|
|
|
|
"models": [
|
|
|
|
"models_scraping": [
|
|
|
|
|
|
|
|
{"model_id": "gemini-3.0-pro", "display_name": "Gemini 3.0 Pro", "is_default": true}
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
"models_websearch": [
|
|
|
|
{"model_id": "gemini-3.0-pro", "display_name": "Gemini 3.0 Pro", "is_default": true}
|
|
|
|
{"model_id": "gemini-3.0-pro", "display_name": "Gemini 3.0 Pro", "is_default": true}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -266,8 +276,8 @@ async fn update_provider_changes_display_name_and_models() {
|
|
|
|
|
|
|
|
|
|
|
|
assert_eq!(status, StatusCode::OK, "Update should return 200");
|
|
|
|
assert_eq!(status, StatusCode::OK, "Update should return 200");
|
|
|
|
assert_eq!(resp["display_name"], "Google Gemini Updated");
|
|
|
|
assert_eq!(resp["display_name"], "Google Gemini Updated");
|
|
|
|
assert_eq!(resp["models"].as_array().unwrap().len(), 1);
|
|
|
|
assert_eq!(resp["models_scraping"].as_array().unwrap().len(), 1);
|
|
|
|
assert_eq!(resp["models"][0]["model_id"], "gemini-3.0-pro");
|
|
|
|
assert_eq!(resp["models_scraping"][0]["model_id"], "gemini-3.0-pro");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
#[tokio::test]
|
|
|
|
@ -397,7 +407,9 @@ async fn create_provider_with_empty_models_returns_422() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "openai",
|
|
|
|
"provider_name": "openai",
|
|
|
|
"display_name": "OpenAI",
|
|
|
|
"display_name": "OpenAI",
|
|
|
|
"models": []
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [],
|
|
|
|
|
|
|
|
"models_websearch": []
|
|
|
|
});
|
|
|
|
});
|
|
|
|
let (status, resp) = app
|
|
|
|
let (status, resp) = app
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
@ -435,7 +447,11 @@ async fn create_provider_returns_with_id() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "openai",
|
|
|
|
"provider_name": "openai",
|
|
|
|
"display_name": "OpenAI Fresh",
|
|
|
|
"display_name": "OpenAI Fresh",
|
|
|
|
"models": [
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [
|
|
|
|
|
|
|
|
{"model_id": "gpt-4o", "display_name": "GPT-4o", "is_default": true}
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
"models_websearch": [
|
|
|
|
{"model_id": "gpt-4o", "display_name": "GPT-4o", "is_default": true}
|
|
|
|
{"model_id": "gpt-4o", "display_name": "GPT-4o", "is_default": true}
|
|
|
|
]
|
|
|
|
]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -447,7 +463,7 @@ async fn create_provider_returns_with_id() {
|
|
|
|
assert!(resp["id"].is_string(), "Response should have an id");
|
|
|
|
assert!(resp["id"].is_string(), "Response should have an id");
|
|
|
|
assert_eq!(resp["provider_name"], "openai");
|
|
|
|
assert_eq!(resp["provider_name"], "openai");
|
|
|
|
assert_eq!(resp["display_name"], "OpenAI Fresh");
|
|
|
|
assert_eq!(resp["display_name"], "OpenAI Fresh");
|
|
|
|
assert_eq!(resp["models"].as_array().unwrap().len(), 1);
|
|
|
|
assert_eq!(resp["models_scraping"].as_array().unwrap().len(), 1);
|
|
|
|
assert_eq!(resp["is_enabled"], true);
|
|
|
|
assert_eq!(resp["is_enabled"], true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -756,11 +772,11 @@ async fn config_providers_with_auth_returns_enabled() {
|
|
|
|
assert!(providers.len() >= 3, "Should have at least 3 enabled providers");
|
|
|
|
assert!(providers.len() >= 3, "Should have at least 3 enabled providers");
|
|
|
|
|
|
|
|
|
|
|
|
// Verify the structure: should NOT have admin-only fields like `id` at root
|
|
|
|
// Verify the structure: should NOT have admin-only fields like `id` at root
|
|
|
|
// (actually this endpoint returns provider_name, display_name, models)
|
|
|
|
// (actually this endpoint returns provider_name, display_name, models_scraping, models_websearch)
|
|
|
|
for p in providers {
|
|
|
|
for p in providers {
|
|
|
|
assert!(p["provider_name"].is_string());
|
|
|
|
assert!(p["provider_name"].is_string());
|
|
|
|
assert!(p["display_name"].is_string());
|
|
|
|
assert!(p["display_name"].is_string());
|
|
|
|
assert!(p["models"].is_array());
|
|
|
|
assert!(p["models_scraping"].is_array() || p["models_websearch"].is_array());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -867,7 +883,9 @@ async fn audit_log_created_on_provider_creation() {
|
|
|
|
let body = serde_json::json!({
|
|
|
|
let body = serde_json::json!({
|
|
|
|
"provider_name": "openai",
|
|
|
|
"provider_name": "openai",
|
|
|
|
"display_name": "OpenAI Audit Test",
|
|
|
|
"display_name": "OpenAI Audit Test",
|
|
|
|
"models": [{"model_id": "gpt-4o", "display_name": "GPT-4o"}]
|
|
|
|
"is_enabled": true,
|
|
|
|
|
|
|
|
"models_scraping": [{"model_id": "gpt-4o", "display_name": "GPT-4o"}],
|
|
|
|
|
|
|
|
"models_websearch": [{"model_id": "gpt-4o", "display_name": "GPT-4o"}]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
let (status, _) = app
|
|
|
|
let (status, _) = app
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
.post_with_session("/api/v1/admin/providers", &body, &session)
|
|
|
|
|