/*************************GO-LICENSE-START********************************* * Copyright 2014 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. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.server.materials; import com.thoughtworks.go.config.GoRepoConfigDataSource; import com.thoughtworks.go.config.materials.SubprocessExecutionContext; import com.thoughtworks.go.config.materials.svn.SvnMaterial; import com.thoughtworks.go.domain.MaterialRevision; import com.thoughtworks.go.domain.MaterialRevisions; import com.thoughtworks.go.domain.materials.Material; import com.thoughtworks.go.domain.materials.Modification; import com.thoughtworks.go.domain.materials.Revision; import com.thoughtworks.go.domain.materials.TestSubprocessExecutionContext; import com.thoughtworks.go.server.persistence.MaterialRepository; import com.thoughtworks.go.server.service.MaterialService; import com.thoughtworks.go.server.service.materials.MaterialPoller; import org.junit.Before; import org.junit.Test; import java.io.File; import java.util.Date; import static com.thoughtworks.go.domain.materials.Modification.modifications; import static org.mockito.Mockito.*; public class ConfigMaterialUpdaterTest { private GoRepoConfigDataSource repoConfigDataSource; private MaterialRepository materialRepository; private MaterialChecker materialChecker; private ConfigMaterialUpdateCompletedTopic configCompleted; private MaterialUpdateCompletedTopic topic; private ConfigMaterialUpdater configUpdater; private MaterialService materialService; private Material material; private File folder = new File("checkoutDir"); private MaterialRevisions mods; private MaterialPoller poller; @Before public void SetUp() { repoConfigDataSource = mock(GoRepoConfigDataSource.class); materialChecker = mock(MaterialChecker.class); materialRepository = mock(MaterialRepository.class); configCompleted = mock(ConfigMaterialUpdateCompletedTopic.class); topic = mock(MaterialUpdateCompletedTopic.class); materialService = mock(MaterialService.class); material = new SvnMaterial("url","tom","pass",false); when(materialRepository.folderFor(material)).thenReturn(folder); poller = mock(MaterialPoller.class); when(materialService.getPollerImplementation(any(Material.class))).thenReturn(poller); Modification svnModification = new Modification("user", "commend", "em@il", new Date(), "1"); mods = revisions(material,svnModification); when(materialRepository.findLatestModification(material)).thenReturn(mods); configUpdater = new ConfigMaterialUpdater( repoConfigDataSource,materialRepository,materialChecker, configCompleted,topic,materialService,new TestSubprocessExecutionContext()); } private MaterialRevisions revisions(Material material, Modification modification) { return new MaterialRevisions(new MaterialRevision(material, modifications(modification))); } @Test public void shouldSubscribeToMaterialUpdateCompletedMessages() { verify(configCompleted,times(1)).addListener(configUpdater); } @Test public void shouldPostMaterialUpdateCompletedMessagesFurther() { MaterialUpdateSuccessfulMessage message = new MaterialUpdateSuccessfulMessage(material, 123); this.configUpdater.onMessage(message); verify(topic,times(1)).post(message); } @Test public void shouldPerformCheckoutUsingMaterialPoller() { MaterialUpdateSuccessfulMessage message = new MaterialUpdateSuccessfulMessage(material, 123); this.configUpdater.onMessage(message); verify(poller,times(1)).checkout(any(Material.class),any(File.class), any(Revision.class),any(SubprocessExecutionContext.class)); } @Test public void shouldCallGoRepoConfigDataSourceWhenMaterialUpdateSuccessfulMessage() { MaterialUpdateSuccessfulMessage message = new MaterialUpdateSuccessfulMessage(material, 123); this.configUpdater.onMessage(message); verify(repoConfigDataSource,times(1)).onCheckoutComplete(material.config(),folder,"1"); verify(topic,times(1)).post(message); } @Test public void shouldNotCallGoRepoConfigDataSourceWhenMaterialUpdateFailedMessage() { MaterialUpdateFailedMessage message = new MaterialUpdateFailedMessage(material, 123, new RuntimeException("bla")); this.configUpdater.onMessage(message); verify(repoConfigDataSource,times(0)).onCheckoutComplete(material.config(),folder,"1"); verify(topic,times(1)).post(message); } @Test public void shouldNotCallGoRepoConfigDataSourceWhenNoChanges() { when(repoConfigDataSource.getRevisionAtLastAttempt(material.config())).thenReturn("1"); when(materialChecker.findSpecificRevision(material,"1")).thenReturn(mods.getMaterialRevision(0)); MaterialUpdateSuccessfulMessage message = new MaterialUpdateSuccessfulMessage(material, 123); this.configUpdater.onMessage(message); verify(repoConfigDataSource,times(0)).onCheckoutComplete(material.config(),folder,"1"); // but pass message further anyway verify(topic,times(1)).post(message); } @Test public void shouldCallGoRepoConfigDataSourceWhenNewRevision() { when(repoConfigDataSource.getRevisionAtLastAttempt(material.config())).thenReturn("1"); when(materialChecker.findSpecificRevision(material,"1")).thenReturn(mods.getMaterialRevision(0)); Modification svnModification = new Modification("user", "commend", "em@il", new Date(), "2"); MaterialRevisions mods2 = revisions(material, svnModification); when(materialRepository.findLatestModification(material)).thenReturn(mods2); MaterialUpdateSuccessfulMessage message = new MaterialUpdateSuccessfulMessage(material, 123); this.configUpdater.onMessage(message); verify(repoConfigDataSource,times(1)).onCheckoutComplete(material.config(),folder,"2"); verify(topic,times(1)).post(message); } }