package org.zalando.catwatch.backend.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.zalando.catwatch.backend.model.Project;
import org.zalando.catwatch.backend.repo.ProjectRepository;
import org.zalando.catwatch.backend.repo.builder.ProjectBuilder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import static java.util.Collections.singletonList;
import static java.util.Optional.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ProjectServiceImplTest {
@InjectMocks
ProjectServiceImpl projectService;
@Mock
ProjectRepository projectRepository;
private final String ORGANIZATION1 = "organization1";
private final String LANGUAGE1 = "JAVA";
@Test
public void findProjectsByOrganizationNameTest() throws Exception {
// given
Project p = new ProjectBuilder().create();
when(projectRepository.findProjects(ORGANIZATION1, empty(), empty())).thenReturn(singletonList(p));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
empty(), empty(), empty(), empty(), empty());
// then
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findMostRecentProjectsTest() throws Exception {
// given
Date snapshotDate = new Date(System.currentTimeMillis());
Project p = new ProjectBuilder().snapshotDate(snapshotDate).gitHubProjectId(1).organizationName(ORGANIZATION1)
.starsCount(1).commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
when(projectRepository.findProjects(ORGANIZATION1, snapshotDate, empty(), empty()))
.thenReturn(singletonList(p));
when(projectRepository.findProjects(ORGANIZATION1, empty(), empty())).thenReturn(singletonList(p));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
Optional.of(snapshotDate), empty(), empty(), empty(), empty());
// then
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findProjectsByProjectNameAndSnapshotDateTest() throws Exception {
// given
Date snapshotDate = new Date(System.currentTimeMillis());
Project p = new ProjectBuilder().snapshotDate(snapshotDate).gitHubProjectId(1).organizationName(ORGANIZATION1)
.starsCount(1).commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
when(projectRepository.findProjects(ORGANIZATION1, snapshotDate, Optional.of("PROJECT Z"), empty()))
.thenReturn(singletonList(p));
when(projectRepository.findProjects(ORGANIZATION1, Optional.of("PROJECT Z"), empty()))
.thenReturn(singletonList(p));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
Optional.of(snapshotDate), empty(), empty(), Optional.of("PROJECT Z"), empty());
// then
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findProjectsByProjectNameAndLanguageTest() throws Exception {
// given
Project p = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
when(projectRepository.findProjects(ORGANIZATION1, Optional.of("PROJECT Z"),
Optional.of(LANGUAGE1))).thenReturn(singletonList(p));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
empty(), empty(), empty(), Optional.of("PROJECT Z"), Optional.of(LANGUAGE1));
// then
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findProjectPerformanceByStartDateAndEndDateTest() throws Exception {
// given
Date snapshotDate = new Date(System.currentTimeMillis());
Project p = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).snapshotDate(snapshotDate)
.starsCount(4).commitsCount(6).contributorsCount(2).score(20).forksCount(0).create();
Project p1 = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).days(1).starsCount(1)
.commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
when(projectRepository.findProjects(ORGANIZATION1, snapshotDate, empty(), empty()))
.thenReturn(singletonList(p));
when(projectRepository.findProjects(ORGANIZATION1, p1.getSnapshotDate(), empty(), empty()))
.thenReturn(singletonList(p1));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
Optional.ofNullable(p1.getSnapshotDate()), Optional.ofNullable(p.getSnapshotDate()), empty(), empty(),
empty());
// then
p.setStarsCount(p.getStarsCount() - p1.getStarsCount());
p.setCommitsCount(p.getCommitsCount() - p1.getCommitsCount());
p.setForksCount(p.getForksCount() - p1.getForksCount());
p.setContributorsCount(p.getContributorsCount() - p1.getContributorsCount());
p.setScore(p.getScore() - p1.getScore());
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findProjectsByStartDateAndEndDateTest() throws Exception {
// given
Date snapshotDate = new Date(System.currentTimeMillis());
Project p = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).snapshotDate(snapshotDate)
.starsCount(4).commitsCount(6).contributorsCount(2).score(20).forksCount(0).create();
Project p1 = new ProjectBuilder().gitHubProjectId(2).organizationName(ORGANIZATION1).days(1).starsCount(1)
.commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
when(projectRepository.findProjects(ORGANIZATION1, snapshotDate, empty(), empty()))
.thenReturn(singletonList(p));
when(projectRepository.findProjects(ORGANIZATION1, p1.getSnapshotDate(), empty(), empty()))
.thenReturn(singletonList(p1));
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
Optional.ofNullable(p1.getSnapshotDate()), Optional.ofNullable(p.getSnapshotDate()), empty(), empty(),
empty());
// then
assertThat(projectList, hasSize(1));
assertThat(projectList.get(0), equalTo(p));
}
@Test
public void findProjectsBySnapshotDateSortByTest() throws Exception {
// given
Project p = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).starsCount(4)
.commitsCount(6).contributorsCount(2).score(20).forksCount(0).create();
Project p1 = new ProjectBuilder().gitHubProjectId(2).organizationName(ORGANIZATION1).starsCount(3)
.commitsCount(2).contributorsCount(1).score(20).forksCount(0).create();
Project p2 = new ProjectBuilder().gitHubProjectId(3).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(3).contributorsCount(1).score(20).forksCount(0).create();
List<Project> projects = new ArrayList<>();
projects.add(p);
projects.add(p1);
projects.add(p2);
when(projectRepository.findProjects(ORGANIZATION1, empty(), empty())).thenReturn(projects);
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
empty(), empty(), Optional.of("-commits"), empty(), empty());
// then
projects = new ArrayList<>();
projects.add(p);
projects.add(p2);
projects.add(p1);
assertThat(projectList, hasSize(3));
assertThat(projectList, equalTo(projects));
// when
projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, empty(), empty(),
empty(), empty(), Optional.of("stars"), empty(), empty());
// then
projects = new ArrayList<>();
projects.add(p2);
projects.add(p1);
projects.add(p);
assertThat(projectList, hasSize(3));
assertThat(projectList, equalTo(projects));
}
@Test
public void findProjectsBySnapshotDatePagination() throws Exception {
// given
Project p = new ProjectBuilder().gitHubProjectId(1).organizationName(ORGANIZATION1).starsCount(4)
.commitsCount(6).contributorsCount(2).score(20).forksCount(0).create();
Project p1 = new ProjectBuilder().gitHubProjectId(2).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(2).contributorsCount(1).score(50).forksCount(0).create();
Project p2 = new ProjectBuilder().gitHubProjectId(3).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(3).contributorsCount(1).score(15).forksCount(0).create();
Project p3 = new ProjectBuilder().gitHubProjectId(4).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(3).contributorsCount(1).score(30).forksCount(0).create();
Project p4 = new ProjectBuilder().gitHubProjectId(5).organizationName(ORGANIZATION1).starsCount(1)
.commitsCount(3).contributorsCount(1).score(39).forksCount(0).create();
List<Project> projects = new ArrayList<>();
projects.add(p);
projects.add(p1);
projects.add(p2);
projects.add(p3);
projects.add(p4);
when(projectRepository.findProjects(ORGANIZATION1, empty(), empty())).thenReturn(projects);
// when
List<Project> projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, Optional.of(2),
empty(), empty(), empty(), empty(), empty(), empty());
// then
projects = new ArrayList<>();
projects.add(p1);
projects.add(p4);
assertThat(projectList, hasSize(2));
assertThat(projectList, equalTo(projects));
// when
projectList = (List<Project>) projectService.findProjects(ORGANIZATION1, Optional.of(3),
Optional.of(1), empty(), empty(), empty(), empty(), empty());
// then
projects = new ArrayList<>();
projects.add(p4);
projects.add(p3);
projects.add(p);
assertThat(projectList, hasSize(3));
assertThat(projectList, equalTo(projects));
}
}