package org.zalando.catwatch.backend.web.fetch;
import org.apache.commons.beanutils.BeanComparator;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.support.CronSequenceGenerator;
import org.zalando.catwatch.backend.model.Contributor;
import org.zalando.catwatch.backend.model.Project;
import org.zalando.catwatch.backend.model.Statistics;
import org.zalando.catwatch.backend.repo.ContributorRepository;
import org.zalando.catwatch.backend.repo.ProjectRepository;
import org.zalando.catwatch.backend.repo.StatisticsRepository;
import org.zalando.catwatch.backend.web.AbstractCatwatchIT;
import java.util.Collection;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.TimeZone.getTimeZone;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.springframework.web.util.UriComponentsBuilder.fromHttpUrl;
import static org.zalando.catwatch.backend.web.config.DateUtil.iso8601;
@IntegrationTest({ "github.login=", "organization.list=rwitzeltestorg,rwitzeltestorg2", "server.port=0" })
public class FetchControllerIT extends AbstractCatwatchIT {
@Autowired
private Environment env;
@Autowired
private ContributorRepository contributorRepository;
@Autowired
private StatisticsRepository statisticsRepository;
@Autowired
private ProjectRepository projectRepository;
@Test
public void testCronExpressionEveryDayInTheMorning() throws Exception {
CronSequenceGenerator cronSequence = new CronSequenceGenerator(env.getProperty("schedule"), getTimeZone("UTC"));
assertThat(cronSequence.next(iso8601("2015-07-01T08:21:34Z")), equalTo(iso8601("2015-07-02T08:01:00Z")));
assertThat(cronSequence.next(iso8601("2015-07-02T08:01:01Z")), equalTo(iso8601("2015-07-03T08:01:00Z")));
}
/**
* Ignored as long as this test hangs from time to time (locally rarely but quite often at Travis).
*/
@Ignore
@Test
public void testFetch() throws Exception {
// given
contributorRepository.deleteAll();
statisticsRepository.deleteAll();
projectRepository.deleteAll();
// when
String result = template.getForEntity(fetchUrl(), String.class).getBody();
// then
assertThat(result, equalTo("OK"));
List<Statistics> statisticses = newArrayList(statisticsRepository.findAll());
List<Contributor> contributors = newArrayList(contributorRepository.findAll());
List<Project> projects = newArrayList(projectRepository.findAll());
assertThat(statisticses.size(), equalTo(2));
assertThat(projects.size(), equalTo(2));
assertThat(contributors.size(), equalTo(2));
Statistics statistics = sort(statisticses, "organizationName").get(0);
Project project = sort(projects, "organizationName").get(0);
assertThat(statistics.getOrganizationName(), equalTo("rwitzeltestorg"));
assertThat(project.getName(), equalTo("testrepo1"));
assertThat(contributors.get(0).getName(), equalTo("Rodrigo Witzel"));
assertThat(contributors.get(1).getName(), equalTo("Rodrigo Witzel"));
}
private String fetchUrl() {
return fromHttpUrl(base.toString() + "fetch").toUriString();
}
private <T> List<T> sort(Collection<T> collection, String property) {
return collection.stream().sorted(new BeanComparator<>(property)).collect(toList());
}
}