From 7129c5ea87195107bf1c4d2f128802992817a6b8 Mon Sep 17 00:00:00 2001 From: Sergi Domingo Date: Sat, 10 Dec 2022 18:45:22 +0100 Subject: [PATCH] feat: add `AggregateCommits` use case --- .../application/AggregateCommits.java | 17 +++++ .../githubstats/domain/CommitAggregation.java | 30 +++++++++ .../application/AggregateCommitsTest.java | 67 +++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 src/main/java/io/pakland/mdas/githubstats/application/AggregateCommits.java create mode 100644 src/main/java/io/pakland/mdas/githubstats/domain/CommitAggregation.java create mode 100644 src/test/java/io/pakland/mdas/githubstats/application/AggregateCommitsTest.java diff --git a/src/main/java/io/pakland/mdas/githubstats/application/AggregateCommits.java b/src/main/java/io/pakland/mdas/githubstats/application/AggregateCommits.java new file mode 100644 index 00000000..01780303 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/AggregateCommits.java @@ -0,0 +1,17 @@ +package io.pakland.mdas.githubstats.application; + +import io.pakland.mdas.githubstats.domain.Commit; +import io.pakland.mdas.githubstats.domain.CommitAggregation; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AggregateCommits { + + public AggregateCommits() {} + + public CommitAggregation execute(List commits) { + return CommitAggregation.aggregate(commits); + } +} diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/CommitAggregation.java b/src/main/java/io/pakland/mdas/githubstats/domain/CommitAggregation.java new file mode 100644 index 00000000..94bd2d9e --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/domain/CommitAggregation.java @@ -0,0 +1,30 @@ +package io.pakland.mdas.githubstats.domain; + +import java.util.List; + +public class CommitAggregation { + + private int numCommits; + private int linesAdded; + private int linesRemoved; + + public static CommitAggregation aggregate(List commits) { + CommitAggregation commitAggregation = new CommitAggregation(); + commitAggregation.numCommits = (int) commits.stream().distinct().count(); + commitAggregation.linesAdded = commits.stream().mapToInt(Commit::getAdditions).sum(); + commitAggregation.linesRemoved = commits.stream().mapToInt(Commit::getDeletions).sum(); + return commitAggregation; + } + + public int getNumCommits() { + return numCommits; + } + + public int getLinesAdded() { + return linesAdded; + } + + public int getLinesRemoved() { + return linesRemoved; + } +} diff --git a/src/test/java/io/pakland/mdas/githubstats/application/AggregateCommitsTest.java b/src/test/java/io/pakland/mdas/githubstats/application/AggregateCommitsTest.java new file mode 100644 index 00000000..f5dd228c --- /dev/null +++ b/src/test/java/io/pakland/mdas/githubstats/application/AggregateCommitsTest.java @@ -0,0 +1,67 @@ +package io.pakland.mdas.githubstats.application; + +import io.pakland.mdas.githubstats.domain.Commit; +import io.pakland.mdas.githubstats.domain.CommitAggregation; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class AggregateCommitsTest { + + @Test + public void aggregatingCommits_shouldGiveValidNumCommits() { + List commits = new ArrayList<>(); + + int numCommits = new Random().nextInt(10); + + for (int i = 0; i < numCommits; i++) { + commits.add(mock(Commit.class)); + } + + CommitAggregation commitAggregation = CommitAggregation.aggregate(commits); + assertEquals(commitAggregation.getNumCommits(), numCommits); + } + + @Test + public void aggregatingCommits_shouldGiveValidLinesAdded() { + List commits = new ArrayList<>(); + + int totalLines = 0; + + for (int i = 0; i < 10; i++) { + int numLines = new Random().nextInt(1000); + Commit commit = mock(Commit.class); + when(commit.getAdditions()).thenReturn(numLines); + commits.add(commit); + totalLines += numLines; + } + + CommitAggregation commitAggregation = CommitAggregation.aggregate(commits); + assertEquals(commitAggregation.getLinesAdded(), totalLines); + } + + @Test + public void aggregatingCommits_shouldGiveValidLinesRemoved() { + List commits = new ArrayList<>(); + + int totalLines = 0; + + for (int i = 0; i < 10; i++) { + int numLines = new Random().nextInt(1000); + Commit commit = mock(Commit.class); + when(commit.getDeletions()).thenReturn(numLines); + commits.add(commit); + totalLines += numLines; + } + + CommitAggregation commitAggregation = CommitAggregation.aggregate(commits); + assertEquals(commitAggregation.getLinesRemoved(), totalLines); + } + +}