You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2021/01/11 21:15:39 UTC

[sling-org-apache-sling-testing-resourceresolver-mock] 01/01: SLING-10003 allow to provide mocked search results for findResources and queryResources

This is an automated email from the ASF dual-hosted git repository.

sseifert pushed a commit to branch feature/SLING-10003-mock-find-query-resources
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-resourceresolver-mock.git

commit 24e8fee7a1c75ce050f9394b5cf6dc5a2913df84
Author: Stefan Seifert <st...@users.noreply.github.com>
AuthorDate: Mon Jan 11 22:15:04 2021 +0100

    SLING-10003 allow to provide mocked search results for findResources and queryResources
---
 .../resourceresolver/MockFindResourcesHandler.java |  41 ++++++++
 .../resourceresolver/MockQueryResourceHandler.java |  41 ++++++++
 .../resourceresolver/MockResourceResolver.java     |  44 ++++++--
 .../resourceresolver/FindQueryResourcesTest.java   | 116 +++++++++++++++++++++
 4 files changed, 234 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/apache/sling/testing/resourceresolver/MockFindResourcesHandler.java b/src/main/java/org/apache/sling/testing/resourceresolver/MockFindResourcesHandler.java
new file mode 100644
index 0000000..03798cd
--- /dev/null
+++ b/src/main/java/org/apache/sling/testing/resourceresolver/MockFindResourcesHandler.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.sling.testing.resourceresolver;
+
+import java.util.Iterator;
+
+import org.apache.sling.api.resource.Resource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
+
+/**
+ * Can provide a result when finding resources using a certain query/language.
+ */
+@ConsumerType
+public interface MockFindResourcesHandler {
+
+    /**
+     * @param query Query
+     * @param language Language
+     * @return Returns a non-null value if a mocked result is available 
+     */
+    @Nullable Iterator<Resource> findResources(final @NotNull String query, final String language);
+
+}
diff --git a/src/main/java/org/apache/sling/testing/resourceresolver/MockQueryResourceHandler.java b/src/main/java/org/apache/sling/testing/resourceresolver/MockQueryResourceHandler.java
new file mode 100644
index 0000000..8710006
--- /dev/null
+++ b/src/main/java/org/apache/sling/testing/resourceresolver/MockQueryResourceHandler.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.sling.testing.resourceresolver;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.osgi.annotation.versioning.ConsumerType;
+
+/**
+ * Can provide a result when querying for resources using a certain query/language.
+ */
+@ConsumerType
+public interface MockQueryResourceHandler {
+
+    /**
+     * @param query Query
+     * @param language Language
+     * @return Returns a non-null value if a mocked result is available 
+     */
+    @Nullable Iterator<Map<String, Object>> queryResources(@NotNull String query, String language);
+
+}
diff --git a/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java b/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
index c4eb210..68041ac 100644
--- a/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
+++ b/src/main/java/org/apache/sling/testing/resourceresolver/MockResourceResolver.java
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -60,6 +61,9 @@ public class MockResourceResolver extends SlingAdaptable implements ResourceReso
     private final MockResourceResolverFactory factory;
     
     private final Map<String,Object> attributes;
+    
+    private final List<MockFindResourcesHandler> findResourcesHandlers = new ArrayList<>();
+    private final List<MockQueryResourceHandler> queryResourcesHandlers = new ArrayList<>();
 
     public MockResourceResolver(final MockResourceResolverFactoryOptions options,
             final MockResourceResolverFactory factory,
@@ -447,22 +451,46 @@ public class MockResourceResolver extends SlingAdaptable implements ResourceReso
         return this.getResource(parentPath);
     }
 
+    @Override
+    @SuppressWarnings("null")
+    public @NotNull Iterator<Resource> findResources(final @NotNull String query, final String language) {
+        return findResourcesHandlers.stream()
+            .map(handler -> handler.findResources(query, language))
+            .filter(Objects::nonNull)
+            .findFirst()
+            .orElse(Collections.emptyIterator());
+    }
 
-    // --- unsupported operations ---
+    /**
+     * @param handler Handler that can provide a mocked find resources result.
+     */
+    public void addFindResourceHandler(@NotNull MockFindResourcesHandler handler) {
+        findResourcesHandlers.add(handler);
+    }
 
     @Override
-    @Deprecated
-    public @NotNull Resource resolve(final @NotNull HttpServletRequest request) {
-        throw new UnsupportedOperationException();
+    @SuppressWarnings("null")
+    public @NotNull Iterator<Map<String, Object>> queryResources(@NotNull String query, String language) {
+        return queryResourcesHandlers.stream()
+                .map(handler -> handler.queryResources(query, language))
+                .filter(Objects::nonNull)
+                .findFirst()
+                .orElse(Collections.emptyIterator());
     }
 
-    @Override
-    public @NotNull Iterator<Resource> findResources(final @NotNull String query, final String language) {
-        throw new UnsupportedOperationException();
+    /**
+     * @param handler Handler that can provide a mocked query resources result.
+     */
+    public void addQueryResourceHandler(@NotNull MockQueryResourceHandler handler) {
+        queryResourcesHandlers.add(handler);
     }
 
+
+    // --- unsupported operations ---
+
     @Override
-    public @NotNull Iterator<Map<String, Object>> queryResources(@NotNull String query, String language) {
+    @Deprecated
+    public @NotNull Resource resolve(final @NotNull HttpServletRequest request) {
         throw new UnsupportedOperationException();
     }
 
diff --git a/src/test/java/org/apache/sling/testing/resourceresolver/FindQueryResourcesTest.java b/src/test/java/org/apache/sling/testing/resourceresolver/FindQueryResourcesTest.java
new file mode 100644
index 0000000..cc53d6d
--- /dev/null
+++ b/src/test/java/org/apache/sling/testing/resourceresolver/FindQueryResourcesTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.sling.testing.resourceresolver;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Tests finding/querying for resources.
+ */
+@SuppressWarnings("null")
+public class FindQueryResourcesTest {
+
+    private ResourceResolver resourceResolver;
+    private Resource resource1;
+    private Resource resource2;
+
+    @Before
+    public void setUp() throws IOException, LoginException {
+        resourceResolver = new MockResourceResolverFactory().getResourceResolver(null);
+
+        MockHelper.create(resourceResolver)
+            .resource("/resource1").p("prop1", "value1")
+            .resource("/resource2").p("prop1", "value2")
+            .commit();
+        resource1 = resourceResolver.getResource("/resource1");
+        resource2 = resourceResolver.getResource("/resource2");
+    }
+
+    @Test
+    public void testFindResourcesNoHandler() {
+        Iterator<Resource> result = resourceResolver.findResources("any-query", "any-language");
+        assertFalse(result.hasNext());
+    }
+
+    @Test
+    public void testFindResourcesSingleHandler() {
+        List<Resource> expected = ImmutableList.of(resource1, resource2);
+        ((MockResourceResolver)resourceResolver).addFindResourceHandler((query, language) -> expected.iterator()); 
+
+        assertEquals(expected, ImmutableList.copyOf(resourceResolver.findResources("any-query", "any-language")));
+    }
+
+    @Test
+    public void testFindResourcesMultipleHandlers() {
+        List<Resource> expected1 = ImmutableList.of(resource1);
+        ((MockResourceResolver)resourceResolver).addFindResourceHandler((query, language) -> 
+            StringUtils.equals(query, "q1") ? expected1.iterator() : null); 
+
+        List<Resource> expected2 = ImmutableList.of(resource2);
+        ((MockResourceResolver)resourceResolver).addFindResourceHandler((query, language) -> 
+            StringUtils.equals(query, "q2") ? expected2.iterator() : null); 
+
+        assertEquals(expected1, ImmutableList.copyOf(resourceResolver.findResources("q1", "any-language")));
+        assertEquals(expected2, ImmutableList.copyOf(resourceResolver.findResources("q2", "any-language")));
+    }
+
+    @Test
+    public void testQueryResourcesNoHandler() {
+        Iterator<Map<String,Object>> result = resourceResolver.queryResources("any-query", "any-language");
+        assertFalse(result.hasNext());
+    }
+
+    @Test
+    public void testQueryResourcesSingleHandler() {
+        List<Map<String,Object>> expected = ImmutableList.of(resource1.getValueMap(), resource2.getValueMap());
+        ((MockResourceResolver)resourceResolver).addQueryResourceHandler((query, language) -> expected.iterator()); 
+
+        assertEquals(expected, ImmutableList.copyOf(resourceResolver.queryResources("any-query", "any-language")));
+    }
+
+    @Test
+    public void testQueryResourcesMultipleHandlers() {
+        List<Map<String,Object>> expected1 = ImmutableList.of(resource1.getValueMap());
+        ((MockResourceResolver)resourceResolver).addQueryResourceHandler((query, language) -> 
+            StringUtils.equals(query, "q1") ? expected1.iterator() : null); 
+
+        List<Map<String,Object>> expected2 = ImmutableList.of(resource2.getValueMap());
+        ((MockResourceResolver)resourceResolver).addQueryResourceHandler((query, language) -> 
+            StringUtils.equals(query, "q2") ? expected2.iterator() : null); 
+
+        assertEquals(expected1, ImmutableList.copyOf(resourceResolver.queryResources("q1", "any-language")));
+        assertEquals(expected2, ImmutableList.copyOf(resourceResolver.queryResources("q2", "any-language")));
+    }
+
+}