package org.zalando.catwatch.backend.service; import org.junit.Assert; import org.junit.Test; import org.zalando.catwatch.backend.model.Statistics; import org.zalando.catwatch.backend.repo.builder.StatisticsBuilder; import org.zalando.catwatch.backend.util.TestUtils; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import static java.time.Instant.now; import static java.time.temporal.ChronoUnit.DAYS; public class StatisticsServiceTest { private final String ORGANIZATION1 = "org1", ORGANIZATION2 = "org2", ORGANIZATION3 = "org3"; @Test(expected = IllegalArgumentException.class) public void testAggregateNullStatistics() { StatisticsService.aggregateStatistics(null); } @Test(expected = IllegalArgumentException.class) public void testAggregateEmptyStatistics() { StatisticsService.aggregateStatistics(new ArrayList<>()); } @Test public void testAggregateStatistics() { // given Statistics s1 = new StatisticsBuilder(null) .organizationName(ORGANIZATION1) .publicProjectCount(10) .allForksCount(12) .allStarsCount(11) .programLanguagesCount(13) .allContributersCount(33) .externalContributorsCount(5) .allSize(17) .membersCount(43) .privateProjectCount(3) .tagsCount(28) .teamsCount(1) .create(); Statistics s2 = new StatisticsBuilder(null) .organizationName(ORGANIZATION1) .publicProjectCount(9) .allForksCount(11) .allStarsCount(10) .programLanguagesCount(12) .allContributersCount(32) .externalContributorsCount(4) .allSize(16) .membersCount(42) .privateProjectCount(0) .tagsCount(27) .teamsCount(2) .create(); Statistics s3 = new StatisticsBuilder(null) .organizationName(ORGANIZATION2) .publicProjectCount(8) .allForksCount(10) .allStarsCount(9) .programLanguagesCount(11) .allContributersCount(31) .externalContributorsCount(1) .allSize(15) .membersCount(41) .privateProjectCount(2) .tagsCount(26) .teamsCount(3) .create(); List<Statistics> actual = new ArrayList<>(); actual.add(s1); // when Statistics result = StatisticsService.aggregateStatistics(actual); // then TestUtils.checkEquals(s1, result); // when actual.add(s2); result = StatisticsService.aggregateStatistics(actual); // then Assert.assertEquals(33 + 32, result.getAllContributorsCount().intValue()); Assert.assertEquals(12 + 11, result.getAllForksCount().intValue()); Assert.assertEquals(17 + 16, result.getAllSizeCount().intValue()); Assert.assertEquals(11 + 10, result.getAllStarsCount().intValue()); Assert.assertEquals(43 + 42, result.getMembersCount().intValue()); Assert.assertEquals(3 + 0, result.getPrivateProjectCount().intValue()); Assert.assertEquals(13 + 12, result.getProgramLanguagesCount().intValue()); Assert.assertEquals(10 + 9, result.getPublicProjectCount().intValue()); Assert.assertEquals(28 + 27, result.getTagsCount().intValue()); Assert.assertEquals(1 + 2, result.getTeamsCount().intValue()); Assert.assertEquals(5 + 4, result.getExternalContributorsCount().intValue()); Assert.assertNotNull(result.getOrganizationName()); Assert.assertNotNull(result.getSnapshotDate()); Assert.assertNotNull(result.getId()); Assert.assertEquals(ORGANIZATION1, result.getOrganizationName()); // when actual.add(s3); result = StatisticsService.aggregateStatistics(actual); // then Assert.assertEquals(33 + 32 + 31, result.getAllContributorsCount().intValue()); Assert.assertEquals(12 + 11 + 10, result.getAllForksCount().intValue()); Assert.assertEquals(17 + 16 + 15, result.getAllSizeCount().intValue()); Assert.assertEquals(11 + 10 + 9, result.getAllStarsCount().intValue()); Assert.assertEquals(43 + 42 + 41, result.getMembersCount().intValue()); Assert.assertEquals(3 + 0 + 2, result.getPrivateProjectCount().intValue()); Assert.assertEquals(13 + 12 +11, result.getProgramLanguagesCount().intValue()); Assert.assertEquals(10 + 9 + 8, result.getPublicProjectCount().intValue()); Assert.assertEquals(28 + 27 +26, result.getTagsCount().intValue()); Assert.assertEquals(1 + 2 + 3, result.getTeamsCount().intValue()); Assert.assertEquals(5 + 4 + 1, result.getExternalContributorsCount().intValue()); Assert.assertNotNull(result.getOrganizationName()); Assert.assertNotNull(result.getSnapshotDate()); Assert.assertNotNull(result.getId()); Assert.assertTrue(result.getOrganizationName().contains(ORGANIZATION1)); Assert.assertTrue(result.getOrganizationName().contains(ORGANIZATION2)); } @Test public void testAggregateHistoricalStatistics(){ //given List<List<Statistics>> history = generateStatisticHistory(); //when Collection<Statistics> aggregatedHistory = StatisticsService.aggregateHistoricalStatistics(history); //then Assert.assertNotNull(aggregatedHistory); Assert.assertEquals(3, aggregatedHistory.size()); Iterator<Statistics> iter = aggregatedHistory.iterator(); //check the first aggregated record checkStatisticsRecord(history, 0, iter.next()); //check the second aggregated record checkStatisticsRecord(history, 1, iter.next()); //check the second aggregated record checkStatisticsRecord(history, 2, iter.next()); } private void checkStatisticsRecord(List<List<Statistics>> statLists, int recordNr, Statistics actual){ List<Statistics> organizationsStats = new ArrayList<>(); for(List<Statistics> stats : statLists){ Assert.assertTrue(stats.size()>=recordNr); organizationsStats.add(stats.get(recordNr)); } TestUtils.checkEquals(StatisticsService.aggregateStatistics(organizationsStats), actual, false); } private List<List<Statistics>> generateStatisticHistory(){ //given Date oneDayAgo = Date.from(now().minus(1, DAYS)); Date twoDaysAgo = Date.from(now().minus(2, DAYS)); Date threeDaysAgo = Date.from(now().minus(3, DAYS)); Statistics org1Day1 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION1) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(oneDayAgo) .create(); Statistics org1Day2 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION1) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(twoDaysAgo) .create(); Statistics org1Day3 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION1) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(threeDaysAgo) .create(); Statistics org2Day1 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION2) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(oneDayAgo) .create(); Statistics org2Day2 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION2) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(twoDaysAgo) .create(); Statistics org2Day3 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION2) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(threeDaysAgo) .create(); Statistics org3Day1 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION3) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(oneDayAgo) .create(); Statistics org3Day2 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION3) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(twoDaysAgo) .create(); Statistics org3Day3 = new StatisticsBuilder(null) .allContributersCount(100) .allForksCount(200) .allSize(300) .allStarsCount(400) .membersCount(500) .organizationName(ORGANIZATION3) .privateProjectCount(600) .programLanguagesCount(700) .tagsCount(800) .teamsCount(900) .snapshotDate(threeDaysAgo) .create(); List<Statistics> org1Records = new ArrayList<>(); org1Records.add(org1Day1); org1Records.add(org1Day2); org1Records.add(org1Day3); List<Statistics> org2Records = new ArrayList<>(); org2Records.add(org2Day1); org2Records.add(org2Day2); org2Records.add(org2Day3); List<Statistics> org3Records = new ArrayList<>(); org3Records.add(org3Day1); org3Records.add(org3Day2); org3Records.add(org3Day3); List<List<Statistics>> history = new ArrayList<>(); history.add(org1Records); history.add(org2Records); history.add(org3Records); return history; } }