From: Lukasz Jarocki Date: Thu, 11 May 2023 14:56:37 +0000 (+0200) Subject: SONAR-18856 accurate usage of project uuid in applications X-Git-Tag: 10.1.0.73491~267 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=73015aec6f1dc68c18fa378641bc2ba5fd257196;p=sonarqube.git SONAR-18856 accurate usage of project uuid in applications --- diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/component/ApplicationProjectsDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/component/ApplicationProjectsDaoIT.java index 37a91d41a48..cc2d83834d2 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/component/ApplicationProjectsDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/component/ApplicationProjectsDaoIT.java @@ -19,6 +19,7 @@ */ package org.sonar.db.component; +import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -33,12 +34,12 @@ import static org.assertj.core.api.Assertions.assertThat; public class ApplicationProjectsDaoIT { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(System2.INSTANCE, true); - private UuidFactoryFast uuids = UuidFactoryFast.getInstance(); - private TestSystem2 system2 = new TestSystem2(); - private DbSession dbSession = db.getSession(); - private ApplicationProjectsDao underTest = new ApplicationProjectsDao(system2, uuids); + private final UuidFactoryFast uuids = UuidFactoryFast.getInstance(); + private final TestSystem2 system2 = new TestSystem2(); + private final DbSession dbSession = db.getSession(); + private final ApplicationProjectsDao underTest = new ApplicationProjectsDao(system2, uuids); @Before public void before() { @@ -79,10 +80,10 @@ public class ApplicationProjectsDaoIT { @Test public void select_project_branches_from_application_branch() { - var project = db.components().insertPublicProject(p -> p.setKey("project")).getProjectDto(); - var projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("project-branch")); - var app = db.components().insertPrivateApplication(a -> a.setKey("app1")).getProjectDto(); - var appBranch = db.components().insertProjectBranch(app, b -> b.setKey("app-branch")); + ProjectDto project = db.components().insertPublicProject(p -> p.setKey("project")).getProjectDto(); + BranchDto projectBranch = db.components().insertProjectBranch(project, b -> b.setKey("project-branch")); + ProjectDto app = db.components().insertPrivateApplication(a -> a.setKey("app1")).getProjectDto(); + BranchDto appBranch = db.components().insertProjectBranch(app, b -> b.setKey("app-branch")); db.components().addApplicationProject(app, project); underTest.addProjectBranchToAppBranch(dbSession, app.getUuid(), appBranch.getUuid(), project.getUuid(), projectBranch.getUuid()); assertThat(underTest.selectProjectBranchesFromAppBranchUuid(dbSession, appBranch.getUuid())).extracting(BranchDto::getKey).containsOnly("project-branch"); @@ -112,16 +113,32 @@ public class ApplicationProjectsDaoIT { assertThat(underTest.selectProjects(dbSession, "uuid")).extracting(ProjectDto::getUuid).containsOnly("p1"); } + @Test - public void remove() { - insertApplicationProject("uuid", "p1"); - insertApplicationProject("uuid", "p2"); + public void selectProjectsMainBranchesOfApplication_whenApplicationDoesNotExist_shouldReturnEmptyList() { + insertBranchesForProjectUuids(true, "1"); - underTest.remove(dbSession, "uuid"); - assertThat(underTest.selectProjects(dbSession, "uuid")).isEmpty(); + List branchDtos = underTest.selectProjectsMainBranchesOfApplication(dbSession, "1"); + + assertThat(branchDtos).isEmpty(); } - private String insertApplicationProject(String applicationUuid, String projectUuid) { + @Test + public void selectProjectsMainBranchesOfApplication_whenApplicationExistWithTwoProjects_shouldReturnTwoBranches() { + String appUuid = "appUuid"; + insertProject("1"); + insertProject("2"); + insertBranchesForProjectUuids(false, "1", "2"); + insertApplicationProjectWithoutProject(appUuid, "1"); + insertApplicationProjectWithoutProject(appUuid, "2"); + + List branchDtos = underTest.selectProjectsMainBranchesOfApplication(dbSession, appUuid); + + assertThat(branchDtos).hasSize(2); + assertThat(branchDtos).extracting(BranchDto::isMain).allMatch(s -> true); + } + + private void insertApplicationProject(String applicationUuid, String projectUuid) { String uuid = uuids.create(); db.executeInsert( "app_projects", @@ -130,19 +147,22 @@ public class ApplicationProjectsDaoIT { "project_uuid", projectUuid, "created_at", 1000L); insertProject(projectUuid); - return uuid; } - private void insertProject(String projectUuid) { - db.executeInsert("projects", - "uuid", projectUuid, - "kee", projectUuid, - "qualifier", "TRK", - "private", true, - "updated_at", 1000L, + private void insertApplicationProjectWithoutProject(String applicationUuid, String projectUuid) { + String uuid = uuids.create(); + db.executeInsert( + "app_projects", + "uuid", uuid, + "application_uuid", applicationUuid, + "project_uuid", projectUuid, "created_at", 1000L); } + private void insertProject(String projectUuid) { + db.components().insertPrivateProject(c -> {}, p -> p.setUuid(projectUuid)); + } + private void insertApplication(String appUuid) { db.executeInsert("projects", "uuid", appUuid, @@ -154,6 +174,10 @@ public class ApplicationProjectsDaoIT { } private void insertBranch(String projectUuid, String branchKey) { + insertBranch(projectUuid, branchKey, false); + } + + private void insertBranch(String projectUuid, String branchKey, boolean isMain) { db.executeInsert("project_branches", "uuid", branchKey, "branch_type", "BRANCH", @@ -162,7 +186,13 @@ public class ApplicationProjectsDaoIT { "NEED_ISSUE_SYNC", true, "updated_at", 1000L, "created_at", 1000L, - "is_main", false); + "is_main", isMain); + } + + private void insertBranchesForProjectUuids(boolean mainBranch, String... projectUuids) { + for (String uuid : projectUuids) { + insertBranch(uuid, "key" + uuid + mainBranch, mainBranch); + } } } diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/component/BranchDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/component/BranchDaoIT.java index 270a3e6a1ba..b0bb9df6e60 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/component/BranchDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/component/BranchDaoIT.java @@ -50,7 +50,6 @@ import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic; import static org.apache.commons.lang.StringUtils.repeat; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; -import static org.assertj.core.api.Assertions.linesOf; import static org.assertj.core.api.Assertions.tuple; import static org.sonar.db.component.BranchType.BRANCH; import static org.sonar.db.component.BranchType.PULL_REQUEST; @@ -113,8 +112,6 @@ public class BranchDaoIT { dto2.setKey("branch"); underTest.insert(dbSession, dto2); - int a = 12124; - underTest.updateBranchName(dbSession, "U1", "master"); BranchDto loaded = underTest.selectByBranchKey(dbSession, "U1", "master").get(); assertThat(loaded.getMergeBranchUuid()).isNull(); @@ -854,4 +851,47 @@ public class BranchDaoIT { assertThat(underTest.selectMainBranchByProjectUuid(dbSession, "U1")).isEmpty(); } + + @Test + public void selectMainBranchesByProjectUuids_whenNoUuidsPassed_shouldReturnEmpty() { + insertBranchesForProjectUuids(true, "1"); + + List branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of()); + + assertThat(branchDtos).isEmpty(); + } + + @Test + public void selectMainBranchesByProjectUuids_whenOneUuidPassedAndTwoBranchesInDatabase_shouldReturnOneBranch() { + insertBranchesForProjectUuids(true, "1", "2"); + + List branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of("1")); + + assertThat(branchDtos).hasSize(1); + assertThat(branchDtos).extracting(BranchDto::getProjectUuid).allMatch(s -> s.equals("1")); + } + + @Test + public void selectMainBranchesByProjectUuids_whenTenUuidsPassedAndTenBranchesInDatabase_shouldReturnAllBranches() { + String[] projectUuids = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; + insertBranchesForProjectUuids(true, projectUuids); + insertBranchesForProjectUuids(false, projectUuids); + + List branchDtos = underTest.selectMainBranchesByProjectUuids(dbSession, Set.of(projectUuids)); + + assertThat(branchDtos).hasSize(10); + assertThat(branchDtos).extracting(BranchDto::isMain).allMatch(b -> true); + } + + private void insertBranchesForProjectUuids(boolean mainBranch, String... uuids) { + for (String uuid : uuids) { + BranchDto dto = new BranchDto(); + dto.setProjectUuid(uuid); + dto.setUuid(uuid + "-uuid" + mainBranch); + dto.setIsMain(mainBranch); + dto.setBranchType(BranchType.BRANCH); + dto.setKey("feature-" + uuid + mainBranch); + underTest.insert(dbSession, dto); + } + } } diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/measure/LiveMeasureDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/measure/LiveMeasureDaoIT.java index bb52a216671..674833e209e 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/measure/LiveMeasureDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/measure/LiveMeasureDaoIT.java @@ -36,6 +36,7 @@ import org.sonar.api.utils.System2; import org.sonar.db.DbTester; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.ProjectData; import org.sonar.db.metric.MetricDto; import static java.util.Arrays.asList; @@ -173,19 +174,19 @@ public class LiveMeasureDaoIT { @Test public void selectForProjectsByMetricUuids_shouldReturnProjectWithTRKQualifierOnly() { MetricDto metric = db.measures().insertMetric(); - ComponentDto application = db.components().insertPrivateApplication().getMainBranchComponent(); - ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent(); - ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent(); + ProjectData application = db.components().insertPrivateApplication(); + ProjectData project = db.components().insertPrivateProject(); + ProjectData project2 = db.components().insertPrivateProject(); db.components().addApplicationProject(application, project, project2); - underTest.insert(db.getSession(), newLiveMeasure(application, metric).setValue(3.14).setData((String) null)); - underTest.insert(db.getSession(), newLiveMeasure(project, metric).setValue(4.54).setData((String) null)); - underTest.insert(db.getSession(), newLiveMeasure(project2, metric).setValue(5.56).setData((String) null)); + underTest.insert(db.getSession(), newLiveMeasure(application.getMainBranchComponent(), metric).setValue(3.14).setData((String) null)); + underTest.insert(db.getSession(), newLiveMeasure(project.getMainBranchComponent(), metric).setValue(4.54).setData((String) null)); + underTest.insert(db.getSession(), newLiveMeasure(project2.getMainBranchComponent(), metric).setValue(5.56).setData((String) null)); List selected = underTest.selectForProjectsByMetricUuids(db.getSession(), List.of(metric.getUuid())); assertThat(selected) .extracting(LiveMeasureDto::getProjectUuid) - .containsExactlyInAnyOrder(project.uuid(), project2.uuid()); + .containsExactlyInAnyOrder(project.projectUuid(), project2.projectUuid()); } @Test diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectDaoIT.java index 5e57fc83960..94fa0a6a606 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/project/ProjectDaoIT.java @@ -43,6 +43,7 @@ import org.sonar.db.audit.AuditPersister; import org.sonar.db.audit.NoOpAuditPersister; import org.sonar.db.component.BranchDto; import org.sonar.db.component.ComponentDto; +import org.sonar.db.component.ProjectData; import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.metric.MetricDto; import org.sonar.db.qualityprofile.QProfileDto; @@ -316,14 +317,14 @@ public class ProjectDaoIT { } @Test public void selectAllProjectUuids_shouldOnlyReturnProjectWithTRKQualifier() { - ComponentDto application = db.components().insertPrivateApplication().getMainBranchComponent(); - ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent(); - ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent(); + ProjectData application = db.components().insertPrivateApplication(); + ProjectData project = db.components().insertPrivateProject(); + ProjectData project2 = db.components().insertPrivateProject(); db.components().addApplicationProject(application, project, project2); List projectUuids = projectDao.selectAllProjectUuids(db.getSession()); - assertThat(projectUuids).containsExactlyInAnyOrder(project.uuid(), project2.uuid()); + assertThat(projectUuids).containsExactlyInAnyOrder(project.projectUuid(), project2.projectUuid()); } private void insertDefaultQualityProfile(String language) { diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsDao.java index 2e708ed2b82..ff33dc8eb38 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsDao.java @@ -20,6 +20,7 @@ package org.sonar.db.component; import java.util.Collection; +import java.util.List; import java.util.Set; import org.sonar.api.utils.System2; import org.sonar.core.util.UuidFactory; @@ -53,11 +54,6 @@ public class ApplicationProjectsDao implements Dao { return getMapper(dbSession).selectProjects(applicationUuid); } - public void remove(DbSession dbSession, String applicationUuid) { - getMapper(dbSession).removeApplicationBranchProjectBranchesByApplication(applicationUuid); - getMapper(dbSession).removeApplicationProjectsByApplication(applicationUuid); - } - public void addProjectBranchToAppBranch(DbSession dbSession, BranchDto applicationBranch, BranchDto projectBranch) { getMapper(dbSession).addProjectBranchToAppBranch( uuidFactory.create(), @@ -98,11 +94,11 @@ public class ApplicationProjectsDao implements Dao { return getMapper(dbSession).selectApplicationsFromProjects(projectUuids); } - private static ApplicationProjectsMapper getMapper(DbSession session) { - return session.getMapper(ApplicationProjectsMapper.class); + public List selectProjectsMainBranchesOfApplication(DbSession dbSession, String applicationUuid) { + return getMapper(dbSession).selectProjectsMainBranchesOfApplication(applicationUuid); } - public void removeAllProjectBranchesOfAppBranch(DbSession dbSession, String applicationBranchUuid) { - getMapper(dbSession).removeAllProjectBranchesOfAppBranch(applicationBranchUuid); + private static ApplicationProjectsMapper getMapper(DbSession session) { + return session.getMapper(ApplicationProjectsMapper.class); } } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsMapper.java index 28e8dec3623..16bc8b1915b 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/ApplicationProjectsMapper.java @@ -20,6 +20,7 @@ package org.sonar.db.component; import java.util.Collection; +import java.util.List; import java.util.Set; import org.apache.ibatis.annotations.Param; import org.sonar.db.project.ProjectDto; @@ -41,10 +42,6 @@ public interface ApplicationProjectsMapper { Set selectProjects(@Param("applicationUuid") String applicationUuid); - void removeApplicationProjectsByApplication(String applicationUuid); - - void removeApplicationBranchProjectBranchesByApplication(String applicationUuid); - void addProjectBranchToAppBranch( @Param("uuid") String uuid, @Param("applicationUuid") String applicationUuid, @@ -65,5 +62,5 @@ public interface ApplicationProjectsMapper { Set selectApplicationsFromProjects(@Param("projectUuids") Collection projectUuids); - void removeAllProjectBranchesOfAppBranch(@Param("applicationBranchUuid") String applicationBranchUuid); + List selectProjectsMainBranchesOfApplication(String applicationUuid); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java index 39d000faec9..e884c269e4e 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchDao.java @@ -95,7 +95,7 @@ public class BranchDao implements Dao { */ public Collection selectByComponent(DbSession dbSession, ComponentDto component) { BranchDto branchDto = mapper(dbSession).selectByUuid(component.branchUuid()); - if(branchDto == null) { + if (branchDto == null) { return List.of(); } return mapper(dbSession).selectByProjectUuid(branchDto.getProjectUuid()); @@ -109,7 +109,14 @@ public class BranchDao implements Dao { return mapper(dbSession).selectMainBranchByProjectUuid(projectUuid); } - public List countPrBranchAnalyzedLanguageByProjectUuid(DbSession dbSession){ + public List selectMainBranchesByProjectUuids(DbSession dbSession, Set projectUuids) { + if (projectUuids.isEmpty()) { + return List.of(); + } + return mapper(dbSession).selectMainBranchesByProjectUuids(projectUuids); + } + + public List countPrBranchAnalyzedLanguageByProjectUuid(DbSession dbSession) { return mapper(dbSession).countPrBranchAnalyzedLanguageByProjectUuid(); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java index 3d3a7daa5d2..803cae647d2 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/component/BranchMapper.java @@ -74,4 +74,6 @@ public interface BranchMapper { short doAnyOfComponentsNeedIssueSync(@Param("componentKeys") List components); Optional selectMainBranchByProjectUuid(String projectUuid); + + List selectMainBranchesByProjectUuids(@Param("projectUuids") Set projectUuids); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java index d777f526599..4836b3969cb 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueTesting.java @@ -43,23 +43,23 @@ public class IssueTesting { // only statics } - public static IssueDto newIssue(RuleDto rule, ComponentDto project, ComponentDto file) { - checkArgument(project.qualifier().equals(Qualifiers.PROJECT), "Second parameter should be a project"); - return newIssue(rule, project.uuid(), project.getKey(), file); + public static IssueDto newIssue(RuleDto rule, ComponentDto branch, ComponentDto file) { + checkArgument(branch.qualifier().equals(Qualifiers.PROJECT), "Second parameter should be a branch that belongs to a project"); + return newIssue(rule, branch.uuid(), branch.getKey(), file); } public static IssueDto newIssue(RuleDto rule, ProjectDto project, ComponentDto file) { return newIssue(rule, project.getUuid(), project.getKey(), file); } - public static IssueDto newIssue(RuleDto rule, String projectUuid, String projectKey, ComponentDto file) { - //checkArgument(file.branchUuid().equals(projectUuid), "The file doesn't belong to the project"); + public static IssueDto newIssue(RuleDto rule, String branchUuid, String projectKey, ComponentDto file) { + //checkArgument(file.branchUuid().equals(branchUuid), "The file doesn't belong to the project"); return new IssueDto() .setKee("uuid_" + randomAlphabetic(5)) .setRule(rule) .setType(rule.getType()) - .setProjectUuid(projectUuid) + .setProjectUuid(branchUuid) .setProjectKey(projectKey) .setComponent(file) .setStatus(Issue.STATUS_OPEN) diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ApplicationProjectsMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ApplicationProjectsMapper.xml index 254ef938291..5f277f8c630 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ApplicationProjectsMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ApplicationProjectsMapper.xml @@ -203,4 +203,13 @@ application_branch_uuid=#{applicationBranchUuid,jdbcType=VARCHAR} + + + diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml index 462f3d10144..0ce062f2ee5 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/BranchMapper.xml @@ -115,6 +115,16 @@ and is_main = ${_true} + +