Package com.adobe.acs.commons.replication.dispatcher.impl

Source Code of com.adobe.acs.commons.replication.dispatcher.impl.DispatcherFlushRulesImplTest

/*
* #%L
* ACS AEM Commons Bundle
* %%
* Copyright (C) 2013 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.
* #L%
*/

package com.adobe.acs.commons.replication.dispatcher.impl;

import com.adobe.acs.commons.replication.dispatcher.DispatcherFlushFilter;
import com.adobe.acs.commons.replication.dispatcher.DispatcherFlusher;
import com.day.cq.replication.ReplicationAction;
import com.day.cq.replication.ReplicationActionType;
import com.day.cq.replication.ReplicationOptions;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Pattern;

import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

public class DispatcherFlushRulesImplTest {
    @Mock
    private DispatcherFlusher dispatcherFlusher;

    @Spy
    private Map<Pattern, String[]> hierarchicalFlushRules = new LinkedHashMap<Pattern, String[]>();

    @Spy
    private Map<Pattern, String[]> resourceOnlyFlushRules = new LinkedHashMap<Pattern, String[]>();

    @Mock
    private ResourceResolverFactory resourceResolverFactory;

    @InjectMocks
    private DispatcherFlushRulesImpl dispatcherFlushRules = new DispatcherFlushRulesImpl();

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        when(resourceResolverFactory.getAdministrativeResourceResolver(null)).thenReturn(mock(ResourceResolver.class));
    }

    @After
    public void tearDown() throws Exception {
        reset(dispatcherFlusher, resourceResolverFactory, hierarchicalFlushRules, resourceOnlyFlushRules);
    }

    @Test
    public void testConfigureReplicationActionType_ACTIVATE() throws Exception {
        final ReplicationActionType expected = ReplicationActionType.ACTIVATE;
        final ReplicationActionType actual = dispatcherFlushRules.configureReplicationActionType("ACTIVATE");

        assertEquals(expected, actual);
    }

    @Test
    public void testConfigureReplicationActionType_DELETE() throws Exception {
        final ReplicationActionType expected = ReplicationActionType.DELETE;
        final ReplicationActionType actual = dispatcherFlushRules.configureReplicationActionType("DELETE");

        assertEquals(expected, actual);
    }

    @Test
    public void testConfigureReplicationActionType_DEACTIVATE() throws Exception {
        final ReplicationActionType expected = ReplicationActionType.DEACTIVATE;
        final ReplicationActionType actual = dispatcherFlushRules.configureReplicationActionType("DEACTIVATE");

        assertEquals(expected, actual);
    }

    @Test
    public void testConfigureReplicationActionType_INHERIT() throws Exception {
        final ReplicationActionType expected = null;
        final ReplicationActionType actual = dispatcherFlushRules.configureReplicationActionType("INHERIT");

        assertEquals(expected, actual);
    }

    @Test
    public void testConfigureFlushRules() throws Exception {
        final Map<String, String> validFlushRules = new LinkedHashMap<String, String>();
        validFlushRules.put("/a/.*", "/b");
        validFlushRules.put("/b/.*", "/c");
        validFlushRules.put("/c/d/.*", "/e/f");
        validFlushRules.put("/c/a/.*", "/e/f,/g/h");

        final Map<Pattern, String[]> expected = new LinkedHashMap<Pattern, String[]>();
        expected.put(Pattern.compile("/a/.*"), new String[] { "/b" });
        expected.put(Pattern.compile("/b/.*"), new String[] { "/c" });
        expected.put(Pattern.compile("/c/d/.*"), new String[] { "/e/f" });
        expected.put(Pattern.compile("/c/a/.*"), new String[] { "/e/f", "/g/h" });

        final Map<Pattern, String[]> actual = dispatcherFlushRules.configureFlushRules(validFlushRules);

        final Pattern[] expectedPatterns = expected.keySet().toArray(new Pattern[0]);
        final Pattern[] actualPatterns = actual.keySet().toArray(new Pattern[0]);
        final String[][] expectedValues = expected.values().toArray(new String[0][0]);
        final String[][] actualValues = actual.values().toArray(new String[0][0]);

        assertEquals(expected.size(), actual.size());

        for(int i = 0; i < expected.size(); i++) {
            assertEquals(expectedPatterns[i].pattern(), actualPatterns[i].pattern());
        }
        assertArrayEquals(expectedValues, actualValues);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionIsNull() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(9);
        when(this.resourceOnlyFlushRules.size()).thenReturn(9);

        dispatcherFlushRules.preprocess(null, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }


    @Test
    public void testPreprocess_notAccepts_ReplicationOptionsIsNull() throws Exception {
        when(hierarchicalFlushRules.size()).thenReturn(9);

        dispatcherFlushRules.preprocess(new ReplicationAction(ReplicationActionType.ACTIVATE, "/content/foo"), null);

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionNoFlushRules() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(0);
        when(this.resourceOnlyFlushRules.size()).thenReturn(0);

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons");

        dispatcherFlushRules.preprocess(replicationAction, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionPathEmpty() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(9);
        when(this.resourceOnlyFlushRules.size()).thenReturn(9);

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("");

        dispatcherFlushRules.preprocess(replicationAction, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionPathNull() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(9);
        when(this.resourceOnlyFlushRules.size()).thenReturn(9);

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn(null);

        dispatcherFlushRules.preprocess(replicationAction, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionTypeInternalPoll() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(9);
        when(this.resourceOnlyFlushRules.size()).thenReturn(9);

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.INTERNAL_POLL);

        dispatcherFlushRules.preprocess(replicationAction, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_ReplicationActionTypeTest() throws Exception {
        when(this.hierarchicalFlushRules.size()).thenReturn(9);
        when(this.resourceOnlyFlushRules.size()).thenReturn(9);

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.TEST);

        dispatcherFlushRules.preprocess(replicationAction, new ReplicationOptions());

        verifyZeroInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_notAccepts_NonMatchingPath() throws Exception {
        this.hierarchicalFlushRules.put(Pattern.compile("/content/foo.*"), new String[] { "/content/target" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verifyZeroInteractions(dispatcherFlusher);
    }


    @Test
    public void testPreprocess_success_hierarchical() throws Exception {
        hierarchicalFlushRules.put(Pattern.compile("/content/acs-aem-commons/.*"), new String[] { "/content/target", "/content/target2" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target"));

        assertEquals(DispatcherFlushFilter.FlushType.Hierarchical, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target2"));

        assertEquals(DispatcherFlushFilter.FlushType.Hierarchical, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_success_resourceOnly() throws Exception {
        resourceOnlyFlushRules.put(Pattern.compile("/content/acs-aem-commons/.*"), new String[] { "/content/target" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target"));

        assertEquals(DispatcherFlushFilter.FlushType.ResourceOnly, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_success_hierarchicalAndResourceOnly() throws Exception {
        hierarchicalFlushRules.put(Pattern.compile("/content/.*"), new String[] { "/content/hierarchical" });
        resourceOnlyFlushRules.put(Pattern.compile("/content/.*"), new String[] { "/content/resource-only" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);
        replicationOptions.setFilter(new DispatcherFlushFilter());

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/hierarchical"));

        assertEquals(DispatcherFlushFilter.FlushType.Hierarchical, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/resource-only"));

        assertEquals(DispatcherFlushFilter.FlushType.ResourceOnly, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_success_translation1() throws Exception {
        hierarchicalFlushRules.put(Pattern.compile("/content/acs-aem-commons/(.*)"), new String[] { "/content/target/$1" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target/page"));

        assertEquals(DispatcherFlushFilter.FlushType.Hierarchical, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }

    @Test
    public void testPreprocess_success_translation2() throws Exception {
        hierarchicalFlushRules.put(Pattern.compile("/content/acs-aem-commons/(.*)/(.*)"), new String[] { "/content/target/$1/acs-aem-commons/$2" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/en/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target/en/acs-aem-commons/page"));

        assertEquals(DispatcherFlushFilter.FlushType.Hierarchical, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }


    @Test
    public void testPreprocess_success_resourceonly_translation2() throws Exception {
        resourceOnlyFlushRules.put(Pattern.compile("/content/acs-aem-commons/(.*)/(.*)"), new String[] { "/content/target/$1/acs-aem-commons/$2" });

        final ReplicationAction replicationAction = mock(ReplicationAction.class);
        when(replicationAction.getPath()).thenReturn("/content/acs-aem-commons/en/page");
        when(replicationAction.getType()).thenReturn(ReplicationActionType.ACTIVATE);

        final ReplicationOptions replicationOptions = new ReplicationOptions();
        replicationOptions.setSynchronous(false);

        final ArgumentCaptor<DispatcherFlushFilter> agentFilterCaptor = ArgumentCaptor.forClass(DispatcherFlushFilter
                .class);

        dispatcherFlushRules.preprocess(replicationAction, replicationOptions);

        verify(dispatcherFlusher, times(1)).flush(any(ResourceResolver.class), eq(ReplicationActionType.ACTIVATE),
                eq(false),
                agentFilterCaptor.capture(),
                eq("/content/target/en/acs-aem-commons/page"));

        assertEquals(DispatcherFlushFilter.FlushType.ResourceOnly, agentFilterCaptor.getValue().getFlushType());
        // Private impl class; no access to test for instanceof
        assertEquals("DispatcherFlushRulesFilter", agentFilterCaptor.getValue().getClass().getSimpleName());

        verifyNoMoreInteractions(dispatcherFlusher);
    }

}
TOP

Related Classes of com.adobe.acs.commons.replication.dispatcher.impl.DispatcherFlushRulesImplTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.