/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.uberfire.ext.security.management.client.widgets.management.editor.user; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.jboss.errai.security.shared.api.Group; import org.jboss.errai.security.shared.api.GroupImpl; import org.jboss.errai.security.shared.api.Role; import org.jboss.errai.security.shared.api.RoleImpl; import org.jboss.errai.security.shared.api.identity.User; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.uberfire.ext.security.management.api.Capability; import org.uberfire.ext.security.management.client.ClientUserSystemManager; import org.uberfire.ext.security.management.client.widgets.management.editor.AssignedEntitiesEditor; import org.uberfire.ext.security.management.client.widgets.management.editor.AssignedEntitiesExplorer; import org.uberfire.ext.security.management.client.widgets.management.editor.acl.ACLViewer; import org.uberfire.ext.security.management.client.widgets.management.events.OnChangePasswordEvent; import org.uberfire.ext.security.management.client.widgets.management.events.OnDeleteEvent; import org.uberfire.ext.security.management.client.widgets.management.events.OnEditEvent; import org.uberfire.ext.security.management.client.widgets.management.events.OnShowEvent; import org.uberfire.ext.security.management.client.widgets.management.events.OnUpdateUserGroupsEvent; import org.uberfire.ext.security.management.client.widgets.management.events.OnUpdateUserRolesEvent; import org.uberfire.mocks.EventSourceMock; import static org.junit.Assert.*; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class UserEditorTest { @Mock ClientUserSystemManager userSystemManager; @Mock UserAttributesEditor userAttributesEditor; @Mock UserAssignedGroupsExplorer userAssignedGroupsExplorer; @Mock UserAssignedRolesExplorer userAssignedRolesExplorer; @Mock UserAssignedGroupsEditor userAssignedGroupsEditor; @Mock UserAssignedRolesEditor userAssignedRolesEditor; @Mock ACLViewer aclViewer; @Mock EventSourceMock<OnEditEvent> onEditEvent; @Mock EventSourceMock<OnShowEvent> onShowEvent; @Mock EventSourceMock<OnDeleteEvent> onDeleteEvent; @Mock EventSourceMock<OnChangePasswordEvent> onChangePasswordEvent; @Mock UserEditor.View view; @Mock User user; private UserEditor presenter; @Before public void setup() { Map<String, String> userAttributes = new HashMap<String, String>(1); userAttributes.put("attr1", "value1"); when(user.getIdentifier()).thenReturn("user1"); when(user.getProperties()).thenReturn(userAttributes); when(userSystemManager.isUserCapabilityEnabled(any(Capability.class))).thenReturn(true); presenter = new UserEditor(userSystemManager, userAttributesEditor, userAssignedGroupsExplorer, userAssignedGroupsEditor, userAssignedRolesExplorer, userAssignedRolesEditor, aclViewer, onEditEvent, onShowEvent, onDeleteEvent, onChangePasswordEvent, view); } @Test public void testInit() { presenter.init(); verify(view, times(1)).init(presenter); verify(view, times(1)).initWidgets(any(UserAttributesEditor.View.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(ACLViewer.class)); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setAttributesEditorVisible(anyBoolean()); verify(view, times(0)).setChangePasswordButtonVisible(anyBoolean()); verify(view, times(0)).setDeleteButtonVisible(anyBoolean()); verify(view, times(0)).setEditButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } @Test public void testClear() { presenter.isEditMode = true; presenter.user = user; presenter.clear(); assertNull(presenter.user); assertFalse(presenter.isEditMode); verify(userAttributesEditor, times(1)).clear(); verify(userAssignedGroupsExplorer, times(1)).clear(); verify(userAssignedGroupsEditor, times(1)).clear(); assertNoViewCalls(); } @Test public void testIdentifier() { presenter.user = user; String id = presenter.identifier(); assertEquals("user1", id); assertNoViewCalls(); } @Test public void testAttributesEditor() { assertEquals(userAttributesEditor, presenter.attributesEditor()); assertNoViewCalls(); } @Test public void testGroupsExplorer() { assertEquals(userAssignedGroupsExplorer, presenter.groupsExplorer()); assertNoViewCalls(); } @Test public void testGroupsEditor() { assertEquals(userAssignedGroupsEditor, presenter.groupsEditor()); assertNoViewCalls(); } @Test public void testRolesExplorer() { assertEquals(userAssignedRolesExplorer, presenter.rolesExplorer()); assertNoViewCalls(); } @Test public void testRolesEditor() { assertEquals(userAssignedRolesEditor, presenter.rolesEditor()); assertNoViewCalls(); } @Test public void testShow() { presenter.show(user); assertFalse(presenter.isEditMode); verify(userAttributesEditor, times(1)).clear(); verify(userAssignedGroupsExplorer, times(1)).clear(); verify(userAssignedRolesExplorer, times(1)).clear(); verify(userAssignedGroupsEditor, times(1)).clear(); verify(onShowEvent, times(1)).fire(any(OnShowEvent.class)); verify(view, times(0)).init(any(UserEditor.class)); verify(view, times(0)).initWidgets(any(UserAttributesEditor.View.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(ACLViewer.class)); verify(view, times(1)).setAddToGroupsButtonVisible(false); verify(view, times(1)).setAttributesEditorVisible(true); verify(view, times(1)).setChangePasswordButtonVisible(false); verify(view, times(1)).setDeleteButtonVisible(false); verify(view, times(1)).setEditButtonVisible(true); verify(view, times(1)).setUsername("user1"); } @Test public void testSetEditButtonVisible() { presenter.setEditButtonVisible(true); verify(view, times(1)).setEditButtonVisible(true); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setAttributesEditorVisible(anyBoolean()); verify(view, times(0)).setChangePasswordButtonVisible(anyBoolean()); verify(view, times(0)).setDeleteButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } @Test public void testSetDeleteButtonVisible() { presenter.setDeleteButtonVisible(true); verify(view, times(1)).setDeleteButtonVisible(true); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setAttributesEditorVisible(anyBoolean()); verify(view, times(0)).setChangePasswordButtonVisible(anyBoolean()); verify(view, times(0)).setEditButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } @Test public void testSetChangePasswordButtonVisible() { presenter.setChangePasswordButtonVisible(true); verify(view, times(1)).setChangePasswordButtonVisible(true); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setAttributesEditorVisible(anyBoolean()); verify(view, times(0)).setDeleteButtonVisible(anyBoolean()); verify(view, times(0)).setEditButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } @Test public void testSetAttributesEditorVisible() { presenter.setAttributesEditorVisible(true); verify(view, times(1)).setAttributesEditorVisible(true); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setChangePasswordButtonVisible(anyBoolean()); verify(view, times(0)).setDeleteButtonVisible(anyBoolean()); verify(view, times(0)).setEditButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } @Test public void testOnEdit() { presenter.onEdit(); verify(onEditEvent, times(1)).fire(any(OnEditEvent.class)); assertNoViewCalls(); } @Test public void testOnDelete() { presenter.onDelete(); verify(onDeleteEvent, times(1)).fire(any(OnDeleteEvent.class)); assertNoViewCalls(); } @Test public void testOnChangePassword() { presenter.onChangePassword(); verify(onChangePasswordEvent, times(1)).fire(any(OnChangePasswordEvent.class)); assertNoViewCalls(); } @Test public void testOnAssignGroupsInReadMode() { presenter.user = user; presenter.isEditMode = false; presenter.onAssignGroups(); verify(userAssignedGroupsEditor, times(1)).show(any(User.class)); verify(userAssignedGroupsEditor, times(0)).edit(any(User.class)); assertNoViewCalls(); } @Test public void testOnAssignGroupsInEditMode() { presenter.user = user; presenter.isEditMode = true; presenter.onAssignGroups(); verify(userAssignedGroupsEditor, times(0)).show(any(User.class)); verify(userAssignedGroupsEditor, times(1)).edit(any(User.class)); assertNoViewCalls(); } @Test public void testOnOnUserGroupsUpdatedEvent() { OnUpdateUserGroupsEvent onUpdateUserGroupsEvent = mock(OnUpdateUserGroupsEvent.class); when(onUpdateUserGroupsEvent.getContext()).thenReturn(userAssignedGroupsEditor); final Set<Group> explorerGroups = new HashSet<Group>(); when(userAssignedGroupsExplorer.getValue()).thenReturn(explorerGroups); final Set<Group> groups = new HashSet<Group>(); groups.add(new GroupImpl("group1")); when(userAssignedGroupsEditor.getValue()).thenReturn(groups); presenter.onOnUserGroupsUpdatedEvent(onUpdateUserGroupsEvent); assertEquals(groups, userAssignedGroupsExplorer.getValue()); verify(userAssignedGroupsEditor, times(1)).flush(); verify(userAssignedGroupsExplorer, times(1)).doShow(); assertNoViewCalls(); } @Test public void testOnAssignRolesInReadMode() { presenter.user = user; presenter.isEditMode = false; presenter.onAssignRoles(); verify(userAssignedRolesEditor, times(1)).show(any(User.class)); verify(userAssignedRolesEditor, times(0)).edit(any(User.class)); assertNoViewCalls(); } @Test public void testOnAssignRolesInEditMode() { presenter.user = user; presenter.isEditMode = true; presenter.onAssignRoles(); verify(userAssignedRolesEditor, times(0)).show(any(User.class)); verify(userAssignedRolesEditor, times(1)).edit(any(User.class)); assertNoViewCalls(); } @Test public void testOnOnUserRolesUpdatedEvent() { OnUpdateUserRolesEvent onUpdateUserRolesEvent = mock(OnUpdateUserRolesEvent.class); when(onUpdateUserRolesEvent.getContext()).thenReturn(userAssignedRolesEditor); final Set<Role> explorerRoles = new HashSet<Role>(); when(userAssignedRolesExplorer.getValue()).thenReturn(explorerRoles); final Set<Role> roles = new HashSet<Role>(); roles.add(new RoleImpl("role1")); when(userAssignedRolesEditor.getValue()).thenReturn(roles); presenter.onOnUserRolesUpdatedEvent(onUpdateUserRolesEvent); assertEquals(roles, userAssignedRolesExplorer.getValue()); verify(userAssignedRolesEditor, times(1)).flush(); verify(userAssignedRolesExplorer, times(1)).doShow(); assertNoViewCalls(); } private void assertNoViewCalls() { verify(view, times(0)).init(any(UserEditor.class)); verify(view, times(0)).initWidgets(any(UserAttributesEditor.View.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(AssignedEntitiesExplorer.class), any(AssignedEntitiesEditor.class), any(ACLViewer.class)); verify(view, times(0)).setAddToGroupsButtonVisible(anyBoolean()); verify(view, times(0)).setAttributesEditorVisible(anyBoolean()); verify(view, times(0)).setChangePasswordButtonVisible(anyBoolean()); verify(view, times(0)).setDeleteButtonVisible(anyBoolean()); verify(view, times(0)).setEditButtonVisible(anyBoolean()); verify(view, times(0)).setUsername(anyString()); } }