/* * 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.service.materials; import com.thoughtworks.go.config.materials.PackageMaterial; import com.thoughtworks.go.domain.config.Configuration; import com.thoughtworks.go.domain.config.ConfigurationProperty; import com.thoughtworks.go.domain.materials.Modification; import com.thoughtworks.go.domain.materials.packagematerial.PackageMaterialRevision; import com.thoughtworks.go.domain.packagerepository.ConfigurationPropertyMother; import com.thoughtworks.go.domain.packagerepository.PackageDefinition; import com.thoughtworks.go.domain.packagerepository.PackageRepository; import com.thoughtworks.go.domain.packagerepository.PackageRepositoryMother; import com.thoughtworks.go.helper.MaterialsMother; import com.thoughtworks.go.plugin.access.packagematerial.PackageRepositoryExtension; import com.thoughtworks.go.plugin.api.config.Property; import com.thoughtworks.go.plugin.api.material.packagerepository.PackageRevision; import com.thoughtworks.go.plugin.api.material.packagerepository.RepositoryConfiguration; import com.thoughtworks.go.util.json.JsonHelper; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import java.util.Date; import java.util.HashMap; import java.util.List; import static com.thoughtworks.go.domain.packagerepository.PackageDefinitionMother.create; import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class PackageMaterialPollerTest { private PackageMaterial material; private PackageRepositoryExtension packageRepositoryExtension; private ArgumentCaptor<com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration> packageConfiguration; private ArgumentCaptor<RepositoryConfiguration> repositoryConfiguration; private com.thoughtworks.go.server.service.materials.PackageMaterialPoller poller; @Before public void setup() { //setup material material = new PackageMaterial(); PackageRepository packageRepository = PackageRepositoryMother.create("id", "name", "plugin-id", "plugin-version", new Configuration(ConfigurationPropertyMother.create("url", false, "http://some-url"))); PackageDefinition packageDefinition = create("id", "package", new Configuration(ConfigurationPropertyMother.create("name", false, "go-agent"), ConfigurationPropertyMother.create("secure", true, "value")), packageRepository); material.setPackageDefinition(packageDefinition); packageRepositoryExtension = mock(PackageRepositoryExtension.class); poller = new com.thoughtworks.go.server.service.materials.PackageMaterialPoller(packageRepositoryExtension); packageConfiguration = ArgumentCaptor.forClass(com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration.class); repositoryConfiguration = ArgumentCaptor.forClass(RepositoryConfiguration.class); } @Test public void shouldGetLatestModificationsAlongWithAdditionalDataFromThePackageRevision() { Date timestamp = new Date(); PackageRevision packageRevision = new PackageRevision("revision-123", timestamp, "user"); String dataKey = "extra_data"; String dataValue = "value"; packageRevision.addData(dataKey, dataValue); when(packageRepositoryExtension.getLatestRevision(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture())).thenReturn(packageRevision); HashMap<String, String> expected = new HashMap<>(); expected.put(dataKey, dataValue); List<Modification> modifications = poller.latestModification(material, null, null); assertThat(modifications.get(0).getRevision(), is("revision-123")); assertThat(modifications.get(0).getModifiedTime(), is(timestamp)); assertThat(modifications.get(0).getUserName(), is("user")); assertThat(modifications.get(0).getComment(), is(notNullValue())); assertThat(modifications.get(0).getAdditionalData(), is(JsonHelper.toJsonString(expected))); assertConfiguration(packageConfiguration.getValue(), material.getPackageDefinition().getConfiguration()); assertConfiguration(repositoryConfiguration.getValue(), material.getPackageDefinition().getRepository().getConfiguration()); } private void assertConfiguration(com.thoughtworks.go.plugin.api.config.Configuration configurationsSentToPlugin, Configuration configurationInMaterial) { assertThat(configurationsSentToPlugin.size(), is(configurationInMaterial.size())); for (ConfigurationProperty property : configurationInMaterial) { Property configuration = configurationsSentToPlugin.get(property.getConfigurationKey().getName()); assertThat(configuration.getValue(), is(property.getValue())); } } @Test public void shouldGetModificationsSinceAGivenRevisionAlongWithAdditionalDataFromThePackageRevision() { String previousRevision = "rev-122"; Date timestamp = new Date(); HashMap<String, String> dataInPreviousRevision = new HashMap<>(); dataInPreviousRevision.put("1", "one"); PackageMaterialRevision knownRevision = new PackageMaterialRevision(previousRevision, timestamp, dataInPreviousRevision); ArgumentCaptor<PackageRevision> knownPackageRevision = ArgumentCaptor.forClass(PackageRevision.class); PackageRevision latestRevision = new PackageRevision("rev-123", timestamp, "user"); String dataKey = "2"; String dataValue = "two"; latestRevision.addData(dataKey, dataValue); when(packageRepositoryExtension.latestModificationSince(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture(), knownPackageRevision.capture())).thenReturn(latestRevision); List<Modification> modifications = poller.modificationsSince(material, null, knownRevision, null); assertThat(knownPackageRevision.getValue().getRevision(), is(previousRevision)); assertThat(knownPackageRevision.getValue().getTimestamp(), is(timestamp)); assertThat(knownPackageRevision.getValue().getData(), is(notNullValue())); assertThat(knownPackageRevision.getValue().getData().size(), is(dataInPreviousRevision.size())); assertThat(knownPackageRevision.getValue().getData().get("1"), is(dataInPreviousRevision.get("1"))); HashMap<String, String> expected = new HashMap<>(); expected.put(dataKey, dataValue); String expectedDataString = JsonHelper.toJsonString(expected); Modification firstModification = modifications.get(0); assertThat(firstModification.getRevision(), is("rev-123")); assertThat(firstModification.getModifiedTime(), is(timestamp)); assertThat(firstModification.getUserName(), is("user")); assertThat(firstModification.getComment(), is(notNullValue())); assertThat(firstModification.getAdditionalData(), is(expectedDataString)); } @Test public void shouldTalkToPlugInToGetLatestModifications() { Date timestamp = new Date(); when(packageRepositoryExtension.getLatestRevision(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture())).thenReturn(new PackageRevision("revision-123", timestamp, "user")); List<Modification> modifications = poller.latestModification(material, null, null); assertThat(modifications.get(0).getRevision(), is("revision-123")); assertThat(modifications.get(0).getModifiedTime(), is(timestamp)); assertThat(modifications.get(0).getUserName(), is("user")); assertThat(modifications.get(0).getComment(), is(notNullValue())); assertConfiguration(packageConfiguration.getValue(), "name", "go-agent"); assertConfiguration(repositoryConfiguration.getValue(), "url", "http://some-url"); } @Test public void shouldReturnEmptyModificationWhenPackageRevisionIsNullForLatestModification() { when(packageRepositoryExtension.getLatestRevision(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture())).thenReturn(null); List<Modification> modifications = poller.latestModification(material, null, null); assertThat(modifications, is(notNullValue())); assertThat(modifications.isEmpty(), is(true)); } @Test public void shouldTalkToPlugInToGetModificationsSinceAGivenRevision() { Date timestamp = new Date(); PackageMaterialRevision knownRevision = new PackageMaterialRevision("rev-122", timestamp); ArgumentCaptor<PackageRevision> knownPackageRevision = ArgumentCaptor.forClass(PackageRevision.class); PackageRevision latestRevision = new PackageRevision("rev-123", timestamp, "user"); when(packageRepositoryExtension.latestModificationSince(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture(), knownPackageRevision.capture())).thenReturn(latestRevision); List<Modification> modifications = poller.modificationsSince(material, null, knownRevision, null); assertThat(modifications.get(0).getRevision(), is("rev-123")); assertThat(modifications.get(0).getModifiedTime(), is(timestamp)); assertThat(modifications.get(0).getUserName(), is("user")); assertThat(modifications.get(0).getComment(), is(notNullValue())); assertConfiguration(packageConfiguration.getValue(), "name", "go-agent"); assertConfiguration(repositoryConfiguration.getValue(), "url", "http://some-url"); assertThat(knownPackageRevision.getValue().getRevision(), is("rev-122")); assertThat(knownPackageRevision.getValue().getTimestamp(), is(timestamp)); } @Test public void shouldReturnEmptyModificationWhenPackageRevisionIsNullForLatestModificationSince() { PackageMaterialRevision knownRevision = new PackageMaterialRevision("rev-122", new Date()); ArgumentCaptor<PackageRevision> knownPackageRevision = ArgumentCaptor.forClass(PackageRevision.class); when(packageRepositoryExtension.latestModificationSince(eq(material.getPluginId()), packageConfiguration.capture(), repositoryConfiguration.capture(), knownPackageRevision.capture())).thenReturn(null); List<Modification> modifications = poller.modificationsSince(material, null, knownRevision, null); assertThat(modifications, is(notNullValue())); assertThat(modifications.isEmpty(), is(true)); } @Test public void shouldPopulatePackageModificationComment_WithTrackbackUrlAndComment() throws Exception { PackageRevision packageRevision = new PackageRevision(null, null, null, "Built on host1", "http://google.com"); PackageMaterial packageMaterial = MaterialsMother.packageMaterial(); when(packageRepositoryExtension.getLatestRevision(eq(packageMaterial.getPluginId()), any(com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration.class), any(RepositoryConfiguration.class))).thenReturn(packageRevision); List<Modification> modifications = poller.latestModification(packageMaterial, null, null); assertThat(modifications.get(0).getComment(), jsonEquals("{\"COMMENT\":\"Built on host1\",\"TRACKBACK_URL\":\"http://google.com\",\"TYPE\":\"PACKAGE_MATERIAL\"}")); } @Test public void shouldPopulatePackageModificationComment_WithTrackbackUrl_ForModificationsSince() throws Exception { PackageRevision packageRevision = new PackageRevision(null, null, null, "some comment", "http://google.com"); PackageMaterialRevision previousRevision = new PackageMaterialRevision("rev", new Date()); PackageMaterial packageMaterial = MaterialsMother.packageMaterial(); when(packageRepositoryExtension.latestModificationSince(eq(packageMaterial.getPluginId()), any(com.thoughtworks.go.plugin.api.material.packagerepository.PackageConfiguration.class), any(RepositoryConfiguration.class), any(PackageRevision.class))).thenReturn(packageRevision); List<Modification> modifications = poller.modificationsSince(packageMaterial, null, previousRevision, null); assertThat(modifications.get(0).getComment(), jsonEquals("{\"COMMENT\":\"some comment\",\"TRACKBACK_URL\":\"http://google.com\",\"TYPE\":\"PACKAGE_MATERIAL\"}")); } private void assertConfiguration(com.thoughtworks.go.plugin.api.config.Configuration actualPackageConfiguration, String key, String value) { assertThat(actualPackageConfiguration.get(key), is(notNullValue())); assertThat(actualPackageConfiguration.get(key).getValue(), is(value)); } }