diff --git a/contracts/split/src/validation.rs b/contracts/split/src/validation.rs index e0c16da..480c4a7 100644 --- a/contracts/split/src/validation.rs +++ b/contracts/split/src/validation.rs @@ -103,4 +103,17 @@ mod tests { let v: Vec
= Vec::new(&env); assert!(assert_unique_recipients(&env, &v.to_vec()).is_ok()); } + + #[test] + fn two_identical_addresses_returns_duplicate_error() { + let env = Env::default(); + let a = Address::generate(&env); + let mut v: Vec
= Vec::new(&env); + v.push_back(a.clone()); + v.push_back(a.clone()); + assert_eq!( + assert_unique_recipients(&env, &v.to_vec()), + Err(ContractError::DuplicateRecipient) + ); + } } diff --git a/tests/event_log_tests.rs b/tests/event_log_tests.rs index 4954f84..926fb43 100644 --- a/tests/event_log_tests.rs +++ b/tests/event_log_tests.rs @@ -1,10 +1,12 @@ #![cfg(test)] use soroban_sdk::{ - testutils::{Address as _, Ledger, Events}, + testutils::{Address as _, Ledger, Events, BytesN as _}, token::{Client as TokenClient, StellarAssetClient}, - Address, Env, Symbol, Vec, Map, + Address, Env, Symbol, Vec, Map, BytesN, }; +use split_contracts::types::InvoiceStatus; +use split_contracts::events::{invoice_state_changed, allowlist_updated, dispute_raised}; #[test] fn test_event_log_stores_creation_event() { @@ -243,3 +245,75 @@ fn test_event_log_with_multiple_recipients() { // Verify release event includes all 3 recipient addresses } + +#[test] +fn invoice_state_changed_status_symbols() { + let env = Env::default(); + env.mock_all_auths(); + + let invoice_id = 1u64; + let actor = Address::generate(&env); + + let test_cases = vec![ + (None, InvoiceStatus::Pending, "none", "pending"), + (Some(InvoiceStatus::Pending), InvoiceStatus::Released, "pending", "released"), + (Some(InvoiceStatus::Released), InvoiceStatus::Refunded, "released", "refunded"), + (Some(InvoiceStatus::Refunded), InvoiceStatus::Expired, "refunded", "expired"), + ]; + + for (from_status, to_status, expected_from, expected_to) in test_cases { + let before_events = env.events().all(); + invoice_state_changed(&env, invoice_id, from_status.as_ref(), &to_status, &actor); + let after_events = env.events().all(); + + assert!(after_events.len() > before_events.len(), "Event should be published"); + } +} + +#[test] +fn allowlist_updated_event_add() { + let env = Env::default(); + env.mock_all_auths(); + + let invoice_id = 1u64; + let creator = Address::generate(&env); + let payer = Address::generate(&env); + + let before_events = env.events().all(); + allowlist_updated(&env, invoice_id, &creator, &payer, true); + let after_events = env.events().all(); + + assert!(after_events.len() > before_events.len(), "Event should be published"); +} + +#[test] +fn allowlist_updated_event_remove() { + let env = Env::default(); + env.mock_all_auths(); + + let invoice_id = 1u64; + let creator = Address::generate(&env); + let payer = Address::generate(&env); + + let before_events = env.events().all(); + allowlist_updated(&env, invoice_id, &creator, &payer, false); + let after_events = env.events().all(); + + assert!(after_events.len() > before_events.len(), "Event should be published"); +} + +#[test] +fn dispute_raised_event_carries_payer_and_hash() { + let env = Env::default(); + env.mock_all_auths(); + + let invoice_id = 1u64; + let payer = Address::generate(&env); + let reason_hash = BytesN::<32>::random(&env); + + let before_events = env.events().all(); + dispute_raised(&env, invoice_id, &payer, &reason_hash); + let after_events = env.events().all(); + + assert!(after_events.len() > before_events.len(), "Event should be published"); +}