/* * * * #%L * * ACS AEM Commons Bundle * * %% * * Copyright (C) 2016 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.wcm.comparisons.model; import com.adobe.acs.commons.wcm.comparisons.PageCompareData; import com.adobe.acs.commons.wcm.comparisons.PageCompareDataLine; import com.adobe.acs.commons.wcm.comparisons.PageCompareDataLines; import com.adobe.acs.commons.wcm.comparisons.PageCompareDataLoader; import com.adobe.acs.commons.wcm.comparisons.VersionSelection; import com.adobe.acs.commons.wcm.comparisons.VersionService; import com.adobe.acs.commons.wcm.comparisons.lines.Line; import com.google.common.collect.Lists; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import javax.jcr.RepositoryException; import java.util.ArrayList; import java.util.List; import static com.adobe.acs.commons.wcm.comparisons.lines.Line.State.NOT_EQUAL; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyCollectionOf; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class PageCompareModelTest { @Mock private ResourceResolver resolver; @Mock private PageCompareDataLoader loader; @Mock private PageCompareDataLines lines; @Mock private VersionService versionService; PageCompareModel underTest; @Captor ArgumentCaptor<Resource> resourceArgumentCaptor; @Test public void constructor_shouldInitializeWithParams() throws Exception { // given final String pathA = "/path/a"; final String versionA = "1.0"; final String pathB = "/path/b"; final String versionB = "2.0"; // when construct(pathA, versionA, pathB, versionB); // then assertThat(underTest.getPathA(), is(pathA)); assertThat(underTest.getVersionA(), is(versionA)); assertThat(underTest.getPathB(), is(pathB)); assertThat(underTest.getVersionB(), is(versionB)); } @Test public void activate_noPath_shouldNotInitializeData() throws Exception { // given construct(null, null, null, null); // when underTest.activate(); // then assertNull(underTest.getA()); assertNull(underTest.getB()); } @Test public void activate_pathAOnly_copyDataToB() throws Exception { // given construct("/path/a", "", null, ""); // when underTest.activate(); // then verify(underTest.loader, times(2)).load(resourceArgumentCaptor.capture(), anyString()); final List<Resource> resources = resourceArgumentCaptor.getAllValues(); assertThat(resources.size(), is(2)); assertThat(resources.get(0), is(resources.get(1))); } @Test public void getData_noA_emptyList() throws Exception { // given construct(null, null, null, null); underTest.activate(); // when final List<Line<PageCompareDataLine>> data = underTest.getData(); // then assertThat(data.isEmpty(), is(true)); } @Test public void getData_aAndB_generateLines() throws Exception { // given construct("/path/a", null, "/path/b", null); underTest.activate(); // when final List<Line<PageCompareDataLine>> data = underTest.getData(); // then assertThat(data.size(), is(1)); assertThat(data.get(0).getLeft(), is(not(data.get(0).getRight()))); assertThat(data.get(0).getState(), is(NOT_EQUAL)); } @Test public void getData_A_generateVersionLists() throws Exception { // given construct("/path/a", null, "/path/b", null); underTest.activate(); // when final List<VersionSelection> versionsA = underTest.getA().getVersions(); final List<VersionSelection> versionsB = underTest.getB().getVersions(); // then assertThat(versionsA.size(), is(2)); assertThat(versionsB.size(), is(2)); } @Test public void getData_A_repositoryError_getEmptyList() throws Exception { // given construct("/path/a", null, null, null); when(loader.load(any(Resource.class), anyString())).thenThrow(new RepositoryException()); underTest.activate(); // when final List<Line<PageCompareDataLine>> data = underTest.getData(); // then assertThat(data.size(), is(0)); } private void construct(String pathA, String versionA, String pathB, String versionB) throws RepositoryException { SlingHttpServletRequest request = mock(SlingHttpServletRequest.class); when(request.getParameter("path")).thenReturn(pathA); when(request.getParameter("pathB")).thenReturn(pathB); when(request.getParameter("a")).thenReturn(versionA); when(request.getParameter("b")).thenReturn(versionB); mockOne2OneData(pathA, versionA); mockOne2OneData(pathB, versionB); underTest = new PageCompareModel(request); underTest.resolver = resolver; underTest.loader = loader; underTest.lines = lines; underTest.versionService = versionService; } private PageCompareData mockOne2OneData(String pathA, String version) throws RepositoryException { Resource resource = mock(Resource.class); when(resolver.resolve(pathA)).thenReturn(resource); when(resource.getResourceResolver()).thenReturn(resolver); PageCompareData pageCompareData = mock(PageCompareData.class); final List<Line<PageCompareDataLine>> lineResult = Lists.newArrayList( mockOne2OneDataLine("a", "b")); when(lines.generate(anyCollectionOf(PageCompareDataLine.class), anyCollectionOf(PageCompareDataLine.class))).thenReturn(lineResult); final ArrayList<VersionSelection> versionSelections = Lists.newArrayList( mock(VersionSelection.class), mock(VersionSelection.class)); when(pageCompareData.getVersions()).thenReturn(versionSelections); when(loader.load(resource, version != null ? version : "latest")).thenReturn(pageCompareData); return pageCompareData; } private Line<PageCompareDataLine> mockOne2OneDataLine(String left, String right) { PageCompareDataLine leftLine = mock(PageCompareDataLine.class); when(leftLine.getUniqueName()).thenReturn(left); PageCompareDataLine rightLine = mock(PageCompareDataLine.class); when(rightLine.getUniqueName()).thenReturn(right); Line<PageCompareDataLine> line = mock(Line.class); when(line.getLeft()).thenReturn(leftLine); when(line.getRight()).thenReturn(rightLine); when(line.getState()).thenReturn(Line.State.NOT_EQUAL); return line; } }