internal_auth_lifecycle/
auth_lifecycle.rs1#[path = "../support/utils.rs"]
2mod _utils;
3
4use _utils::{boxed_error, create_client, print_summary, require};
5use serde_json::{json, Value};
6use std::error::Error;
7use std::time::{Instant, SystemTime, UNIX_EPOCH};
8
9#[tokio::main(flavor = "current_thread")]
10async fn main() -> Result<(), Box<dyn Error>> {
11 let name = "internal_auth_lifecycle";
12 let started = Instant::now();
13 let client = create_client().await?;
14 let username = format!("sdk_example_{}", SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or_default().as_millis());
15 let mut passed = true;
16 let mut detail = "validated raw auth lifecycle".to_string();
17 let mut metrics = json!({});
18
19 let scenario = async {
20 let health = client.auth.health().await?;
21 let created = client.auth.create_user(json!({"username": username, "role": "user"})).await?;
22 let listed = client.auth.list_users(json!({})).await?;
23 let rotated = client.auth.rotate_user_api_key(json!({"username": username})).await?;
24 let fetched = client.auth.get_user(json!({"username": username})).await?;
25 let revoked = client.auth.revoke_user_api_key(json!({"username": username})).await?;
26 let deleted = client.auth.delete_user(json!({"username": username})).await?;
27 let listed_users = listed
28 .as_array()
29 .cloned()
30 .or_else(|| listed.get("users").and_then(Value::as_array).cloned())
31 .unwrap_or_default();
32 let fetched_user = fetched.get("user").unwrap_or(&fetched);
33
34 require(!health.is_null(), format!("auth health failed: {health}"))?;
35 require(created.get("success").and_then(Value::as_bool).unwrap_or(true) || created.get("api_key").is_some(), format!("create_user failed: {created}"))?;
36 require(listed_users.iter().any(|item| item.get("username").and_then(Value::as_str) == Some(username.as_str())), format!("list_users missing created user: {listed}"))?;
37 require(rotated.get("success").and_then(Value::as_bool).unwrap_or(true) || rotated.get("api_key").is_some(), format!("rotate_user_api_key failed: {rotated}"))?;
38 require(fetched_user.get("username").and_then(Value::as_str) == Some(username.as_str()), format!("get_user failed: {fetched}"))?;
39 require(revoked.get("success").and_then(Value::as_bool).unwrap_or(true), format!("revoke_user_api_key failed: {revoked}"))?;
40 require(deleted.get("success").and_then(Value::as_bool).unwrap_or(true), format!("delete_user failed: {deleted}"))?;
41
42 metrics = json!({"username": username});
43 Ok::<(), Box<dyn Error>>(())
44 }.await;
45
46 if let Err(err) = scenario { passed = false; detail = err.to_string(); }
47 print_summary(name, passed, &detail, &metrics, started.elapsed().as_secs_f64(), true);
48 if passed { Ok(()) } else { Err(boxed_error(detail)) }
49}