package org.zalando.catwatch.backend.util;
import com.google.common.collect.Lists;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
import org.junit.Test;
import org.zalando.catwatch.backend.model.Project;
import java.util.Date;
import java.util.List;
import static org.hamcrest.collection.IsEmptyCollection.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsCollectionContaining.hasItem;
import static org.junit.Assert.assertThat;
public class LanguageStatsTest {
private static final String JAVA = "java";
private static final String PYTHON = "python";
@Test
public void thatNullLanguageNameResultsInUnknownLanguage() {
LanguageStats languageStats = new LanguageStats(null, null, null);
assertThat(languageStats.getLanguageName(), is("unknown"));
}
@Test
public void thatStatsAreBuiltForEmptyProjects() {
assertThat(LanguageStats.buildStats(Lists.newArrayList()), empty());
}
@Test
public void thatStatsAreBuildForSingleProjectWithoutLanguageName() {
Project project = new Project();
project.setSnapshotDate(new Date());
List<LanguageStats> listOfLanguageStats = LanguageStats.buildStats(Lists.newArrayList(project));
assertThat(listOfLanguageStats.size(), is(1));
LanguageStats languageStats = listOfLanguageStats.get(0);
assertThat(languageStats.getLanguageName(), is("unknown"));
List<Integer> projectCounts = languageStats.getProjectCounts();
assertThat(projectCounts.size(), is(1));
assertThat(projectCounts.get(0), is(1));
}
@Test
public void thatStatsAreBuildForTwoProjectsOfDifferentLanguageAndSameSnapshotDate() {
Date snapshotDate = new Date();
Project javaProject = new Project();
javaProject.setName("Project 1");
javaProject.setPrimaryLanguage(JAVA);
javaProject.setSnapshotDate(snapshotDate);
Project pythonProject = new Project();
pythonProject.setName("Project 2");
pythonProject.setPrimaryLanguage(PYTHON);
pythonProject.setSnapshotDate(snapshotDate);
List<LanguageStats> listOfLanguageStats = LanguageStats.buildStats(Lists.newArrayList(javaProject, pythonProject));
assertThat(listOfLanguageStats.size(), is(2));
assertThat(listOfLanguageStats,
hasItem(new LanguageStatsMatcher(JAVA, Lists.newArrayList(1), Lists.newArrayList(snapshotDate))));
assertThat(listOfLanguageStats,
hasItem(new LanguageStatsMatcher(PYTHON, Lists.newArrayList(1), Lists.newArrayList(snapshotDate))));
}
@Test
public void thatDuplicateProjectsAreFiltered() {
Date snapshotDate = new Date();
Project javaProject = new Project();
javaProject.setName("Project 1");
javaProject.setPrimaryLanguage(JAVA);
javaProject.setSnapshotDate(snapshotDate);
Project duplicateProject = new Project();
duplicateProject.setName("Project 1");
duplicateProject.setPrimaryLanguage(JAVA);
duplicateProject.setSnapshotDate(snapshotDate);
List<LanguageStats> listOfLanguageStats = LanguageStats.buildStats(Lists.newArrayList(javaProject, duplicateProject));
assertThat(listOfLanguageStats.size(), is(1));
}
private class LanguageStatsMatcher extends TypeSafeMatcher<LanguageStats> {
private String languageName;
private List<Integer> projectCounts;
private List<Date> snapshotDates;
LanguageStatsMatcher(String languageName, List<Integer> projectCounts, List<Date> snapshotDates) {
this.languageName = languageName;
this.projectCounts = projectCounts;
this.snapshotDates = snapshotDates;
}
@Override
protected boolean matchesSafely(LanguageStats languageStats) {
return languageName.equals(languageStats.getLanguageName()) &&
projectCounts.equals(languageStats.getProjectCounts()) &&
snapshotDates.equals(languageStats.getSnapshotDates());
}
@Override
public void describeTo(Description description) {
description.appendText("projectCounts " + projectCounts +
" and snapshotDates " + snapshotDates +
" and languageName " + languageName);
}
}
}