diff --git a/tests/contract_test.rs b/tests/contract_test.rs index 988ecf0..0bb006e 100644 --- a/tests/contract_test.rs +++ b/tests/contract_test.rs @@ -109,6 +109,27 @@ fn pause_and_unpause() { assert!(!client.is_paused()); } +#[test] +#[should_panic(expected = "not admin")] +fn test_non_admin_cannot_pause() { + let env = Env::default(); + let (_, _, client) = setup(&env); + let non_admin = Address::generate(&env); + + client.pause(&non_admin); +} + +#[test] +#[should_panic(expected = "not admin")] +fn test_non_admin_cannot_unpause() { + let env = Env::default(); + let (admin, _, client) = setup(&env); + let non_admin = Address::generate(&env); + + client.pause(&admin); + client.unpause(&non_admin); +} + // --------------------------------------------------------------------------- // Paused mutating calls — issue #70 (depends on #63 / #10) // --------------------------------------------------------------------------- @@ -337,6 +358,48 @@ fn add_and_remove_asset() { assert!(!client.is_asset_allowed(&usd(&env))); } +#[test] +fn test_add_asset_emits_event() { + let env = Env::default(); + let (admin, contract_id, client) = setup(&env); + let asset_code = SorobanString::from_str(&env, "EUR"); + + client.add_asset(&admin, &asset_code); + + let all_events = env.events().all(); + let topics: soroban_sdk::Vec = (symbol_short!("synapse"),).into_val(&env); + let ledger = env.ledger().sequence(); + let event_count = all_events.len(); + let (evt_contract, evt_topics, evt_data) = all_events.get(event_count - 1).unwrap(); + + assert_eq!(evt_contract, contract_id); + assert_eq!(evt_topics, topics); + assert_eq!(event_data(&env, evt_data), (Event::AssetAdded(asset_code), ledger)); +} + +#[test] +fn test_remove_asset_emits_event() { + let env = Env::default(); + let (admin, contract_id, client) = setup(&env); + let asset_code = SorobanString::from_str(&env, "EUR"); + + client.add_asset(&admin, &asset_code); + client.remove_asset(&admin, &asset_code); + + let all_events = env.events().all(); + let topics: soroban_sdk::Vec = (symbol_short!("synapse"),).into_val(&env); + let ledger = env.ledger().sequence(); + let event_count = all_events.len(); + let (evt_contract, evt_topics, evt_data) = all_events.get(event_count - 1).unwrap(); + + assert_eq!(evt_contract, contract_id); + assert_eq!(evt_topics, topics); + assert_eq!( + event_data(&env, evt_data), + (Event::AssetRemoved(asset_code), ledger), + ); +} + #[test] fn remove_asset_emits_asset_removed_event() { let env = Env::default(); @@ -1809,6 +1872,46 @@ fn mark_failed_creates_dlq_entry() { assert_eq!(entry.tx_id, tx_id); } +#[test] +fn test_mark_failed_emits_events() { + let env = Env::default(); + let (admin, contract_id, client) = setup(&env); + let relayer = Address::generate(&env); + client.grant_relayer(&admin, &relayer); + client.add_asset(&admin, &usd(&env)); + + let tx_id = register(&env, &client, &relayer, "issue-600-mf-events", 50_000_000); + let error_reason = SorobanString::from_str(&env, "horizon timeout"); + + client.mark_failed(&relayer, &tx_id, &error_reason); + + let all_events = env.events().all(); + let topics: soroban_sdk::Vec = (symbol_short!("synapse"),).into_val(&env); + let ledger = env.ledger().sequence(); + let event_count = all_events.len(); + + assert!(event_count >= 2, "expected at least two events after mark_failed"); + + let (status_contract, status_topics, status_data) = all_events.get(event_count - 2).unwrap(); + let (dlq_contract, dlq_topics, dlq_data) = all_events.get(event_count - 1).unwrap(); + + assert_eq!(status_contract, contract_id); + assert_eq!(status_topics, topics); + let (status_event, status_ledger) = event_data(&env, status_data); + assert_eq!(status_ledger, ledger); + match status_event { + Event::StatusUpdated(emitted_tx_id, ..) => assert_eq!(emitted_tx_id, tx_id), + _ => panic!("expected StatusUpdated as second-to-last event"), + } + + assert_eq!(dlq_contract, contract_id); + assert_eq!(dlq_topics, topics); + assert_eq!( + event_data(&env, dlq_data), + (Event::MovedToDlq(tx_id, error_reason), ledger), + ); +} + #[test] fn get_dlq_entry_returns_none_when_not_found() { let env = Env::default();