This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch bugfix/allow-import-of-jcr-mixintypes in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-sling-mock.git
commit 69410514c7d637b9ac24768f473912ee7a9bb5bb Author: Konrad Windszus <[email protected]> AuthorDate: Thu May 8 20:25:12 2025 +0200 SLING-12779 Allow content loading of jcr:mixinTypes for all resource resolver types --- .../testing/mock/sling/loader/ContentLoader.java | 4 +--- .../AbstractContentLoaderFileVaultXmlTest.java | 25 ++++++++++++++++++++++ .../loader/AbstractContentLoaderJsonTest.java | 24 +++++++++++++++++++++ .../resources/json-import-samples/content.json | 1 + .../content/samples/en/.content.xml | 1 + 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java index 86ed548..97583f9 100644 --- a/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java +++ b/core/src/main/java/org/apache/sling/testing/mock/sling/loader/ContentLoader.java @@ -80,9 +80,7 @@ public final class ContentLoader { .collect(Collectors.toSet()); // set of resource or property names that are ignored when other resource resolver types than JCR_OAK are used - private static final Set<String> MOCK_IGNORED_NAMES = Stream.concat( - SHARED_IGNORED_NAMES.stream(), Stream.of(JcrConstants.JCR_MIXINTYPES)) - .collect(Collectors.toSet()); + private static final Set<String> MOCK_IGNORED_NAMES = SHARED_IGNORED_NAMES; // set of resource or property names that are ignored when JCR_OAK resource resolver type (= a real repo impl) is // used diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java index 0f31a95..ba4a62a 100644 --- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java +++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderFileVaultXmlTest.java @@ -21,8 +21,11 @@ package org.apache.sling.testing.mock.sling.loader; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.Resource; @@ -36,6 +39,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -99,6 +103,12 @@ public abstract class AbstractContentLoaderFileVaultXmlTest { assertPrimaryNodeType(resource, "app:PageContent"); } + @Test + public void testPageContentMixinTypes() throws RepositoryException { + Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content"); + assertMixinTypes(resource, "app:TestMixin"); + } + @Test public void testPageContentProperties() { Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content"); @@ -116,4 +126,19 @@ public abstract class AbstractContentLoaderFileVaultXmlTest { assertEquals(nodeType, props.get(JcrConstants.JCR_PRIMARYTYPE)); } } + + private void assertMixinTypes(final Resource resource, String... mixinTypes) throws RepositoryException { + Node node = resource.adaptTo(Node.class); + if (node != null) { + assertArrayEquals( + mixinTypes, + Stream.of(node.getMixinNodeTypes()) + .map(NodeType::getName) + .collect(Collectors.toSet()) + .toArray(new String[0])); + } else { + ValueMap props = ResourceUtil.getValueMap(resource); + assertArrayEquals(mixinTypes, props.get(JcrConstants.JCR_MIXINTYPES, String[].class)); + } + } } diff --git a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java index 30c2153..c53bd14 100644 --- a/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java +++ b/core/src/test/java/org/apache/sling/testing/mock/sling/loader/AbstractContentLoaderJsonTest.java @@ -21,10 +21,13 @@ package org.apache.sling.testing.mock.sling.loader; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; import java.util.Calendar; import java.util.List; import java.util.TimeZone; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.Resource; @@ -88,6 +91,12 @@ public abstract class AbstractContentLoaderJsonTest { assertPrimaryNodeType(resource, "app:Page"); } + @Test + public void testPageContentMixinTypes() throws RepositoryException { + Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content"); + assertMixinTypes(resource, "app:TestMixin"); + } + @Test public void testPageContentResourceType() { Resource resource = context.resourceResolver().getResource(path + "/sample/en/toolbar/profiles/jcr:content"); @@ -144,6 +153,21 @@ public abstract class AbstractContentLoaderJsonTest { } } + private void assertMixinTypes(final Resource resource, String... mixinTypes) throws RepositoryException { + Node node = resource.adaptTo(Node.class); + if (node != null) { + assertArrayEquals( + mixinTypes, + Stream.of(node.getMixinNodeTypes()) + .map(NodeType::getName) + .collect(Collectors.toSet()) + .toArray(new String[0])); + } else { + ValueMap props = ResourceUtil.getValueMap(resource); + assertArrayEquals(mixinTypes, props.get(JcrConstants.JCR_MIXINTYPES, String[].class)); + } + } + @Test public void testCalendarEcmaFormat() { Resource resource = context.resourceResolver().getResource(path + "/sample/en/jcr:content"); diff --git a/core/src/test/resources/json-import-samples/content.json b/core/src/test/resources/json-import-samples/content.json index c1fa7de..2784b31 100644 --- a/core/src/test/resources/json-import-samples/content.json +++ b/core/src/test/resources/json-import-samples/content.json @@ -4,6 +4,7 @@ "jcr:created": "Thu Aug 07 2014 16:32:59 GMT+0200", "jcr:content": { "jcr:primaryType": "app:PageContent", + "jcr:mixinTypes": ["app:TestMixin"], "jcr:createdBy": "admin", "jcr:title": "English", "app:template": "/apps/sample/templates/homepage", diff --git a/core/src/test/resources/xml-jcr-import-samples/content/samples/en/.content.xml b/core/src/test/resources/xml-jcr-import-samples/content/samples/en/.content.xml index 09748dc..13d4844 100644 --- a/core/src/test/resources/xml-jcr-import-samples/content/samples/en/.content.xml +++ b/core/src/test/resources/xml-jcr-import-samples/content/samples/en/.content.xml @@ -24,6 +24,7 @@ app:deviceGroups="[/etc/mobile/groups/responsive]" app:template="samples/sample-app/templates/content/homepage" jcr:primaryType="app:PageContent" + jcr:mixinTypes="app:TestMixin" jcr:title="en" sling:resourceType="samples/sample-app/components/content/page/homepage" includeAside="{Boolean}true"
