package org.simbasecurity.dwclient.gateway;
import static org.fest.assertions.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mock;
import org.mockito.internal.util.reflection.Whitebox;
import org.simbasecurity.dwclient.dropwizard.config.SimbaManagerRestConfiguration;
import org.simbasecurity.dwclient.exception.SimbaUnavailableException;
import org.simbasecurity.dwclient.gateway.SimbaGateway;
import org.simbasecurity.dwclient.gateway.SimbaManagerRestGateway;
import org.simbasecurity.dwclient.gateway.representations.SimbaRoleR;
import org.simbasecurity.dwclient.gateway.representations.SimbaUserR;
import org.simbasecurity.dwclient.gateway.resources.roles.SimbaRoleService;
import org.simbasecurity.dwclient.gateway.resources.users.SimbaUserService;
import org.simbasecurity.dwclient.test.rule.MockitoRule;
import org.slf4j.Logger;
import com.google.common.base.Optional;
public class SimbaManagerRestGatewayTest {
private static final String APP_PASSWORD = "appUserPw";
private static final String APP_USER = "appUser";
private static final String APP_USER_ROLE = "simbaManagerRole";
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Rule
public MockitoRule mockitoRule = MockitoRule.create();
@Mock
private SimbaGateway simbaGatewayMock;
@Mock
private SimbaRoleService simbaRoleServiceMock;
@Mock
private SimbaUserService simbaUserServiceMock;
private SimbaManagerRestGateway simbaManagerRestGateway;
@Before
public void setUp() {
SimbaManagerRestConfiguration simbaConfig = new SimbaManagerRestConfiguration();
simbaConfig.setAppPassword(APP_PASSWORD);
simbaConfig.setAppUser(APP_USER);
simbaConfig.setAppUserRole(APP_USER_ROLE);
simbaManagerRestGateway = new SimbaManagerRestGateway(simbaConfig, simbaGatewayMock, simbaRoleServiceMock, simbaUserServiceMock);
}
@Test
public void loginWithAppUser_WhenNoSSOToken_ThrowsIllegalStateException() throws Exception {
String username = "herp";
String rolename = "derp";
when(simbaGatewayMock.login(APP_USER, APP_PASSWORD)).thenReturn(Optional.<String> absent());
expectedException.expect(IllegalStateException.class);
expectedException.expectMessage(String.format("Could not log in to Simba with app user %s.", APP_USER));
simbaManagerRestGateway.assignRoleToUser(rolename, username);
}
@Test
public void loginWithAppUser_WhenNoSSOToken_LogsUnauthorized() throws Exception {
Logger loggerMock = mock(Logger.class);
Whitebox.setInternalState(simbaManagerRestGateway, "logger", loggerMock);
when(simbaGatewayMock.login(APP_USER, APP_PASSWORD)).thenReturn(Optional.<String> absent());
try {
simbaManagerRestGateway.assignRoleToUser("derp", "herp");
} catch (Exception e) {
}
verify(loggerMock, times(1)).error("Could not log in to Simba with app user {}.", APP_USER);
}
@Test
public void assignRoleToUser_WhenRolenameIsNull_ThrowsIllegalArgumentException() throws Exception {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("role cannot be null");
simbaManagerRestGateway.assignRoleToUser(null, "username");
}
@Test
public void assignRoleToUser_WhenUsernameIsNull_ThrowsIllegalArgumentException() throws Exception {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("username cannot be null");
simbaManagerRestGateway.assignRoleToUser("role", null);
}
@Test
public void assignRoleToUser_WhenUsernameDoesNotExist_ThrowsIllegalArgumentException() throws Exception {
String username = "ivar";
String rolename = "role name";
logInWithValidUser();
when(simbaUserServiceMock.findUserByName(anyString(), eq(username))).thenThrow(new IllegalArgumentException());
when(simbaRoleServiceMock.findRoleByName(anyString(), eq(rolename))).thenReturn(new SimbaRoleR());
expectedException.expect(IllegalArgumentException.class);
simbaManagerRestGateway.assignRoleToUser(rolename, username);
}
@Test
public void assignRoleToUser_WhenRolenameDoesNotExist_ThrowsIllegalArgumentException() throws Exception {
String username = "ivar";
String rolename = "role name";
logInWithValidUser();
when(simbaUserServiceMock.findUserByName(anyString(), eq(username))).thenReturn(new SimbaUserR(username));
when(simbaRoleServiceMock.findRoleByName(anyString(), eq(rolename))).thenThrow(new IllegalArgumentException());
expectedException.expect(IllegalArgumentException.class);
simbaManagerRestGateway.assignRoleToUser(rolename, username);
}
@Test
public void assignRoleToUser_AssignsLookedUpSimbaRoleToLookedUpSimbaUser() throws Exception {
String username = "herp";
String rolename = "derp";
String ssoToken = logInWithValidUser();
SimbaRoleR simbaRole = new SimbaRoleR();
SimbaUserR simbaUser = new SimbaUserR("simbauser");
when(simbaRoleServiceMock.findRoleByName(ssoToken, rolename)).thenReturn(simbaRole);
when(simbaUserServiceMock.findUserByName(ssoToken, username)).thenReturn(simbaUser);
simbaManagerRestGateway.assignRoleToUser(rolename, username);
verify(simbaGatewayMock, times(1)).login(APP_USER, APP_PASSWORD);
verify(simbaRoleServiceMock, times(1)).findRoleByName(ssoToken, rolename);
verify(simbaUserServiceMock, times(1)).findUserByName(ssoToken, username);
verify(simbaRoleServiceMock, times(1)).addRoleToUser(ssoToken, simbaRole, simbaUser);
}
@Test
public void unassignRoleFromUser_WhenRolenameIsNull_ThrowsIllegalArgumentException() throws Exception {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("role cannot be null");
simbaManagerRestGateway.unassignRoleFromUser(null, "username");
}
@Test
public void unassignRoleFromUser_WhenUsernameIsNull_ThrowsIllegalArgumentException() throws Exception {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("username cannot be null");
simbaManagerRestGateway.unassignRoleFromUser("role", null);
}
@Test
public void unassignRoleFromUser_WhenUsernameDoesNotExist_ThrowsIllegalArgumentException() throws Exception {
String username = "ivar";
String rolename = "role name";
logInWithValidUser();
when(simbaUserServiceMock.findUserByName(anyString(), eq(username))).thenThrow(new IllegalArgumentException());
when(simbaRoleServiceMock.findRoleByName(anyString(), eq(rolename))).thenReturn(new SimbaRoleR());
expectedException.expect(IllegalArgumentException.class);
simbaManagerRestGateway.unassignRoleFromUser(rolename, username);
}
@Test
public void unassignRoleFromUser_WhenRolenameDoesNotExist_ThrowsIllegalArgumentException() throws Exception {
String username = "ivar";
String rolename = "role name";
logInWithValidUser();
when(simbaUserServiceMock.findUserByName(anyString(), eq(username))).thenReturn(new SimbaUserR(username));
when(simbaRoleServiceMock.findRoleByName(anyString(), eq(rolename))).thenThrow(new IllegalArgumentException());
expectedException.expect(IllegalArgumentException.class);
simbaManagerRestGateway.unassignRoleFromUser(rolename, username);
}
@Test
public void unassignRoleFromUser_RemovesLookedUpSimbaRoleFromLookedUpSimbaUser() throws Exception {
String username = "herp";
String rolename = "derp";
String ssoToken = logInWithValidUser();
SimbaRoleR simbaRole = new SimbaRoleR();
SimbaUserR simbaUser = new SimbaUserR("simbauser");
when(simbaRoleServiceMock.findRoleByName(ssoToken, rolename)).thenReturn(simbaRole);
when(simbaUserServiceMock.findUserByName(ssoToken, username)).thenReturn(simbaUser);
simbaManagerRestGateway.unassignRoleFromUser(rolename, username);
verify(simbaGatewayMock, times(1)).login(APP_USER, APP_PASSWORD);
verify(simbaRoleServiceMock, times(1)).findRoleByName(ssoToken, rolename);
verify(simbaUserServiceMock, times(1)).findUserByName(ssoToken, username);
verify(simbaRoleServiceMock, times(1)).removeRoleFromUser(ssoToken, simbaRole, simbaUser);
}
@Test
public void isSimbaRestManagerAlive_WhenRoleServiceCallWasSuccessfulAndRoleExists_ThenSimbaManagerIsAlive() throws Exception {
String ssoToken = logInWithValidUser();
when(simbaRoleServiceMock.findRoleByName(ssoToken, APP_USER_ROLE)).thenReturn(new SimbaRoleR());
boolean actual = simbaManagerRestGateway.isSimbaRestManagerAlive();
assertThat(actual).isTrue();
}
@Test
public void isSimbaRestManagerAlive_WhenRoleServiceCallWasSuccessfulAndRoleDoesNotExist_ThenSimbaManagerIsAlive() throws Exception {
String ssoToken = logInWithValidUser();
when(simbaRoleServiceMock.findRoleByName(ssoToken, APP_USER_ROLE)).thenReturn(new SimbaRoleR());
boolean actual = simbaManagerRestGateway.isSimbaRestManagerAlive();
assertThat(actual).isTrue();
}
@Test
public void isSimbaRestManagerAlive_WhenRoleServiceCallReturnsErrorStatus_ThenSimbaManagerIsNotAlive() throws Exception {
String ssoToken = logInWithValidUser();
when(simbaRoleServiceMock.findRoleByName(ssoToken, APP_USER_ROLE)).thenThrow(new IllegalArgumentException());
boolean actual = simbaManagerRestGateway.isSimbaRestManagerAlive();
assertThat(actual).isFalse();
}
private String logInWithValidUser() throws SimbaUnavailableException {
String ssoToken = "validSSOToken";
when(simbaGatewayMock.login(APP_USER, APP_PASSWORD)).thenReturn(Optional.of(ssoToken));
return ssoToken;
}
}