@@ -279,3 +279,80 @@ fun test_create_multiple_trails() {
279279
280280 ts::end (scenario);
281281}
282+
283+ /// Test creating a MetaDataAdmin role with metadata_admin_permissions.
284+ ///
285+ /// This test verifies that:
286+ /// 1. A creator can create an AuditTrail and receive an admin capability
287+ /// 2. The admin capability can be transferred to another user
288+ /// 3. The user can use the capability to create a new MetaDataAdmin role
289+ /// 4. The new role has the correct permissions (meta_data_update and meta_data_delete)
290+ #[test]
291+ fun test_create_metadata_admin_role () {
292+ let creator = @0xA ;
293+ let user = @0xB ;
294+ let mut scenario = ts::begin (creator);
295+
296+ // Creator creates the audit trail
297+ {
298+ let mut clock = clock::create_for_testing (ts::ctx (&mut scenario));
299+ clock.set_for_testing (1000 );
300+
301+ let locking_config = locking::new (std::option ::none (), std::option ::some (0 ));
302+ let trail_metadata = main::new_trail_metadata (
303+ std::option ::some (string::utf8 (b"Test Trail for MetaDataAdmin ")),
304+ std::option ::some (string::utf8 (b"Testing metadata admin role creation ")),
305+ );
306+
307+ let (admin_cap, trail_id) = main::create <TestData >(
308+ std::option ::none (),
309+ std::option ::none (),
310+ locking_config,
311+ trail_metadata,
312+ std::option ::some (string::utf8 (b"Initial metadata ")),
313+ &clock,
314+ ts::ctx (&mut scenario),
315+ );
316+
317+ // Verify admin capability was created
318+ assert ! (admin_cap.role () == initial_admin_role_name (), 0 );
319+ assert ! (admin_cap.trail_id () == trail_id, 1 );
320+
321+ // Transfer the admin capability to the user
322+ transfer::public_transfer (admin_cap, user);
323+
324+ clock::destroy_for_testing (clock);
325+ };
326+
327+ // User receives the capability and creates the MetaDataAdmin role
328+ ts::next_tx (&mut scenario, user);
329+ {
330+ let admin_cap = ts::take_from_sender <Capability >(&scenario);
331+ let mut trail = ts::take_shared <AuditTrail <TestData >>(&scenario);
332+
333+ // Create the MetaDataAdmin role using the admin capability
334+ let metadata_admin_role_name = string::utf8 (b"MetaDataAdmin ");
335+ let metadata_admin_perms = audit_trail::permission ::metadata_admin_permissions ();
336+
337+ trail.create_role (
338+ &admin_cap,
339+ metadata_admin_role_name,
340+ metadata_admin_perms,
341+ ts::ctx (&mut scenario),
342+ );
343+
344+ // Verify the role was created by fetching its permissions
345+ let role_perms = trail.get_role_permissions (&string::utf8 (b"MetaDataAdmin "));
346+
347+ // Verify the role has the correct permissions
348+ assert ! (audit_trail::permission ::has_permission (role_perms, &audit_trail::permission ::meta_data_update ()), 2 );
349+ assert ! (audit_trail::permission ::has_permission (role_perms, &audit_trail::permission ::meta_data_delete ()), 3 );
350+ assert ! (iota::vec_set ::size (role_perms) == 2 , 4 );
351+
352+ // Clean up
353+ ts::return_to_sender (&scenario, admin_cap);
354+ ts::return_shared (trail);
355+ };
356+
357+ ts::end (scenario);
358+ }
0 commit comments