@@ -125,3 +125,113 @@ fn test_unauthorized_assignment() {
125125 let result = client. try_assign_role ( & non_admin, & user, & Role :: Operator ) ;
126126 assert_eq ! ( result, Err ( Ok ( Error :: Unauthorized ) ) ) ;
127127}
128+ #[ test]
129+ fn test_is_admin ( ) {
130+ let env = Env :: default ( ) ;
131+ env. mock_all_auths ( ) ;
132+
133+ let contract_id = env. register ( AccessControl , ( ) ) ;
134+ let client = AccessControlClient :: new ( & env, & contract_id) ;
135+
136+ let admin = Address :: generate ( & env) ;
137+ let non_admin = Address :: generate ( & env) ;
138+
139+ client. init ( & admin) ;
140+
141+ // Check that admin is recognized as admin
142+ assert ! ( client. is_admin( & admin) ) ;
143+
144+ // Check that non-admin is not admin
145+ assert ! ( !client. is_admin( & non_admin) ) ;
146+ }
147+
148+ #[ test]
149+ fn test_revoke_all_roles ( ) {
150+ let env = Env :: default ( ) ;
151+ env. mock_all_auths ( ) ;
152+
153+ let contract_id = env. register ( AccessControl , ( ) ) ;
154+ let client = AccessControlClient :: new ( & env, & contract_id) ;
155+
156+ let admin = Address :: generate ( & env) ;
157+ let user = Address :: generate ( & env) ;
158+
159+ client. init ( & admin) ;
160+
161+ // Assign multiple roles to user
162+ client. assign_role ( & admin, & user, & Role :: Operator ) ;
163+ client. assign_role ( & admin, & user, & Role :: Moderator ) ;
164+
165+ assert ! ( client. has_role( & user, & Role :: Operator ) ) ;
166+ assert ! ( client. has_role( & user, & Role :: Moderator ) ) ;
167+
168+ // Revoke all roles at once
169+ client. revoke_all_roles ( & admin, & user) ;
170+
171+ // Verify all roles are removed
172+ assert ! ( !client. has_role( & user, & Role :: Operator ) ) ;
173+ assert ! ( !client. has_role( & user, & Role :: Moderator ) ) ;
174+ assert ! ( !client. has_role( & user, & Role :: Admin ) ) ;
175+ }
176+
177+ #[ test]
178+ fn test_revoke_all_roles_unauthorized ( ) {
179+ let env = Env :: default ( ) ;
180+ env. mock_all_auths ( ) ;
181+
182+ let contract_id = env. register ( AccessControl , ( ) ) ;
183+ let client = AccessControlClient :: new ( & env, & contract_id) ;
184+
185+ let admin = Address :: generate ( & env) ;
186+ let non_admin = Address :: generate ( & env) ;
187+ let user = Address :: generate ( & env) ;
188+
189+ client. init ( & admin) ;
190+ client. assign_role ( & admin, & user, & Role :: Operator ) ;
191+
192+ // Non-admin tries to revoke all roles
193+ let result = client. try_revoke_all_roles ( & non_admin, & user) ;
194+ assert_eq ! ( result, Err ( Ok ( Error :: Unauthorized ) ) ) ;
195+ }
196+
197+ #[ test]
198+ fn test_has_any_role ( ) {
199+ let env = Env :: default ( ) ;
200+ env. mock_all_auths ( ) ;
201+
202+ let contract_id = env. register ( AccessControl , ( ) ) ;
203+ let client = AccessControlClient :: new ( & env, & contract_id) ;
204+
205+ let admin = Address :: generate ( & env) ;
206+ let user = Address :: generate ( & env) ;
207+
208+ client. init ( & admin) ;
209+
210+ // User has no roles yet
211+ let mut empty_roles = soroban_sdk:: Vec :: new ( & env) ;
212+ empty_roles. push_back ( Role :: Operator ) ;
213+ empty_roles. push_back ( Role :: Moderator ) ;
214+ assert ! ( !client. has_any_role( & user, & empty_roles) ) ;
215+
216+ // Assign Operator role to user
217+ client. assign_role ( & admin, & user, & Role :: Operator ) ;
218+
219+ // Now user should have any role (Operator is in the list)
220+ assert ! ( client. has_any_role( & user, & empty_roles) ) ;
221+
222+ // Create a list with roles user doesn't have
223+ let mut other_roles = soroban_sdk:: Vec :: new ( & env) ;
224+ other_roles. push_back ( Role :: Admin ) ;
225+ other_roles. push_back ( Role :: Moderator ) ;
226+
227+ // User still has Operator (not in this list), so should return false
228+ assert ! ( !client. has_any_role( & user, & other_roles) ) ;
229+
230+ // Add Admin to the list - still false because user is not admin
231+ let mut mixed_roles = soroban_sdk:: Vec :: new ( & env) ;
232+ mixed_roles. push_back ( Role :: Operator ) ;
233+ mixed_roles. push_back ( Role :: Admin ) ;
234+
235+ // Now should be true because user has Operator
236+ assert ! ( client. has_any_role( & user, & mixed_roles) ) ;
237+ }
0 commit comments