busbar_sf_rest/
collections.rs1use crate::sobject::SalesforceError;
4use serde::{Deserialize, Serialize};
5
6#[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#[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 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}