loadInc(); // Ensure target roles exist Database::exec('INSERT INTO role (roleid, rolename) VALUES (:id, :n)', ['id' => 10, 'n' => 'R10']); Database::exec('INSERT INTO role (roleid, rolename) VALUES (:id, :n)', ['id' => 11, 'n' => 'R11']); // add PermissionDbUpdate::addRoleToUser([1,2], [10]); $rows = Database::queryAll('SELECT * FROM role_x_user WHERE roleid = :r ORDER BY userid, roleid', ['r' => 10]); $this->assertSame([[ 'userid' => 1, 'roleid' => 10 ], [ 'userid' => 2, 'roleid' => 10 ]], $rows); // remove PermissionDbUpdate::removeRoleFromUser([1,2], [10,11]); $rows2 = Database::queryAll('SELECT * FROM role_x_user WHERE roleid IN (:r)', ['r' => [10,11]]); $this->assertCount(0, $rows2); } public function testSetRolesForUserDeletesThenAdds(): void { $this->loadInc(); Database::exec('INSERT INTO role (roleid, rolename) VALUES (:id, :n)', ['id' => 10, 'n' => 'R10']); Database::exec('INSERT INTO role (roleid, rolename) VALUES (:id, :n)', ['id' => 11, 'n' => 'R11']); // Prepopulate with an extra role to be removed Database::exec('INSERT INTO role_x_user (userid, roleid) VALUES (5, 12)'); PermissionDbUpdate::setRolesForUser([5], [10, 11]); $rows = Database::queryAll('SELECT roleid FROM role_x_user WHERE userid = 5 ORDER BY roleid'); $this->assertSame([[ 'roleid' => 10 ], [ 'roleid' => 11 ]], $rows); } public function testSaveRoleUpdateAndInsertPaths(): void { $this->loadInc(); // Create existing role 42 with some mappings Database::exec('INSERT INTO role (roleid, rolename, roledescription) VALUES (:id, :n, :d)', ['id' => 42, 'n' => 'Old', 'd' => 'old']); Database::exec('INSERT INTO role_x_location (roleid, locationid) VALUES (:r, :l)', ['r' => 42, 'l' => 1]); Database::exec('INSERT INTO role_x_permission (roleid, permissionid) VALUES (:r, :p)', ['r' => 42, 'p' => 'permissionmanager.users.view']); // Update existing role PermissionDbUpdate::saveRole('Editors', 'desc', [0, 5], ['permissionmanager.roles.edit'], 42); $row = Database::queryFirst('SELECT rolename, roledescription FROM role WHERE roleid = 42'); $this->assertSame('Editors', $row['rolename']); $this->assertSame('desc', $row['roledescription']); $locs = Database::queryAll('SELECT locationid FROM role_x_location WHERE roleid = 42 ORDER BY locationid'); $this->assertSame([[ 'locationid' => 0 ], [ 'locationid' => 5 ]], $locs); $perms = Database::queryAll('SELECT permissionid FROM role_x_permission WHERE roleid = 42'); $this->assertSame([[ 'permissionid' => 'permissionmanager.roles.edit' ]], $perms); // Insert new role with mappings $this->loadInc(); PermissionDbUpdate::saveRole('New Role', 'desc2', [1], ['permissionmanager.users.view']); // Fetch the last inserted role $role = Database::queryFirst('SELECT roleid, rolename, roledescription FROM role WHERE rolename = :n', ['n' => 'New Role']); $this->assertNotFalse($role); $rid = (int)$role['roleid']; $this->assertGreaterThan(0, $rid); $this->assertSame('desc2', $role['roledescription']); $locs2 = Database::queryAll('SELECT locationid FROM role_x_location WHERE roleid = :r', ['r' => $rid]); $this->assertSame([[ 'locationid' => 1 ]], $locs2); $perms2 = Database::queryAll('SELECT permissionid FROM role_x_permission WHERE roleid = :r', ['r' => $rid]); $this->assertSame([[ 'permissionid' => 'permissionmanager.users.view' ]], $perms2); } public function testDeleteRole(): void { $this->loadInc(); Database::exec('INSERT INTO role (roleid, rolename) VALUES (:id, :n)', ['id' => 77, 'n' => 'Tmp']); PermissionDbUpdate::deleteRole(77); $row = Database::queryFirst('SELECT * FROM role WHERE roleid = 77'); $this->assertFalse($row); } }