Adobe-Consulting-Services/acs-aem-commons

View on GitHub
bundle/src/test/java/com/adobe/acs/commons/wcm/impl/PagesReferenceProviderTest.java

Summary

Maintainability
A
0 mins
Test Coverage
/*
 * ACS AEM Commons
 *
 * Copyright (C) 2013 - 2023 Adobe
 *
 * Licensed 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 com.adobe.acs.commons.wcm.impl;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import com.day.cq.wcm.api.Page;
import com.day.cq.wcm.api.PageManager;
import com.day.cq.wcm.api.reference.Reference;

@RunWith(MockitoJUnitRunner.class)
public class PagesReferenceProviderTest {

    @Rule
    public SlingContext context = new SlingContext();

    private PagesReferenceProvider instance;

    @Mock
    private PageManager pageManager;

    @Before
    public void setUp() throws Exception {
        instance = new PagesReferenceProvider();
        instance.activate(Collections.emptyMap());
        context.registerAdapter(ResourceResolver.class, PageManager.class, new Function<ResourceResolver, PageManager>() {
            @Nullable
            @Override
            public PageManager apply(@Nullable ResourceResolver input) {
                return pageManager;
            }
        });

        context.load().json(getClass().getResourceAsStream("PagesReferenceProviderTest.json"), "/content/geometrixx");

        registerPage("/content/geometrixx/en", "geometrixx");
        registerPage("/content/geometrixx/en/toolbar", "geometrixx1");
        registerPage("/content/geometrixx/reftoself", "to self");
    }

    @Test
    public void testSingleReferenceToaPage() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/oneref/jcr:content"));
        assertNotNull(actual);
        assertEquals(1, actual.size());
        assertEquals("geometrixx (Page)", actual.get(0).getName());

    }

    @Test
    public void testNoReferenceToAnyPage() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/noref/jcr:content"));
        assertNotNull(actual);
        assertEquals(0, actual.size());
    }

    @Test
    public void testReferenceToMissingPage() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/badref/jcr:content"));
        assertNotNull(actual);
        assertEquals(0, actual.size());
    }

    @Test
    public void testSingleReferenceToManyPages() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/tworefs/jcr:content"));

        assertNotNull(actual);
        assertEquals(2, actual.size());

        assertArrayEquals(new String[] { "geometrixx (Page)", "geometrixx1 (Page)" }, toArrayOfNames(actual));
    }

    @Test
    public void testReferenceOnChildNode() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/tworefsChild/jcr:content"));

        assertNotNull(actual);
        assertEquals(2, actual.size());

        assertArrayEquals(new String[] { "geometrixx (Page)", "geometrixx1 (Page)" }, toArrayOfNames(actual));
    }

    @Test
    public void testManyReferenceToSinglePages() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/tworefsSamePage/jcr:content"));

        assertNotNull(actual);
        assertEquals(1, actual.size());
        assertEquals("geometrixx (Page)", actual.get(0).getName());

    }

    @Test
    public void testMultiValuedProp() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/mvRef/jcr:content"));

        assertNotNull(actual);
        assertEquals(2, actual.size());

        assertArrayEquals(new String[] { "geometrixx (Page)", "geometrixx1 (Page)" }, toArrayOfNames(actual));
    }

    @Test
    public void testMultiValuedPropWithOther() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/mvRefSamePage/jcr:content"));

        assertNotNull(actual);
        assertEquals(2, actual.size());

        assertArrayEquals(new String[] { "geometrixx (Page)", "geometrixx1 (Page)" }, toArrayOfNames(actual));
    }

    @Test
    public void testMultipleReferencesReferenceToPages() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/commaSeparated/jcr:content"));

        assertNotNull(actual);
        assertEquals(2, actual.size());

        assertArrayEquals(new String[] { "geometrixx (Page)", "geometrixx1 (Page)" }, toArrayOfNames(actual));

    }

    @Test
    public void testRefToSelf() throws Exception {
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/reftoself/jcr:content"));

        assertNotNull(actual);
        assertEquals(1, actual.size());
        assertEquals("geometrixx (Page)", actual.get(0).getName());

    }

    @Test
    public void testPageReferenceResourcePath() throws Exception {
        // The references resource should point to the cq:Page and not the [cq:Pages]/jcr:content per https://github.com/Adobe-Consulting-Services/acs-aem-commons/issues/1283
        List<Reference> actual = instance.findReferences(context.resourceResolver().getResource("/content/geometrixx/oneref/jcr:content"));
        assertNotNull(actual);
        assertEquals(1, actual.size());
        assertEquals("/content/geometrixx/en", actual.get(0).getResource().getPath());
    }

    private Page registerPage(String path, String name) {
        Page result = mock(Page.class, path);
        when(pageManager.getContainingPage(path)).thenReturn(result);
        when(result.getName()).thenReturn(name);
        when(result.getLastModified()).thenReturn(Calendar.getInstance());
        when(result.getContentResource()).then(i -> context.resourceResolver().getResource(path + "/jcr:content"));
        return result;
    }

    private Object[] toArrayOfNames(List<Reference> actual) {
        return actual.stream().map(p -> p.getName()).sorted().collect(Collectors.toList()).toArray();
    }
}