package org.ovirt.engine.core.bll; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.ovirt.engine.core.common.action.ActionGroupsToRoleParameter; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.RoleGroupMap; import org.ovirt.engine.core.compat.Guid; public class DetachActionGroupsFromRoleCommandTest extends AbstractRolesCommandTestBase { @Override protected ActionGroupsToRoleParameter generateParameters() { Guid roleId = Guid.newGuid(); ArrayList<ActionGroup> groups = new ArrayList<>(Arrays.asList(ActionGroup.DELETE_HOST, ActionGroup.CONFIGURE_ENGINE)); return new ActionGroupsToRoleParameter(roleId, groups); } @Override protected DetachActionGroupsFromRoleCommand<? extends ActionGroupsToRoleParameter> generateCommand() { return new DetachActionGroupsFromRoleCommand<>(getParams(), null); } @Override protected ActionGroupsToRoleParameter getParams() { return (ActionGroupsToRoleParameter) super.getParams(); } /* execute related tests */ /** A flow test that makes sure all the action groups are removed correctly if the role is not updated because it still has roles that allow viewing children */ @Test public void testExecuteCommandNoUpdate() { mockRoleGroups(ActionGroup.CONFIGURE_HOST_NETWORK); getRole().setAllowsViewingChildren(true); getCommand().executeCommand(); verifyRoleSaving(true, false); } /** A flow test that makes sure all the action groups are removed correctly if the role is not updated because it does not allow viewing children */ @Test public void testExecuteCommandNoUpdateSinceRoleWasAlreadyNotInheritable() { getRole().setAllowsViewingChildren(false); getCommand().executeCommand(); verifyRoleSaving(false, false); } /** A flow test that makes sure all the action groups are removed correctly if the role is updated because no roles are left in it*/ @Test public void testExecuteCommandWithUpdateAllRolesRemoved() { mockRoleGroups(); getRole().setAllowsViewingChildren(true); getCommand().executeCommand(); verifyRoleSaving(true, true); } /** A flow test that makes sure all the action groups are removed correctly if the role is updated because no roles that allow viewing children are left in it*/ @Test public void testExecuteCommandWithUpdateInheritableRolesRemoved() { mockRoleGroups(ActionGroup.CREATE_VM); getRole().setAllowsViewingChildren(true); getCommand().executeCommand(); verifyRoleSaving(true, true); } /** Mock the action groups remaining on the role AFTER some were detached */ private void mockRoleGroups(ActionGroup... groups) { List<RoleGroupMap> maps = new ArrayList<>(); for (ActionGroup group : groups) { maps.add(new RoleGroupMap(group, getParams().getRoleId())); } when(getRoleGroupMapDaoMock().getAllForRole(getParams().getRoleId())).thenReturn(maps); } private void verifyRoleSaving(boolean wasInheritable, boolean roleStatusChanged) { for (ActionGroup group : getParams().getActionGroups()) { verify(getRoleGroupMapDaoMock()).remove(group, getParams().getRoleId()); } if (wasInheritable) { verify(getRoleDaoMock()).get(getParams().getRoleId()); verify(getRoleGroupMapDaoMock()).getAllForRole(getParams().getRoleId()); } if (roleStatusChanged) { verify(getRoleDaoMock()).update(getRole()); } verifyNoMoreInteractions(getRoleGroupMapDaoMock()); } }