/* * Copyright 2017 ThoughtWorks, Inc. * * 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.thoughtworks.go.server.materials.postcommit.svn; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import com.thoughtworks.go.config.materials.dependency.DependencyMaterial; import com.thoughtworks.go.config.materials.git.GitMaterial; import com.thoughtworks.go.config.materials.mercurial.HgMaterial; import com.thoughtworks.go.config.materials.perforce.P4Material; import com.thoughtworks.go.config.materials.svn.SvnMaterial; import com.thoughtworks.go.config.materials.tfs.TfsMaterial; import com.thoughtworks.go.domain.materials.Material; import com.thoughtworks.go.domain.materials.svn.SvnCommand; import org.junit.Before; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class SvnPostCommitHookImplementerTest { private SvnPostCommitHookImplementer implementer; @Before public void setUp() { implementer = new SvnPostCommitHookImplementer(); } @Test public void shouldPruneListToGiveOutOnlySvnMaterials() { final Material svnMaterial1 = mock(SvnMaterial.class); final Material svnMaterial2 = mock(SvnMaterial.class); final Material svnMaterial3 = mock(SvnMaterial.class); final Material hgMaterial = mock(HgMaterial.class); final Material gitMaterial = mock(GitMaterial.class); final Material p4Material = mock(P4Material.class); final Material tfsMaterial = mock(TfsMaterial.class); final Material dependencyMaterial = mock(DependencyMaterial.class); final HashSet<Material> allMaterials = new HashSet<>(Arrays.asList(svnMaterial1, svnMaterial2, svnMaterial3, gitMaterial, hgMaterial, p4Material, tfsMaterial, dependencyMaterial)); final SvnPostCommitHookImplementer spy = spy(implementer); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return Boolean.TRUE; } }).when(spy).isQualified(anyString(), any(SvnMaterial.class), any(HashMap.class)); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return new HashMap(); } }).when(spy).createUrlToRemoteUUIDMap(allMaterials); final HashMap params = new HashMap(); params.put(SvnPostCommitHookImplementer.UUID, "some uuid"); final Set<Material> prunedList = spy.prune(allMaterials, params); assertThat(prunedList.size(), is(3)); assertThat(prunedList, hasItems(svnMaterial1, svnMaterial2, svnMaterial3)); } @Test public void shouldPruneListToGiveOutOnlySvnMaterialsWhichMatchTheRepositoryUUID() { final SvnMaterial svnMaterial1 = mock(SvnMaterial.class); final SvnMaterial svnMaterial2 = mock(SvnMaterial.class); final SvnMaterial svnMaterial3 = mock(SvnMaterial.class); final HashSet<Material> allMaterials = new HashSet<>(Arrays.asList(svnMaterial1, svnMaterial2, svnMaterial3)); final HashMap<Object, Object> params = new HashMap<>(); final String uuid = "12345"; params.put(SvnPostCommitHookImplementer.UUID, uuid); final SvnPostCommitHookImplementer spy = spy(implementer); final HashMap<String, String> map = new HashMap<>(); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { map.put("url1", "12345"); map.put("url2", "54321"); return map; } }).when(spy).createUrlToRemoteUUIDMap(allMaterials); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return Boolean.FALSE; } }).when(spy).isQualified(uuid, svnMaterial1, map); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return Boolean.TRUE; } }).when(spy).isQualified(uuid, svnMaterial2, map); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return Boolean.FALSE; } }).when(spy).isQualified(uuid, svnMaterial3, map); final Set<Material> prunedList = spy.prune(allMaterials, params); assertThat(prunedList.size(), is(1)); verify(spy, times(1)).createUrlToRemoteUUIDMap(allMaterials); } @Test public void shouldReturnEmptyListWhenUUIDIsNotPresent() { final SvnMaterial svnMaterial1 = mock(SvnMaterial.class); final HashSet<Material> allMaterials = new HashSet<>(); allMaterials.add(svnMaterial1); final SvnPostCommitHookImplementer spy = spy(implementer); final Set<Material> prunedList = spy.prune(allMaterials, new HashMap()); assertThat(prunedList.size(), is(0)); verify(spy, never()).isQualified(anyString(), any(SvnMaterial.class), any(HashMap.class)); } @Test public void shouldQualifySvnMaterialIfMaterialMatchesUUID() { final SvnMaterial svnMaterial1 = mock(SvnMaterial.class); when(svnMaterial1.getUrl()).thenReturn("url1"); final SvnMaterial svnMaterial2 = mock(SvnMaterial.class); when(svnMaterial2.getUrl()).thenReturn("url2"); final SvnMaterial svnMaterial3 = mock(SvnMaterial.class); when(svnMaterial3.getUrl()).thenReturn("url not present in map"); final HashMap<String, String> map = new HashMap<>(); map.put("url1", "12345"); map.put("url2", "54321"); assertThat(implementer.isQualified("12345", svnMaterial1, map), is(true)); assertThat(implementer.isQualified("12345", svnMaterial2, map), is(false)); assertThat(implementer.isQualified("12345", svnMaterial3, map), is(false)); } @Test public void shouldCreateRemoteUrlToRemoteUUIDMap() { final SvnPostCommitHookImplementer spy = spy(implementer); final SvnCommand svnCommand = mock(SvnCommand.class); final Material svnMaterial1 = mock(SvnMaterial.class); final Material hgMaterial1 = mock(HgMaterial.class); final HashSet<Material> allMaterials = new HashSet<>(Arrays.asList(svnMaterial1, hgMaterial1)); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return svnCommand; } }).when(spy).getEmptySvnCommand(); spy.createUrlToRemoteUUIDMap(allMaterials); verify(svnCommand).createUrlToRemoteUUIDMap(new HashSet<>(Arrays.asList((SvnMaterial) svnMaterial1))); } @Test public void shouldReturnEmptySvnCommand() { final SvnCommand svnCommand = implementer.getEmptySvnCommand(); assertThat(svnCommand instanceof SvnCommand, is(true)); assertThat(svnCommand.getUrl().toString(), is(".")); } }