package org.simbasecurity.dwclient.dropwizard.provider; import static org.fest.assertions.api.Assertions.*; import static org.mockito.Mockito.*; import javax.ws.rs.core.Response; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mock; import org.simbasecurity.dwclient.dropwizard.authenticator.SimbaAuthenticator; import org.simbasecurity.dwclient.dropwizard.credentials.SimbaCredentials; import org.simbasecurity.dwclient.dropwizard.credentials.SimbaCredentialsBuilderForTests; import org.simbasecurity.dwclient.dropwizard.credentials.SimbaCredentialsFactory; import org.simbasecurity.dwclient.dropwizard.credentials.SimbaPrincipal; import org.simbasecurity.dwclient.test.dropwizard.matchers.ContainerRequestBuilderForTests; import org.simbasecurity.dwclient.test.dropwizard.matchers.WebApplicationExceptionMatcher; import org.simbasecurity.dwclient.test.rule.MockitoRule; import com.google.common.base.Optional; import com.sun.jersey.api.core.HttpContext; import com.sun.jersey.spi.container.ContainerRequest; import com.yammer.dropwizard.auth.AuthenticationException; public class SimbaAuthenticatedInjectableTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Rule public MockitoRule mockitoRule = MockitoRule.create(); @Mock private SimbaAuthenticator authenticatorMock; @Mock private SimbaCredentialsFactory simbaCredentialsFactoryMock; @Mock private DomainUserProvider<AuthenticatedPrincipal> domainProviderMock; @Mock private HttpContext dummyHttpContext; private SimbaCredentials simbaCredentials; private SimbaAuthenticatedInjectable<AuthenticatedPrincipal> injectable; @Before public void setUp() { injectable = new SimbaAuthenticatedInjectable<AuthenticatedPrincipal>(authenticatorMock, simbaCredentialsFactoryMock, domainProviderMock, false); simbaCredentials = new SimbaCredentialsBuilderForTests().build(); ContainerRequest containerRequest = new ContainerRequestBuilderForTests().build(); when(dummyHttpContext.getRequest()).thenReturn(containerRequest); when(simbaCredentialsFactoryMock.create(containerRequest)).thenReturn(simbaCredentials); } @Test public void getValue_WhenAuthenticatorThrowsAuthenticationException_ThenThrowsWebAppException() throws Exception { when(authenticatorMock.authenticate(simbaCredentials)).thenThrow(new AuthenticationException("")); expectedException.expect(WebApplicationExceptionMatcher.webApplicationException(Response.Status.UNAUTHORIZED)); injectable.getValue(dummyHttpContext); } @Test public void getValue_WhenAuthenticatorReturnsEmptyOptional_ThenDomainProviderIsNotCalled() throws Exception { when(authenticatorMock.authenticate(simbaCredentials)).thenReturn(Optional.<SimbaPrincipal> absent()); injectable.getValue(dummyHttpContext); verifyZeroInteractions(domainProviderMock); } @Test public void getValue_WhenAuthenticatorReturnsEmptyOptional_AndIsRequired_ThenThrowsWebAppException() throws Exception { when(authenticatorMock.authenticate(simbaCredentials)).thenReturn(Optional.<SimbaPrincipal> absent()); injectable = new SimbaAuthenticatedInjectable<AuthenticatedPrincipal>(authenticatorMock, simbaCredentialsFactoryMock, domainProviderMock, true); expectedException.expect(WebApplicationExceptionMatcher.webApplicationException(Response.Status.UNAUTHORIZED)); injectable.getValue(dummyHttpContext); } @Test public void getValue_WhenDomainProviderReturnsNull_AndIsRequired_ThenNoExceptionIsThrown() throws Exception { SimbaPrincipal principal = new SimbaPrincipal("user", "token"); when(authenticatorMock.authenticate(simbaCredentials)).thenReturn(Optional.of(principal)); when(domainProviderMock.lookUp(principal)).thenReturn(null); injectable = new SimbaAuthenticatedInjectable<AuthenticatedPrincipal>(authenticatorMock, simbaCredentialsFactoryMock, domainProviderMock, true); AuthenticatedPrincipal actual = injectable.getValue(dummyHttpContext); assertThat(actual).isNull(); } @Test public void getValue_WhenAuthenticatorReturnsPresentPrincipal_ThenDomainProviderIsCalledToLookupDomainPrincipalWithPrincipal() throws Exception { SimbaPrincipal principal = new SimbaPrincipal("user", "token"); when(authenticatorMock.authenticate(simbaCredentials)).thenReturn(Optional.of(principal)); AuthenticatedPrincipal expectedDomainPrincipal = mock(AuthenticatedPrincipal.class); when(domainProviderMock.lookUp(principal)).thenReturn(expectedDomainPrincipal); AuthenticatedPrincipal actualDomainPrincipal = injectable.getValue(dummyHttpContext); assertThat(actualDomainPrincipal).isEqualTo(expectedDomainPrincipal); } }