package com.adobe.acs.commons.wcm.impl; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.wrappers.ModifiableValueMapDecorator; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class PropertyMergePostProcessorTest { @InjectMocks PropertyMergePostProcessor propertyMerge = new PropertyMergePostProcessor(); @Mock Resource resource; @Mock ResourceResolver resourceResolver; ModifiableValueMap properties = new ModifiableValueMapDecorator(new HashMap<String, Object>()); @Before public void setUp() throws Exception { when(resource.getResourceResolver()).thenReturn(resourceResolver); doNothing().when(resourceResolver).commit(); } @Test public void testMerge_NoDuplicates_String() throws Exception { properties.put("cats", new String[]{ "felix", "hobbes", "fluffy" }); properties.put("dogs", new String[]{ "snoopy", "ira", "fluffy" }); properties.put("fish", "nemo"); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "animals", Arrays.asList("cats", "dogs", "fish"), String.class, false); Assert.assertArrayEquals(new String[]{ "felix", "hobbes", "fluffy", "snoopy", "ira", "nemo" }, properties.get("animals", String[].class)); } @Test public void testMerge_NoDuplicates_Long() throws Exception { properties.put("odd", new Long[]{ 1L, 3L }); properties.put("even", new Long[]{ 2L, 4L }); properties.put("duplicates", new Long[]{ 1L, 2L, 3L, 4L }); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "longs", Arrays.asList("even", "odd", "duplicates"), Long.class, false); Assert.assertArrayEquals(new Long[]{ 2L, 4L, 1L, 3L }, properties.get("longs", Long[].class)); } @Test public void testMerge_NoDuplicates_Double() throws Exception { properties.put("tenths", new Double[]{ 1.1D, 1.2D }); properties.put("hundredths", 3.01D); properties.put("duplicates", new Double[]{ 1.1D }); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "doubles", Arrays.asList("tenths", "hundredths", "duplicates"), Double.class, false); Assert.assertArrayEquals(new Double[]{ 1.1D, 1.2D, 3.01D }, properties.get("doubles", Double[].class)); } @Test public void testMerge_NoDuplicates_Boolean() throws Exception { properties.put("first", new Boolean[]{ true, false, true }); properties.put("second", true); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "booleans", Arrays.asList("first", "second"), Boolean.class, false); Assert.assertArrayEquals(new Boolean[]{ true, false }, properties.get("booleans", Boolean[].class)); } @Test public void testMerge_NoDuplicates_Calendar() throws Exception { Calendar january = Calendar.getInstance(); january.set(2015, Calendar.JANUARY, 1); Calendar july = Calendar.getInstance(); july.set(2015, Calendar.JULY, 4); Calendar september = Calendar.getInstance(); september.set(2015, Calendar.SEPTEMBER, 16); properties.put("cold", new Calendar[] { january, september }); properties.put("hot", new Calendar[]{ july, september }); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "dates", Arrays.asList("cold", "hot"), Calendar.class, false); Assert.assertArrayEquals(new Calendar[]{ january, september, july }, properties.get("dates", Calendar[].class)); } @Test public void testMerge_Duplicates_String() throws Exception { properties.put("cats", new String[]{ "felix", "hobbes", "fluffy" }); properties.put("dogs", new String[]{ "snoopy", "ira", "fluffy" }); properties.put("fish", "nemo"); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "animals", Arrays.asList("cats", "dogs", "fish"), String.class, true); Assert.assertArrayEquals(new String[]{ "felix", "hobbes", "fluffy", "snoopy", "ira", "fluffy", "nemo" }, properties.get("animals", String[].class)); } @Test public void testMerge_Duplicates_Calendar() throws Exception { Calendar january = Calendar.getInstance(); january.set(2015, Calendar.JANUARY, 1); Calendar july = Calendar.getInstance(); july.set(2015, Calendar.JULY, 4); Calendar september = Calendar.getInstance(); september.set(2015, Calendar.SEPTEMBER, 16); properties.put("cold", new Calendar[] { january, september }); properties.put("hot", new Calendar[]{ july, september }); when(resource.adaptTo(ModifiableValueMap.class)).thenReturn(properties); propertyMerge.merge(resource, "dates", Arrays.asList("cold", "hot"), Calendar.class, true); Assert.assertArrayEquals(new Calendar[]{ january, september, july, september }, properties.get("dates", Calendar[].class)); } }