package gov.nasa.arc.mct.identitymgr.impl;
import gov.nasa.arc.mct.platform.spi.PersistenceProvider;
import gov.nasa.arc.mct.platform.spi.Platform;
import gov.nasa.arc.mct.platform.spi.PlatformAccess;
import gov.nasa.arc.mct.platform.spi.WindowManager;
import gov.nasa.arc.mct.services.internal.component.User;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestDefaultIdentityManager {
// Some sample users & corresponding groups
private String[] users = {
"mockUser", "mockAdmin", "mockOther"
};
private String[] groups = {
"users", "admin", "other"
};
private Platform oldPlatform;
@Mock Platform mockPlatform;
@Mock PersistenceProvider mockPersistence;
@Mock WindowManager mockWindowing;
@Mock Properties mockProperties;
@BeforeClass
public void setup() {
oldPlatform = PlatformAccess.getPlatform();
}
@AfterClass
public void teardown() {
new PlatformAccess().setPlatform(oldPlatform);
}
@BeforeMethod
public void setupMethod() {
MockitoAnnotations.initMocks(this);
Mockito.when(mockPlatform.getPersistenceProvider()).thenReturn(mockPersistence);
Mockito.when(mockPlatform.getWindowManager()).thenReturn(mockWindowing);
// Expose sample users/groups through persistence
for (int i = 0; i < 3; i++) {
User mockUser = Mockito.mock(User.class);
Mockito.when(mockUser.getUserId()).thenReturn(users[i]);
Mockito.when(mockUser.getDisciplineId()).thenReturn(groups[i]);
Mockito.when(mockPersistence.getUser(users[i])).thenReturn(mockUser);
}
Set<String> userSet = new HashSet<String>();
userSet.addAll(Arrays.<String>asList(users));
Mockito.when(mockPersistence.getAllUsers()).thenReturn(userSet);
new PlatformAccess().setPlatform(mockPlatform);
}
@Test
public void testMonitorDisabled() {
// The default identity manager should have no monitor
Assert.assertFalse(new DefaultIdentityManager(mockProperties).isMonitorRunning());
}
@Test
public void testNoDialogForNoUsers() {
// No input dialog should be shown if there are no users in the DB
Mockito.when(mockPersistence.getAllUsers()).thenReturn(Collections.<String>emptySet());
new DefaultIdentityManager(mockProperties).getCurrentUser();
Mockito.verify(mockWindowing, Mockito.never()).showInputDialog(Mockito.anyString(), Mockito.anyString(), Mockito.<Object[]>any(), Mockito.any(), Mockito.<Map<String,Object>>any());
}
@Test
public void testNoDialogForOneUsers() {
// No input dialog should be shown if there are 1 user in the DB
Set<String> oneElementSet = new HashSet<String>();
oneElementSet.add("testUser1");
Mockito.when(mockPersistence.getAllUsers()).thenReturn(oneElementSet);
new DefaultIdentityManager(mockProperties).getCurrentUser();
Mockito.verify(mockWindowing, Mockito.never()).showInputDialog(Mockito.anyString(), Mockito.anyString(), Mockito.<Object[]>any(), Mockito.any(), Mockito.<Map<String,Object>>any());
}
@Test
public void testDialogForUsers() {
// If multiple users are present, input dialog should be shown
new DefaultIdentityManager(mockProperties).getCurrentUser();
Mockito.verify(mockWindowing, Mockito.times(1)).showInputDialog(Mockito.anyString(), Mockito.anyString(), Mockito.<Object[]>any(), Mockito.any(), Mockito.<Map<String,Object>>any());
}
@Test
public void testSelectionForUsers() {
// Verify that IdentityManager matches selection from shown dialog
for (int i = 0; i < 3; i++) {
Mockito.when(mockWindowing.showInputDialog(Mockito.anyString(), Mockito.anyString(), Mockito.<Object[]>any(), Mockito.any(), Mockito.<Map<String,Object>>any())).thenReturn(users[i]);
IdentityManager identityManager = new DefaultIdentityManager(mockProperties);
Assert.assertEquals(identityManager.getCurrentUser(), users[i]);
Assert.assertEquals(identityManager.getCurrentGroup(), groups[i]);
}
}
@Test
public void testMatchesMCTProperties() {
// Here, we make sure that specifying mct.user still works with this identity manager
for (int i = 0; i < 3; i++) {
Mockito.when(mockProperties.getProperty("mct.user")).thenReturn(users[i]);
IdentityManager identityManager = new DefaultIdentityManager(mockProperties);
// Input dialog should not be shown - mct.user was set!
Mockito.verify(mockWindowing, Mockito.never()).showInputDialog(Mockito.anyString(), Mockito.anyString(), Mockito.<Object[]>any(), Mockito.any(), Mockito.<Map<String,Object>>any());
// But we should still have "loaded" the requested user
Assert.assertEquals(identityManager.getCurrentUser(), users[i]);
Assert.assertEquals(identityManager.getCurrentGroup(), groups[i]);
// Finally, ensure there's still no monitor
Assert.assertFalse(identityManager.isMonitorRunning());
}
}
}