package org.pac4j.cas.client.direct;
import org.jasig.cas.client.validation.AssertionImpl;
import org.junit.Test;
import org.pac4j.cas.config.CasConfiguration;
import org.pac4j.cas.config.CasProtocol;
import org.pac4j.cas.profile.CasProfile;
import org.pac4j.core.context.MockWebContext;
import org.pac4j.core.credentials.TokenCredentials;
import org.pac4j.core.exception.HttpAction;
import org.pac4j.core.exception.TechnicalException;
import org.pac4j.core.profile.CommonProfile;
import org.pac4j.core.util.TestsConstants;
import org.pac4j.core.util.TestsHelper;
import static org.junit.Assert.*;
/**
* Tests the {@link DirectCasProxyClient}.
*
* @author Jerome Leleu
* @since 1.9.2
*/
public final class DirectCasProxyClientTests implements TestsConstants {
@Test
public void testInitOk() {
final CasConfiguration configuration = new CasConfiguration();
configuration.setLoginUrl(LOGIN_URL);
configuration.setProtocol(CasProtocol.CAS20_PROXY);
final DirectCasProxyClient client = new DirectCasProxyClient(configuration, CALLBACK_URL);
client.init(MockWebContext.create());
}
@Test
public void testInitMissingConfiguration() {
final DirectCasProxyClient client = new DirectCasProxyClient();
client.setServiceUrl(CALLBACK_URL);
TestsHelper.expectException(() -> client.init(MockWebContext.create()), TechnicalException.class, "configuration cannot be null");
}
@Test
public void testInitMissingServiceUrl() {
final CasConfiguration configuration = new CasConfiguration();
configuration.setLoginUrl(LOGIN_URL);
final DirectCasProxyClient client = new DirectCasProxyClient();
client.setConfiguration(configuration);
TestsHelper.expectException(() -> client.init(MockWebContext.create()), TechnicalException.class, "serviceUrl cannot be blank");
}
@Test
public void testInitFailsBadProtocol() {
final CasConfiguration configuration = new CasConfiguration();
configuration.setLoginUrl(LOGIN_URL);
final DirectCasProxyClient client = new DirectCasProxyClient(configuration, CALLBACK_URL);
TestsHelper.expectException(() -> client.init(MockWebContext.create()), TechnicalException.class, "The DirectCasProxyClient must be configured with a CAS proxy protocol (CAS20_PROXY or CAS30_PROXY)");
}
@Test
public void testNoTicket() throws HttpAction {
final CasConfiguration configuration = new CasConfiguration();
configuration.setLoginUrl(LOGIN_URL);
configuration.setProtocol(CasProtocol.CAS20_PROXY);
final DirectCasProxyClient client = new DirectCasProxyClient(configuration, CALLBACK_URL);
assertNull(client.getCredentials(MockWebContext.create()));
}
@Test
public void testTokenExistsValidationOccurs() throws HttpAction {
final CasConfiguration configuration = new CasConfiguration();
configuration.setLoginUrl(LOGIN_URL);
configuration.setProtocol(CasProtocol.CAS30_PROXY);
configuration.setDefaultTicketValidator((ticket, service) -> {
if (TICKET.equals(ticket) && CALLBACK_URL.equals(service)) {
return new AssertionImpl(TICKET);
}
throw new TechnicalException("Bad ticket or service");
});
final DirectCasProxyClient client = new DirectCasProxyClient(configuration, CALLBACK_URL);
final MockWebContext context = MockWebContext.create();
context.setFullRequestURL(CALLBACK_URL + "?" + CasConfiguration.TICKET_PARAMETER + "=" + TICKET);
context.addRequestParameter(CasConfiguration.TICKET_PARAMETER, TICKET);
final TokenCredentials credentials = client.getCredentials(context);
assertEquals(TICKET, credentials.getToken());
final CommonProfile profile = credentials.getUserProfile();
assertTrue(profile instanceof CasProfile);
assertEquals(TICKET, profile.getId());
}
}