bug6239: fix roles rows removal bug

This commit is contained in:
masha.kashirina
2026-05-19 18:08:08 +02:00
parent 5761bfe6d9
commit 236506a239
5 changed files with 51 additions and 37 deletions
@@ -33,6 +33,8 @@ public class UserGroupRoleDefinitionPanelPO extends PageArea {
private static final String TABLE_ROLE_NAME_COLUMN = "Role Name";
@FindBy(how = BySeleniumId.class, using = "AddGroupUserButton")
private WebElement addRoleButton;
@FindBy(how = BySeleniumId.class, using = "RemoveRoleButton")
private WebElement removeRoleButton;
@FindBy(how = BySeleniumId.class, using = "RoleSuggestion")
private WebElement roleNameInput;
@FindBy(how = BySeleniumId.class, using = "GroupRoleDefinitionDTOTable")
@@ -85,9 +87,14 @@ public class UserGroupRoleDefinitionPanelPO extends PageArea {
}
public void removeRole(String name) {
final RoleEntryPO findRole = findRole(name);
findRole.deleteRole();
waitForAlertContainingMessageAndAccept("Do you really want to remove role");
final RoleEntryPO role = findRole(name);
role.select();
removeRoleButton.click();
waitForAlertContainingMessageAndAccept("The following element(s) will be removed");
}
public void removeRoleViaActionButton(String name) {
findRole(name).deleteRole();
}
public void removeRoleAndExpectPermissionError(String name) {
@@ -87,6 +87,19 @@ public class TestUserGroupCreation extends AbstractSeleniumTest {
@SeleniumTestCase
public void testRoleRemoval() {
final UserGroupManagementPanelPO userGroupManagementPanel = goToUserGroupDefinitionsPanel();
createGroup(userGroupManagementPanel);
userGroupManagementPanel.selectGroup(TEST_GROUP_NAME);
final UserGroupRoleDefinitionPanelPO userRolesPO = userGroupManagementPanel.getUserGroupRoles();
createRole(userRolesPO);
userGroupManagementPanel.selectGroup(TEST_GROUP_NAME);
userRolesPO.removeRoleViaActionButton(TEST_ROLE);
userGroupManagementPanel.selectGroup(TEST_GROUP_NAME);
assertNull(userRolesPO.findRole(TEST_ROLE));
}
@SeleniumTestCase
public void testRoleRemovalViaGlobalRemoveButton() {
final UserGroupManagementPanelPO userGroupManagementPanel = goToUserGroupDefinitionsPanel();
createGroup(userGroupManagementPanel);
userGroupManagementPanel.selectGroup(TEST_GROUP_NAME);
@@ -1,6 +1,5 @@
package com.sap.sse.gwt.client.celltable;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.view.client.ListDataProvider;
@@ -142,12 +141,8 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModelWithSe
// Deselect items that are no longer present in newObjects (e.g. because they were deleted).
// newObjects comes from getAllListDataProvider() (the unfiltered list), so absence here means
// true deletion, not just a filter hiding the item.
// Snapshot first to avoid ConcurrentModificationException while calling super.setSelected below.
final List<T> selectedSnapshot = new ArrayList<>();
for (final T s : getSelectedElements()) {
selectedSnapshot.add(s);
}
for (final T selected : selectedSnapshot) {
// getSelectedElements() already returns a snapshot copy, so no additional copy is needed here.
for (final T selected : getSelectedElements()) {
boolean foundInNew = false;
for (final T candidate : newObjects) {
if (comp != null ? comp.representSameEntity(selected, candidate) : selected.equals(candidate)) {
@@ -20,8 +20,10 @@ import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.dto.StrippedRoleDefinitionDTO;
@@ -124,33 +126,33 @@ public class GroupRoleDefinitionPanel extends Composite
});
addButton.ensureDebugId("AddGroupUserButton");
// Removing a role from a group is semantically an UPDATE to the UserGroup, not a per-role DELETE.
buttonPanel.addCountingActionWithParentPermission(stringMessages.removeRole(),
final Button removeButton = buttonPanel.addCountingActionWithParentPermission(stringMessages.removeRole(),
roleDefinitionTableWrapper.getSelectionModel(),
() -> (SecuredDTO) TableWrapper.getSingleSelectedObjectOrNull(userGroupSelectionModel), UPDATE, () -> {
final Pair<StrippedRoleDefinitionDTO, Boolean> selectedRole = TableWrapper.getSingleSelectedObjectOrNull(roleDefinitionTableWrapper.getSelectionModel());
if (selectedRole == null) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
} else if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(selectedRole.getA().getName()))) {
UserGroupDTO selectedObject = TableWrapper.getSingleSelectedObjectOrNull(userGroupSelectionModel);
if (selectedObject != null) {
userManagementService.removeRoleDefinitionFromUserGroup(selectedObject.getId().toString(),
selectedRole.getA().getId().toString(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotDeleteRole(selectedRole.getA().getName()));
}
final UserGroupDTO selectedObject = TableWrapper.getSingleSelectedObjectOrNull(userGroupSelectionModel);
if (selectedObject != null) {
final RefreshableMultiSelectionModel<Pair<StrippedRoleDefinitionDTO, Boolean>> rolesSelectionModel = roleDefinitionTableWrapper.getSelectionModel();
final String roleNames = Util.joinStrings("\n", Util.mapToArrayList(rolesSelectionModel.getSelectedElements(), pair -> pair.getA().getName()));
if (Window.confirm(stringMessages.doYouReallyWantToRemoveSelectedElements(roleNames))) {
for (final Pair<StrippedRoleDefinitionDTO, Boolean> selectedRole : rolesSelectionModel.getSelectedElements()) {
userManagementService.removeRoleDefinitionFromUserGroup(selectedObject.getId().toString(),
selectedRole.getA().getId().toString(), new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotDeleteRole(selectedRole.getA().getName()));
}
@Override
public void onSuccess(Void result) {
selectedObject.remove(selectedRole.getA());
updateUserGroups();
}
});
} else {
Window.alert(stringMessages.pleaseSelect());
@Override
public void onSuccess(Void result) {
selectedObject.remove(selectedRole.getA());
updateUserGroups();
}
});
}
}
}
});
removeButton.ensureDebugId("RemoveRoleButton");
buttonPanel.insertWidgetAtPosition(suggestRole, 0);
return buttonPanel;
}
@@ -3,7 +3,6 @@ package com.sap.sse.security.ui.client.component.usergroup.users;
import static com.sap.sse.security.shared.HasPermissions.DefaultActions.UPDATE;
import static com.sap.sse.security.shared.impl.SecuredSecurityTypes.USER_GROUP;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -23,6 +22,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.security.shared.dto.StrippedUserDTO;
import com.sap.sse.security.shared.dto.UserGroupDTO;
@@ -106,11 +106,8 @@ public class UserGroupDetailPanel extends Composite
final Set<UserGroupDTO> selectedUserGroups = userGroupSelectionModel.getSelectedSet();
if (selectedUserGroups != null && selectedUserGroups.size() == 1) {
final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next();
final List<StrippedUserDTO> users = new ArrayList<>(tenantUsersTable.getSelectionModel().getSelectedSet());
if (selectedUserGroups == null || selectedUserGroups.isEmpty()) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
return;
}
final RefreshableMultiSelectionModel<StrippedUserDTO> usersSelectionModel = tenantUsersTable.getSelectionModel();
final List<StrippedUserDTO> users = Util.asList(usersSelectionModel.getSelectedElements());
for (StrippedUserDTO user : users) {
final String username = user.getName();
userManagementService.removeUserFromUserGroup(selectedUserGroup.getId().toString(), username,