package org.apereo.cas.services.web;
import org.apereo.cas.mgmt.services.web.RegisteredServiceSimpleFormController;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceEditBean;
import org.apereo.cas.mgmt.services.web.beans.RegisteredServiceViewBean;
import org.apereo.cas.mgmt.services.web.factory.AttributeFormDataPopulator;
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.AbstractRegisteredService;
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.apereo.services.persondir.support.StubPersonAttributeDao;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.validation.BindingResult;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* Test cases for {@link RegisteredServiceSimpleFormController}.
*
* @author Scott Battaglia
* @author Misagh Moayyed
* @since 3.1
*/
@RunWith(JUnit4.class)
public class RegisteredServiceSimpleFormControllerTests {
private static final String NAME = "name";
private static final String SERVICE_ID = "serviceId";
private static final String DESCRIPTION = "description";
private static final String TEST_ID = "test";
private RegisteredServiceSimpleFormController controller;
private DefaultServicesManager manager;
private StubPersonAttributeDao repository;
private DefaultRegisteredServiceFactory registeredServiceFactory;
private final DefaultAttributeReleasePolicyMapper policyMapper = new DefaultAttributeReleasePolicyMapper(new DefaultAttributeFilterMapper(),
new DefaultPrincipalAttributesRepositoryMapper());
@Before
public void setUp() throws Exception {
final Map<String, List<Object>> attributes = new HashMap<>();
attributes.put(TEST_ID, Arrays.asList(new Object[]{TEST_ID}));
this.repository = new StubPersonAttributeDao();
this.repository.setBackingMap(attributes);
this.registeredServiceFactory = new DefaultRegisteredServiceFactory(new DefaultAccessStrategyMapper(), policyMapper, new DefaultProxyPolicyMapper(),
new DefaultRegisteredServiceMapper(), new DefaultUsernameAttributeProviderMapper(),
Collections.singletonList(new AttributeFormDataPopulator(this.repository)));
this.manager = new DefaultServicesManager(new InMemoryServiceRegistry());
this.controller = new RegisteredServiceSimpleFormController(this.manager, this.registeredServiceFactory);
}
@Test
public void verifyAddRegisteredServiceNoValues() throws Exception {
final BindingResult result = mock(BindingResult.class);
when(result.getModel()).thenReturn(new HashMap<>());
when(result.hasErrors()).thenReturn(true);
assertTrue(result.hasErrors());
}
@Test
public void verifyAddRegisteredServiceWithValues() throws Exception {
final RegexRegisteredService svc = new RegexRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId(SERVICE_ID);
svc.setName(NAME);
svc.setEvaluationOrder(123);
assertTrue(this.manager.getAllServices().isEmpty());
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
final Collection<RegisteredService> services = this.manager.getAllServices();
assertEquals(1, services.size());
this.manager.getAllServices().forEach(rs -> assertTrue(rs instanceof RegexRegisteredService));
}
@Test
public void verifyEditRegisteredServiceWithValues() throws Exception {
final RegexRegisteredService r = new RegexRegisteredService();
r.setId(1000);
r.setName("Test Service");
r.setServiceId(TEST_ID);
r.setDescription(DESCRIPTION);
this.manager.save(r);
final RegexRegisteredService svc = new RegexRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId("serviceId1");
svc.setName(NAME);
svc.setId(1000);
svc.setEvaluationOrder(1000);
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
assertFalse(this.manager.getAllServices().isEmpty());
final RegisteredService r2 = this.manager.findServiceBy(1000);
assertEquals("serviceId1", r2.getServiceId());
}
@Test
public void verifyAddRegexRegisteredService() throws Exception {
final RegexRegisteredService svc = new RegexRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId("^serviceId");
svc.setName(NAME);
svc.setId(1000);
svc.setEvaluationOrder(1000);
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
final Collection<RegisteredService> services = this.manager.getAllServices();
assertEquals(1, services.size());
this.manager.getAllServices().forEach(rs -> assertTrue(rs instanceof RegexRegisteredService));
}
@Test
public void verifyAddMultipleRegisteredServiceTypes() throws Exception {
AbstractRegisteredService svc = new RegexRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId("^serviceId");
svc.setName(NAME);
svc.setId(1000);
svc.setEvaluationOrder(1000);
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
svc = new RegexRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId("^serviceId");
svc.setName(NAME);
svc.setId(100);
svc.setEvaluationOrder(100);
final RegisteredServiceEditBean.ServiceData data2 = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data2, mock(BindingResult.class));
final Collection<RegisteredService> services = this.manager.getAllServices();
assertEquals(2, services.size());
}
@Test
public void verifyAddMockRegisteredService() throws Exception {
this.registeredServiceFactory = new DefaultRegisteredServiceFactory(new DefaultAccessStrategyMapper(), policyMapper, new DefaultProxyPolicyMapper(),
new MockRegisteredServiceMapper(), new DefaultUsernameAttributeProviderMapper(),
Collections.singletonList(new AttributeFormDataPopulator(this.repository)));
this.controller = new RegisteredServiceSimpleFormController(this.manager, this.registeredServiceFactory);
final MockRegisteredService svc = new MockRegisteredService();
svc.setDescription(DESCRIPTION);
svc.setServiceId("^serviceId");
svc.setName(NAME);
svc.setId(1000);
svc.setEvaluationOrder(1000);
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(svc);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
final Collection<RegisteredService> services = this.manager.getAllServices();
assertEquals(1, services.size());
this.manager.getAllServices().forEach(rs -> assertTrue(rs instanceof MockRegisteredService));
}
@Test
public void verifyEditMockRegisteredService() throws Exception {
this.registeredServiceFactory = new DefaultRegisteredServiceFactory(new DefaultAccessStrategyMapper(), policyMapper, new DefaultProxyPolicyMapper(),
new MockRegisteredServiceMapper(), new DefaultUsernameAttributeProviderMapper(),
Collections.singletonList(new AttributeFormDataPopulator(this.repository)));
this.controller = new RegisteredServiceSimpleFormController(this.manager, this.registeredServiceFactory);
final MockRegisteredService r = new MockRegisteredService();
r.setId(1000);
r.setName("Test Service");
r.setServiceId(TEST_ID);
r.setDescription(DESCRIPTION);
this.manager.save(r);
r.setServiceId("serviceId1");
final RegisteredServiceEditBean.ServiceData data = registeredServiceFactory.createServiceData(r);
this.controller.saveService(new MockHttpServletRequest(), new MockHttpServletResponse(), data, mock(BindingResult.class));
assertFalse(this.manager.getAllServices().isEmpty());
final RegisteredService r2 = this.manager.findServiceBy(1000);
assertEquals("serviceId1", r2.getServiceId());
assertTrue(r2 instanceof MockRegisteredService);
}
private static class MockRegisteredService extends RegexRegisteredService {
private static final long serialVersionUID = -7746061989010390744L;
@Override
protected AbstractRegisteredService newInstance() {
return new MockRegisteredService();
}
}
private static class MockRegisteredServiceMapper implements RegisteredServiceMapper {
private final RegisteredServiceMapper base = new DefaultRegisteredServiceMapper();
@Override
public void mapRegisteredService(final RegisteredService svc, final RegisteredServiceEditBean.ServiceData bean) {
base.mapRegisteredService(svc, bean);
if (svc instanceof MockRegisteredService) {
bean.setCustomComponent("mock", Collections.singletonMap("service_type", "MockRegisteredService"));
}
}
@Override
public void mapRegisteredService(final RegisteredService svc, final RegisteredServiceViewBean bean) {
base.mapRegisteredService(svc, bean);
}
@Override
public RegisteredService toRegisteredService(final RegisteredServiceEditBean.ServiceData data) {
final RegisteredService baseSvc = base.toRegisteredService(data);
// return base svc if this isn't a MockRegisteredService
final Map<String, ?> mockComponent = data.getCustomComponent("mock");
if (mockComponent == null || !"MockRegisteredService".equals(mockComponent.get("service_type"))) {
return baseSvc;
}
// copy data from baseSvc to MockRegisteredService
final MockRegisteredService svc = new MockRegisteredService();
svc.copyFrom(baseSvc);
return svc;
}
}
}