package org.zalando.catwatch.backend.web;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.util.UriComponentsBuilder;
import org.zalando.catwatch.backend.model.Project;
import org.zalando.catwatch.backend.repo.ProjectRepository;
import org.zalando.catwatch.backend.repo.builder.ProjectBuilder;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Arrays;
import java.util.Date;
import static java.time.temporal.ChronoUnit.DAYS;
import static java.time.temporal.ChronoUnit.HOURS;
import static org.junit.Assert.*;
import static org.springframework.web.util.UriComponentsBuilder.fromHttpUrl;
import static org.zalando.catwatch.backend.util.Constants.*;
public class ProjectsApiIT extends AbstractCatwatchIT {
@Autowired
private ProjectRepository projectRepository;
private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
@Before
public void init() { }
@Test
public void testProjectsGet() {
// tear down
projectRepository.deleteAll();
Instant instant = Instant.now();
Date snapshotDate1 = Date.from(instant.minus(3, DAYS));
Project project1 = new ProjectBuilder(projectRepository).name("catwatch").snapshotDate(snapshotDate1)
.organizationName("zalando").gitHubProjectId(73561571)
.starsCount(4000).contributorsCount(300)
.externalContributorsCount(30).score(79)
.commitsCount(100).forksCount(70)
.languages(Arrays.asList("Java", "Python", "Scala"))
.save();
Date snapshotDate2 = Date.from(instant.minus(1, DAYS));
Project project2 = new ProjectBuilder(projectRepository).name("catwatch").snapshotDate(snapshotDate2)
.organizationName("zalando").gitHubProjectId(73561571)
.starsCount(5000).score(90).contributorsCount(500)
.externalContributorsCount(50).commitsCount(130)
.forksCount(90)
.languages(Arrays.asList("Java", "Python", "Scala"))
.save();
testWithNoDates(project2);
testWithStartAndEndDate(snapshotDate1, project1, snapshotDate2, project2);
}
private void testWithStartAndEndDate(final Date snapshotDate1, final Project project1, final Date snapshotDate2,
final Project project2) {
String url = projectUrl().queryParam(API_REQUEST_PARAM_ORGANIZATIONS, "zalando")
.queryParam(API_REQUEST_PARAM_STARTDATE, new SimpleDateFormat(DATE_PATTERN).format(
Date.from(snapshotDate1.toInstant().plus(1, HOURS))))
.queryParam(API_REQUEST_PARAM_ENDDATE, new SimpleDateFormat(DATE_PATTERN).format(
Date.from(snapshotDate2.toInstant().plus(1, HOURS)))).toUriString();
ResponseEntity<Project[]> response = template.getForEntity(url, Project[].class);
assertNotNull(response);
Project[] projects = response.getBody();
assertNotNull(projects);
assertTrue(projects.length == 1);
Project responseProject = projects[0];
assertEquals(responseProject.getStarsCount(),
Integer.valueOf(project2.getStarsCount() - project1.getStarsCount()));
}
private void testWithNoDates(final Project project2) {
String url = projectUrl().queryParam(API_REQUEST_PARAM_ORGANIZATIONS, "zalando").toUriString();
ResponseEntity<Project[]> response = template.getForEntity(url, Project[].class);
assertNotNull(response);
Project[] projects = response.getBody();
assertNotNull(projects);
assertTrue(projects.length == 1);
Project responseProject = projects[0];
assertEquals(responseProject.getStarsCount(), project2.getStarsCount());
assertEquals(responseProject.getScore(), project2.getScore());
assertEquals(responseProject.getContributorsCount(), project2.getContributorsCount());
assertEquals(responseProject.getExternalContributorsCount(), project2.getExternalContributorsCount());
assertEquals(responseProject.getCommitsCount(), project2.getCommitsCount());
assertEquals(responseProject.getScore(), project2.getScore());
}
private UriComponentsBuilder projectUrl() {
return fromHttpUrl(base.toString() + API_RESOURCE_PROJECTS);
}
}