From fec874489985e355d8f47201a750ba9b0647f53e Mon Sep 17 00:00:00 2001 From: Duarte Meneses Date: Thu, 17 Aug 2017 15:11:07 +0200 Subject: [PATCH] SONAR-9628 Branches must not appear in administration of projects --- .../sonar/db/component/ComponentMapper.xml | 5 +- .../ProjectQgateAssociationMapper.xml | 1 + .../qualityprofile/QualityProfileMapper.xml | 5 +- .../sonar/db/component/ComponentDaoTest.java | 55 +++++++++++++++++++ .../ProjectQgateAssociationDaoTest.java | 5 +- .../qualityprofile/QualityProfileDaoTest.java | 4 ++ .../ProjectQgateAssociationDaoTest/shared.xml | 21 +++++++ 7 files changed, 91 insertions(+), 5 deletions(-) diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml index d7079ac7a10..a30f402448c 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/component/ComponentMapper.xml @@ -276,7 +276,8 @@ where p.enabled=${_true} - and p.copy_component_uuid is null + AND p.main_branch_project_uuid is null + AND p.copy_component_uuid is null and p.organization_uuid=#{organizationUuid,jdbcType=VARCHAR} @@ -425,6 +426,7 @@ where s2.id is null and p.qualifier='TRK' + and p.main_branch_project_uuid is null and p.copy_component_uuid is null and ( @@ -453,6 +455,7 @@ from projects p p.enabled=${_true} + AND p.main_branch_project_uuid is null AND p.copy_component_uuid is null AND p.qualifier = 'TRK' diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml index 74c2111e8ef..14c8cbd1b58 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualitygate/ProjectQgateAssociationMapper.xml @@ -10,6 +10,7 @@ where proj.qualifier = 'TRK' and proj.enabled = ${_true} + and proj.main_branch_project_uuid is null and proj.copy_component_uuid is null diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml index 1e3276715be..e0aae550a54 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/qualityprofile/QualityProfileMapper.xml @@ -297,6 +297,7 @@ where pj.scope = 'PRJ' and pj.qualifier = 'TRK' + and pj.main_branch_project_uuid is null and upper(pj.name) like #{nameQuery, jdbcType=VARCHAR} and pj.organization_uuid = #{organizationUuid, jdbcType=VARCHAR} order by pj.name ASC @@ -307,7 +308,7 @@ FROM projects pj LEFT JOIN project_qprofiles pp ON pp.project_uuid = pj.uuid AND pp.profile_key = #{profileUuid, jdbcType=VARCHAR} - WHERE pj.scope='PRJ' AND pj.qualifier='TRK' + WHERE pj.scope='PRJ' AND pj.qualifier='TRK' AND pj.main_branch_project_uuid is null AND UPPER(pj.name) LIKE #{nameQuery, jdbcType=VARCHAR} AND pp.profile_key IS NULL AND pj.organization_uuid = #{organizationUuid, jdbcType=VARCHAR} @@ -319,7 +320,7 @@ FROM projects pj LEFT JOIN project_qprofiles pp ON pp.project_uuid = pj.uuid AND pp.profile_key = #{profileUuid, jdbcType=VARCHAR} - WHERE pj.scope='PRJ' AND pj.qualifier='TRK' + WHERE pj.scope='PRJ' AND pj.qualifier='TRK' AND pj.main_branch_project_uuid is null AND UPPER(pj.name) LIKE #{nameQuery, jdbcType=VARCHAR} AND pj.organization_uuid = #{organizationUuid, jdbcType=VARCHAR} ORDER BY pj.name ASC diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java index 21eae5e1253..96dedef6184 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/component/ComponentDaoTest.java @@ -743,6 +743,24 @@ public class ComponentDaoTest { assertThat(underTest.countGhostProjects(dbSession, organization.getUuid(), null)).isEqualTo(3); } + @Test + public void dont_select_branch_ghost_projects() { + OrganizationDto organization = db.organizations().insert(); + + // ghosts because has at least one snapshot with status U but none with status P + ComponentDto ghostProject = db.components().insertPrivateProject(organization); + db.components().insertSnapshot(ghostProject, dto -> dto.setStatus("U")); + db.components().insertSnapshot(ghostProject, dto -> dto.setStatus("U")); + ComponentDto ghostBranchProject = db.components().insertProjectBranch(ghostProject); + + db.components().insertSnapshot(ghostBranchProject, dto -> dto.setStatus("U")); + + assertThat(underTest.selectGhostProjects(dbSession, organization.getUuid(), null, 0, 10)) + .extracting(ComponentDto::uuid) + .containsOnly(ghostProject.uuid()); + assertThat(underTest.countGhostProjects(dbSession, organization.getUuid(), null)).isEqualTo(1); + } + @Test public void selectByProjectUuid() { ComponentDto project = db.components().insertPrivateProject(); @@ -964,6 +982,23 @@ public class ComponentDaoTest { .isEmpty(); } + @Test + public void selectByQuery_should_not_return_branches() { + ComponentDto main = db.components().insertMainBranch(); + ComponentDto branch = db.components().insertProjectBranch(main); + + assertThat(underTest.selectByQuery(dbSession, ALL_PROJECTS_COMPONENT_QUERY, 0, 2)).hasSize(1); + assertThat(underTest.selectByQuery(dbSession, ALL_PROJECTS_COMPONENT_QUERY, 0, 2).get(0).uuid()).isEqualTo(main.uuid()); + } + + @Test + public void countByQuery_should_not_include_branches() { + ComponentDto main = db.components().insertMainBranch(); + ComponentDto branch = db.components().insertProjectBranch(main); + + assertThat(underTest.countByQuery(dbSession, ALL_PROJECTS_COMPONENT_QUERY)).isEqualTo(1); + } + @Test public void countByQuery_with_organization_filters_on_specified_organization() { OrganizationDto organization1 = db.organizations().insert(); @@ -1281,6 +1316,26 @@ public class ComponentDaoTest { assertThat(components).extracting("organizationUuid").containsOnly(organizationDto.getUuid()); } + @Test + public void select_projects_by_name_ignore_branches() { + OrganizationDto organizationDto = db.organizations().insert(); + ComponentDto project1 = db.components().insertComponent(ComponentTesting.newPrivateProjectDto(organizationDto).setName("project1")); + ComponentDto module1 = db.components().insertComponent(newModuleDto(project1).setName("project1")); + ComponentDto subModule1 = db.components().insertComponent(newModuleDto(module1).setName("project1")); + + db.components().insertComponent(newFileDto(subModule1).setName("project1")); + db.components().insertProjectBranch(project1, b -> b.setKey("branch1")); + + // check that branch is present with same name as main branch + assertThat(underTest.selectByKeyAndBranch(dbSession, project1.getKey(), "branch1").get().name()).isEqualTo("project1"); + + // branch is not returned + assertThat(underTest.selectProjectsByNameQuery(dbSession, null, false)).extracting(ComponentDto::uuid) + .containsOnly(project1.uuid()); + assertThat(underTest.selectProjectsByNameQuery(dbSession, "project", false)).extracting(ComponentDto::uuid) + .containsOnly(project1.uuid()); + } + @Test public void select_projects_by_name_query() { OrganizationDto organizationDto = db.organizations().insert(); diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java index ac367f96381..df22238b152 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest.java @@ -19,8 +19,11 @@ */ package org.sonar.db.qualitygate; +import static org.assertj.core.api.Assertions.assertThat; + import java.util.List; import java.util.Optional; + import org.junit.Rule; import org.junit.Test; import org.sonar.api.utils.System2; @@ -30,8 +33,6 @@ import org.sonar.db.DbTester; import org.sonar.db.component.ComponentDto; import org.sonar.db.property.PropertyDto; -import static org.assertj.core.api.Assertions.assertThat; - public class ProjectQgateAssociationDaoTest { @Rule diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java index 97391a80f54..4583a3bc5cb 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/qualityprofile/QualityProfileDaoTest.java @@ -489,6 +489,7 @@ public class QualityProfileDaoTest { QProfileDto profileWithProjects = db.qualityProfiles().insert(organization); ComponentDto project1 = db.components().insertPrivateProject(organization); ComponentDto project2 = db.components().insertPrivateProject(organization); + db.qualityProfiles().associateWithProject(project1, profileWithProjects); db.qualityProfiles().associateWithProject(project2, profileWithProjects); @@ -580,6 +581,7 @@ public class QualityProfileDaoTest { ComponentDto project3 = db.components().insertPrivateProject(t -> t.setName("Project3 name"), t -> t.setOrganizationUuid(organization.getUuid())); OrganizationDto organization2 = db.organizations().insert(); ComponentDto project4 = db.components().insertPrivateProject(t -> t.setName("Project4 name"), t -> t.setOrganizationUuid(organization2.getUuid())); + ComponentDto branch = db.components().insertProjectBranch(project1, t -> t.setKey("branch")); QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); @@ -608,6 +610,7 @@ public class QualityProfileDaoTest { ComponentDto project3 = db.components().insertPrivateProject(t -> t.setName("Project3 name"), t -> t.setOrganizationUuid(organization.getUuid())); OrganizationDto organization2 = db.organizations().insert(); ComponentDto project4 = db.components().insertPrivateProject(t -> t.setName("Project4 name"), t -> t.setOrganizationUuid(organization2.getUuid())); + ComponentDto branch = db.components().insertProjectBranch(project1, t -> t.setKey("branch")); QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); @@ -635,6 +638,7 @@ public class QualityProfileDaoTest { ComponentDto project3 = db.components().insertPrivateProject(t -> t.setName("Project3 name"), t -> t.setOrganizationUuid(organization.getUuid())); OrganizationDto organization2 = db.organizations().insert(); ComponentDto project4 = db.components().insertPrivateProject(t -> t.setName("Project4 name"), t -> t.setOrganizationUuid(organization2.getUuid())); + ComponentDto branch = db.components().insertProjectBranch(project1, t -> t.setKey("branch")); QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); diff --git a/server/sonar-db-dao/src/test/resources/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest/shared.xml b/server/sonar-db-dao/src/test/resources/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest/shared.xml index 2c53537979d..3b4ee850ea7 100644 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest/shared.xml +++ b/server/sonar-db-dao/src/test/resources/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest/shared.xml @@ -11,6 +11,7 @@ root_uuid="A" project_uuid="A" kee="project-one" + main_branch_project_uuid="[null]" name="Project One" qualifier="TRK" scope="PRJ" @@ -24,6 +25,7 @@ root_uuid="B" project_uuid="B" kee="project-two" + main_branch_project_uuid="[null]" name="Project Two" qualifier="TRK" scope="PRJ" @@ -37,6 +39,7 @@ root_uuid="C" project_uuid="C" kee="project-three" + main_branch_project_uuid="[null]" name="Project Three" qualifier="TRK" scope="PRJ" @@ -50,6 +53,7 @@ root_uuid="D" project_uuid="D" kee="project-four" + main_branch_project_uuid="[null]" name="Project Four" qualifier="TRK" scope="PRJ" @@ -63,6 +67,7 @@ root_uuid="E" project_uuid="E" kee="project-five" + main_branch_project_uuid="[null]" name="Project Five" qualifier="TRK" scope="PRJ" @@ -76,6 +81,7 @@ root_uuid="F" project_uuid="F" kee="view-six" + main_branch_project_uuid="[null]" name="View Six" qualifier="VW" scope="PRJ" @@ -89,6 +95,7 @@ root_uuid="G" project_uuid="G" kee="file-one" + main_branch_project_uuid="[null]" name="File One" qualifier="TRK" scope="FIL" @@ -96,6 +103,20 @@ copy_component_uuid="C" id="7" private="[false]"/> +