Skip to main content

internal_auth_lifecycle/
auth_lifecycle.rs

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