feat: add integration tests and runnable examples

Add 91 integration tests (all #[ignore]) mirroring the JavaScript SDK's
integration test suite. Tests cover all endpoints: ping, apps, fields,
records, files, lists, and reports with success, auth, access, and
not-found scenarios.

Add 7 runnable examples (cargo run --example <name>) for quick manual
smoke testing against a real Onspring instance.

Both use env vars (API_BASE_URL, SANDBOX_API_KEY, TEST_*) matching the
JavaScript SDK setup.

Also rename crate to onspring-api-sdk-rust with [lib] name = "onspring"
so imports remain `use onspring::*`.
This commit is contained in:
Stevan Freeborn
2026-03-25 18:57:45 -05:00
parent 905f7f945a
commit a517aef3bd
18 changed files with 1755 additions and 1 deletions
+84
View File
@@ -0,0 +1,84 @@
use onspring::{OnspringClient, PagingRequest, QueryRecordsRequest, SaveRecordRequest};
use std::collections::HashMap;
#[tokio::main]
async fn main() -> onspring::Result<()> {
let base_url = std::env::var("API_BASE_URL").expect("API_BASE_URL is required");
let api_key = std::env::var("SANDBOX_API_KEY").expect("SANDBOX_API_KEY is required");
let app_id: i32 = std::env::var("TEST_SURVEY_ID")
.expect("TEST_SURVEY_ID is required")
.parse()
.expect("TEST_SURVEY_ID must be an integer");
let field_id = std::env::var("TEST_TEXT_FIELD").expect("TEST_TEXT_FIELD is required");
let client = OnspringClient::builder(&api_key)
.base_url(&base_url)
.build();
// List records
let paging = PagingRequest {
page_number: 1,
page_size: 5,
};
let response = client
.list_records(app_id, Some(paging), None, None)
.await?;
println!("Total records: {:?}", response.total_records);
if let Some(items) = &response.items {
for record in items {
println!(" Record ID: {}", record.record_id);
}
}
// Create a record
let mut fields = HashMap::new();
fields.insert(field_id.clone(), serde_json::json!("Hello from Rust SDK"));
let request = SaveRecordRequest {
app_id,
record_id: None,
fields,
};
let saved = client.save_record(request).await?;
println!("\nCreated record with ID: {}", saved.id);
// Get the record back
let record = client.get_record(app_id, saved.id, None, None).await?;
println!(
"Fetched record: app_id={}, record_id={}",
record.app_id, record.record_id
);
// Update the record
let mut fields = HashMap::new();
fields.insert(field_id, serde_json::json!("Updated from Rust SDK"));
let update = SaveRecordRequest {
app_id,
record_id: Some(saved.id),
fields,
};
client.save_record(update).await?;
println!("Updated record {}", saved.id);
// Query records
let query = QueryRecordsRequest {
app_id,
filter: format!(
"{} contains 'Rust'",
std::env::var("TEST_TEXT_FIELD").unwrap()
),
field_ids: None,
data_format: None,
};
let query_result = client.query_records(query, None).await?;
println!("\nQuery found {:?} records", query_result.total_records);
// Delete the record
client.delete_record(app_id, saved.id).await?;
println!("Deleted record {}", saved.id);
Ok(())
}