From f046ad6db279ea93fb412eb9959657fefda20406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 4 Jun 2020 10:08:17 +0200 Subject: [PATCH] Unite trailer detection and message update The detection of trailers and removing them from the message should be in one place, not divided between classes. --- .../java/sonia/scm/repository/Changeset.java | 8 + .../ChangesetTrailerPreProcessorFactory.java | 61 ------ .../repository/ChangesetTrailerProvider.java | 34 ---- .../ChangesetDescriptionTrailerProvider.java | 75 +++++--- .../DefaultChangesetToChangesetDtoMapper.java | 18 -- .../v2/resources/BranchRootResourceTest.java | 5 - ...angesetDescriptionTrailerProviderTest.java | 178 ++++++++++++++++++ .../ChangesetDescriptionTrailersTest.java | 122 ------------ .../resources/ChangesetRootResourceTest.java | 5 - .../v2/resources/FileHistoryResourceTest.java | 5 - .../resources/IncomingRootResourceTest.java | 5 - 11 files changed, 230 insertions(+), 286 deletions(-) delete mode 100644 scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerPreProcessorFactory.java delete mode 100644 scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerProvider.java create mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java delete mode 100644 scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailersTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Changeset.java b/scm-core/src/main/java/sonia/scm/repository/Changeset.java index 8e3b14587a..5b5b1f2e5b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Changeset.java +++ b/scm-core/src/main/java/sonia/scm/repository/Changeset.java @@ -313,4 +313,12 @@ public class Changeset extends BasicPropertiesAware implements ModelObject { public void setTrailers(Collection trailers) { this.trailers = trailers; } + + public void addTrailers(Collection trailers) { + if (this.trailers == null) { + this.trailers = new ArrayList<>(trailers); + } else { + this.trailers.addAll(trailers); + } + } } diff --git a/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerPreProcessorFactory.java b/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerPreProcessorFactory.java deleted file mode 100644 index 0097a3129d..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerPreProcessorFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-present Cloudogu GmbH and Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package sonia.scm.repository; - -import sonia.scm.plugin.Extension; - -import javax.inject.Inject; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -@Extension -public class ChangesetTrailerPreProcessorFactory implements ChangesetPreProcessorFactory { - - private final Set changesetTrailerProviderSet; - - @Inject - public ChangesetTrailerPreProcessorFactory(Set changesetTrailerProviderSet) { - this.changesetTrailerProviderSet = changesetTrailerProviderSet; - } - - @Override - public ChangesetPreProcessor createPreProcessor(Repository repository) { - return changeset -> { - Collection existingTrailers = changeset.getTrailers(); - List collectedTrailers; - if (existingTrailers == null && existingTrailers.isEmpty()) { - collectedTrailers = new ArrayList<>(); - } else { - collectedTrailers = new ArrayList<>(existingTrailers); - } - changesetTrailerProviderSet.stream() - .flatMap(changesetTrailers -> changesetTrailers.getTrailers(repository, changeset).stream()) - .forEach(collectedTrailers::add); - changeset.setTrailers(collectedTrailers); - }; - } -} diff --git a/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerProvider.java b/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerProvider.java deleted file mode 100644 index 09f156df32..0000000000 --- a/scm-core/src/main/java/sonia/scm/repository/ChangesetTrailerProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-present Cloudogu GmbH and Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package sonia.scm.repository; - -import sonia.scm.plugin.ExtensionPoint; - -import java.util.List; - -@ExtensionPoint -public interface ChangesetTrailerProvider { - List getTrailers(Repository repository, Changeset changeset); -} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java index 7f2f2464e5..491c121108 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProvider.java @@ -27,62 +27,75 @@ package sonia.scm.api.v2.resources; import com.google.common.collect.ImmutableSet; import sonia.scm.plugin.Extension; import sonia.scm.repository.Changeset; -import sonia.scm.repository.ChangesetTrailerProvider; +import sonia.scm.repository.ChangesetPreProcessor; +import sonia.scm.repository.ChangesetPreProcessorFactory; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; import sonia.scm.repository.Trailer; -import javax.inject.Inject; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Optional; import java.util.Scanner; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static java.util.Optional.empty; -import static java.util.Optional.of; - @Extension -public class ChangesetDescriptionTrailerProvider implements ChangesetTrailerProvider { +public class ChangesetDescriptionTrailerProvider implements ChangesetPreProcessorFactory { private static final Collection SUPPORTED_TRAILER_TYPES = ImmutableSet.of("Co-authored-by", "Reviewed-by", "Signed-off-by", "Committed-by"); private static final Pattern PERSON_PATTERN = Pattern.compile("^\\W*(.*)\\W+<(.*)>\\W*$"); - @Inject - public ChangesetDescriptionTrailerProvider() {} - @Override - public List getTrailers(Repository repository, Changeset changeset) { - List trailers = new ArrayList<>(); + public ChangesetPreProcessor createPreProcessor(Repository repository) { + return new TrailerChangesetPreProcessor(); + } - try (Scanner scanner = new Scanner(changeset.getDescription())) { - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); + private static class TrailerChangesetPreProcessor implements ChangesetPreProcessor { - String[] typeAndUser = line.split(":\\W"); - if (typeAndUser.length == 2) { - String type = typeAndUser[0]; - String person = typeAndUser[1]; - if (SUPPORTED_TRAILER_TYPES.contains(type)) { - Optional trailer = createTrailer(type, person); - trailer.ifPresent(trailers::add); + private final List trailers = new ArrayList<>(); + private final StringBuilder newDescription = new StringBuilder(); + + @Override + public void process(Changeset changeset) { + + try (Scanner scanner = new Scanner(changeset.getDescription())) { + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + + String[] typeAndUser = line.split(":\\W"); + if (typeAndUser.length == 2) { + String type = typeAndUser[0]; + String person = typeAndUser[1]; + if (!SUPPORTED_TRAILER_TYPES.contains(type) || !createTrailer(type, person)) { + appendLine(scanner, line); + } + } else { + appendLine(scanner, line); } } } + changeset.addTrailers(trailers); + changeset.setDescription(newDescription.toString()); } - return trailers; - } - private Optional createTrailer(String type, String person) { - Matcher matcher = PERSON_PATTERN.matcher(person.trim()); - if (matcher.matches()) { - MatchResult matchResult = matcher.toMatchResult(); - return of(new Trailer(type, new Person(matchResult.group(1), matchResult.group(2)))); - } else { - return empty(); + public void appendLine(Scanner scanner, String line) { + newDescription.append(line); + if (scanner.hasNextLine()) { + newDescription.append('\n'); + } + } + + private boolean createTrailer(String type, String person) { + Matcher matcher = PERSON_PATTERN.matcher(person.trim()); + if (matcher.matches()) { + MatchResult matchResult = matcher.toMatchResult(); + trailers.add(new Trailer(type, new Person(matchResult.group(1), matchResult.group(2)))); + return true; + } else { + return false; + } } } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DefaultChangesetToChangesetDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DefaultChangesetToChangesetDtoMapper.java index 3ca1bb137e..fe6dbff14c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DefaultChangesetToChangesetDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DefaultChangesetToChangesetDtoMapper.java @@ -74,24 +74,6 @@ public abstract class DefaultChangesetToChangesetDtoMapper extends HalAppenderMa abstract PersonDto map(Person person); - @AfterMapping - void removeTrailerFromChangesetDescription(@MappingTarget ChangesetDto target) { - StringBuilder builder = new StringBuilder(); - try (Scanner scanner = new Scanner(target.getDescription())) { - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - if (!line.contains("-by:")) { - builder.append(line); - if (scanner.hasNextLine()) { - builder.append("\n"); - } - } - } - } - - target.setDescription(builder.toString()); - } - @ObjectFactory ChangesetDto createDto(@Context Repository repository, Changeset source) { String namespace = repository.getNamespace(); diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java index 518f75a3c9..2be9c6cdef 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/BranchRootResourceTest.java @@ -44,7 +44,6 @@ import sonia.scm.repository.Branch; import sonia.scm.repository.Branches; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.ChangesetTrailerProvider; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; @@ -115,10 +114,6 @@ public class BranchRootResourceTest extends RepositoryTestBase { @Mock private TagCollectionToDtoMapper tagCollectionToDtoMapper; - @Mock - private Set changesetTrailers; - - @InjectMocks private DefaultChangesetToChangesetDtoMapperImpl changesetToChangesetDtoMapper; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java new file mode 100644 index 0000000000..10af22c4c3 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailerProviderTest.java @@ -0,0 +1,178 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.api.v2.resources; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import sonia.scm.repository.Changeset; +import sonia.scm.repository.Person; +import sonia.scm.repository.Repository; +import sonia.scm.repository.RepositoryTestData; +import sonia.scm.repository.Trailer; + +import java.util.Collection; +import java.util.Iterator; + +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +class ChangesetDescriptionTrailerProviderTest { + + private static final Repository REPOSITORY = RepositoryTestData.createHeartOfGold(); + + private final ChangesetDescriptionTrailerProvider changesetDescriptionTrailers = new ChangesetDescriptionTrailerProvider(); + + @Test + void shouldReturnEmptyList() { + Changeset changeset = createChangeset("zaphod beeblebrox"); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + assertThat(trailers).isNotNull(); + assertThat(trailers).isEmpty(); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox"); + } + + @Test + void shouldConvertTrailerWithCoAuthors() { + Person person = createPerson("Arthur Dent", "dent@hitchhiker.org"); + Changeset changeset = createChangeset("zaphod beeblebrox\n\nCo-authored-by: Arthur Dent "); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + Trailer trailer = trailers.iterator().next(); + assertThat(trailer.getTrailerType()).isEqualTo("Co-authored-by"); + assertThat(trailer.getPerson()).isEqualTo(person); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + } + + @Test + void shouldConvertTrailerWithReviewers() { + Person person = createPerson("Tricia McMillan", "trillian@hitchhiker.org"); + Changeset changeset = createChangeset("zaphod beeblebrox\n\nReviewed-by: Tricia McMillan "); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + Trailer trailer = trailers.iterator().next(); + + assertThat(trailer.getTrailerType()).isEqualTo("Reviewed-by"); + assertThat(trailer.getPerson()).isEqualTo(person); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + } + + @Test + void shouldConvertTrailerWithSigner() { + Person person = createPerson("Tricia McMillan", "trillian@hitchhiker.org"); + Changeset changeset = createChangeset("zaphod beeblebrox\n\nSigned-off-by: Tricia McMillan "); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + Trailer trailer = trailers.iterator().next(); + + assertThat(trailer.getTrailerType()).isEqualTo("Signed-off-by"); + assertThat(trailer.getPerson()).isEqualTo(person); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + } + + @Test + void shouldConvertTrailerWithCommitter() { + Person person = createPerson("Tricia McMillan", "trillian@hitchhiker.org"); + Changeset changeset = createChangeset("zaphod beeblebrox\n\nCommitted-by: Tricia McMillan "); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + Trailer trailer = trailers.iterator().next(); + + assertThat(trailer.getTrailerType()).isEqualTo("Committed-by"); + assertThat(trailer.getPerson()).isEqualTo(person); + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + } + + @Test + void shouldConvertMixedTrailers() { + Changeset changeset = createChangeset("zaphod beeblebrox\n\n" + + "Committed-by: Tricia McMillan \n" + + "Signed-off-by: Artur Dent "); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + Iterator trailerIterator = trailers.iterator(); + Trailer firstTrailer = trailerIterator.next(); + Trailer secondTrailer = trailerIterator.next(); + + assertThat(firstTrailer.getTrailerType()).isEqualTo("Committed-by"); + assertThat(firstTrailer.getPerson()) + .isEqualTo(createPerson("Tricia McMillan", "trillian@hitchhiker.org")); + + assertThat(secondTrailer.getTrailerType()).isEqualTo("Signed-off-by"); + assertThat(secondTrailer.getPerson()) + .isEqualTo(createPerson("Artur Dent", "dent@hitchhiker.org")); + + assertThat(changeset.getDescription()).isEqualTo("zaphod beeblebrox\n\n"); + } + + @Test + void shouldNotTouchUnknownTrailers() { + String originalCommitMessage = "zaphod beeblebrox\n\n" + + "Some-strange-tag: Tricia McMillan "; + Changeset changeset = createChangeset(originalCommitMessage); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + assertThat(trailers).isEmpty(); + assertThat(changeset.getDescription()).isEqualTo(originalCommitMessage); + } + + @Test + void shouldIgnoreKnownTrailersWithIllegalNameFormat() { + String originalCommitMessage = "zaphod beeblebrox\n\n" + + "Committed-by: Tricia McMillan"; + Changeset changeset = createChangeset(originalCommitMessage); + + changesetDescriptionTrailers.createPreProcessor(REPOSITORY).process(changeset); + Collection trailers = changeset.getTrailers(); + + assertThat(trailers).isEmpty(); + assertThat(changeset.getDescription()).isEqualTo(originalCommitMessage); + } + + private Changeset createChangeset(String commitMessage) { + Changeset changeset = new Changeset(); + changeset.setDescription(commitMessage); + return changeset; + } + + private Person createPerson(String name, String mail) { + return new Person(name, mail); + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailersTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailersTest.java deleted file mode 100644 index 35d2646a2a..0000000000 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetDescriptionTrailersTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2020-present Cloudogu GmbH and Contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package sonia.scm.api.v2.resources; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; -import sonia.scm.repository.Changeset; -import sonia.scm.repository.Repository; -import sonia.scm.repository.RepositoryTestData; -import sonia.scm.repository.Trailer; -import sonia.scm.user.DisplayUser; -import sonia.scm.user.User; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@ExtendWith(MockitoExtension.class) -class ChangesetDescriptionTrailersTest { - - private static final Repository REPOSITORY = RepositoryTestData.createHeartOfGold(); - - private final ChangesetDescriptionTrailerProvider changesetDescriptionTrailers = new ChangesetDescriptionTrailerProvider(); - - @Test - void shouldReturnEmptyList() { - Changeset changeset = createChangeset("zaphod beeblebrox"); - - List trailer = changesetDescriptionTrailers.getTrailers(REPOSITORY, changeset); - - assertThat(trailer).isNotNull(); - assertThat(trailer).isEmpty(); - } - - @Test - void shouldReturnTrailerWithCoAuthors() { - DisplayUser displayUser = createDisplayUser("Arthur Dent", "dent@hitchhiker.org"); - Changeset changeset = createChangeset("zaphod beeblebrox\n\nCo-authored-by: Arthur Dent "); - - List Trailer = changesetDescriptionTrailers.getTrailers(REPOSITORY, changeset); - - Trailer first = Trailer.get(0); - assertThat(first.getTrailerType()).isEqualTo("Co-authored-by"); - assertThat(first.getPerson().getName()).isEqualTo(displayUser.getDisplayName()); - assertThat(first.getPerson().getMail()).isEqualTo(displayUser.getMail()); - } - - @Test - void shouldReturnTrailerWithReviewers() { - DisplayUser displayUser = createDisplayUser("Tricia McMillan", "trillian@hitchhiker.org"); - Changeset changeset = createChangeset("zaphod beeblebrox\nReviewed-by: Tricia McMillan "); - - List trailer = changesetDescriptionTrailers.getTrailers(REPOSITORY, changeset); - - Trailer Trailer = trailer.get(0); - - assertThat(Trailer.getTrailerType()).isEqualTo("Reviewed-by"); - assertThat(Trailer.getPerson().getName()).isEqualTo(displayUser.getDisplayName()); - assertThat(Trailer.getPerson().getMail()).isEqualTo(displayUser.getMail()); - } - - @Test - void shouldReturnTrailerWithSigner() { - DisplayUser displayUser = createDisplayUser("Tricia McMillan", "trillian@hitchhiker.org"); - Changeset changeset = createChangeset("zaphod beeblebrox\nSigned-off-by: Tricia McMillan "); - - List trailer = changesetDescriptionTrailers.getTrailers(REPOSITORY, changeset); - - Trailer Trailer = trailer.get(0); - - assertThat(Trailer.getTrailerType()).isEqualTo("Signed-off-by"); - assertThat(Trailer.getPerson().getName()).isEqualTo(displayUser.getDisplayName()); - assertThat(Trailer.getPerson().getMail()).isEqualTo(displayUser.getMail()); - } - - @Test - void shouldReturnTrailerWithCommitter() { - DisplayUser displayUser = createDisplayUser("Tricia McMillan", "trillian@hitchhiker.org"); - Changeset changeset = createChangeset("zaphod beeblebrox\nCommitted-by: Tricia McMillan "); - - List trailer = changesetDescriptionTrailers.getTrailers(REPOSITORY, changeset); - - Trailer Trailer = trailer.get(0); - - assertThat(Trailer.getTrailerType()).isEqualTo("Committed-by"); - assertThat(Trailer.getPerson().getName()).isEqualTo(displayUser.getDisplayName()); - assertThat(Trailer.getPerson().getMail()).isEqualTo(displayUser.getMail()); - } - - private Changeset createChangeset(String commitMessage) { - Changeset changeset = new Changeset(); - changeset.setDescription(commitMessage); - return changeset; - } - - private DisplayUser createDisplayUser(String name, String mail) { - return DisplayUser.from(new User(name, name, mail)); - } -} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java index 33b280e351..14b26396d4 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java @@ -43,7 +43,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.ChangesetTrailerProvider; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; @@ -57,7 +56,6 @@ import java.net.URI; import java.time.Instant; import java.util.Date; import java.util.List; -import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -87,9 +85,6 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { @Mock private LogCommandBuilder logCommandBuilder; - @Mock - private Set changesetTrailers; - @InjectMocks private ChangesetCollectionToDtoMapper changesetCollectionToDtoMapper; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java index 44fb6d76fd..77c25dd0a2 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/FileHistoryResourceTest.java @@ -44,7 +44,6 @@ import sonia.scm.ContextEntry; import sonia.scm.NotFoundException; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.ChangesetTrailerProvider; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Person; @@ -60,7 +59,6 @@ import java.net.URISyntaxException; import java.time.Instant; import java.util.Date; import java.util.List; -import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -91,9 +89,6 @@ public class FileHistoryResourceTest extends RepositoryTestBase { private FileHistoryCollectionToDtoMapper fileHistoryCollectionToDtoMapper; - @Mock - private Set changesetTrailers; - @InjectMocks private DefaultChangesetToChangesetDtoMapperImpl changesetToChangesetDtoMapper; diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java index 6ce4630c59..b2ef5ad319 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/IncomingRootResourceTest.java @@ -45,7 +45,6 @@ import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.NotFoundException; import sonia.scm.repository.Changeset; import sonia.scm.repository.ChangesetPagingResult; -import sonia.scm.repository.ChangesetTrailerProvider; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Person; import sonia.scm.repository.Repository; @@ -65,7 +64,6 @@ import java.net.URISyntaxException; import java.time.Instant; import java.util.Date; import java.util.List; -import java.util.Set; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.Assert.assertEquals; @@ -109,9 +107,6 @@ public class IncomingRootResourceTest extends RepositoryTestBase { private IncomingChangesetCollectionToDtoMapper incomingChangesetCollectionToDtoMapper; - @Mock - private Set changesetTrailers; - @InjectMocks private DefaultChangesetToChangesetDtoMapperImpl changesetToChangesetDtoMapper;