Author: cziegeler
Date: Fri Mar 24 16:27:37 2017
New Revision: 1788498

URL: http://svn.apache.org/viewvc?rev=1788498&view=rev
Log:
SLING-6710 : Vanity Path might get removed if a resource is updated

Modified:
    
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java

Modified: 
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java?rev=1788498&r1=1788497&r2=1788498&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
 (original)
+++ 
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
 Fri Mar 24 16:27:37 2017
@@ -57,6 +57,8 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.resource.observation.ResourceChange;
+import org.apache.sling.api.resource.observation.ResourceChange.ChangeType;
 import org.apache.sling.api.resource.path.Path;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.resourceresolver.impl.ResourceResolverImpl;
@@ -297,6 +299,78 @@ public class MapEntriesTest {
 
     }
 
+    @Test
+    public void test_vanity_path_updates() throws Exception {
+        Resource parent = mock(Resource.class, "parent");
+        when(parent.getPath()).thenReturn("/foo/parent");
+        when(parent.getName()).thenReturn("parent");
+        when(parent.getValueMap()).thenReturn(new 
ValueMapDecorator(Collections.<String, Object>emptyMap()));
+        
when(resourceResolver.getResource(parent.getPath())).thenReturn(parent);
+
+        Resource child = mock(Resource.class, "jcrcontent");
+        when(child.getPath()).thenReturn("/foo/parent/jcr:content");
+        when(child.getName()).thenReturn("jcr:content");
+        when(child.getValueMap()).thenReturn(buildValueMap("sling:vanityPath", 
"/target/found"));
+        when(child.getParent()).thenReturn(parent);
+        when(parent.getChild(child.getName())).thenReturn(child);
+        when(resourceResolver.getResource(child.getPath())).thenReturn(child);
+
+        when(resourceResolver.findResources(anyString(), 
eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() {
+
+            @Override
+            public Iterator<Resource> answer(InvocationOnMock invocation) 
throws Throwable {
+                return Collections.<Resource> emptySet().iterator();
+            }
+        });
+
+        mapEntries.doInit();
+        mapEntries.initializeVanityPaths();
+
+        // map entries should have no alias atm
+        assertTrue( mapEntries.getResolveMaps().isEmpty());
+
+        // add parent
+        mapEntries.onChange(Arrays.asList(new ResourceChange(ChangeType.ADDED, 
parent.getPath(), false)));
+        assertTrue( mapEntries.getResolveMaps().isEmpty());
+
+        // add child
+        mapEntries.onChange(Arrays.asList(new ResourceChange(ChangeType.ADDED, 
child.getPath(), false)));
+
+        // two entries for the vanity path
+        List<MapEntry> entries = mapEntries.getResolveMaps();
+        assertEquals(2, entries.size());
+        for (MapEntry entry : entries) {
+            assertTrue(entry.getPattern().contains("/target/found"));
+        }
+
+        // update parent - no change
+        mapEntries.onChange(Arrays.asList(new 
ResourceChange(ChangeType.CHANGED, parent.getPath(), false)));
+        entries = mapEntries.getResolveMaps();
+        assertEquals(2, entries.size());
+        for (MapEntry entry : entries) {
+            assertTrue(entry.getPattern().contains("/target/found"));
+        }
+
+        // update child - no change
+        mapEntries.onChange(Arrays.asList(new 
ResourceChange(ChangeType.CHANGED, child.getPath(), false)));
+        entries = mapEntries.getResolveMaps();
+        assertEquals(2, entries.size());
+        for (MapEntry entry : entries) {
+            assertTrue(entry.getPattern().contains("/target/found"));
+        }
+
+        // remove child - empty again
+        when(resourceResolver.getResource(child.getPath())).thenReturn(null);
+        when(parent.getChild(child.getName())).thenReturn(null);
+        mapEntries.onChange(Arrays.asList(new 
ResourceChange(ChangeType.REMOVED, child.getPath(), false)));
+        assertTrue( mapEntries.getResolveMaps().isEmpty());
+
+        // remove parent - still empty
+        when(resourceResolver.getResource(parent.getPath())).thenReturn(null);
+        mapEntries.onChange(Arrays.asList(new 
ResourceChange(ChangeType.REMOVED, parent.getPath(), false)));
+        assertTrue( mapEntries.getResolveMaps().isEmpty());
+    }
+
     private ValueMap buildValueMap(Object... string) {
         final Map<String, Object> data = new HashMap<>();
         for (int i = 0; i < string.length; i = i + 2) {


Reply via email to