package org.apereo.cas.support.saml;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.FileUtils;
import org.apereo.cas.authentication.principal.WebApplicationServiceFactory;
import org.apereo.cas.services.ChainingAttributeReleasePolicy;
import org.apereo.cas.services.DefaultServicesManager;
import org.apereo.cas.services.DenyAllAttributeReleasePolicy;
import org.apereo.cas.services.InMemoryServiceRegistry;
import org.apereo.cas.services.JsonServiceRegistryDao;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.support.saml.services.InCommonRSAttributeReleasePolicy;
import org.apereo.cas.support.saml.services.SamlRegisteredService;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.io.ClassPathResource;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* The {@link SamlRegisteredServiceTests} handles test cases for {@link SamlRegisteredService}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class SamlRegisteredServiceTests {
private static final File JSON_FILE = new File(FileUtils.getTempDirectoryPath(), "samlRegisteredService.json");
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final ClassPathResource RESOURCE = new ClassPathResource("services");
private static final String SAML_SERVICE = "SAMLService";
private static final String METADATA_LOCATION = "classpath:/metadata/idp-metadata.xml";
@BeforeClass
public static void prepTests() throws Exception {
FileUtils.cleanDirectory(RESOURCE.getFile());
}
@Test
public void verifySavingSamlService() throws Exception {
final SamlRegisteredService service = new SamlRegisteredService();
service.setName(SAML_SERVICE);
service.setServiceId("http://mmoayyed.unicon.net");
service.setMetadataLocation(METADATA_LOCATION);
final JsonServiceRegistryDao dao = new JsonServiceRegistryDao(RESOURCE, false, mock(ApplicationEventPublisher.class));
dao.save(service);
dao.load();
}
@Test
public void verifySavingInCommonSamlService() throws Exception {
final SamlRegisteredService service = new SamlRegisteredService();
service.setName(SAML_SERVICE);
service.setServiceId("http://mmoayyed.unicon.net");
service.setMetadataLocation(METADATA_LOCATION);
final InCommonRSAttributeReleasePolicy policy = new InCommonRSAttributeReleasePolicy();
final ChainingAttributeReleasePolicy chain = new ChainingAttributeReleasePolicy();
chain.setPolicies(Arrays.asList(policy, new DenyAllAttributeReleasePolicy()));
service.setAttributeReleasePolicy(chain);
final JsonServiceRegistryDao dao = new JsonServiceRegistryDao(RESOURCE, false, mock(ApplicationEventPublisher.class));
dao.save(service);
dao.load();
}
@Test
public void checkPattern() {
final SamlRegisteredService service = new SamlRegisteredService();
service.setName(SAML_SERVICE);
service.setServiceId("^http://.+");
service.setMetadataLocation(METADATA_LOCATION);
final InMemoryServiceRegistry dao = new InMemoryServiceRegistry();
dao.setRegisteredServices(Collections.singletonList(service));
final DefaultServicesManager impl = new DefaultServicesManager(dao);
impl.load();
final RegisteredService s = impl.findServiceBy(new WebApplicationServiceFactory()
.createService("http://mmoayyed.unicon.net:8081/sp/saml/SSO"));
assertNotNull(s);
}
@Test
public void verifySerializeAReturnMappedAttributeReleasePolicyToJson() throws IOException {
final SamlRegisteredService serviceWritten = new SamlRegisteredService();
serviceWritten.setName(SAML_SERVICE);
serviceWritten.setServiceId("http://mmoayyed.unicon.net");
serviceWritten.setMetadataLocation(METADATA_LOCATION);
MAPPER.writeValue(JSON_FILE, serviceWritten);
final RegisteredService serviceRead = MAPPER.readValue(JSON_FILE, SamlRegisteredService.class);
assertEquals(serviceWritten, serviceRead);
}
}