Skip to content

Commit 3217f12

Browse files
authored
Merge pull request #41 from Samuel1-ona/main
Added Test core test cases
2 parents 3925777 + 7407b87 commit 3217f12

File tree

3 files changed

+187
-49
lines changed

3 files changed

+187
-49
lines changed

Scarb.toml

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ sierra = true
1919
[scripts]
2020
test = "snforge test"
2121

22+
23+
[profile.dev.cairo]
24+
unstable-add-statements-code-locations-debug-info = true
25+
unstable-add-statements-functions-debug-info = true
26+
27+
28+
2229
# Visit https://foundry-rs.github.io/starknet-foundry/appendix/scarb-toml.html for more information
2330

2431
# [tool.snforge] # Define `snforge` tool section

src/weaver.cairo

+60-36
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::starknet::ContractAddress;
22

33
#[starknet::contract]
4-
mod Weaver {
4+
pub mod Weaver {
55
// *************************************************************************
66
// IMPORT
77
// *************************************************************************
@@ -44,11 +44,12 @@ mod Weaver {
4444
// EVENTS
4545
// *************************************************************************
4646
#[event]
47-
#[derive(Copy, Drop, Debug, PartialEq, starknet::Event)]
47+
#[derive(Copy, Drop, starknet::Event)]
4848
pub enum Event {
4949
Upgraded: Upgraded,
5050
UserRegistered: UserRegistered,
5151
ProtocolRegistered: ProtocolRegistered,
52+
TaskMinted: TaskMinted,
5253
}
5354

5455

@@ -68,6 +69,13 @@ mod Weaver {
6869
}
6970

7071

72+
#[derive(Copy, Drop, Debug, PartialEq, starknet::Event)]
73+
pub struct TaskMinted {
74+
pub task_id: u256,
75+
pub user: ContractAddress,
76+
}
77+
78+
7179
#[constructor]
7280
fn constructor(
7381
ref self: ContractState, owner: ContractAddress, weavernft_address: ContractAddress,
@@ -95,36 +103,7 @@ mod Weaver {
95103
self.emit(Event::UserRegistered(UserRegistered { user: get_caller_address() }));
96104
}
97105

98-
fn set_erc721(ref self: ContractState, address: ContractAddress) {
99-
assert(get_caller_address() == self.owner.read(), 'UNAUTHORIZED');
100-
assert(address.is_non_zero(), 'INVALID_ADDRESS');
101-
self.weaver_nft_address.write(address);
102-
}
103-
104-
fn get_register_user(self: @ContractState, address: ContractAddress) -> User {
105-
return self.users.read(address);
106-
}
107-
108-
fn version(self: @ContractState) -> u16 {
109-
return self.version.read();
110-
}
111-
112-
fn upgrade(ref self: ContractState, Imp_hash: ClassHash) {
113-
assert(Imp_hash.is_non_zero(), 'Clash Hasd Cannot be Zero');
114-
assert(get_caller_address() == self.owner.read(), 'UNAUTHORIZED');
115-
starknet::syscalls::replace_class_syscall(Imp_hash).unwrap_syscall();
116-
self.version.write(self.version.read() + 1);
117-
self.emit(Event::Upgraded(Upgraded { implementation: Imp_hash }));
118-
}
119-
120-
fn owner(self: @ContractState) -> ContractAddress {
121-
return self.owner.read();
122-
}
123-
124-
fn erc_721(self: @ContractState) -> ContractAddress {
125-
return self.weaver_nft_address.read();
126-
}
127-
106+
128107
fn mint(ref self: ContractState, task_id: u256) {
129108
let caller = get_caller_address();
130109

@@ -144,12 +123,10 @@ mod Weaver {
144123

145124
// Mint NFT to user
146125
weavernft_dispatcher.mint_weaver_nft(caller);
126+
self.emit(Event::TaskMinted(TaskMinted { task_id, user: caller }));
147127
}
148128

149-
fn get_task_info(self: @ContractState, task_id: u256) -> TaskInfo {
150-
self.task_registry.read(task_id)
151-
}
152-
129+
153130

154131
fn protocol_register(ref self: ContractState, protocol_name: ByteArray) {
155132
assert(protocol_name.len() > 0, 'INVALID_PROTOCOL_NAME');
@@ -166,9 +143,56 @@ mod Weaver {
166143
self.emit(Event::ProtocolRegistered(ProtocolRegistered { user: get_caller_address() }));
167144
}
168145

146+
147+
148+
149+
// Getter functions
150+
151+
fn owner(self: @ContractState) -> ContractAddress {
152+
return self.owner.read();
153+
}
154+
155+
fn erc_721(self: @ContractState) -> ContractAddress {
156+
return self.weaver_nft_address.read();
157+
}
158+
159+
fn get_register_user(self: @ContractState, address: ContractAddress) -> User {
160+
return self.users.read(address);
161+
}
162+
163+
fn get_task_info(self: @ContractState, task_id: u256) -> TaskInfo {
164+
self.task_registry.read(task_id)
165+
}
166+
169167
fn get_registered_protocols(self: @ContractState, address: ContractAddress) -> ProtocolInfo {
170168
self.protocol_registrations.read(address)
171169
}
172170

171+
172+
173+
//Utility functions
174+
175+
fn version(self: @ContractState) -> u16 {
176+
return self.version.read();
177+
}
178+
179+
fn upgrade(ref self: ContractState, Imp_hash: ClassHash) {
180+
assert(Imp_hash.is_non_zero(), 'Clash Hasd Cannot be Zero');
181+
assert(get_caller_address() == self.owner.read(), 'UNAUTHORIZED');
182+
starknet::syscalls::replace_class_syscall(Imp_hash).unwrap_syscall();
183+
self.version.write(self.version.read() + 1);
184+
self.emit(Event::Upgraded(Upgraded { implementation: Imp_hash }));
185+
}
186+
187+
188+
fn set_erc721(ref self: ContractState, address: ContractAddress) {
189+
assert(get_caller_address() == self.owner.read(), 'UNAUTHORIZED');
190+
assert(address.is_non_zero(), 'INVALID_ADDRESS');
191+
self.weaver_nft_address.write(address);
192+
}
193+
194+
195+
196+
173197
}
174198
}

tests/test_weaver_contract.cairo

+120-13
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
use core::option::OptionTrait;
2-
use core::starknet::SyscallResultTrait;
3-
use starknet::testing::set_block_timestamp;
42
use core::result::ResultTrait;
5-
use core::traits::{TryInto, Into};
3+
use core::traits::{TryInto};
64
use core::byte_array::ByteArray;
75

86
use snforge_std::{
97
declare, start_cheat_caller_address, stop_cheat_caller_address, ContractClassTrait,
108
DeclareResultTrait, spy_events, EventSpyAssertionsTrait, get_class_hash
119
};
1210

13-
use openzeppelin::{token::erc721::interface::{ERC721ABIDispatcher, ERC721ABIDispatcherTrait}};
14-
15-
use starknet::{ContractAddress, ClassHash, get_block_timestamp};
11+
use starknet::{ContractAddress, get_block_timestamp};
1612

1713
use weaver_contract::interfaces::IWeaverNFT::{IWeaverNFTDispatcher, IWeaverNFTDispatcherTrait};
1814
use weaver_contract::interfaces::IWeaver::{IWeaverDispatcher, IWeaverDispatcherTrait, User};
15+
use weaver_contract::weaver::Weaver::{Event};
16+
use weaver_contract::weaver::Weaver::{UserRegistered , ProtocolRegistered , TaskMinted};
17+
18+
1919

2020
const ADMIN: felt252 = 'ADMIN';
2121

@@ -78,6 +78,30 @@ fn test_register_user() {
7878
}
7979

8080

81+
#[test]
82+
fn test_register_user_emit_event() {
83+
let (weaver_contract_address, _) = __setup__();
84+
let weaver_contract = IWeaverDispatcher { contract_address: weaver_contract_address };
85+
86+
let mut spy = spy_events();
87+
88+
let user: ContractAddress = USER();
89+
start_cheat_caller_address(weaver_contract_address, user);
90+
91+
let details: ByteArray = "Test User";
92+
weaver_contract.register_User(details);
93+
94+
let is_registered = weaver_contract.get_register_user(user);
95+
assert!(is_registered.Details == "Test User", "User should be registered");
96+
97+
let expected_event = Event::UserRegistered(UserRegistered{user: user});
98+
spy.assert_emitted(@array![(weaver_contract_address, expected_event)]);
99+
100+
stop_cheat_caller_address(weaver_contract_address);
101+
}
102+
103+
104+
81105
#[test]
82106
#[should_panic(expected: 'user already registered')]
83107
fn test_already_registered_should_panic() {
@@ -133,6 +157,32 @@ fn test_protocol_register() {
133157
stop_cheat_caller_address(weaver_contract_address);
134158
}
135159

160+
161+
#[test]
162+
fn test_protocol_register_emit_event() {
163+
let (weaver_contract_address, nft_address) = __setup__();
164+
let weaver_contract = IWeaverDispatcher { contract_address: weaver_contract_address };
165+
166+
let user: ContractAddress = USER();
167+
let mut spy = spy_events();
168+
start_cheat_caller_address(weaver_contract_address, user);
169+
170+
let protocol_name: ByteArray = "Weaver Protocol";
171+
weaver_contract.protocol_register(protocol_name);
172+
173+
let protocol_info = weaver_contract.get_registered_protocols(user);
174+
assert!(protocol_info.protocol_name == "Weaver Protocol", "Protocol should be registered");
175+
176+
let expected_event = Event::ProtocolRegistered(ProtocolRegistered{user: user});
177+
spy.assert_emitted(@array![(weaver_contract_address, expected_event)]);
178+
179+
stop_cheat_caller_address(weaver_contract_address);
180+
}
181+
182+
183+
184+
185+
136186
#[test]
137187
fn test_nft_minted_on_protocol_register() {
138188
let (weaver_contract_address, nft_address) = __setup__();
@@ -215,6 +265,8 @@ fn test_mint_nft_duplicate_id_should_panic() {
215265
assert!(minted_token_id > 0, "First NFT mint failed!");
216266

217267
weaver_contract.mint(task_id);
268+
269+
stop_cheat_caller_address(weaver_contract_address);
218270
}
219271

220272
#[test]
@@ -223,6 +275,8 @@ fn test_mint_nft() {
223275

224276
let weaver_contract = IWeaverDispatcher { contract_address: weaver_contract_address };
225277
let nft_dispatcher = IWeaverNFTDispatcher { contract_address: nft_address };
278+
279+
let mut spy = spy_events();
226280
let user: ContractAddress = USER();
227281

228282
start_cheat_caller_address(weaver_contract_address, user);
@@ -233,12 +287,6 @@ fn test_mint_nft() {
233287
let is_registered = weaver_contract.get_register_user(user);
234288
assert!(is_registered.Details == "Test User", "User should be registered");
235289

236-
let protocol_name: ByteArray = "Weaver Protocol";
237-
weaver_contract.protocol_register(protocol_name);
238-
239-
let protocol_info = weaver_contract.get_registered_protocols(user);
240-
assert!(protocol_info.protocol_name == "Weaver Protocol", "Protocol should be registered");
241-
242290
let task_id = 2;
243291

244292
let mut task_info = weaver_contract.get_task_info(task_id);
@@ -252,6 +300,11 @@ fn test_mint_nft() {
252300
let minted_token_id = nft_dispatcher.get_user_token_id(user);
253301

254302
assert!(minted_token_id > 0, "NFT NOT Minted!");
303+
304+
let expected_event = Event::TaskMinted(TaskMinted{ task_id:task_id, user: user });
305+
spy.assert_emitted(@array![(weaver_contract_address, expected_event)]);
306+
307+
stop_cheat_caller_address(weaver_contract_address);
255308
}
256309

257310
#[test]
@@ -280,6 +333,8 @@ fn test_mint_nft_task_not_completed_should_panic() {
280333
weaver_contract.mint(task_id);
281334

282335
println!("Mint function did not panic!");
336+
337+
stop_cheat_caller_address(weaver_contract_address);
283338
}
284339

285340
#[test]
@@ -370,4 +425,56 @@ fn test_mint_task_already_exists() {
370425
stop_cheat_caller_address(weaver_contract_address);
371426
}
372427

373-
// This is a comment
428+
429+
#[test]
430+
fn test_nft_was_minted_after_user_registers(){
431+
let (weaver_contract_address, nft_address) = __setup__();
432+
let weaver_contract = IWeaverDispatcher { contract_address: weaver_contract_address };
433+
let nft_dispatcher = IWeaverNFTDispatcher { contract_address: nft_address };
434+
435+
let user: ContractAddress = USER();
436+
start_cheat_caller_address(weaver_contract_address, user);
437+
438+
let details: ByteArray = "Test User";
439+
weaver_contract.register_User(details);
440+
441+
let minted_token_id = nft_dispatcher.get_user_token_id(user);
442+
assert!(minted_token_id > 0, "NFT NOT Minted!");
443+
444+
let last_minted_id = nft_dispatcher.get_last_minted_id();
445+
assert_eq!(minted_token_id, last_minted_id, "Minted token ID should match the last minted ID");
446+
447+
let mint_timestamp = nft_dispatcher.get_token_mint_timestamp(minted_token_id);
448+
let current_block_timestamp = get_block_timestamp();
449+
assert_eq!(mint_timestamp, current_block_timestamp, "Mint timestamp not matched");
450+
451+
stop_cheat_caller_address(weaver_contract_address);
452+
453+
}
454+
455+
456+
#[test]
457+
fn test_nft_was_minted_after_protocol_registers(){
458+
let (weaver_contract_address, nft_address) = __setup__();
459+
let weaver_contract = IWeaverDispatcher { contract_address: weaver_contract_address };
460+
let nft_dispatcher = IWeaverNFTDispatcher { contract_address: nft_address };
461+
462+
let user: ContractAddress = USER();
463+
start_cheat_caller_address(weaver_contract_address, user);
464+
465+
let protocol_name: ByteArray = "Weaver Protocol";
466+
weaver_contract.protocol_register(protocol_name);
467+
468+
let minted_token_id = nft_dispatcher.get_user_token_id(user);
469+
assert!(minted_token_id > 0, "NFT NOT Minted!");
470+
471+
let last_minted_id = nft_dispatcher.get_last_minted_id();
472+
assert_eq!(minted_token_id, last_minted_id, "Minted token ID should match the last minted ID");
473+
474+
let mint_timestamp = nft_dispatcher.get_token_mint_timestamp(minted_token_id);
475+
let current_block_timestamp = get_block_timestamp();
476+
assert_eq!(mint_timestamp, current_block_timestamp, "Mint timestamp not matched");
477+
478+
stop_cheat_caller_address(weaver_contract_address);
479+
480+
}

0 commit comments

Comments
 (0)