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")));
+ }
+
+}