Skip to main content

rhood_core/endpoints/
transfers.rs

1use crate::Result;
2use crate::api::paths;
3use crate::client::RobinhoodClient;
4use crate::models::transfer::Transfer;
5
6impl RobinhoodClient {
7    /// Fetches all unified transfers (ACH, wire, debit card).
8    ///
9    /// Uses the Bonfire API to retrieve a consolidated view of all transfer
10    /// types in a single request.
11    ///
12    /// # Errors
13    ///
14    /// Returns an error if the HTTP request fails or the response cannot be
15    /// deserialized.
16    pub async fn get_transfers(&self) -> Result<Vec<Transfer>> {
17        self.get_paginated(&self.bonfire_url(paths::UNIFIED_TRANSFERS), &[])
18            .await
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use crate::models::transfer::Transfer;
25
26    #[test]
27    fn transfer_deserializes_full() {
28        let json = r#"{
29            "id": "xfer-001",
30            "transfer_type": "originated_ach",
31            "amount": "500.00",
32            "currency": "USD",
33            "direction": "pull",
34            "state": "completed",
35            "created_at": "2026-03-01T10:00:00Z",
36            "updated_at": "2026-03-02T10:00:00Z",
37            "net_amount": "500.00",
38            "service_fee": "0.00",
39            "originating_account_id": "bank-001",
40            "originating_account_type": "ach",
41            "receiving_account_id": "rh-001",
42            "receiving_account_type": "brokerage",
43            "is_visible_in_history": true,
44            "details": {"ach_relationship_id": "rel-001"}
45        }"#;
46        let xfer: Transfer = serde_json::from_str(json).unwrap();
47        assert_eq!(xfer.id.as_deref(), Some("xfer-001"));
48        assert_eq!(xfer.transfer_type.as_deref(), Some("originated_ach"));
49        assert_eq!(xfer.direction.as_deref(), Some("pull"));
50        assert!(xfer.details.is_some());
51    }
52
53    #[test]
54    fn transfer_handles_missing_fields() {
55        let json = r#"{"id": "xfer-002", "state": "pending"}"#;
56        let xfer: Transfer = serde_json::from_str(json).unwrap();
57        assert_eq!(xfer.id.as_deref(), Some("xfer-002"));
58        assert!(xfer.details.is_none());
59        assert!(xfer.transfer_type.is_none());
60    }
61}