use gocardless_client::client::GoCardlessClient; use gocardless_client::models::TokenResponse; use wiremock::matchers::{method, path}; use wiremock::{Mock, MockServer, ResponseTemplate}; use std::fs; #[tokio::test] async fn test_get_transactions_parsing() { // 1. Setup WireMock let mock_server = MockServer::start().await; // Mock Token Endpoint Mock::given(method("POST")) .and(path("/api/v2/token/new/")) .respond_with(ResponseTemplate::new(200).set_body_json(TokenResponse { access: "fake_access_token".to_string(), access_expires: 3600, refresh: Some("fake_refresh".to_string()), refresh_expires: Some(86400), })) .mount(&mock_server) .await; // Mock Transactions Endpoint let fixture = fs::read_to_string("tests/fixtures/gc_transactions.json").unwrap(); Mock::given(method("GET")) .and(path("/api/v2/accounts/ACC123/transactions/")) .respond_with(ResponseTemplate::new(200).set_body_string(fixture)) .mount(&mock_server) .await; // 2. Run Client let mut client = GoCardlessClient::new(&mock_server.uri(), "id", "key").unwrap(); client.obtain_access_token().await.unwrap(); let resp = client.get_transactions("ACC123", None, None).await.unwrap(); // 3. Assertions assert_eq!(resp.transactions.booked.len(), 2); let tx1 = &resp.transactions.booked[0]; assert_eq!(tx1.transaction_id.as_deref(), Some("TX123")); assert_eq!(tx1.transaction_amount.amount, "100.00"); assert_eq!(tx1.transaction_amount.currency, "EUR"); let tx2 = &resp.transactions.booked[1]; assert_eq!(tx2.transaction_id.as_deref(), Some("TX124")); assert_eq!(tx2.transaction_amount.amount, "-10.00"); // Verify Multi-Currency parsing let exchange = tx2.currency_exchange.as_ref().unwrap(); assert_eq!(exchange[0].source_currency.as_deref(), Some("USD")); assert_eq!(exchange[0].exchange_rate.as_deref(), Some("1.10")); }