internal_core_direct_search/
core_direct_search.rs1#[path = "../support/utils.rs"]
2mod _utils;
3
4use _utils::{
5 boxed_error, cleanup_run, create_client, is_permission_denied_like, new_run_id, print_summary,
6 require, ScenarioConfig,
7};
8use mubit_sdk::TransportMode;
9use serde_json::{json, Value};
10use std::error::Error;
11use std::time::Instant;
12
13fn extract_result_count(payload: &Value) -> usize {
14 if let Some(items) = payload.as_array() {
15 return items.iter().filter(|item| item.is_object()).count();
16 }
17 payload
18 .get("results")
19 .and_then(Value::as_array)
20 .map(|items| items.iter().filter(|item| item.is_object()).count())
21 .unwrap_or(0)
22}
23
24#[tokio::main(flavor = "current_thread")]
25async fn main() -> Result<(), Box<dyn Error>> {
26 let name = "internal_core_direct_search";
27 let started = Instant::now();
28 let config = ScenarioConfig::from_env();
29 let client = create_client().await?;
30 let run_id = new_run_id("internal_core_direct_search");
31 client.set_run_id(Some(run_id.clone()));
32 client.set_transport(TransportMode::Http);
33
34 let mut passed = true;
35 let mut detail = "validated optional core direct-search".to_string();
36 let mut metrics = json!({});
37
38 let scenario = async {
39 match client
40 .core
41 .search(json!({
42 "query": "direct core semantic search probe",
43 "k": 5,
44 }))
45 .await
46 {
47 Ok(payload) => {
48 require(
49 payload.is_array() || payload.is_object(),
50 format!("core.search payload must be dict/list: {payload}"),
51 )?;
52
53 metrics = json!({
54 "run_id": run_id,
55 "enabled": true,
56 "result_count": extract_result_count(&payload),
57 });
58 detail = "validated optional core direct-search (enabled)".to_string();
59 }
60 Err(err) => {
61 if config.expect_direct_search_enabled {
62 return Err(boxed_error(format!(
63 "core.search expected enabled but failed: {err}"
64 )));
65 }
66 let message = err.to_string();
67 require(
68 is_permission_denied_like(&message),
69 format!(
70 "core.search should fail with permission denied when disabled: {message}"
71 ),
72 )?;
73
74 metrics = json!({
75 "run_id": run_id,
76 "enabled": false,
77 "message": message,
78 });
79 detail = "validated optional core direct-search (disabled)".to_string();
80 }
81 }
82
83 Ok::<(), Box<dyn Error>>(())
84 }
85 .await;
86
87 if let Err(err) = scenario {
88 passed = false;
89 detail = err.to_string();
90 }
91
92 let cleanup_ok = cleanup_run(&client, &run_id).await;
93 if !cleanup_ok {
94 passed = false;
95 detail = format!("{detail} | cleanup failures");
96 }
97
98 print_summary(
99 name,
100 passed,
101 &detail,
102 &metrics,
103 started.elapsed().as_secs_f64(),
104 cleanup_ok,
105 );
106
107 if passed {
108 Ok(())
109 } else {
110 Err(boxed_error(detail))
111 }
112}