package com.hubspot.blazar.service;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.jukito.JukitoRunner;
import org.jukito.UseModules;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject;
import com.hubspot.blazar.BlazarServiceTestBase;
import com.hubspot.blazar.BlazarServiceTestModule;
import com.hubspot.blazar.base.BuildOptions;
import com.hubspot.blazar.base.BuildTrigger;
import com.hubspot.blazar.base.GitInfo;
import com.hubspot.blazar.base.Module;
import com.hubspot.blazar.base.ModuleActivityPage;
import com.hubspot.blazar.base.ModuleBuildInfo;
import com.hubspot.blazar.base.RepositoryBuild;
import com.hubspot.blazar.data.service.BranchService;
import com.hubspot.blazar.data.service.ModuleBuildService;
import com.hubspot.blazar.data.service.ModuleService;
import io.dropwizard.db.ManagedDataSource;
@RunWith(JukitoRunner.class)
@UseModules({BlazarServiceTestModule.class})
public class ModuleActivityTest extends BlazarServiceTestBase {
@Inject
private BranchService branchService;
@Inject
private ModuleService moduleService;
@Inject
private ModuleBuildService moduleBuildService;
@Inject
private TestUtils testUtils;
private GitInfo branch;
private Module module;
private List<RepositoryBuild> launchedBuilds = new ArrayList<>();
@Before
@Inject
public void before(ManagedDataSource dataSource) throws Exception {
runSql(dataSource, "InterProjectData.sql");
module = moduleService.get(1).get();
branch = branchService.get(moduleService.getBranchIdFromModuleId(module.getId().get())).get();
}
private void seedBuilds() {
// Run 10 build of our module
BuildTrigger trigger = BuildTrigger.forUser("bob");
BuildOptions options = new BuildOptions(ImmutableSet.of(1), BuildOptions.BuildDownstreams.NONE, false);
for (int i=0; i < 10; i++) {
launchedBuilds.add(testUtils.runAndWaitForRepositoryBuild(branch, trigger, options));
}
}
@Test
public void testGetsRightActivity() {
seedBuilds();
ModuleActivityPage page = moduleBuildService.getModuleActivityPage(module.getId().get(), Optional.of(10), Optional.of(100));
// check that we find the number of builds we started
assertThat(page.getModuleBuildInfos().size()).isEqualTo(launchedBuilds.size());
// builds are launched in ASC order, but history endpoint returns in DESC order
launchedBuilds.sort(Comparator.comparing(RepositoryBuild::getBuildNumber, Comparator.reverseOrder()));
// check that they are correctly paired (module build is associated with repo build found)
for (int i = 0; i < page.getModuleBuildInfos().size(); i++) {
RepositoryBuild launchedBuild = launchedBuilds.get(i);
ModuleBuildInfo info = page.getModuleBuildInfos().get(i);
assertThat(launchedBuild).isEqualTo(info.getBranchBuild());
assertThat(info.getModuleBuild().getRepoBuildId()).isEqualTo(launchedBuild.getId().get());
}
}
@Test
public void testGetsCorrectPageSize() {
seedBuilds();
ModuleActivityPage page1 = moduleBuildService.getModuleActivityPage(module.getId().get(), Optional.of(10), Optional.of(100));
// check that we find 10 (the number of builds we started)
assertThat(page1.getModuleBuildInfos().size()).isEqualTo(10);
ModuleActivityPage page2 = moduleBuildService.getModuleActivityPage(module.getId().get(), Optional.of(5), Optional.of(100));
// check that we find 5
assertThat(page2.getModuleBuildInfos().size()).isEqualTo(5);
ModuleActivityPage page3 = moduleBuildService.getModuleActivityPage(module.getId().get(), Optional.of(5), Optional.of(4));
// check that we find 5
assertThat(page3.getModuleBuildInfos().size()).isEqualTo(4);
}
public void testGetsActivity() {
ModuleActivityPage page = moduleBuildService.getModuleActivityPage(module.getId().get(), Optional.of(10), Optional.of(100));
assertThat(page.getModuleBuildInfos().size()).isEqualTo(4);
}
public static GitInfo newGitInfo(int repositoryId, String repositoryName, String branch) {
return new GitInfo(Optional.<Integer>absent(), "github", "HubSpot", repositoryName, repositoryId, branch, true, System.currentTimeMillis(), System.currentTimeMillis());
}
}