package org.simbasecurity.dwclient.test.rule;
import com.google.common.base.Optional;
import com.sun.jersey.spi.container.ContainerRequest;
import com.yammer.dropwizard.auth.AuthenticationException;
import com.yammer.dropwizard.testing.ResourceTest;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
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.dropwizard.provider.AuthenticatedPrincipal;
import org.simbasecurity.dwclient.dropwizard.provider.DomainUserProvider;
import org.simbasecurity.dwclient.dropwizard.provider.SimbaAuthenticatedProvider;
import static org.mockito.Mockito.*;
public class SimbaAuthRule implements MethodRule {
public static final String USER_UNIQUE_EMAIL_ADRESS = "user.unique@email.com";
public static final String USER_NON_UNIQUE_EMAIL_ADRESS = "user.non.unique@email.com";
public static final String USER_PASSWORD = "password";
public static final String SIMBA_ID = "SIMBA ID";
private DomainUserProvider<? extends AuthenticatedPrincipal> domainProvider;
public static SimbaAuthRule create(DomainUserProvider<? extends AuthenticatedPrincipal> domainProvider) {
return new SimbaAuthRule(domainProvider);
}
public static SimbaAuthRule create() {
return new SimbaAuthRule(new DomainUserProvider<AuthenticatedPrincipal>() {
@Override
public AuthenticatedPrincipal lookUp(SimbaPrincipal principal) {
return null;
}
});
}
private SimbaAuthRule(DomainUserProvider<? extends AuthenticatedPrincipal> domainProvider) {
this.domainProvider = domainProvider;
}
@Override
public Statement apply(final Statement base, FrameworkMethod method, Object target) {
if (!ResourceTest.class.isAssignableFrom(target.getClass())) {
throw new IllegalArgumentException("This rule can only be used on tests that extend ResourceTest.");
}
final ResourceTest currentTest = (ResourceTest) target;
return new Statement() {
@Override
public void evaluate() throws Throwable {
before(currentTest);
try {
base.evaluate();
} finally {
}
}
};
}
protected void before(ResourceTest currentTest) throws AuthenticationException {
SimbaAuthenticator authenticatorMock = mock(SimbaAuthenticator.class);
SimbaCredentialsFactory simbaCredentialsFactoryMock = mock(SimbaCredentialsFactory.class);
SimbaAuthenticatedProvider simbaAuthenticatedProvider = new SimbaAuthenticatedProvider(authenticatorMock,
simbaCredentialsFactoryMock, domainProvider);
SimbaCredentials simbaCredentials = new SimbaCredentialsBuilderForTests().build();
when(simbaCredentialsFactoryMock.create(any(ContainerRequest.class))).thenReturn(simbaCredentials);
when(authenticatorMock.authenticate(simbaCredentials)).thenReturn(Optional.fromNullable(new SimbaPrincipal("user", "ssoToken")));
currentTest.addProvider(simbaAuthenticatedProvider);
}
}