Skip to main content

hindclaw_client/
lib.rs

1//! Hindclaw API Client
2//!
3//! A Rust client library for the Hindclaw access control API.
4//!
5//! # Example
6//!
7//! ```rust,no_run
8//! use hindclaw_client::Client;
9//!
10//! #[tokio::main]
11//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
12//!     let client = Client::new("http://localhost:8888");
13//!
14//!     // List users
15//!     let users = client.list_users().await?;
16//!     println!("Found {} users", users.into_inner().len());
17//!
18//!     Ok(())
19//! }
20//! ```
21
22// Include the generated client code
23include!(concat!(env!("OUT_DIR"), "/hindclaw_client_generated.rs"));
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_client_creation() {
31        let _client = Client::new("http://localhost:8888");
32        assert!(true);
33    }
34
35    #[tokio::test]
36    #[ignore] // Requires a running Hindclaw server: cargo test -- --ignored
37    async fn test_user_lifecycle() {
38        let api_url = std::env::var("HINDCLAW_API_URL")
39            .unwrap_or_else(|_| "http://localhost:8888".to_string());
40        let api_key = std::env::var("HINDCLAW_API_KEY")
41            .expect("HINDCLAW_API_KEY must be set for integration tests");
42
43        // Build a reqwest client with Bearer auth and generous timeout
44        let http_client = reqwest::Client::builder()
45            .timeout(std::time::Duration::from_secs(30))
46            .default_headers({
47                let mut headers = reqwest::header::HeaderMap::new();
48                headers.insert(
49                    reqwest::header::AUTHORIZATION,
50                    format!("Bearer {}", api_key).parse().unwrap(),
51                );
52                headers
53            })
54            .build()
55            .expect("Failed to build HTTP client");
56        let client = Client::new_with_client(&api_url, http_client);
57
58        let user_id = format!("rust-test-{}", uuid::Uuid::new_v4());
59
60        // Create a user
61        let create_request = types::CreateUserRequest {
62            id: user_id.clone(),
63            display_name: "Rust Test User".to_string(),
64            email: None,
65            is_active: true,
66        };
67        let _create_response = client
68            .create_user(&create_request)
69            .await
70            .expect("Failed to create user");
71
72        // List users and verify ours exists
73        let users = client
74            .list_users()
75            .await
76            .expect("Failed to list users");
77        let user_list = users.into_inner();
78        assert!(
79            user_list.iter().any(|u| u.id == user_id),
80            "Created user should appear in list"
81        );
82
83        // Cleanup: delete test user
84        let _ = client.delete_user(&user_id).await;
85    }
86}