]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11038 Add ProjectAlmBindingsDao.findProjectKey
authorJanos Gyerik <janos.gyerik@sonarsource.com>
Fri, 27 Jul 2018 11:09:06 +0000 (13:09 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 10 Aug 2018 18:21:29 +0000 (20:21 +0200)
server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/alm/ProjectAlmBindingsMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/alm/ProjectAlmBindingsMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/alm/ProjectAlmBindingsDaoTest.java

index 51d5789ae89529dfc3438acc1b7eeee292113444..45fbecb66e0a253dce519d2ff304c6bd5fefad9a 100644 (file)
@@ -81,6 +81,14 @@ public class ProjectAlmBindingsDao implements Dao {
     return Optional.ofNullable(getMapper(session).selectByRepoId(alm.getId(), repoId));
   }
 
+  public Optional<String> findProjectKey(DbSession dbSession, ALM alm, String repoId) {
+    checkAlm(alm);
+    checkRepoId(repoId);
+
+    ProjectAlmBindingsMapper mapper = getMapper(dbSession);
+    return Optional.ofNullable(mapper.selectProjectKey(alm.getId(), repoId));
+  }
+
   private static void checkAlm(@Nullable ALM alm) {
     Objects.requireNonNull(alm, "alm can't be null");
   }
index 41eec6968e4e955cd0ad2230a6824bc5739bf6b6..df0484e578025b06fec49dd7ed8fa0a8ffe50d19 100644 (file)
@@ -20,6 +20,7 @@
 package org.sonar.db.alm;
 
 import java.util.List;
+import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import org.apache.ibatis.annotations.Param;
 
@@ -38,4 +39,7 @@ public interface ProjectAlmBindingsMapper {
   ProjectAlmBindingDto selectByRepoId(@Param("almId") String almId, @Param("repoId") String repoId);
 
   ProjectAlmBindingDto selectByProjectUuid(@Param("projectUuid") String projectUuid);
+
+  @CheckForNull
+  String selectProjectKey(@Param("almId") String almId, @Param("repoId") String repoId);
 }
index 317e4038790c9181c0499bb1b3ff2cfba6d8875d..1cb6e67e3b5952ed9997e6e049a9f2dcbfc71feb 100644 (file)
     project_uuid = #{projectUuid, jdbcType=VARCHAR}
   </select>
 
+  <select id="selectProjectKey" parameterType="Map" resultType="String">
+    select
+      p.kee as projectKey
+    from
+      project_alm_bindings b join projects p
+      on b.project_uuid = p.project_uuid
+    where
+      alm_id = #{almId, jdbcType=VARCHAR}
+      and repo_id = #{repoId, jdbcType=VARCHAR}
+  </select>
+
 </mapper>
index b434588cdabe98fca0e68c0047cd17e31b48e96d..fd279815dc7872fffa04c8ca15b3d4a869b8f03f 100644 (file)
@@ -31,9 +31,13 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.sonar.api.utils.System2;
 import org.sonar.core.util.UuidFactory;
+import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ComponentTesting;
 
+import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.tuple;
 import static org.mockito.Mockito.mock;
@@ -65,8 +69,9 @@ public class ProjectAlmBindingsDaoTest {
   public ExpectedException expectedException = ExpectedException.none();
   @Rule
   public DbTester dbTester = DbTester.create(system2);
-
+  private DbClient dbClient = dbTester.getDbClient();
   private DbSession dbSession = dbTester.getSession();
+
   private UuidFactory uuidFactory = mock(UuidFactory.class);
   private ProjectAlmBindingsDao underTest = new ProjectAlmBindingsDao(system2, uuidFactory);
 
@@ -121,8 +126,8 @@ public class ProjectAlmBindingsDaoTest {
 
   @Test
   public void insert() {
-    when(uuidFactory.create()).thenReturn(A_UUID);
     when(system2.now()).thenReturn(DATE);
+    when(uuidFactory.create()).thenReturn("uuid1");
     underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
 
     assertThatProjectAlmBinding(GITHUB, A_REPO)
@@ -135,8 +140,8 @@ public class ProjectAlmBindingsDaoTest {
 
   @Test
   public void update() {
-    when(uuidFactory.create()).thenReturn(A_UUID);
     when(system2.now()).thenReturn(DATE);
+    when(uuidFactory.create()).thenReturn("uuid1");
     underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
 
     when(system2.now()).thenReturn(DATE_LATER);
@@ -153,9 +158,7 @@ public class ProjectAlmBindingsDaoTest {
   @Test
   public void insert_multiple() {
     when(system2.now()).thenReturn(DATE);
-    when(uuidFactory.create())
-      .thenReturn(A_UUID)
-      .thenReturn(ANOTHER_UUID);
+    when(uuidFactory.create()).thenReturn("uuid1").thenReturn("uuid2");
     underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
     underTest.insertOrUpdate(dbSession, GITHUB, ANOTHER_REPO, ANOTHER_UUID, ANOTHER_GITHUB_SLUG, ANOTHER_URL);
 
@@ -202,7 +205,7 @@ public class ProjectAlmBindingsDaoTest {
 
   @Test
   public void mappingExists_returns_true_when_entry_exists() {
-    when(uuidFactory.create()).thenReturn(A_UUID);
+    when(uuidFactory.create()).thenReturn("uuid1");
     underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
 
     assertThat(underTest.bindingExists(dbSession, GITHUB, A_REPO)).isTrue();
@@ -261,17 +264,55 @@ public class ProjectAlmBindingsDaoTest {
       .thenReturn("uuid1")
       .thenReturn("uuid2")
       .thenReturn("uuid3");
+
     underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, A_UUID, A_GITHUB_SLUG, A_URL);
     underTest.insertOrUpdate(dbSession, GITHUB, ANOTHER_REPO, ANOTHER_UUID, null, ANOTHER_URL);
     underTest.insertOrUpdate(dbSession, BITBUCKETCLOUD, ANOTHER_REPO, "foo", null, "http://foo");
 
     assertThat(underTest.selectByRepoIds(dbSession, GITHUB, Arrays.asList(A_REPO, ANOTHER_REPO, "foo")))
-      .extracting(ProjectAlmBindingDto::getUuid, ProjectAlmBindingDto::getAlmId, ProjectAlmBindingDto::getRepoId, ProjectAlmBindingDto::getProjectUuid, ProjectAlmBindingDto::getUrl, ProjectAlmBindingDto::getGithubSlug)
+      .extracting(ProjectAlmBindingDto::getUuid, ProjectAlmBindingDto::getAlmId, ProjectAlmBindingDto::getRepoId, ProjectAlmBindingDto::getProjectUuid,
+        ProjectAlmBindingDto::getUrl, ProjectAlmBindingDto::getGithubSlug)
       .containsExactlyInAnyOrder(
         tuple("uuid1", GITHUB.getId(), A_REPO, A_UUID, A_URL, A_GITHUB_SLUG),
         tuple("uuid2", GITHUB.getId(), ANOTHER_REPO, ANOTHER_UUID, ANOTHER_URL, null));
   }
 
+  @Test
+  public void findProjectKey_throws_NPE_when_alm_is_null() {
+    expectAlmNPE();
+
+    underTest.findProjectKey(dbSession, null, A_REPO);
+  }
+
+  @Test
+  public void findProjectKey_throws_IAE_when_repo_id_is_null() {
+    expectRepoIdNullOrEmptyIAE();
+
+    underTest.findProjectKey(dbSession, GITHUB, null);
+  }
+
+  @Test
+  public void findProjectKey_throws_IAE_when_repo_id_is_empty() {
+    expectRepoIdNullOrEmptyIAE();
+
+    underTest.findProjectKey(dbSession, GITHUB, EMPTY_STRING);
+  }
+
+  @Test
+  public void findProjectKey_returns_empty_when_entry_does_not_exist_in_DB() {
+    assertThat(underTest.findProjectKey(dbSession, GITHUB, A_REPO)).isEmpty();
+  }
+
+  @Test
+  public void findProjectKey_returns_projectKey_when_entry_exists() {
+    String projectKey = randomAlphabetic(10);
+    ComponentDto project = createProject(projectKey);
+    when(uuidFactory.create()).thenReturn("uuid1");
+    underTest.insertOrUpdate(dbSession, GITHUB, A_REPO, project.projectUuid(), A_GITHUB_SLUG, A_URL);
+
+    assertThat(underTest.findProjectKey(dbSession, GITHUB, A_REPO)).contains(projectKey);
+  }
+
   private void expectAlmNPE() {
     expectedException.expect(NullPointerException.class);
     expectedException.expectMessage("alm can't be null");
@@ -392,4 +433,11 @@ public class ProjectAlmBindingsDaoTest {
       this.updatedAt = updatedAt;
     }
   }
+
+  private ComponentDto createProject(String projectKey) {
+    ComponentDto project = ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert()).setDbKey(projectKey);
+    dbClient.componentDao().insert(dbSession, project);
+    dbSession.commit();
+    return project;
+  }
 }