package org.apereo.cas.services.support;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.FileUtils;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.services.RegisteredServiceAttributeFilter;
import org.apereo.cas.util.CollectionUtils;
import org.apereo.cas.util.serialization.SerializationUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* @author Misagh Moayyed
* @since 5.1.0
*/
public class RegisteredServiceMappedRegexAttributeFilterTests {
private static final File JSON_FILE = new File(FileUtils.getTempDirectoryPath(), "registeredServiceMappedRegexAttributeFilter.json");
private static final ObjectMapper MAPPER = new ObjectMapper();
private static final String PHONE = "phone";
private static final String FAMILY_NAME = "familyName";
private static final String GIVEN_NAME = "givenName";
private static final String UID = "uid";
private final RegisteredServiceMappedRegexAttributeFilter filter;
private final Map<String, Object> givenAttributesMap;
@Mock
private RegisteredService registeredService;
public RegisteredServiceMappedRegexAttributeFilterTests() {
this.filter = new RegisteredServiceMappedRegexAttributeFilter();
this.givenAttributesMap = new HashMap<>();
this.givenAttributesMap.put(UID, "loggedInTestUid");
this.givenAttributesMap.put(PHONE, "1290");
this.givenAttributesMap.put(FAMILY_NAME, "Smith");
this.givenAttributesMap.put(GIVEN_NAME, "John");
this.givenAttributesMap.put("employeeId", "E1234");
this.givenAttributesMap.put("memberOf", Arrays.asList("math", "science", "chemistry", "marathon"));
this.givenAttributesMap.put("arrayAttribute", new String[]{"math", "science", "chemistry"});
this.givenAttributesMap.put("setAttribute", Stream.of("math", "science", "chemistry").collect(Collectors.toSet()));
final Map<String, String> mapAttributes = new HashMap<>();
mapAttributes.put(UID, "loggedInTestUid");
mapAttributes.put(PHONE, "890");
mapAttributes.put(FAMILY_NAME, "Smith");
this.givenAttributesMap.put("mapAttribute", mapAttributes);
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(this.registeredService.getName()).thenReturn("sample test service");
when(this.registeredService.getServiceId()).thenReturn("https://www.jasig.org");
}
@Test
public void verifyPatternFilter() {
this.filter.setPatterns(Collections.singletonMap("memberOf", "^m"));
final Map<String, Object> attrs = this.filter.filter(this.givenAttributesMap);
assertEquals(attrs.size(), this.givenAttributesMap.size());
assertEquals(CollectionUtils.toCollection(attrs.get("memberOf")).size(), 2);
}
@Test
public void verifyPatternFilterExcludeUnmatched() {
this.filter.setPatterns(Collections.singletonMap("memberOf", "^m"));
this.filter.setExcludeUnmappedAttributes(true);
final Map<String, Object> attrs = this.filter.filter(this.givenAttributesMap);
assertEquals(attrs.size(), 1);
assertEquals(CollectionUtils.toCollection(attrs.get("memberOf")).size(), 2);
}
@Test
public void verifyPatternFilterFullMatch() {
this.filter.setPatterns(Collections.singletonMap("memberOf", "^m"));
this.filter.setCompleteMatch(true);
final Map<String, Object> attrs = this.filter.filter(this.givenAttributesMap);
assertEquals(attrs.size(), this.givenAttributesMap.size() - 1);
assertFalse(attrs.containsKey("memberOf"));
}
@Test
public void verifySerialization() {
final byte[] data = SerializationUtils.serialize(this.filter);
final RegisteredServiceAttributeFilter secondFilter =
SerializationUtils.deserializeAndCheckObject(data, RegisteredServiceAttributeFilter.class);
assertEquals(secondFilter, this.filter);
}
@Test
public void verifySerializeARegisteredServiceRegexAttributeFilterToJson() throws IOException {
this.filter.setPatterns(Collections.singletonMap("memberOf", "^\\w{3}$"));
MAPPER.writeValue(JSON_FILE, this.filter);
final RegisteredServiceAttributeFilter filterRead = MAPPER.readValue(JSON_FILE, RegisteredServiceMappedRegexAttributeFilter.class);
assertEquals(filter, filterRead);
}
}