mod common; use wiremock::matchers::{body_json, header, method, path, query_param}; use wiremock::{Mock, ResponseTemplate}; #[tokio::test] async fn test_list_apps_success() { let (mock_server, client) = common::setup().await; Mock::given(method("GET")) .and(path("/Apps")) .and(header("x-apikey", "test-api-key")) .and(header("x-api-version", "2")) .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ "pageNumber": 1, "pageSize": 50, "totalPages": 1, "totalRecords": 2, "items": [ {"href": "/Apps/id/1", "id": 1, "name": "App One"}, {"href": "/Apps/id/2", "id": 2, "name": "App Two"} ] }))) .mount(&mock_server) .await; let result = client.list_apps(None).await.unwrap(); assert_eq!(result.total_records, Some(2)); let items = result.items.unwrap(); assert_eq!(items.len(), 2); assert_eq!(items[0].id, 1); assert_eq!(items[0].name.as_deref(), Some("App One")); } #[tokio::test] async fn test_list_apps_with_paging() { let (mock_server, client) = common::setup().await; Mock::given(method("GET")) .and(path("/Apps")) .and(query_param("PageNumber", "2")) .and(query_param("PageSize", "10")) .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ "pageNumber": 2, "pageSize": 10, "totalPages": 3, "totalRecords": 25, "items": [] }))) .mount(&mock_server) .await; let paging = onspring::PagingRequest { page_number: 2, page_size: 10, }; let result = client.list_apps(Some(paging)).await.unwrap(); assert_eq!(result.page_number, Some(2)); } #[tokio::test] async fn test_get_app_success() { let (mock_server, client) = common::setup().await; Mock::given(method("GET")) .and(path("/Apps/id/42")) .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ "href": "/Apps/id/42", "id": 42, "name": "Test App" }))) .mount(&mock_server) .await; let app = client.get_app(42).await.unwrap(); assert_eq!(app.id, 42); assert_eq!(app.name.as_deref(), Some("Test App")); } #[tokio::test] async fn test_get_app_not_found() { let (mock_server, client) = common::setup().await; Mock::given(method("GET")) .and(path("/Apps/id/999")) .respond_with(ResponseTemplate::new(404)) .mount(&mock_server) .await; let result = client.get_app(999).await; assert!(result.is_err()); if let Err(onspring::OnspringError::Api { status_code, .. }) = result { assert_eq!(status_code, 404); } else { panic!("Expected Api error"); } } #[tokio::test] async fn test_batch_get_apps() { let (mock_server, client) = common::setup().await; Mock::given(method("POST")) .and(path("/Apps/batch-get")) .and(body_json(serde_json::json!([1, 2, 3]))) .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({ "count": 3, "items": [ {"href": "/Apps/id/1", "id": 1, "name": "App 1"}, {"href": "/Apps/id/2", "id": 2, "name": "App 2"}, {"href": "/Apps/id/3", "id": 3, "name": "App 3"} ] }))) .mount(&mock_server) .await; let result = client.batch_get_apps(&[1, 2, 3]).await.unwrap(); assert_eq!(result.count, Some(3)); assert_eq!(result.items.unwrap().len(), 3); }