package com.thinkbiganalytics.metadata.modeshape.support;
/*-
* #%L
* thinkbig-metadata-modeshape
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.thinkbiganalytics.metadata.api.MissingUserPropertyException;
import com.thinkbiganalytics.metadata.api.extension.UserFieldDescriptor;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
public class JcrPropertyUtilTest {
/**
* Verify getting user properties.
*/
@Test
public void getUserProperties() throws Exception {
// Mock properties
final Property prop1 = Mockito.mock(Property.class);
Mockito.when(prop1.getName()).thenReturn("*");
final Property prop2 = Mockito.mock(Property.class);
Mockito.when(prop2.getName()).thenReturn("usr:testProp");
Mockito.when(prop2.getString()).thenReturn("one");
final Property prop3 = Mockito.mock(Property.class);
Mockito.when(prop3.getName()).thenReturn("usr:%E7%A2%BC%E6%A8%99%E6%BA%96%E8%90%AC%E5%9C%8B%E7%A2%BC%2F1.1%2F%3Fname%3D%2520");
Mockito.when(prop3.getString()).thenReturn("two");
// Mock node
final Iterator<Property> delegateIter = ImmutableList.of(prop1, prop2, prop3).iterator();
final PropertyIterator propIter = Mockito.mock(PropertyIterator.class);
Mockito.when(propIter.hasNext()).thenAnswer(invocation -> delegateIter.hasNext());
Mockito.when(propIter.nextProperty()).thenAnswer(invocation -> delegateIter.next());
final Node node = Mockito.when(Mockito.mock(Node.class).getProperties()).thenReturn(propIter).getMock();
// Test user properties
final Map<String, String> userProps = JcrPropertyUtil.getUserProperties(node);
Assert.assertEquals(2, userProps.size());
Assert.assertEquals("one", userProps.get("testProp"));
Assert.assertEquals("two", userProps.get("碼標準萬國碼/1.1/?name=%20"));
}
/**
* Verify setting user properties.
*/
@Test
public void setUserProperties() throws Exception {
// Mock node
final Property oldProp = Mockito.when(Mockito.mock(Property.class).getName()).thenReturn("usr:oldProp").getMock();
final Iterator<Property> delegateIter = ImmutableList.of(oldProp).iterator();
final PropertyIterator propIter = Mockito.mock(PropertyIterator.class);
Mockito.when(propIter.hasNext()).thenAnswer(invocation -> delegateIter.hasNext());
Mockito.when(propIter.nextProperty()).thenAnswer(invocation -> delegateIter.next());
final Node node = Mockito.mock(Node.class);
Mockito.when(node.getProperties()).thenReturn(propIter);
// Mock field
final UserFieldDescriptor field = Mockito.mock(UserFieldDescriptor.class);
Mockito.when(field.getSystemName()).thenReturn("testProp");
Mockito.when(field.isRequired()).thenReturn(true);
// Test setting user properties
final Map<String, String> properties = ImmutableMap.of("testProp", "one", "碼標準萬國碼/1.1/?name=%20", "two");
JcrPropertyUtil.setUserProperties(node, Collections.singleton(field), properties);
Mockito.verify(node).setProperty("usr:testProp", "one");
Mockito.verify(node).setProperty("usr:%E7%A2%BC%E6%A8%99%E6%BA%96%E8%90%AC%E5%9C%8B%E7%A2%BC%2F1.1%2F%3Fname%3D%2520", "two");
Mockito.verify(node).getProperties();
Mockito.verify(oldProp).remove();
Mockito.verifyNoMoreInteractions(node);
}
/**
* Verify exception if a required property is not set.
*/
@Test(expected = MissingUserPropertyException.class)
public void setUserPropertiesWithMissing() {
// Mock field
final UserFieldDescriptor field = Mockito.mock(UserFieldDescriptor.class);
Mockito.when(field.getSystemName()).thenReturn("requiredProperty");
Mockito.when(field.isRequired()).thenReturn(true);
// Test required property
JcrPropertyUtil.setUserProperties(Mockito.mock(Node.class), Collections.singleton(field), Collections.emptyMap());
}
}