package org.zalando.catwatch.backend.web; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.util.UriComponentsBuilder; import org.zalando.catwatch.backend.model.Contributor; import org.zalando.catwatch.backend.repo.ContributorRepository; import org.zalando.catwatch.backend.repo.builder.ContributorBuilder; import java.net.URI; import java.util.Date; import java.util.Map; import static java.time.Instant.now; import static java.time.temporal.ChronoUnit.DAYS; import static java.time.temporal.ChronoUnit.HOURS; import static java.util.Date.from; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.springframework.http.HttpMethod.GET; import static org.springframework.web.util.UriComponentsBuilder.fromHttpUrl; import static org.zalando.catwatch.backend.util.Constants.*; import static org.zalando.catwatch.backend.web.config.DateUtil.iso8601; public class ContributorsApiIT extends AbstractCatwatchIT { @Autowired private ContributorRepository repository; public ContributorBuilder newContributor() { return new ContributorBuilder(repository); } @SuppressWarnings("unchecked") @Test public void testContributorsGet_Serialization() throws Exception { // given repository.deleteAll(); Contributor c = newContributor().organizationName("IBM").save(); // when String url = contributorUrl().queryParam("organizations", "IBM").toUriString(); Map<String, Object>[] contributors = exchange(GET, url, Map[].class).getBody(); // then assertEquals(contributors.length, 1); assertThat(contributors[0].get("id"), equalTo((int) c.getId())); assertThat(contributors[0].get("snapshotDate"), equalTo(c.getSnapshotDate().getTime())); } @Test public void testContributorsGet_FindInPeriodOfTime() throws Exception { // given repository.deleteAll(); newContributor().id(11).days(2).organizationId(1).organizationName("IBM").orgCommits(28).save(); newContributor().id(11).days(3).organizationId(1).organizationName("IBM").orgCommits(23).save(); newContributor().id(11).days(4).organizationId(1).organizationName("IBM").orgCommits(20).save(); newContributor().id(12).days(2).organizationId(2).organizationName("Sun").orgCommits(18).save(); newContributor().id(12).days(4).organizationId(2).organizationName("Sun").orgCommits(16).save(); newContributor().id(13).days(2).organizationId(1).organizationName("IBM").orgCommits(7).save(); newContributor().id(13).days(4).organizationId(1).organizationName("IBM").orgCommits(4).save(); Date endDate = from(now()); Date startDate = from(now().minus(3, DAYS).minus(12, HOURS)); // when String url = contributorUrl() // .queryParam(API_REQUEST_PARAM_ORGANIZATIONS, " IBM,Sun") .queryParam(API_REQUEST_PARAM_STARTDATE, iso8601(startDate)) // .queryParam(API_REQUEST_PARAM_ENDDATE, iso8601(endDate)) // .toUriString(); ResponseEntity<Contributor[]> response = exchange(GET, url, Contributor[].class); // then Contributor[] contributors = response.getBody(); assertThat(contributors[0].getId(), equalTo(11L)); assertThat(contributors[0].getOrganizationalCommitsCount(), equalTo(8)); assertThat(contributors[1].getId(), equalTo(13L)); assertThat(contributors[1].getOrganizationalCommitsCount(), equalTo(3)); assertThat(contributors[2].getId(), equalTo(12L)); assertThat(contributors[2].getOrganizationalCommitsCount(), equalTo(2)); assertThat(contributors.length, equalTo(3)); } @Test public void testContributorsGet_SortBy() throws Exception { // given repository.deleteAll(); newContributor().days(1).orgCommits(28).orgProjects(33).persProjects(10).name("Alf").organizationName("IBM") .save(); newContributor().days(1).orgCommits(29).orgProjects(32).persProjects(11).name("Ben").organizationName("Sun") .save(); // when Contributor[] contributors = exchange(GET, builder().queryParam("sortBy", "-name").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Ben")); assertThat(contributors[1].getName(), equalTo("Alf")); // when contributors = exchange(GET, builder().queryParam("sortBy", "name").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Alf")); assertThat(contributors[1].getName(), equalTo("Ben")); // when contributors = exchange(GET, builder().queryParam("sortBy", "-personalProjectsCount").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Ben")); assertThat(contributors[1].getName(), equalTo("Alf")); // when contributors = exchange(GET, builder().queryParam("sortBy", "personalProjectsCount").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Alf")); assertThat(contributors[1].getName(), equalTo("Ben")); // when contributors = exchange(GET, builder().queryParam("sortBy", "-organizationalProjectsCount").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Alf")); assertThat(contributors[1].getName(), equalTo("Ben")); // when contributors = exchange(GET, builder().queryParam("sortBy", "-organizationalCommitsCount").toUriString(), Contributor[].class).getBody(); // then assertThat(contributors.length, equalTo(2)); assertThat(contributors[0].getName(), equalTo("Ben")); assertThat(contributors[1].getName(), equalTo("Alf")); // TODO does not work yet!!! // // when // contributors = exchange(GET, builder().queryParam("sortBy", "-organizationName").toUriString(), // Contributor[].class).getBody(); // // // then // assertThat(contributors.length, equalTo(2)); // assertThat(contributors[0].getName(), equalTo("Ben")); // assertThat(contributors[1].getName(), equalTo("Alf")); } private UriComponentsBuilder builder() { return contributorUrl().queryParam(API_REQUEST_PARAM_ORGANIZATIONS, "IBM,Sun"); } private <T> ResponseEntity<T> exchange(HttpMethod method, String url, Class<T> clazz) throws Exception { RequestEntity<String> requestEntity = new RequestEntity<>(method, new URI(url)); return template.exchange(requestEntity, clazz); } private UriComponentsBuilder contributorUrl() { return fromHttpUrl(base.toString() + API_RESOURCE_CONTRIBUTORS); } }