|
| 1 | +//! Scenario: embedding_providers_crud. |
| 2 | +//! |
| 3 | +//! Defined in www.hotdata.dev/api/test-scenarios.yaml — register an embedding |
| 4 | +//! provider, read it, confirm it appears in list_embedding_providers, update it, |
| 5 | +//! then delete it. |
| 6 | +//! |
| 7 | +//! Uses a `service` provider with **no** api_key/secret_name (not `local` — the |
| 8 | +//! runtime currently rejects `local` as "not yet supported"). A service |
| 9 | +//! provider's key is only consulted when embeddings are actually generated, never |
| 10 | +//! at create/get/update, so this exercises the full CRUD surface without any real |
| 11 | +//! external credential and without auto-creating a secret that would need cleanup. |
| 12 | +
|
| 13 | +mod common; |
| 14 | + |
| 15 | +use hotdata::apis::embedding_providers_api; |
| 16 | +use hotdata::models; |
| 17 | + |
| 18 | +#[tokio::test] |
| 19 | +async fn embedding_providers_crud() { |
| 20 | + let client = skip_if_no_creds!(); |
| 21 | + let config = client.configuration(); |
| 22 | + |
| 23 | + // Provider names follow the same underscore-normalized convention as secrets. |
| 24 | + let name = common::sdkci_name("embprov-crud").replace('-', "_"); |
| 25 | + let renamed = format!("{name}_renamed"); |
| 26 | + |
| 27 | + let mut create_req = |
| 28 | + models::CreateEmbeddingProviderRequest::new(name.clone(), "service".to_string()); |
| 29 | + create_req.config = Some(Some( |
| 30 | + serde_json::json!({ "model": "text-embedding-3-small" }), |
| 31 | + )); |
| 32 | + let created = embedding_providers_api::create_embedding_provider(config, create_req) |
| 33 | + .await |
| 34 | + .expect("create_embedding_provider should succeed"); |
| 35 | + assert_eq!(created.name, name); |
| 36 | + assert_eq!(created.provider_type, "service"); |
| 37 | + assert!(!created.id.is_empty(), "created provider must have an id"); |
| 38 | + |
| 39 | + let fetched = embedding_providers_api::get_embedding_provider(config, &created.id) |
| 40 | + .await |
| 41 | + .expect("get_embedding_provider should succeed"); |
| 42 | + assert_eq!(fetched.id, created.id); |
| 43 | + assert_eq!(fetched.name, name); |
| 44 | + assert_eq!(fetched.provider_type, "service"); |
| 45 | + |
| 46 | + let listing = embedding_providers_api::list_embedding_providers(config) |
| 47 | + .await |
| 48 | + .expect("list_embedding_providers should succeed"); |
| 49 | + assert!( |
| 50 | + listing |
| 51 | + .embedding_providers |
| 52 | + .iter() |
| 53 | + .any(|p| p.id == created.id), |
| 54 | + "created provider {} not present in list_embedding_providers", |
| 55 | + created.id |
| 56 | + ); |
| 57 | + |
| 58 | + let mut update = models::UpdateEmbeddingProviderRequest::new(); |
| 59 | + update.name = Some(Some(renamed.clone())); |
| 60 | + let updated = embedding_providers_api::update_embedding_provider(config, &created.id, update) |
| 61 | + .await |
| 62 | + .expect("update_embedding_provider should succeed"); |
| 63 | + assert_eq!(updated.id, created.id); |
| 64 | + assert_eq!(updated.name, renamed); |
| 65 | + |
| 66 | + embedding_providers_api::delete_embedding_provider(config, &created.id) |
| 67 | + .await |
| 68 | + .expect("delete_embedding_provider should succeed"); |
| 69 | + |
| 70 | + let after_delete = embedding_providers_api::get_embedding_provider(config, &created.id).await; |
| 71 | + match after_delete { |
| 72 | + Err(err) => assert_eq!( |
| 73 | + common::status_of(&err), |
| 74 | + Some(404), |
| 75 | + "expected 404 after delete, got {err:?}" |
| 76 | + ), |
| 77 | + Ok(_) => panic!("get_embedding_provider should fail with 404 after delete"), |
| 78 | + } |
| 79 | +} |
0 commit comments