package org.zalando.catwatch.backend.web;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.zalando.catwatch.backend.model.Statistics;
import org.zalando.catwatch.backend.repo.StatisticsRepository;
import org.zalando.catwatch.backend.repo.builder.StatisticsBuilder;
import org.zalando.catwatch.backend.util.StringParser;
import org.zalando.catwatch.backend.util.TestUtils;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static java.time.Instant.now;
import static java.time.temporal.ChronoUnit.DAYS;
import static org.hamcrest.Matchers.iterableWithSize;
import static org.junit.Assert.assertThat;
import static org.zalando.catwatch.backend.util.TestUtils.createAbsoluteStatisticsUrl;
public class StatisticsApiIT extends AbstractCatwatchIT {
@Autowired
private StatisticsRepository repository;
private static final String ORGANIZATION1 = "organization1", ORGANIZATION2 = "organization2";
private Statistics s1, s2, s3, s5;
private static int statisticIdCounter = 0;
@Test
public void testGetLatestStatisticsFromOrganizations() throws Exception {
// given
createStatistics();
// check if data has been initialized correctly
Assert.assertNotNull(repository);
Assert.assertNotNull(s1);
Assert.assertNotNull(s2);
repository.save(s1);
repository.save(s2);
Assert.assertNotNull("Statistics not found in repository", repository.findByOrganizationName(s1.getOrganizationName()));
Assert.assertNotNull("Statistics not found in repository", repository.findByOrganizationName(s2.getOrganizationName()));
// when
String organisations = s1.getOrganizationName() + "," + s2.getOrganizationName();
String url = TestUtils.createAbsoluteStatisticsUrl(this.base.toString(), organisations, null, null);
ResponseEntity<Statistics[]> response = template.getForEntity(url, Statistics[].class);
Statistics[] statsResponse = response.getBody();
// then
Assert.assertNotNull(statsResponse);
Assert.assertEquals(1, statsResponse.length);
TestUtils.checkAggregatedStatistics(statsResponse[0], Arrays.asList(s1, s2));
}
@Test
public void testGetStatisticsFromOrganizationWithStartAndEnddate() throws Exception {
// 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));
Date fourDaysAgo = Date.from(now().minus(4, DAYS));
Date fiveDaysAgo = Date.from(now().minus(5, DAYS));
repository.deleteAll();
// // snapshot date is before requested period of time
s1 = createAndSaveStatistics(ORGANIZATION1, oneDayAgo);
// snapshot date is at the exact start of the requested period of time
s2 = createAndSaveStatistics(ORGANIZATION1, twoDaysAgo);
s3 = createAndSaveStatistics(ORGANIZATION1, threeDaysAgo);
/**/ createAndSaveStatistics(ORGANIZATION2, threeDaysAgo);
s5 = createAndSaveStatistics(ORGANIZATION1, fourDaysAgo);
/**/ createAndSaveStatistics(ORGANIZATION1, fiveDaysAgo);
assertThat(repository.findAll(), iterableWithSize(6));
// check if data has been initialized correctly
Assert.assertNotNull(repository);
Assert.assertNotNull(s1);
Assert.assertNotNull(s2);
Assert.assertNotNull("Statistics not found in repository",
repository.findByOrganizationName(s1.getOrganizationName()));
Assert.assertNotNull("Statistics not found in repository",
repository.findByOrganizationName(s2.getOrganizationName()));
// initialize url parameter
String start = StringParser.getISO8601StringForDate(new Date(fourDaysAgo.getTime()+60000));
String end = StringParser.getISO8601StringForDate(twoDaysAgo);
// create url
String url = createAbsoluteStatisticsUrl(this.base.toString(), ORGANIZATION1, start, end);
// when
ResponseEntity<Statistics[]> response = template.getForEntity(url, Statistics[].class);
List<Statistics> statsResponse = Arrays.asList(response.getBody());
// then
Assert.assertNotNull(statsResponse);
Assert.assertEquals(2, statsResponse.size());
TestUtils.checkEquals(s3, statsResponse.get(0));
TestUtils.checkEquals(s5, statsResponse.get(1));
Assert.assertThat(statsResponse.get(0).toString(), Matchers.stringContainsInOrder(Arrays.asList(s3.getId()+"")));
Assert.assertThat(statsResponse.get(1).toString(), Matchers.stringContainsInOrder(Arrays.asList(s5.getId()+"")));
}
private Statistics createAndSaveStatistics(String organizationName, Date snapshotDate) {
Statistics s = new Statistics(statisticIdCounter++, snapshotDate);
s.setOrganizationName(organizationName);
s.setSnapshotDate(snapshotDate);
return repository.save(s);
}
private void createStatistics() {
this.repository.deleteAll();
s1 = new Statistics(statisticIdCounter++, new Date());
s1.setAllContributorsCount(10);
s1.setExternalContributorsCount(5);
s1.setAllForksCount(12);
s1.setAllSizeCount(100);
s1.setAllStarsCount(23);
s1.setMembersCount(7);
s1.setPrivateProjectCount(11);
s1.setProgramLanguagesCount(3);
s1.setPublicProjectCount(2);
s1.setTagsCount(6);
s1.setTeamsCount(0);
s1.setOrganizationName("organization1");
repository.save(s1);
s2 = new Statistics(statisticIdCounter++,
new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24));
s2.setAllContributorsCount(9);
s2.setExternalContributorsCount(3);
s2.setAllForksCount(11);
s2.setAllSizeCount(99);
s2.setAllStarsCount(22);
s2.setMembersCount(6);
s2.setPrivateProjectCount(10);
s2.setProgramLanguagesCount(2);
s2.setPublicProjectCount(1);
s2.setTagsCount(5);
s2.setTeamsCount(1);
s2.setOrganizationName("organization2");
s3 = new StatisticsBuilder(null)
.organizationName("organization3")
.create();
/**/ new StatisticsBuilder(null)
.organizationName("organization4")
.create();
s5 = new StatisticsBuilder(null)
.organizationName("organization5")
.create();
}
}