From 84593a734944286351e95e3b58f8909ffe471f7e Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 1 Jun 2026 23:09:56 +0100 Subject: [PATCH] test: verify batch_charge result ordering --- contract/src/test.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/contract/src/test.rs b/contract/src/test.rs index 767ca57..d084ec8 100644 --- a/contract/src/test.rs +++ b/contract/src/test.rs @@ -544,6 +544,54 @@ fn test_batch_charge_charged_and_skipped() { assert_eq!(results.get(1).unwrap(), crate::ChargeResult::Skipped); } +#[test] +fn test_batch_charge_ordering() { + let (env, contract_id, token_addr, user_1, merchant) = setup(); + let client = FlowPayClient::new(&env, &contract_id); + + let user_2 = Address::generate(&env); + let sac = StellarAssetClient::new(&env, &token_addr); + sac.mint(&user_2, &10_000_0000000); + let token = TokenClient::new(&env, &token_addr); + token.approve(&user_2, &contract_id, &10_000_0000000, &200); + + let user_3 = Address::generate(&env); + // user_3 has no subscription + + let user_4 = Address::generate(&env); + sac.mint(&user_4, &10_000_0000000); + token.approve(&user_4, &contract_id, &10_000_0000000, &200); + + let interval = 86400; + + // user_1: valid, will be charged + client.subscribe(&user_1, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + // user_2: valid, will be charged + client.subscribe(&user_2, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + // user_4: valid but skipped (we will subscribe right before charge so interval not elapsed) + + env.ledger().with_mut(|l| { l.timestamp += interval + 1; }); + + client.subscribe(&user_4, &merchant, &1_0000000, &interval, &token_addr, &None, &None); + + let mut users = soroban_sdk::Vec::new(&env); + // Order: user_2 (Charged), user_3 (Failed), user_4 (Skipped), user_1 (Charged) + users.push_back(user_2.clone()); + users.push_back(user_3.clone()); + users.push_back(user_4.clone()); + users.push_back(user_1.clone()); + + let results = client.batch_charge(&users); + + assert_eq!(results.len(), 4); + assert_eq!(results.get(0).unwrap(), crate::ChargeResult::Charged); + assert_eq!(results.get(1).unwrap(), crate::ChargeResult::NoSubscription); + assert_eq!(results.get(2).unwrap(), crate::ChargeResult::Skipped); + assert_eq!(results.get(3).unwrap(), crate::ChargeResult::Charged); +} + #[test] fn test_batch_charge_no_subscription() { let (env, contract_id, _token_addr, _user, _merchant) = setup(); @@ -1194,6 +1242,7 @@ fn test_custom_sac_token_end_to_end_flow() { // Verify subscription is still active after pay_per_use let sub_final = client.get_subscription(&user).unwrap(); assert!(sub_final.active, "subscription should remain active after pay_per_use"); +} // ───────────────────────────────────────────────────────────── // Issue #237: get_token() read function tests // ─────────────────────────────────────────────────────────────