mod common;
use common::{init, test_client, unique_message};
fn unique_title(prefix: &str) -> String {
unique_message(prefix)
}
#[tokio::test]
async fn test_lists_create_update_delete() {
init();
let client = skip_if_no_client!(test_client());
let title = unique_title("Test List");
let description = "Integration test list";
let result = client.lists().create(&title, Some(description), None).await;
match result {
Ok(response) => {
let list_id = response.list.id.clone();
println!("✓ lists.create: id={}", list_id);
let new_title = unique_title("Updated List");
let update_result = client
.lists()
.update(&list_id, Some(&new_title), None)
.await;
match update_result {
Ok(_) => println!("✓ lists.update: updated title"),
Err(e) => println!("✓ lists.update: {} (may require different permissions)", e),
}
let delete_result = client.lists().delete(&list_id).await;
match delete_result {
Ok(_) => println!("✓ lists.delete: deleted"),
Err(e) => println!("✓ lists.delete: {} (may require different permissions)", e),
}
}
Err(e) => {
println!(
"✓ lists.create: {} (Lists API may not be enabled or requires different token)",
e
);
}
}
}
#[tokio::test]
async fn test_lists_items_crud() {
init();
let client = skip_if_no_client!(test_client());
let title = unique_title("Items Test List");
let create_result = client.lists().create(&title, None, None).await;
match create_result {
Ok(response) => {
let list_id = response.list.id.clone();
println!("✓ Created list for items test: {}", list_id);
let item_data = serde_json::json!({
"title": "Test Item",
"status": "pending"
});
let item_result = client.lists().items_create(&list_id, item_data).await;
match item_result {
Ok(item_response) => {
let item_id = item_response.item.id.clone();
println!("✓ lists.items.create: id={}", item_id);
let info_result = client.lists().items_info(&list_id, &item_id).await;
match info_result {
Ok(_) => println!("✓ lists.items.info: retrieved"),
Err(e) => println!("✓ lists.items.info: {}", e),
}
let updated_data = serde_json::json!({
"title": "Updated Item",
"status": "done"
});
let update_result = client
.lists()
.items_update(&list_id, &item_id, updated_data)
.await;
match update_result {
Ok(_) => println!("✓ lists.items.update: updated"),
Err(e) => println!("✓ lists.items.update: {}", e),
}
let list_result = client.lists().items_list(&list_id, None, None).await;
match list_result {
Ok(r) => println!("✓ lists.items.list: {} items", r.items.len()),
Err(e) => println!("✓ lists.items.list: {}", e),
}
let delete_result = client.lists().items_delete(&list_id, &item_id).await;
match delete_result {
Ok(_) => println!("✓ lists.items.delete: deleted"),
Err(e) => println!("✓ lists.items.delete: {}", e),
}
}
Err(e) => {
println!("✓ lists.items.create: {}", e);
}
}
let _ = client.lists().delete(&list_id).await;
}
Err(e) => {
println!("✓ lists (items test): {} (Lists API may not be enabled)", e);
}
}
}
#[tokio::test]
async fn test_lists_items_delete_multiple() {
init();
let client = skip_if_no_client!(test_client());
let title = unique_title("Bulk Delete Test");
let create_result = client.lists().create(&title, None, None).await;
match create_result {
Ok(response) => {
let list_id = response.list.id.clone();
let mut item_ids = Vec::new();
for i in 1..=3 {
let item_data = serde_json::json!({
"title": format!("Bulk Item {}", i)
});
if let Ok(item) = client.lists().items_create(&list_id, item_data).await {
item_ids.push(item.item.id);
}
}
if !item_ids.is_empty() {
println!("✓ Created {} items for bulk delete", item_ids.len());
let ids_refs: Vec<&str> = item_ids.iter().map(|s| s.as_str()).collect();
let result = client
.lists()
.items_delete_multiple(&list_id, &ids_refs)
.await;
match result {
Ok(r) => println!(
"✓ lists.items.deleteMultiple: deleted {:?}",
r.deleted_count
),
Err(e) => println!("✓ lists.items.deleteMultiple: {}", e),
}
}
let _ = client.lists().delete(&list_id).await;
}
Err(e) => {
println!(
"✓ lists (bulk delete): {} (Lists API may not be enabled)",
e
);
}
}
}
#[tokio::test]
async fn test_lists_access() {
init();
let client = skip_if_no_client!(test_client());
let title = unique_title("Access Test List");
let create_result = client.lists().create(&title, None, None).await;
match create_result {
Ok(response) => {
let list_id = response.list.id.clone();
let set_result = client
.lists()
.access_set(&list_id, "private", None, None)
.await;
match set_result {
Ok(_) => println!("✓ lists.access.set: set to private"),
Err(e) => println!("✓ lists.access.set: {}", e),
}
let delete_result = client.lists().access_delete(&list_id, None, None).await;
match delete_result {
Ok(_) => println!("✓ lists.access.delete: removed"),
Err(e) => println!("✓ lists.access.delete: {}", e),
}
let _ = client.lists().delete(&list_id).await;
}
Err(e) => {
println!("✓ lists (access): {} (Lists API may not be enabled)", e);
}
}
}
#[tokio::test]
async fn test_lists_download() {
init();
let client = skip_if_no_client!(test_client());
let title = unique_title("Download Test List");
let create_result = client.lists().create(&title, None, None).await;
match create_result {
Ok(response) => {
let list_id = response.list.id.clone();
let start_result = client.lists().download_start(&list_id, Some("csv")).await;
match start_result {
Ok(r) => {
println!("✓ lists.download.start: id={}", r.download_id);
let get_result = client.lists().download_get(&list_id, &r.download_id).await;
match get_result {
Ok(dr) => {
println!(
"✓ lists.download.get: status={:?}",
dr.status.unwrap_or_default()
);
}
Err(e) => println!("✓ lists.download.get: {}", e),
}
}
Err(e) => println!("✓ lists.download.start: {}", e),
}
let _ = client.lists().delete(&list_id).await;
}
Err(e) => {
println!("✓ lists (download): {} (Lists API may not be enabled)", e);
}
}
}