Skip to content

Commit 5e19946

Browse files
committed
tests for upgrade_agnet
1 parent 287d845 commit 5e19946

File tree

2 files changed

+138
-0
lines changed

2 files changed

+138
-0
lines changed

packages/utils/src/components/roles/event_test_utils.cairo

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,50 @@ pub(crate) fn assert_upgrade_governor_added_event(
197197
}
198198
}
199199

200+
pub(crate) fn assert_upgrade_agent_added_event(
201+
spied_event: @(ContractAddress, Event),
202+
added_account: ContractAddress,
203+
added_by: ContractAddress,
204+
) {
205+
let expected_event = @MockContract::Event::RolesEvent(
206+
RolesEvent::UpgradeAgentAdded(
207+
RolesInterface::UpgradeAgentAdded { added_account, added_by },
208+
),
209+
);
210+
let (expected_emitted_by, raw_event) = spied_event;
211+
let wrapped_spied_event = Events { events: array![(*expected_emitted_by, raw_event.clone())] };
212+
let emitted = is_emitted(self: @wrapped_spied_event, :expected_emitted_by, :expected_event);
213+
if !emitted {
214+
let details = format!(
215+
"UpgradeAgentAdded{{added_account: {:?}, added_by: {:?}}}", added_account, added_by,
216+
);
217+
panic_with_event_details(:expected_emitted_by, :details);
218+
}
219+
}
220+
221+
pub(crate) fn assert_upgrade_agent_removed_event(
222+
spied_event: @(ContractAddress, Event),
223+
removed_account: ContractAddress,
224+
removed_by: ContractAddress,
225+
) {
226+
let expected_event = @MockContract::Event::RolesEvent(
227+
RolesEvent::UpgradeAgentRemoved(
228+
RolesInterface::UpgradeAgentRemoved { removed_account, removed_by },
229+
),
230+
);
231+
let (expected_emitted_by, raw_event) = spied_event;
232+
let wrapped_spied_event = Events { events: array![(*expected_emitted_by, raw_event.clone())] };
233+
let emitted = is_emitted(self: @wrapped_spied_event, :expected_emitted_by, :expected_event);
234+
if !emitted {
235+
let details = format!(
236+
"UpgradeAgentRemoved{{removed_account: {:?}, removed_by: {:?}}}",
237+
removed_account,
238+
removed_by,
239+
);
240+
panic_with_event_details(:expected_emitted_by, :details);
241+
}
242+
}
243+
200244
pub(crate) fn assert_upgrade_governor_removed_event(
201245
spied_event: @(ContractAddress, Event),
202246
removed_account: ContractAddress,

packages/utils/src/components/roles/test.cairo

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,100 @@ fn test_remove_upgrade_governor() {
210210
assert!(!roles_dispatcher.is_upgrade_governor(account: upgrade_governor));
211211
}
212212

213+
#[feature("safe_dispatcher")]
214+
#[test]
215+
fn test_register_upgrade_agent() {
216+
// Deploy mock contract.
217+
let contract_address = test_utils::deploy_mock_contract();
218+
let roles_dispatcher = IRolesDispatcher { contract_address };
219+
let roles_safe_dispatcher = IRolesSafeDispatcher { contract_address };
220+
let app_role_admin = constants::APP_ROLE_ADMIN;
221+
let upgrade_governor = constants::UPGRADE_GOVERNOR;
222+
let wrong_admin = constants::WRONG_ADMIN;
223+
224+
// Try to add zero address as upgrade governor.
225+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
226+
let result = roles_safe_dispatcher.register_upgrade_governor(account: Zero::zero());
227+
assert_panic_with_error(:result, expected_error: AccessErrors::ZERO_ADDRESS.describe());
228+
229+
// Try to add upgrade governor with unqualified caller.
230+
cheat_caller_address_once(:contract_address, caller_address: wrong_admin);
231+
let result = roles_safe_dispatcher.register_upgrade_governor(account: upgrade_governor);
232+
assert_panic_with_felt_error(:result, expected_error: OZAccessErrors::MISSING_ROLE);
233+
234+
// Register upgrade governor and perform the corresponding checks.
235+
let mut spy = snforge_std::spy_events();
236+
assert!(!roles_dispatcher.is_upgrade_governor(account: upgrade_governor));
237+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
238+
roles_dispatcher.register_upgrade_governor(account: upgrade_governor);
239+
240+
let events = spy.get_events().emitted_by(:contract_address).events;
241+
// We only check events[1] because events[0] is an event emitted by OZ AccessControl.
242+
assert_number_of_events(
243+
actual: events.len(), expected: 2, message: "test_register_upgrade_governor first",
244+
);
245+
event_test_utils::assert_upgrade_governor_added_event(
246+
events[1], added_account: upgrade_governor, added_by: app_role_admin,
247+
);
248+
assert!(roles_dispatcher.is_upgrade_governor(account: upgrade_governor));
249+
250+
// Register upgrade governor that is already registered (should not emit events).
251+
let mut spy = snforge_std::spy_events();
252+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
253+
roles_dispatcher.register_upgrade_governor(account: upgrade_governor);
254+
let events = spy.get_events().emitted_by(:contract_address).events;
255+
assert_number_of_events(
256+
actual: events.len(), expected: 0, message: "test_register_upgrade_governor second",
257+
);
258+
}
259+
260+
261+
#[feature("safe_dispatcher")]
262+
#[test]
263+
fn test_remove_upgrade_agent() {
264+
// Deploy mock contract.
265+
let contract_address = test_utils::deploy_mock_contract();
266+
let roles_dispatcher = IRolesDispatcher { contract_address };
267+
let roles_safe_dispatcher = IRolesSafeDispatcher { contract_address };
268+
let app_role_admin = constants::APP_ROLE_ADMIN;
269+
let upgrade_agent = constants::UPGRADE_AGENT;
270+
let wrong_admin = constants::WRONG_ADMIN;
271+
272+
// Remove upgrade governor that was not registered (should not emit events).
273+
assert!(!roles_dispatcher.is_upgrade_agent(account: upgrade_agent));
274+
let mut spy = snforge_std::spy_events();
275+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
276+
roles_dispatcher.remove_upgrade_agent(account: upgrade_agent);
277+
let events = spy.get_events().emitted_by(:contract_address).events;
278+
assert_number_of_events(
279+
actual: events.len(), expected: 0, message: "test_remove_upgrade_agent first",
280+
);
281+
282+
// Register upgrade governor.
283+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
284+
roles_dispatcher.register_upgrade_agent(account: upgrade_agent);
285+
286+
// Try to remove upgrade governor with unqualified caller.
287+
cheat_caller_address_once(:contract_address, caller_address: wrong_admin);
288+
let result = roles_safe_dispatcher.remove_upgrade_agent(account: upgrade_agent);
289+
assert_panic_with_felt_error(:result, expected_error: OZAccessErrors::MISSING_ROLE);
290+
291+
// Remove upgrade governor and perform the corresponding checks.
292+
assert!(roles_dispatcher.is_upgrade_agent(account: upgrade_agent));
293+
let mut spy = snforge_std::spy_events();
294+
cheat_caller_address_once(:contract_address, caller_address: app_role_admin);
295+
roles_dispatcher.remove_upgrade_agent(account: upgrade_agent);
296+
let events = spy.get_events().emitted_by(:contract_address).events;
297+
// We only check events[1] because events[0] is an event emitted by OZ AccessControl.
298+
assert_number_of_events(
299+
actual: events.len(), expected: 2, message: "test_remove_upgrade_agent second",
300+
);
301+
event_test_utils::assert_upgrade_agent_removed_event(
302+
events[1], removed_account: upgrade_agent, removed_by: app_role_admin,
303+
);
304+
assert!(!roles_dispatcher.is_upgrade_agent(account: upgrade_agent));
305+
}
306+
213307

214308
#[test]
215309
#[feature("safe_dispatcher")]

0 commit comments

Comments
 (0)