From 99cd91daf7c5624f77f2555ed65aae42e13d87c9 Mon Sep 17 00:00:00 2001 From: casweeney Date: Thu, 24 Oct 2024 14:04:11 +0100 Subject: [PATCH 1/5] implemented rsvp_for_event() --- .tool-versions | 1 + Scarb.lock | 12 ++++++++++-- src/events/events.cairo | 21 +++++++++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 .tool-versions diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..e086bef --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +starknet-foundry 0.31.0 diff --git a/Scarb.lock b/Scarb.lock index 777e152..dbb367e 100644 --- a/Scarb.lock +++ b/Scarb.lock @@ -95,7 +95,15 @@ name = "openzeppelin_utils" version = "0.15.0" source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.15.0#f57642960f1c8cffafefb88bfff418eca8510634" +[[package]] +name = "snforge_scarb_plugin" +version = "0.31.0" +source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.31.0#72ea785ca354e9e506de3e5d687da9fb2c1b3c67" + [[package]] name = "snforge_std" -version = "0.27.0" -source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.27.0#2d99b7c00678ef0363881ee0273550c44a9263de" +version = "0.31.0" +source = "git+https://github.com/foundry-rs/starknet-foundry?tag=v0.31.0#72ea785ca354e9e506de3e5d687da9fb2c1b3c67" +dependencies = [ + "snforge_scarb_plugin", +] diff --git a/src/events/events.cairo b/src/events/events.cairo index ad48bb5..888e148 100644 --- a/src/events/events.cairo +++ b/src/events/events.cairo @@ -70,7 +70,6 @@ pub mod Events { #[derive(Drop, starknet::Event)] pub struct RSVPForEvent { pub event_id: u256, - pub event_name: felt252, pub attendee_address: ContractAddress } @@ -136,7 +135,25 @@ pub mod Events { fn end_event_registration( ref self: ContractState, event_id: u256 ) {} // only owner can closed an event - fn rsvp_for_event(ref self: ContractState, event_id: u256) {} + + fn rsvp_for_event(ref self: ContractState, event_id: u256) { + let caller = get_caller_address(); + + let attendee_event_details = self.attendee_event_details.entry((event_id, caller)).read(); + + assert!(attendee_event_details.attendee_address == caller, "rsvp only for registered event"); + assert!(attendee_event_details.has_rsvp == false, "can't rsvp twice"); + + self.attendee_event_details.entry((event_id, caller)).has_rsvp.write(true); + + self.emit( + RSVPForEvent { + event_id, + attendee_address: caller, + } + ); + } + fn upgrade_event(ref self: ContractState, event_id: u256, paid_amount: u256) {} // GETTER FUNCTION From d5b336250f5483325425305864e2be2759c529e5 Mon Sep 17 00:00:00 2001 From: casweeney Date: Thu, 24 Oct 2024 15:11:26 +0100 Subject: [PATCH 2/5] implemented test cases for rsvp_for_event() --- src/events/events.cairo | 4 +++- tests/test_contract.cairo | 49 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/events/events.cairo b/src/events/events.cairo index 888e148..182530a 100644 --- a/src/events/events.cairo +++ b/src/events/events.cairo @@ -36,7 +36,7 @@ pub mod Events { // event #[event] #[derive(Drop, starknet::Event)] - enum Event { + pub enum Event { NewEventAdded: NewEventAdded, RegisteredForEvent: RegisteredForEvent, EventAttendanceMark: EventAttendanceMark, @@ -131,7 +131,9 @@ pub mod Events { ); event_id } + fn register_for_event(ref self: ContractState, event_id: u256, event_fee: u256) {} + fn end_event_registration( ref self: ContractState, event_id: u256 ) {} // only owner can closed an event diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index e0701f3..32c57dc 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -9,10 +9,11 @@ use starknet::{ContractAddress}; use snforge_std::{ declare, start_cheat_caller_address, stop_cheat_caller_address, ContractClassTrait, - DeclareResultTrait, + DeclareResultTrait, spy_events, EventSpyAssertionsTrait }; use chainevents_contracts::interfaces::IEvent::{IEventDispatcher, IEventDispatcherTrait}; +use chainevents_contracts::events::events::Events; const USER_ONE: felt252 = 'JOE'; @@ -45,3 +46,49 @@ fn test_add_event() { stop_cheat_caller_address(event_contract_address); } +#[test] +#[should_panic(expected: "rsvp only for registered event")] +fn test_rsvp_for_event_should_panic_on_unregistered_event() { + let event_contract_address = __setup__(); + + let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; + + let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); + + start_cheat_caller_address(event_contract_address, caller); + + let event_id: u256 = 1; + + event_dispatcher.rsvp_for_event(event_id); + + stop_cheat_caller_address(event_contract_address); +} + +#[test] +fn test_rsvp_for_event_should_emit_event() { + let event_contract_address = __setup__(); + + let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; + + let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); + + start_cheat_caller_address(event_contract_address, caller); + + let mut spy = spy_events(); + + let event_id: u256 = 1; + event_dispatcher.rsvp_for_event(event_id); + + let expected_event = Events::Event::RSVPForEvent(Events::RSVPForEvent { event_id: 1, attendee_address: caller }); + + spy.assert_emitted(@array![(event_contract_address, expected_event)]); + + stop_cheat_caller_address(event_contract_address); +} + +#[test] +#[should_panic(expected: "can't rsvp twice")] +fn test_rsvp_for_event_should_panic_if_repeated() { + +} + From 8278e63cb330af49e7c8e3e30006d2edf5347d67 Mon Sep 17 00:00:00 2001 From: casweeney Date: Thu, 24 Oct 2024 15:14:50 +0100 Subject: [PATCH 3/5] commented unfinished test cases --- tests/test_contract.cairo | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index 32c57dc..10b2869 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -64,31 +64,31 @@ fn test_rsvp_for_event_should_panic_on_unregistered_event() { stop_cheat_caller_address(event_contract_address); } -#[test] -fn test_rsvp_for_event_should_emit_event() { - let event_contract_address = __setup__(); +// #[test] +// fn test_rsvp_for_event_should_emit_event() { +// let event_contract_address = __setup__(); - let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; +// let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; - let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); +// let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); - start_cheat_caller_address(event_contract_address, caller); +// start_cheat_caller_address(event_contract_address, caller); - let mut spy = spy_events(); +// let mut spy = spy_events(); - let event_id: u256 = 1; - event_dispatcher.rsvp_for_event(event_id); +// let event_id: u256 = 1; +// event_dispatcher.rsvp_for_event(event_id); - let expected_event = Events::Event::RSVPForEvent(Events::RSVPForEvent { event_id: 1, attendee_address: caller }); +// let expected_event = Events::Event::RSVPForEvent(Events::RSVPForEvent { event_id: 1, attendee_address: caller }); - spy.assert_emitted(@array![(event_contract_address, expected_event)]); +// spy.assert_emitted(@array![(event_contract_address, expected_event)]); - stop_cheat_caller_address(event_contract_address); -} +// stop_cheat_caller_address(event_contract_address); +// } -#[test] -#[should_panic(expected: "can't rsvp twice")] -fn test_rsvp_for_event_should_panic_if_repeated() { +// #[test] +// #[should_panic(expected: "can't rsvp twice")] +// fn test_rsvp_for_event_should_panic_if_repeated() { -} +// } From 20c9980d4d0d40d0c716b92ee4251200a9217e6c Mon Sep 17 00:00:00 2001 From: casweeney Date: Fri, 25 Oct 2024 18:16:57 +0100 Subject: [PATCH 4/5] test case: test_should_panic_on_rsvp_for_event_that_was_unregistered() & test_rsvp_for_event_should_emit_event_on_success() --- tests/test_contract.cairo | 50 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index f2c9ee3..24518c0 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -9,10 +9,11 @@ use starknet::{ContractAddress}; use snforge_std::{ declare, start_cheat_caller_address, stop_cheat_caller_address, ContractClassTrait, - DeclareResultTrait, + DeclareResultTrait, spy_events, EventSpyAssertionsTrait, }; use chainevents_contracts::interfaces::IEvent::{IEventDispatcher, IEventDispatcherTrait}; +use chainevents_contracts::events::events::Events; const USER_ONE: felt252 = 'JOE'; @@ -62,5 +63,52 @@ fn test_register_for_event() { event_dispatcher.register_for_event(event_id); + stop_cheat_caller_address(event_contract_address); +} + +#[test] +#[should_panic(expected: 'rsvp only for registered event')] +fn test_should_panic_on_rsvp_for_event_that_was_unregistered() { + let event_contract_address = __setup__(); + + let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; + + let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); + + start_cheat_caller_address(event_contract_address, caller); + + let event_id: u256 = 1; + + event_dispatcher.rsvp_for_event(event_id); + + stop_cheat_caller_address(event_contract_address); +} + +#[test] +fn test_rsvp_for_event_should_emit_event_on_success() { + let event_contract_address = __setup__(); + + let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; + + // USER_ONE adds event + start_cheat_caller_address(event_contract_address, USER_ONE.try_into().unwrap()); + let event_id = event_dispatcher.add_event("bitcoin dev meetup", "Dan Marna road"); + assert(event_id == 1, 'Event was not created'); + stop_cheat_caller_address(event_contract_address); + + // Use a new user(caller) to register for event & rsvp for event + let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); + + start_cheat_caller_address(event_contract_address, caller); + + event_dispatcher.register_for_event(event_id); + + let mut spy = spy_events(); + + event_dispatcher.rsvp_for_event(event_id); + + let expected_event = Events::Event::RSVPForEvent(Events::RSVPForEvent { event_id: 1, attendee_address: caller }); + spy.assert_emitted(@array![(event_contract_address, expected_event)]); + stop_cheat_caller_address(event_contract_address); } \ No newline at end of file From 596b02c65372bac27c0ba51a45c24253e930d8da Mon Sep 17 00:00:00 2001 From: casweeney Date: Fri, 25 Oct 2024 18:24:28 +0100 Subject: [PATCH 5/5] test case: test_should_panic_on_rsvp_for_event_twice() done --- tests/test_contract.cairo | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/test_contract.cairo b/tests/test_contract.cairo index 24518c0..68a5b6c 100644 --- a/tests/test_contract.cairo +++ b/tests/test_contract.cairo @@ -68,7 +68,7 @@ fn test_register_for_event() { #[test] #[should_panic(expected: 'rsvp only for registered event')] -fn test_should_panic_on_rsvp_for_event_that_was_unregistered() { +fn test_should_panic_on_rsvp_for_event_that_was_not_registered_for() { let event_contract_address = __setup__(); let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; @@ -110,5 +110,34 @@ fn test_rsvp_for_event_should_emit_event_on_success() { let expected_event = Events::Event::RSVPForEvent(Events::RSVPForEvent { event_id: 1, attendee_address: caller }); spy.assert_emitted(@array![(event_contract_address, expected_event)]); + stop_cheat_caller_address(event_contract_address); +} + +#[test] +#[should_panic(expected: 'rsvp already exist')] +fn test_should_panic_on_rsvp_for_event_twice() { + let event_contract_address = __setup__(); + + let event_dispatcher = IEventDispatcher { contract_address: event_contract_address }; + + // USER_ONE adds event + start_cheat_caller_address(event_contract_address, USER_ONE.try_into().unwrap()); + let event_id = event_dispatcher.add_event("bitcoin dev meetup", "Dan Marna road"); + assert(event_id == 1, 'Event was not created'); + stop_cheat_caller_address(event_contract_address); + + // Use a new user(caller) to register for event & rsvp for event + let caller: ContractAddress = starknet::contract_address_const::<0x123626789>(); + + start_cheat_caller_address(event_contract_address, caller); + + event_dispatcher.register_for_event(event_id); + + // first rsvp for event + event_dispatcher.rsvp_for_event(event_id); + + // second rsvp for the same event: should panic + event_dispatcher.rsvp_for_event(event_id); + stop_cheat_caller_address(event_contract_address); } \ No newline at end of file