/* * 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.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import com.google.gson.Gson; import com.thoughtworks.go.domain.MaterialInstance; import com.thoughtworks.go.domain.materials.svn.SvnMaterialInstance; import com.thoughtworks.go.util.json.JsonHelper; import org.hamcrest.core.Is; import org.junit.Test; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertThat; public class ModificationTest { @Test public void shouldReturnAnonymousWhenUserNameIsEmpty() { Modification modification = new Modification("", "comment", null, null, null); assertThat(modification.getUserDisplayName(), Is.is(Modification.ANONYMOUS)); modification.setUserName(""); assertThat(modification.getUserDisplayName(), Is.is(Modification.ANONYMOUS)); modification.setUserName(" "); assertThat(modification.getUserDisplayName(), Is.is(Modification.ANONYMOUS)); } @Test public void shouldAssociateBlankCommentStringWithMaterialIfNull() throws Exception { Modification modification = new Modification(new Date(), "foo", "MOCK_LABEL-12", null); assertThat(modification.getComment(), is(not(nullValue()))); } @Test public void shouldAllowAdditionalData() throws Exception { String expected = "some additional data"; Modification modification = new Modification("loser", "", null, new Date(), "rev-123", expected); assertThat(modification.getAdditionalData(), is(expected)); } @Test public void shouldAllowNullComment() throws Exception { Modification mod = new Modification("user", null, "email", new Date(), "1"); assertThat(mod.getComment(), is(nullValue())); assertThat(mod.getCardNumbersFromComment().isEmpty(), is(true)); } @Test public void shouldReturnUserNameWhenUserNameIsNotEmpty() throws Exception { Modification modification = new Modification("jack", "", null, null, null); assertThat(modification.getUserDisplayName(), Is.is("jack")); } @Test public void shouldConsiderPipelineLabelForEqualsAndHashcode() { Date date = new Date(); Modification modification = new Modification("user", "comment", "foo@bar.com", date, "15"); Modification anotherModificationWithoutLabel = new Modification("user", "comment", "foo@bar.com", date, "15"); Modification modificationWithLabel = new Modification("user", "comment", "foo@bar.com", date, "15"); modificationWithLabel.setPipelineLabel("foo-12"); //even though it doesn't make sense, equals and hashcode must respect it assertThat(modification.hashCode(), not(modificationWithLabel.hashCode())); assertThat(modification.hashCode(), is(anotherModificationWithoutLabel.hashCode())); assertThat(modification, not(modificationWithLabel)); assertThat(modification, is(anotherModificationWithoutLabel)); } @Test public void shouldSerializeAndUnserializeAllAttributes() throws IOException, ClassNotFoundException { HashMap<String, String> additionalData = new HashMap<>(); additionalData.put("foo", "bar"); Modification modification = new Modification("user", "comment", "foo@bar.com", new Date(), "pipe/1/stage/2", JsonHelper.toJsonString(additionalData)); modification.setPipelineLabel("label-1"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(modification); ObjectInputStream inputStream1 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); Modification unserializedModification = (Modification) inputStream1.readObject(); assertThat(unserializedModification, is(modification)); assertThat(unserializedModification.getAdditionalData(), is(JsonHelper.toJsonString(additionalData))); modification = new Modification("user", null, "foo@bar.com", new Date(), "pipe/1/stage/2", JsonHelper.toJsonString(additionalData)); byteArrayOutputStream = new ByteArrayOutputStream(); objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(modification); inputStream1 = new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); unserializedModification = (Modification) inputStream1.readObject(); assertThat(unserializedModification.getComment(), is(nullValue())); assertThat(unserializedModification.getAdditionalData(), is(JsonHelper.toJsonString(additionalData))); assertThat(unserializedModification, is(modification)); } @Test public void shouldCopyConstructor() { Modification modification = new Modification("user", "comment", "foo@bar.com", new Date(), "pipe/1/stage/2"); Map<String, String> additionalData = new HashMap<>(); additionalData.put("a1", "v1"); additionalData.put("a2", "v2"); modification.setAdditionalData(new Gson().toJson(additionalData)); MaterialInstance original = new SvnMaterialInstance("url", "username", UUID.randomUUID().toString(), true); modification.setMaterialInstance(original); assertThat(new Modification(modification), is(modification)); modification = new Modification(new Date(), "rev", "label", 121L); Modification copiedModification = new Modification(modification); assertThat(copiedModification, is(modification)); assertThat(copiedModification.getAdditionalDataMap(), is(modification.getAdditionalDataMap())); } @Test public void shouldParseCardNumberFromAComment() { Modification modification = new Modification(null, "Fixing #3455 and #1234",null , null, null); assertThat(modification.getCardNumbersFromComment().size(), is(2)); assertThat(modification.getCardNumbersFromComment(), hasItems("3455","1234")); } }