package org.apereo.cas.services.web; import org.apereo.cas.authentication.principal.WebApplicationServiceFactory; import org.apereo.cas.mgmt.services.web.ManageRegisteredServicesMultiActionController; import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceEditBean.ServiceData; import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceViewBean; import org.apereo.cas.mgmt.services.web.factory.DefaultAccessStrategyMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultAttributeFilterMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultAttributeReleasePolicyMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultPrincipalAttributesRepositoryMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultProxyPolicyMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultRegisteredServiceFactory; import org.apereo.cas.mgmt.services.web.factory.DefaultRegisteredServiceMapper; import org.apereo.cas.mgmt.services.web.factory.DefaultUsernameAttributeProviderMapper; import org.apereo.cas.mgmt.services.web.factory.RegisteredServiceMapper; import org.apereo.cas.services.DefaultServicesManager; import org.apereo.cas.services.InMemoryServiceRegistry; import org.apereo.cas.services.RegexRegisteredService; import org.apereo.cas.services.RegisteredService; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.web.servlet.ModelAndView; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; /** * @author Scott Battaglia * @since 3.1 */ @RunWith(JUnit4.class) public class ManageRegisteredServicesMultiActionControllerTests { private static final String NAME = "name"; private static final String UNIQUE_DESCRIPTION = "uniqueDescription"; private static final String SERVICES = "services"; @Rule public ExpectedException thrown = ExpectedException.none(); private ManageRegisteredServicesMultiActionController controller; private DefaultRegisteredServiceFactory registeredServiceFactory; private DefaultServicesManager servicesManager; private final DefaultAttributeReleasePolicyMapper policyMapper = new DefaultAttributeReleasePolicyMapper(new DefaultAttributeFilterMapper(), new DefaultPrincipalAttributesRepositoryMapper()); @Before public void setUp() throws Exception { this.servicesManager = new DefaultServicesManager(new InMemoryServiceRegistry()); this.registeredServiceFactory = new DefaultRegisteredServiceFactory(new DefaultAccessStrategyMapper(), policyMapper, new DefaultProxyPolicyMapper(), new DefaultRegisteredServiceMapper(), new DefaultUsernameAttributeProviderMapper(), Collections.emptyList()); this.controller = new ManageRegisteredServicesMultiActionController(this.servicesManager, this .registeredServiceFactory, new WebApplicationServiceFactory(), "https://cas.example.org"); } @Test public void verifyDeleteService() throws Exception { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1200); r.setName(NAME); r.setServiceId("serviceId"); r.setEvaluationOrder(1); this.servicesManager.save(r); final MockHttpServletResponse response = new MockHttpServletResponse(); this.controller.manage(response); this.controller.deleteRegisteredService(1200, response); assertNull(this.servicesManager.findServiceBy(1200)); assertTrue(response.getContentAsString().contains("serviceName")); } @Test public void verifyDeleteServiceNoService() throws Exception { final MockHttpServletResponse response = new MockHttpServletResponse(); this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("The default service https://cas.example.org cannot be deleted. The definition is required for accessing the application."); this.controller.deleteRegisteredService(1200, response); assertNull(this.servicesManager.findServiceBy(1200)); assertFalse(response.getContentAsString().contains("serviceName")); } @Test public void updateEvaluationOrderInvalidServiceId() { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1200); r.setName(NAME); r.setServiceId("test"); r.setEvaluationOrder(2); this.thrown.expect(IllegalArgumentException.class); this.thrown.expectMessage("Service id 5000 cannot be found."); this.servicesManager.save(r); this.controller.updateRegisteredServiceEvaluationOrder(new MockHttpServletResponse(), 5000, 1000); } @Test public void verifyManage() throws Exception { final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1200); r.setName(NAME); r.setDescription(UNIQUE_DESCRIPTION); r.setServiceId("test"); r.setEvaluationOrder(2); this.servicesManager.save(r); final MockHttpServletResponse response = new MockHttpServletResponse(); final ModelAndView mv = this.controller.manage(response); assertTrue(mv.getModel().containsKey("defaultServiceUrl")); assertTrue(mv.getModel().containsKey("status")); this.controller.getServices(response); final String content = response.getContentAsString(); assertTrue(content.contains(SERVICES)); assertTrue(content.contains(UNIQUE_DESCRIPTION)); } @Test public void verifyCustomComponents() throws Exception { // override the RegisteredServiceMapper this.registeredServiceFactory = new DefaultRegisteredServiceFactory(new DefaultAccessStrategyMapper(), policyMapper, new DefaultProxyPolicyMapper(), new CustomRegisteredServiceMapper(), new DefaultUsernameAttributeProviderMapper(), Collections.emptyList()); this.controller = new ManageRegisteredServicesMultiActionController(this.servicesManager, this .registeredServiceFactory, new WebApplicationServiceFactory(), "https://cas.example.org"); final RegexRegisteredService r = new RegexRegisteredService(); r.setId(1200); r.setName(NAME); r.setDescription(UNIQUE_DESCRIPTION); r.setServiceId("test"); r.setEvaluationOrder(2); this.servicesManager.save(r); final MockHttpServletResponse response = new MockHttpServletResponse(); final ModelAndView mv = this.controller.manage(response); assertTrue(mv.getModel().containsKey("defaultServiceUrl")); assertTrue(mv.getModel().containsKey("status")); this.controller.getServices(response); final String content = response.getContentAsString(); assertTrue(content.contains(SERVICES)); assertTrue(content.contains(UNIQUE_DESCRIPTION)); assertTrue(content.contains("customComponent1")); assertTrue(content.contains("key2")); } private static class CustomRegisteredServiceMapper implements RegisteredServiceMapper { private final RegisteredServiceMapper base = new DefaultRegisteredServiceMapper(); @Override public void mapRegisteredService(final RegisteredService svc, final ServiceData bean) { base.mapRegisteredService(svc, bean); } @Override public void mapRegisteredService(final RegisteredService svc, final RegisteredServiceViewBean bean) { base.mapRegisteredService(svc, bean); final Map<String, Object> properties = new HashMap<>(); properties.put("key1", "string"); properties.put("key2", 100); bean.setCustomComponent("customComponent1", properties); } @Override public RegisteredService toRegisteredService(final ServiceData data) { return base.toRegisteredService(data); } } }