use letta::client::{ClientConfig, LettaClient};
use letta::error::LettaResult;
use letta::types::*;
fn get_test_client() -> LettaResult<LettaClient> {
let config = ClientConfig::new("http://localhost:8283")?;
LettaClient::new(config)
}
#[tokio::test]
async fn test_list_identities() -> LettaResult<()> {
let client = get_test_client()?;
let identities = client.identities().list(None).await?;
println!("Found {} identities", identities.len());
for identity in identities.iter().take(5) {
println!(
"Identity: {} - Type: {} - ID: {}",
identity.name, identity.identity_type, identity.identifier_key
);
}
Ok(())
}
#[tokio::test]
async fn test_identity_crud() -> LettaResult<()> {
let client = get_test_client()?;
let create_req = CreateIdentityRequest {
identifier_key: format!("test-user-{}", uuid::Uuid::new_v4()),
name: format!("Test User {}", uuid::Uuid::new_v4()),
identity_type: IdentityType::User,
project_id: None,
agent_ids: None,
block_ids: None,
properties: Some(vec![IdentityProperty {
key: "test_key".to_string(),
value: serde_json::json!("test_value"),
property_type: "string".to_string(),
}]),
};
let identity = client.identities().create(create_req).await?;
println!("Created identity: {} ({})", identity.name, identity.id);
assert_eq!(identity.identity_type, IdentityType::User);
let fetched = client.identities().get(&identity.id).await?;
println!(
"Retrieved identity: {} - {}",
fetched.name, fetched.identifier_key
);
assert_eq!(fetched.id, identity.id);
let update_req = UpdateIdentityRequest {
name: Some("Updated Test User".to_string()),
..Default::default()
};
let updated = client.identities().update(&identity.id, update_req).await?;
println!("Updated identity: {}", updated.name);
assert_eq!(updated.name, "Updated Test User");
client.identities().delete(&identity.id).await?;
println!("Successfully deleted identity");
Ok(())
}
#[tokio::test]
async fn test_list_identities_with_filter() -> LettaResult<()> {
let client = get_test_client()?;
let params = ListIdentitiesParams {
identity_type: Some(IdentityType::User),
limit: Some(10),
..Default::default()
};
let identities = client.identities().list(Some(params)).await?;
println!("Found {} user identities", identities.len());
for identity in &identities {
assert_eq!(identity.identity_type, IdentityType::User);
}
Ok(())
}
#[tokio::test]
async fn test_upsert_identity() -> LettaResult<()> {
let client = get_test_client()?;
let identifier_key = format!("upsert-test-{}", uuid::Uuid::new_v4());
let create_req = CreateIdentityRequest {
identifier_key: identifier_key.clone(),
name: "Initial Name".to_string(),
identity_type: IdentityType::Org,
project_id: None,
agent_ids: None,
block_ids: None,
properties: None,
};
let identity1 = client.identities().create(create_req.clone()).await?;
println!("Created identity: {} ({})", identity1.name, identity1.id);
assert_eq!(identity1.name, "Initial Name");
let update_req = CreateIdentityRequest {
identifier_key: identifier_key.clone(),
name: "Updated Name".to_string(),
identity_type: IdentityType::Org,
project_id: None,
agent_ids: None,
block_ids: None,
properties: None,
};
let identity2 = client.identities().upsert(update_req).await?;
println!("Upsert (update): {} ({})", identity2.name, identity2.id);
assert_eq!(identity2.id, identity1.id);
assert_eq!(identity2.name, "Updated Name");
client.identities().delete(&identity1.id).await?;
Ok(())
}
#[tokio::test]
async fn test_identity_count() -> LettaResult<()> {
let client = get_test_client()?;
let count = client.identities().count().await?;
println!("Total identities: {}", count);
Ok(())
}
#[tokio::test]
async fn test_create_identity_with_project() -> LettaResult<()> {
let client = get_test_client()?;
let request = CreateIdentityRequest {
identifier_key: format!("test-project-identity-{}", uuid::Uuid::new_v4()),
name: "Test Project Identity".to_string(),
identity_type: IdentityType::User,
project_id: None,
agent_ids: None,
block_ids: None,
properties: None,
};
let result = client
.identities()
.create_with_project(request, "test-project-123")
.await;
match result {
Ok(identity) => {
println!(
"Created identity with project: {} ({})",
identity.name, identity.id
);
client.identities().delete(&identity.id).await?;
}
Err(e) => {
println!(
"Expected error creating identity with project header: {}",
e
);
}
}
Ok(())
}