Skip to main content

internal_core_direct_search/
core_direct_search.rs

1#[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}