/*
* 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.domain.materials;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import com.thoughtworks.go.config.materials.*;
import com.thoughtworks.go.config.materials.mercurial.HgMaterialConfig;
import com.thoughtworks.go.domain.MaterialInstance;
import com.thoughtworks.go.domain.materials.mercurial.StringRevision;
import com.thoughtworks.go.domain.materials.packagematerial.PackageMaterialRevision;
import com.thoughtworks.go.domain.materials.scm.PluggableSCMMaterialRevision;
import com.thoughtworks.go.helper.MaterialConfigsMother;
import com.thoughtworks.go.helper.MaterialsMother;
import com.thoughtworks.go.util.json.JsonHelper;
import org.hamcrest.MatcherAssert;
import org.junit.Test;
import static com.thoughtworks.go.helper.ModificationsMother.aCheckIn;
import static com.thoughtworks.go.helper.ModificationsMother.multipleCheckin;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
public class ModificationsTest {
@Test
public void shouldReturnUnknownForEmptyList() {
assertThat(new Modifications().getUsername(), is("Unknown"));
}
@Test
public void shouldReturnFirstUsername() {
Modification modification1 = new Modification("username1", "", null, new Date(), "1");
Modification modification2 = new Modification("username2", "", null, new Date(), "2");
assertThat(new Modifications(modification1, modification2).getUsername(), is("username1"));
}
@Test
public void shouldReturnUnknownRevisionForEmptyList() {
assertThat(new Modifications().getRevision(), is("Unknown"));
}
@Test
public void shouldReturnFirstRevision() {
Modification modification1 = new Modification(new Date(), "cruise/1.0/dev/1", "MOCK_LABEL-12", null);
Modification modification2 = new Modification(new Date(), "cruise/1.0/dev/2", "MOCK_LABEL-12", null);
assertThat(new Modifications(modification1, modification2).getRevision(), is("cruise/1.0/dev/1"));
}
@Test
public void shouldReturnRevisionsWithoutSpecifiedRevision() {
final Modification modification1 = new Modification(new Date(), "1", "MOCK_LABEL-12", null);
final Modification modification2 = new Modification(new Date(), "2", "MOCK_LABEL-12", null);
List<Modification> modifications = new ArrayList<>();
modifications.add(modification1);
modifications.add(modification2);
List<Modification> filtered = Modifications.filterOutRevision(modifications, new StringRevision("1"));
assertThat(filtered.size(), is(1));
assertThat(filtered.get(0), is(modification2));
}
@Test
public void hasModifcationShouldReturnCorrectResults() {
Modifications modifications = modificationWithIds();
assertThat(modifications.hasModfication(3), is(true));
assertThat(modifications.hasModfication(2), is(true));
assertThat(modifications.hasModfication(5), is(false));
assertThat(modifications.hasModfication(0), is(false));
}
@Test
public void hasModifcationResults() {
Modifications modifications = modificationWithIds();
assertThat(modifications.since(3), is(new Modifications(modifcation(4))));
assertThat(modifications.since(2), is(new Modifications(modifcation(4), modifcation(3))));
try {
modifications.since(10);
fail("should throw exception");
} catch (Exception e) {
assertThat(e.getMessage(), is("Could not find modification 10 in " + modifications));
}
try {
modifications.since(6);
fail("should throw exception");
} catch (Exception e) {
assertThat(e.getMessage(), is("Could not find modification 6 in " + modifications));
}
}
@Test
public void shouldUnderstandIfContainsModificationWithSameRevision() {
MaterialInstance materialInstance = MaterialsMother.hgMaterial().createMaterialInstance();
final Modification modification = modificationWith(materialInstance, "1");
final Modification sameModification = modificationWith(materialInstance, "1");
final Modification modificationWithDifferentRev = modificationWith(materialInstance, "2");
final Modification modificationWithDifferentMaterial = modificationWith(MaterialsMother.hgMaterial("http://foo.com").createMaterialInstance(), "1");
Modifications modifications = new Modifications(modification);
assertThat(modifications.containsRevisionFor(modification), is(true));
assertThat(modifications.containsRevisionFor(sameModification), is(true));
assertThat(modifications.containsRevisionFor(modificationWithDifferentRev), is(false));
assertThat(modifications.containsRevisionFor(modificationWithDifferentMaterial), is(true)); //note that its checking for revision and not material instance
}
@Test
public void shouldGetLatestModificationsForPackageMaterial() {
Date timestamp = new Date();
String revisionString = "123";
HashMap<String, String> data = new HashMap<>();
data.put("1", "one");
data.put("2", "two");
Modification modification = new Modification(null, null, null, timestamp, revisionString, JsonHelper.toJsonString(data));
Modifications modifications = new Modifications(modification);
Revision revision = modifications.latestRevision(new PackageMaterial());
assertThat(revision instanceof PackageMaterialRevision, is(true));
PackageMaterialRevision packageMaterialRevision = (PackageMaterialRevision) revision;
assertThat(packageMaterialRevision.getRevision(), is(revisionString));
assertThat(packageMaterialRevision.getTimestamp(), is(timestamp));
assertThat(packageMaterialRevision.getData().size(), is(data.size()));
assertThat(packageMaterialRevision.getData().get("1"), is(data.get("1")));
assertThat(packageMaterialRevision.getData().get("2"), is(data.get("2")));
}
@Test
public void shouldGetLatestModificationsForPluggableSCMMaterial() {
String revisionString = "123";
Date timestamp = new Date();
HashMap<String, String> data = new HashMap<>();
data.put("1", "one");
data.put("2", "two");
Modification modification = new Modification(null, null, null, timestamp, revisionString, JsonHelper.toJsonString(data));
Modifications modifications = new Modifications(modification);
Revision revision = modifications.latestRevision(new PluggableSCMMaterial());
assertThat(revision instanceof PluggableSCMMaterialRevision, is(true));
PluggableSCMMaterialRevision pluggableSCMMaterialRevision = (PluggableSCMMaterialRevision) revision;
assertThat(pluggableSCMMaterialRevision.getRevision(), is(revisionString));
assertThat(pluggableSCMMaterialRevision.getTimestamp(), is(timestamp));
assertThat(pluggableSCMMaterialRevision.getData().size(), is(data.size()));
assertThat(pluggableSCMMaterialRevision.getData().get("1"), is(data.get("1")));
assertThat(pluggableSCMMaterialRevision.getData().get("2"), is(data.get("2")));
}
@Test
public void shouldNeverIgnorePackageMaterialModifications() {
PackageMaterialConfig packageMaterialConfig = new PackageMaterialConfig();
Filter filter = packageMaterialConfig.filter();
MatcherAssert.assertThat(filter, is(notNullValue()));
MatcherAssert.assertThat(new Modifications().shouldBeIgnoredByFilterIn(packageMaterialConfig), is(false));
}
@Test
public void shouldIncludeModificationsIfAnyFileIsNotIgnored() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("*.doc"), new IgnoredFiles("*.pdf")));
materialConfig.setFilter(filter);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(false));
}
@Test
public void shouldIncludeModificationsIfAnyFileIsNotIgnored1() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("*.doc"), new IgnoredFiles("*.pdf")));
materialConfig.setFilter(filter);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf"), aCheckIn("100", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(false));
}
@Test
public void shouldIgnoreModificationsIfAllTheIgnoresMatch() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("*.doc"), new IgnoredFiles("*.pdf")));
materialConfig.setFilter(filter);
assertThat(new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf"))).shouldBeIgnoredByFilterIn(materialConfig), is(true));
assertThat(new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.doc"))).shouldBeIgnoredByFilterIn(materialConfig), is(true));
assertThat(new Modifications(multipleCheckin(aCheckIn("100", "a.pdf", "b.pdf"), aCheckIn("100", "a.doc", "b.doc"))).shouldBeIgnoredByFilterIn(materialConfig), is(true));
}
@Test
public void shouldIgnoreModificationsIfInvertFilterAndEmptyIgnoreList() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter();
materialConfig.setFilter(filter);
materialConfig.setInvertFilter(true);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(true));
}
@Test
public void shouldIgnoreModificationsIfWildcardBlacklist() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("**/*")));
materialConfig.setFilter(filter);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(true));
}
@Test
public void shouldIncludeModificationsIfInvertFilterAndWildcardBlacklist() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("**/*")));
materialConfig.setFilter(filter);
materialConfig.setInvertFilter(true);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(false));
}
@Test
public void shouldIgnoreModificationsIfInvertFilterAndSpecificFileNotChanged() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("*.foo")));
materialConfig.setFilter(filter);
materialConfig.setInvertFilter(true);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.doc", "a.pdf", "a.java")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(true));
}
@Test
public void shouldIgnoreModificationsIfInvertFilterAndSpecificFileNotChanged2() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("foo/bar.baz")));
materialConfig.setFilter(filter);
materialConfig.setInvertFilter(true);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("100", "a.java", "foo", "bar.baz", "foo/bar.qux")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(true));
}
@Test
public void shouldIncludeModificationsIfInvertFilterAndSpecificIsChanged() {
HgMaterialConfig materialConfig = MaterialConfigsMother.hgMaterialConfig();
Filter filter = new Filter(Arrays.asList(new IgnoredFiles("foo/bar.baz")));
materialConfig.setFilter(filter);
materialConfig.setInvertFilter(true);
Modifications modifications = new Modifications(multipleCheckin(aCheckIn("101", "foo/bar.baz")));
assertThat(modifications.shouldBeIgnoredByFilterIn(materialConfig), is(false));
}
private Modifications modificationWithIds() {
return new Modifications(modifcation(4), modifcation(3), modifcation(2), modifcation(1));
}
private Modification modifcation(long id) {
Modification modification = new Modification();
modification.setId(id);
return modification;
}
private Modification modificationWith(MaterialInstance materialInstance, String revision) {
final Modification modification = new Modification(new Date(), revision, "MOCK_LABEL-12", null);
modification.setMaterialInstance(materialInstance);
return modification;
}
}