control_query_direct_bypass_matrix/
control_query_direct_bypass_matrix.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::{Client, TransportMode};
9use serde_json::{json, Value};
10use std::error::Error;
11use std::time::Instant;
12
13async fn run_lane(
14 client: &Client,
15 run_id: &str,
16 query: &str,
17 expect_enabled: bool,
18) -> Result<Value, Box<dyn Error>> {
19 let payload = client
20 .control
21 .query(json!({
22 "run_id": run_id,
23 "query": query,
24 "schema": "",
25 "mode": "direct_bypass",
26 "direct_lane": "semantic_search",
27 "include_linked_runs": false,
28 "limit": 5,
29 "embedding": [],
30 }))
31 .await;
32
33 match payload {
34 Ok(payload) => {
35 require(
36 expect_enabled,
37 format!("direct bypass semantic lane unexpectedly succeeded: {payload}"),
38 )?;
39 require(
40 payload.get("mode").and_then(Value::as_str) == Some("direct_bypass"),
41 format!("unexpected mode payload: {payload}"),
42 )?;
43
44 Ok(json!({
45 "enabled": true,
46 "status": "ok",
47 "mode": payload.get("mode").cloned().unwrap_or(Value::Null),
48 "final_answer": payload.get("final_answer").and_then(Value::as_str).unwrap_or_default(),
49 }))
50 }
51 Err(err) => {
52 if expect_enabled {
53 return Err(boxed_error(format!(
54 "direct bypass semantic lane expected enabled but failed: {err}"
55 )));
56 }
57 let message = err.to_string();
58 require(
59 is_permission_denied_like(&message),
60 format!("direct bypass semantic lane should fail with permission denied: {message}"),
61 )?;
62 Ok(json!({
63 "enabled": false,
64 "status": "denied",
65 "message": message,
66 }))
67 }
68 }
69}
70
71#[tokio::main(flavor = "current_thread")]
72async fn main() -> Result<(), Box<dyn Error>> {
73 let name = "control_query_direct_bypass_matrix";
74 let started = Instant::now();
75 let config = ScenarioConfig::from_env();
76 let client = create_client().await?;
77 let run_id = new_run_id("control_query_direct_bypass");
78 client.set_run_id(Some(run_id.clone()));
79 client.set_transport(TransportMode::Http);
80
81 let mut passed = true;
82 let mut detail = "validated control query direct bypass semantic lane".to_string();
83 let mut metrics = json!({});
84
85 let scenario = async {
86 let semantic = run_lane(
87 &client,
88 &run_id,
89 "semantic direct bypass probe",
90 config.expect_direct_search_enabled,
91 )
92 .await?;
93
94 metrics = json!({
95 "run_id": run_id,
96 "expect_direct_search_enabled": config.expect_direct_search_enabled,
97 "semantic": semantic,
98 });
99
100 Ok::<(), Box<dyn Error>>(())
101 }
102 .await;
103
104 if let Err(err) = scenario {
105 passed = false;
106 detail = err.to_string();
107 }
108
109 let cleanup_ok = cleanup_run(&client, &run_id).await;
110 if !cleanup_ok {
111 passed = false;
112 detail = format!("{detail} | cleanup failures");
113 }
114
115 print_summary(
116 name,
117 passed,
118 &detail,
119 &metrics,
120 started.elapsed().as_secs_f64(),
121 cleanup_ok,
122 );
123
124 if passed { Ok(()) } else { Err(boxed_error(detail)) }
125}