11//! Integration tests for admin-only functions reverting when called by a non-admin.
2- //!
2+ //
33//! Every function gated by `assert_is_admin` must reject a non-admin caller with
44//! `ContractError::Unauthorized` and must not mutate any contract state.
55
@@ -11,18 +11,10 @@ use soroban_sdk::{testutils::Address as _, Address, Env};
1111
1212// ── helpers ───────────────────────────────────────────────────────────────────
1313
14- /// Register a known admin into contract storage and return it.
15- fn setup_admin ( env : & Env , client : & CreatorKeysContractClient < ' _ > ) -> Address {
16- let admin = Address :: generate ( env) ;
17- client. set_protocol_admin ( & admin, & admin) ;
18- admin
19- }
20-
2114/// Full setup: contract + pricing + fees + admin. Returns (client, admin).
2215fn full_setup ( env : & Env ) -> ( CreatorKeysContractClient < ' _ > , Address ) {
2316 let ( client, _) = register_creator_keys ( env) ;
24- set_pricing_and_fees ( env, & client, 100i128 , 9000 , 1000 ) ;
25- let admin = setup_admin ( env, & client) ;
17+ let admin = set_pricing_and_fees ( env, & client, 100i128 , 9000 , 1000 ) ;
2618 ( client, admin)
2719}
2820
@@ -131,6 +123,72 @@ fn test_update_protocol_fee_recipient_no_state_change_on_non_admin_call() {
131123 ) ;
132124}
133125
126+ // ── set_fee_config ──────────────────────────────────────────────────────
127+
128+ #[ test]
129+ fn test_set_fee_config_reverts_for_non_admin ( ) {
130+ let env = test_env_with_auths ( ) ;
131+ let ( client, _admin) = full_setup ( & env) ;
132+
133+ let non_admin = Address :: generate ( & env) ;
134+ let result = client. try_set_fee_config ( & non_admin, & 8000u32 , & 2000u32 ) ;
135+ assert_eq ! ( result, Err ( Ok ( ContractError :: Unauthorized ) ) ) ;
136+ }
137+
138+ #[ test]
139+ fn test_set_fee_config_no_state_change_on_non_admin_call ( ) {
140+ let env = test_env_with_auths ( ) ;
141+ let ( client, _admin) = full_setup ( & env) ;
142+
143+ let protocol_bps_before = client. get_protocol_fee_bps ( ) ;
144+
145+ let non_admin = Address :: generate ( & env) ;
146+ let result = client. try_set_fee_config ( & non_admin, & 8000u32 , & 2000u32 ) ;
147+ assert_eq ! ( result, Err ( Ok ( ContractError :: Unauthorized ) ) ) ;
148+
149+ let protocol_bps_after = client. get_protocol_fee_bps ( ) ;
150+ assert_eq ! (
151+ protocol_bps_before, protocol_bps_after,
152+ "protocol fee bps must not change when non-admin set_fee_config call is rejected"
153+ ) ;
154+ }
155+
156+ // ── set_protocol_fee_recipient ──────────────────────────────────────────
157+
158+ #[ test]
159+ fn test_set_protocol_fee_recipient_reverts_for_non_admin ( ) {
160+ let env = test_env_with_auths ( ) ;
161+ let ( client, admin) = full_setup ( & env) ;
162+
163+ let original_recipient = Address :: generate ( & env) ;
164+ client. set_protocol_fee_recipient ( & admin, & original_recipient) ;
165+
166+ let non_admin = Address :: generate ( & env) ;
167+ let new_recipient = Address :: generate ( & env) ;
168+ let result = client. try_set_protocol_fee_recipient ( & non_admin, & new_recipient) ;
169+ assert_eq ! ( result, Err ( Ok ( ContractError :: Unauthorized ) ) ) ;
170+ }
171+
172+ #[ test]
173+ fn test_set_protocol_fee_recipient_no_state_change_on_non_admin_call ( ) {
174+ let env = test_env_with_auths ( ) ;
175+ let ( client, admin) = full_setup ( & env) ;
176+
177+ let original_recipient = Address :: generate ( & env) ;
178+ client. set_protocol_fee_recipient ( & admin, & original_recipient) ;
179+
180+ let non_admin = Address :: generate ( & env) ;
181+ let new_recipient = Address :: generate ( & env) ;
182+ let _ = client. try_set_protocol_fee_recipient ( & non_admin, & new_recipient) ;
183+
184+ let stored = client. get_protocol_fee_recipient ( ) ;
185+ assert_eq ! (
186+ stored,
187+ Some ( original_recipient) ,
188+ "fee recipient must not change when non-admin set_protocol_fee_recipient call is rejected"
189+ ) ;
190+ }
191+
134192// ── withdraw_treasury ─────────────────────────────────────────────────────────
135193
136194#[ test]
0 commit comments