Skip to main content

busbar_sf_rest/
collections.rs

1//! SObject Collections for batch operations.
2
3use crate::sobject::SalesforceError;
4use serde::{Deserialize, Serialize};
5
6/// Request for SObject Collections operations.
7#[derive(Debug, Clone, Serialize)]
8pub struct CollectionRequest {
9    #[serde(rename = "allOrNone")]
10    pub all_or_none: bool,
11    pub records: Vec<serde_json::Value>,
12}
13
14/// Result of a collection operation.
15#[derive(Debug, Clone, Deserialize)]
16pub struct CollectionResult {
17    pub id: Option<String>,
18    pub success: bool,
19    #[serde(default)]
20    pub errors: Vec<SalesforceError>,
21    pub created: Option<bool>,
22}
23
24#[cfg(test)]
25mod tests {
26    use super::*;
27    use serde_json::json;
28
29    #[test]
30    fn test_collection_request_serialization() {
31        let request = CollectionRequest {
32            all_or_none: true,
33            records: vec![
34                json!({"attributes": {"type": "Account"}, "Name": "Acme"}),
35                json!({"attributes": {"type": "Account"}, "Name": "Widget Co"}),
36            ],
37        };
38
39        let json = serde_json::to_value(&request).unwrap();
40        assert_eq!(json["allOrNone"], true);
41        assert_eq!(json["records"].as_array().unwrap().len(), 2);
42    }
43
44    #[test]
45    fn test_collection_result_success() {
46        let json =
47            json!({"id": "001xx000003DgAAAS", "success": true, "errors": [], "created": true});
48        let result: CollectionResult = serde_json::from_value(json).unwrap();
49        assert_eq!(result.id, Some("001xx000003DgAAAS".to_string()));
50        assert!(result.success);
51        assert_eq!(result.created, Some(true));
52        assert!(result.errors.is_empty());
53    }
54
55    #[test]
56    fn test_collection_result_failure() {
57        let json = json!({
58            "id": null,
59            "success": false,
60            "errors": [{"statusCode": "DUPLICATES_DETECTED", "message": "Duplicate found", "fields": []}],
61            "created": null
62        });
63        let result: CollectionResult = serde_json::from_value(json).unwrap();
64        assert!(result.id.is_none());
65        assert!(!result.success);
66        assert_eq!(result.errors.len(), 1);
67        assert_eq!(result.errors[0].status_code, "DUPLICATES_DETECTED");
68    }
69
70    #[test]
71    fn test_collection_result_batch_response() {
72        // Salesforce returns an array of CollectionResults for batch ops
73        let json = json!([
74            {"id": "001xx000003Dg1", "success": true, "errors": [], "created": true},
75            {"id": null, "success": false, "errors": [{"statusCode": "INVALID_FIELD", "message": "bad field", "fields": ["Foo"]}], "created": null},
76            {"id": "001xx000003Dg3", "success": true, "errors": [], "created": true}
77        ]);
78        let results: Vec<CollectionResult> = serde_json::from_value(json).unwrap();
79        assert_eq!(results.len(), 3);
80        assert!(results[0].success);
81        assert!(!results[1].success);
82        assert!(results[2].success);
83    }
84}