/* * #%L * ACS AEM Commons Bundle * %% * Copyright (C) 2017 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.status.impl; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.Spy; import org.powermock.modules.junit4.PowerMockRunner; import com.adobe.acs.commons.replication.status.ReplicationStatusManager; import com.adobe.acs.commons.util.WorkflowHelper; import com.day.cq.workflow.WorkflowSession; import com.day.cq.workflow.exec.WorkItem; import com.day.cq.workflow.exec.WorkflowData; import com.day.cq.workflow.metadata.MetaDataMap; import junitx.util.PrivateAccessor; @RunWith(PowerMockRunner.class) public class SetReplicationStatusProcessTest { @Mock WorkflowHelper workflowHelper; @Mock ReplicationStatusManager replicationStatusManager; @Mock WorkItem workItem; @Mock WorkflowSession workflowSession; @Mock MetaDataMap metadataMap; @Mock ResourceResolver resourceResolver; @Mock WorkflowData workflowData; @Mock Resource payloadResource; String workflowPayload = "/content/workflow-payload"; @Spy SetReplicationStatusProcess setReplicationStatusProcess = new SetReplicationStatusProcess();; @Before public void setUp() throws Exception { when(workflowHelper.getResourceResolver(workflowSession)).thenReturn(resourceResolver); when(workItem.getWorkflowData()).thenReturn(workflowData); when(workflowData.getPayload()).thenReturn(workflowPayload); when(replicationStatusManager.getReplicationStatusResource(workflowPayload, resourceResolver)).thenReturn(payloadResource); when(payloadResource.getPath()).thenReturn(workflowPayload); PrivateAccessor.setField(setReplicationStatusProcess, "workflowHelper", workflowHelper); PrivateAccessor.setField(setReplicationStatusProcess, "replStatusMgr", replicationStatusManager); } @Test public void testUpdateStatusWithProvidedParams() throws Exception { String workflowParams = "replicationDate=2017-04-21T15:02" + System.lineSeparator(); workflowParams += "replicatedBy=customUser" + System.lineSeparator(); workflowParams += "replicationAction=ACTIVATED"; when(metadataMap.get(WorkflowHelper.PROCESS_ARGS, "")).thenReturn(workflowParams); setReplicationStatusProcess.execute(workItem, workflowSession, metadataMap); CalendarMatcher calMatch = new CalendarMatcher("2017-04-21T15:02"); verify(replicationStatusManager).setReplicationStatus(any(), eq("customUser"), argThat(calMatch), eq(ReplicationStatusManager.Status.valueOf("ACTIVATED")), eq(workflowPayload)); } @Test public void testNoReplicationActionDoesNotUpdateStatus() throws Exception { String workflowParams = ""; when(metadataMap.get(WorkflowHelper.PROCESS_ARGS, "")).thenReturn(workflowParams); setReplicationStatusProcess.execute(workItem, workflowSession, metadataMap); verify(replicationStatusManager, never()).setReplicationStatus(any(), any(), any(), any(), anyString()); } @Test public void testDefaultReplicationUserAndDate() throws Exception { String workflowParams = "replicationAction=ACTIVATED"; when(metadataMap.get(WorkflowHelper.PROCESS_ARGS, "")).thenReturn(workflowParams); Calendar now = Calendar.getInstance(); setReplicationStatusProcess.execute(workItem, workflowSession, metadataMap); CalendarMatcher calMatch = new CalendarMatcher(now); verify(replicationStatusManager).setReplicationStatus(any(), eq("migration"), argThat(calMatch), any(), anyString()); } } class CalendarMatcher extends ArgumentMatcher<Calendar> { private Calendar leftCal; public CalendarMatcher(String date) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm", Locale.ENGLISH); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(date)); this.leftCal = cal; } public CalendarMatcher(Calendar cal) throws ParseException { this.leftCal = cal; } @Override public boolean matches(Object argument) { if (argument instanceof Calendar) { Calendar rightCal = (Calendar)argument; return (leftCal.get(Calendar.YEAR) == rightCal.get(Calendar.YEAR) && leftCal.get(Calendar.MONTH) == rightCal.get(Calendar.MONTH) && leftCal.get(Calendar.DATE) == rightCal.get(Calendar.DATE) && leftCal.get(Calendar.HOUR) == rightCal.get(Calendar.HOUR) && leftCal.get(Calendar.MINUTE) == rightCal.get(Calendar.MINUTE)); } else { return false; } } }