From 894263c72b38760dec362d127bd1090565406090 Mon Sep 17 00:00:00 2001 From: Stanley Owoh Date: Tue, 28 Jul 2026 00:37:18 +0100 Subject: [PATCH 1/3] feat: add assert event unit test --- creator-keys/tests/events.rs | 111 ++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 5bf11ea4..4d0b3a7c 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -142,7 +142,9 @@ fn assert_event_topic_matches(env: &Env, event: &(Address, Vec, Val), expec assert_eq!( actual_topic, expected_topic, - "event topic should match expected contract identifier" + "event topic mismatch: expected {:?}, got {:?}", + expected_topic, + actual_topic ); } @@ -301,7 +303,7 @@ fn test_register_creator_event_fires_once() { } #[test] -#[should_panic(expected = "event topic should match expected contract identifier")] +#[should_panic(expected = "event topic mismatch")] fn test_assert_event_topic_matches_rejects_unexpected_identifier() { let env = Env::default(); env.mock_all_auths(); @@ -438,3 +440,108 @@ fn test_sell_key_event_payload_field_order_is_documented() { ["seller", "creator_id", "quantity", "proceeds", "ledger"] ); } + +#[test] +#[should_panic(expected = "event topic mismatch")] +fn test_assert_event_topic_matches_panics_on_buy_vs_sell_mismatch() { + let env = Env::default(); + env.mock_all_auths(); + let fixture = EventFixture::new(&env); + let buyer = Address::generate(&env); + + fixture.register_creator(&env, "alice"); + fixture.buy_key(&buyer, KEY_PRICE); + + let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }).expect("buy event should be present"); + + assert_event_topic_matches(&env, &buy_event, events::SELL_EVENT_NAME); +} + +#[test] +fn test_assert_event_topic_matches_passes_on_matching_topic() { + let env = Env::default(); + env.mock_all_auths(); + let fixture = EventFixture::new(&env); + let buyer = Address::generate(&env); + + fixture.register_creator(&env, "alice"); + fixture.buy_key(&buyer, KEY_PRICE); + + let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }).expect("buy event should be present"); + + assert_event_topic_matches(&env, &buy_event, events::BUY_EVENT_NAME); +} + +#[test] +#[should_panic(expected = "event topic should be present")] +fn test_assert_event_topic_matches_panics_when_no_topics() { + let env = Env::default(); + let addr = Address::generate(&env); + let empty_topics: Vec = Vec::new(&env); + let event = (addr, empty_topics, 0_i32.into_val(&env)); + + assert_event_topic_matches(&env, &event, events::BUY_EVENT_NAME); +} + +#[test] +fn test_assert_event_topic_mismatch_message_identifies_topics() { + let env = Env::default(); + env.mock_all_auths(); + let fixture = EventFixture::new(&env); + let buyer = Address::generate(&env); + + fixture.register_creator(&env, "alice"); + fixture.buy_key(&buyer, KEY_PRICE); + + let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }).expect("buy event should be present"); + + let err = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + assert_event_topic_matches(&env, &buy_event, events::SELL_EVENT_NAME); + })) + .unwrap_err(); + + let message = err + .downcast_ref::() + .cloned() + .or_else(|| err.downcast_ref::<&str>().map(|s| std::string::String::from(*s))) + .unwrap_or_default(); + assert!( + message.contains("event topic mismatch"), + "message should indicate topic mismatch, got: {}", + message + ); + assert!( + message.contains(&format!("{:?}", events::BUY_EVENT_NAME)), + "message should identify actual topic, got: {}", + message + ); + assert!( + message.contains(&format!("{:?}", events::SELL_EVENT_NAME)), + "message should identify expected topic, got: {}", + message + ); +} From b181a5199db428ff302b2f4756235d80cca2d763 Mon Sep 17 00:00:00 2001 From: Stanley Owoh Date: Fri, 31 Jul 2026 09:29:04 +0100 Subject: [PATCH 2/3] chore: print Rust toolchain versions in CI --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9452098a..5a54280c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,11 @@ jobs: toolchain: stable components: rustfmt, clippy + - name: Rust versions + run: | + rustc --version + cargo fmt --version + - name: Format check run: cargo fmt --all -- --check From 72378f3e206a3c08766387d51df0ee97176ca572 Mon Sep 17 00:00:00 2001 From: Stanley Owoh Date: Fri, 31 Jul 2026 14:17:26 +0100 Subject: [PATCH 3/3] style: format event tests --- creator-keys/tests/events.rs | 80 ++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/creator-keys/tests/events.rs b/creator-keys/tests/events.rs index 4d0b3a7c..d11147fc 100644 --- a/creator-keys/tests/events.rs +++ b/creator-keys/tests/events.rs @@ -143,8 +143,7 @@ fn assert_event_topic_matches(env: &Env, event: &(Address, Vec, Val), expec assert_eq!( actual_topic, expected_topic, "event topic mismatch: expected {:?}, got {:?}", - expected_topic, - actual_topic + expected_topic, actual_topic ); } @@ -452,15 +451,21 @@ fn test_assert_event_topic_matches_panics_on_buy_vs_sell_mismatch() { fixture.register_creator(&env, "alice"); fixture.buy_key(&buyer, KEY_PRICE); - let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { - topics - .get(events::TOPIC_EVENT_NAME_INDEX) - .map(|v| { - let name: Symbol = v.into_val(&env); - name == events::BUY_EVENT_NAME - }) - .unwrap_or(false) - }).expect("buy event should be present"); + let buy_event = env + .events() + .all() + .iter() + .rev() + .find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }) + .expect("buy event should be present"); assert_event_topic_matches(&env, &buy_event, events::SELL_EVENT_NAME); } @@ -475,15 +480,21 @@ fn test_assert_event_topic_matches_passes_on_matching_topic() { fixture.register_creator(&env, "alice"); fixture.buy_key(&buyer, KEY_PRICE); - let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { - topics - .get(events::TOPIC_EVENT_NAME_INDEX) - .map(|v| { - let name: Symbol = v.into_val(&env); - name == events::BUY_EVENT_NAME - }) - .unwrap_or(false) - }).expect("buy event should be present"); + let buy_event = env + .events() + .all() + .iter() + .rev() + .find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }) + .expect("buy event should be present"); assert_event_topic_matches(&env, &buy_event, events::BUY_EVENT_NAME); } @@ -509,15 +520,21 @@ fn test_assert_event_topic_mismatch_message_identifies_topics() { fixture.register_creator(&env, "alice"); fixture.buy_key(&buyer, KEY_PRICE); - let buy_event = env.events().all().iter().rev().find(|(_, topics, _)| { - topics - .get(events::TOPIC_EVENT_NAME_INDEX) - .map(|v| { - let name: Symbol = v.into_val(&env); - name == events::BUY_EVENT_NAME - }) - .unwrap_or(false) - }).expect("buy event should be present"); + let buy_event = env + .events() + .all() + .iter() + .rev() + .find(|(_, topics, _)| { + topics + .get(events::TOPIC_EVENT_NAME_INDEX) + .map(|v| { + let name: Symbol = v.into_val(&env); + name == events::BUY_EVENT_NAME + }) + .unwrap_or(false) + }) + .expect("buy event should be present"); let err = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { assert_event_topic_matches(&env, &buy_event, events::SELL_EVENT_NAME); @@ -527,7 +544,10 @@ fn test_assert_event_topic_mismatch_message_identifies_topics() { let message = err .downcast_ref::() .cloned() - .or_else(|| err.downcast_ref::<&str>().map(|s| std::string::String::from(*s))) + .or_else(|| { + err.downcast_ref::<&str>() + .map(|s| std::string::String::from(*s)) + }) .unwrap_or_default(); assert!( message.contains("event topic mismatch"),