From 25d4527f1b1f4f9d2ad2161e52aa05e8ada7c1a5 Mon Sep 17 00:00:00 2001 From: Antoine Vinot Date: Wed, 12 Oct 2022 17:50:35 +0200 Subject: [PATCH] SONAR-17437 - Improve project search for quality profile by searching for the key --- .../qualityprofile/QualityProfileMapper.java | 6 +- .../qualityprofile/QualityProfileMapper.xml | 31 ++++++--- .../qualityprofile/QualityProfileDaoTest.java | 63 +++++++++++++------ .../qualityprofile/ws/ProjectsActionTest.java | 23 ++++--- 4 files changed, 83 insertions(+), 40 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java index ec6a84fd1f2..8a27afb1aad 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualityprofile/QualityProfileMapper.java @@ -114,15 +114,15 @@ public interface QualityProfileMapper { List selectSelectedProjects( @Param("profileUuid") String profileUuid, - @Param("nameQuery") String nameQuery); + @Param("nameOrKeyQuery") String nameOrKeyQuery); List selectDeselectedProjects( @Param("profileUuid") String profileUuid, - @Param("nameQuery") String nameQuery); + @Param("nameOrKeyQuery") String nameOrKeyQuery); List selectProjectAssociations( @Param("profileUuid") String profileUuid, - @Param("nameQuery") String nameQuery); + @Param("nameOrKeyQuery") String nameOrKeyQuery); List selectUuidsOfCustomRuleProfiles(@Param("language") String language, @Param("name") String name); 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 a48cbe39e7e..b3f7fef3f39 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 @@ -355,28 +355,41 @@ pj.scope = 'PRJ' and pj.qualifier = 'TRK' and pj.main_branch_project_uuid is null - and upper(pj.name) like #{nameQuery, jdbcType=VARCHAR} + and (upper(pj.name) like #{nameOrKeyQuery, jdbcType=VARCHAR} or upper(pj.kee) like #{nameOrKeyQuery, jdbcType=VARCHAR}) order by pj.name ASC 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 0631c5d3fc3..1e0f71be954 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 @@ -185,7 +185,7 @@ public class QualityProfileDaoTest { public void selectRuleProfile() { RulesProfileDto rp = insertRulesProfile(); - assertThat(underTest.selectRuleProfile(dbSession, rp.getUuid()).getName()).isEqualTo(rp.getName()); + assertThat(underTest.selectRuleProfile(dbSession, rp.getUuid())).extracting(RulesProfileDto::getName).isEqualTo(rp.getName()); assertThat(underTest.selectRuleProfile(dbSession, "missing")).isNull(); } @@ -237,8 +237,6 @@ public class QualityProfileDaoTest { ProjectDto project2 = db.components().insertPrivateProjectDto(); ProjectDto project3 = db.components().insertPrivateProjectDto(); - db.getDbClient().projectDao().selectByUuid(dbSession, project1.getUuid()).get(); - db.qualityProfiles().associateWithProject(project1, profile1); db.qualityProfiles().associateWithProject(project2, profile1); db.qualityProfiles().associateWithProject(project3, profile2); @@ -365,7 +363,7 @@ public class QualityProfileDaoTest { @Test public void selectByNameAndLanguage() { - List sharedData = createSharedData(); + createSharedData(); QProfileDto dto = underTest.selectByNameAndLanguage(dbSession, "Sonar Way", "java"); assertThat(dto).isNotNull(); @@ -647,14 +645,10 @@ public class QualityProfileDaoTest { QProfileDto jsProfile = db.qualityProfiles().insert(p -> p.setLanguage("js")); db.qualityProfiles().associateWithProject(project1, javaProfile, jsProfile); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "java").getKee()) - .isEqualTo(javaProfile.getKee()); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "js").getKee()) - .isEqualTo(jsProfile.getKee()); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "cobol")) - .isNull(); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project2, "java")) - .isNull(); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "java")).extracting(QProfileDto::getKee).isEqualTo(javaProfile.getKee()); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "js")).extracting(QProfileDto::getKee).isEqualTo(jsProfile.getKee()); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project1, "cobol")).isNull(); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project2, "java")).isNull(); } @Test @@ -733,8 +727,8 @@ public class QualityProfileDaoTest { underTest.updateProjectProfileAssociation(dbSession, project, javaProfile2.getKee(), javaProfile1.getKee()); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project, "java").getKee()).isEqualTo(javaProfile2.getKee()); - assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project, "js").getKee()).isEqualTo(jsProfile.getKee()); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project, "java")).extracting(QProfileDto::getKee).isEqualTo(javaProfile2.getKee()); + assertThat(underTest.selectAssociatedToProjectAndLanguage(dbSession, project, "js")).extracting(QProfileDto::getKee).isEqualTo(jsProfile.getKee()); } @Test @@ -755,8 +749,8 @@ public class QualityProfileDaoTest { ComponentDto project1 = db.components().insertPrivateProject(t -> t.setName("Project1 name")); ComponentDto project2 = db.components().insertPrivateProject(t -> t.setName("Project2 name")); ComponentDto project3 = db.components().insertPrivateProject(t -> t.setName("Project3 name")); - ComponentDto project4 = db.components().insertPrivateProject(t -> t.setName("Project4 name")); - ComponentDto branch = db.components().insertProjectBranch(project1, t -> t.setKey("branch")); + db.components().insertPrivateProject(t -> t.setName("Project4 name")); + db.components().insertProjectBranch(project1, t -> t.setKey("branch")); QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); @@ -808,7 +802,7 @@ public class QualityProfileDaoTest { ComponentDto project1 = db.components().insertPrivateProject(t -> t.setName("Project1 name")); ComponentDto project2 = db.components().insertPrivateProject(t -> t.setName("Project2 name")); ComponentDto project3 = db.components().insertPrivateProject(t -> t.setName("Project3 name")); - ComponentDto branch = db.components().insertProjectBranch(project1, t -> t.setKey("branch")); + db.components().insertProjectBranch(project1, t -> t.setKey("branch")); QProfileDto profile1 = newQualityProfileDto(); db.qualityProfiles().insert(profile1); @@ -833,8 +827,8 @@ public class QualityProfileDaoTest { @Test public void selectUuidsOfCustomRulesProfiles_returns_the_custom_profiles_with_specified_name() { QProfileDto outdatedProfile1 = db.qualityProfiles().insert(p -> p.setIsBuiltIn(false).setLanguage("java").setName("foo")); - QProfileDto differentLanguage = db.qualityProfiles().insert(p -> p.setIsBuiltIn(false).setLanguage("cobol").setName("foo")); - QProfileDto differentName = db.qualityProfiles().insert(p -> p.setIsBuiltIn(false).setLanguage("java").setName("bar")); + db.qualityProfiles().insert(p -> p.setIsBuiltIn(false).setLanguage("cobol").setName("foo")); + db.qualityProfiles().insert(p -> p.setIsBuiltIn(false).setLanguage("java").setName("bar")); Collection keys = underTest.selectUuidsOfCustomRulesProfiles(dbSession, "java", "foo"); assertThat(keys).containsOnly(outdatedProfile1.getRulesProfileUuid()); @@ -883,6 +877,37 @@ public class QualityProfileDaoTest { assertThat(result).isEmpty(); } + @Test + public void selectProjectAssociations_shouldFindResult_whenQueryMatchingKey() { + ComponentDto privateProject = db.components().insertPrivateProject(project -> project.setName("project name"), project -> project.setKey("project_key")); + QProfileDto qProfileDto = db.qualityProfiles().insert(); + + List results = underTest.selectProjectAssociations(dbSession, qProfileDto, "key"); + + assertThat(results).extracting(ProjectQprofileAssociationDto::getProjectUuid).containsOnly(privateProject.uuid()); + } + + @Test + public void selectSelectedProjects_shouldFindResult_whenQueryMatchingKey() { + ComponentDto privateProject = db.components().insertPrivateProject(project -> project.setName("project name"), project -> project.setKey("project_key")); + QProfileDto qProfileDto = db.qualityProfiles().insert(); + db.qualityProfiles().associateWithProject(db.components().getProjectDto(privateProject), qProfileDto); + + List results = underTest.selectSelectedProjects(dbSession, qProfileDto, "key"); + + assertThat(results).extracting(ProjectQprofileAssociationDto::getProjectUuid).containsOnly(privateProject.uuid()); + } + + @Test + public void selectDeselectedProjects_shouldFindResult_whenQueryMatchingKey() { + ComponentDto privateProject = db.components().insertPrivateProject(project -> project.setName("project name"), project -> project.setKey("project_key")); + QProfileDto qProfileDto = db.qualityProfiles().insert(); + + List results = underTest.selectDeselectedProjects(dbSession, qProfileDto, "key"); + + assertThat(results).extracting(ProjectQprofileAssociationDto::getProjectUuid).containsOnly(privateProject.uuid()); + } + private List createSharedData() { QProfileDto dto1 = new QProfileDto() .setKee("java_sonar_way") diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java index f179570d0c2..6dde162782b 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/ProjectsActionTest.java @@ -31,6 +31,7 @@ import org.sonar.db.qualityprofile.QProfileDto; import org.sonar.db.user.UserDto; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.tester.UserSessionRule; +import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.WsActionTester; import static org.assertj.core.api.Assertions.assertThat; @@ -241,11 +242,13 @@ public class ProjectsActionTest { } @Test - public void filter_on_name() { + public void filter_on_name_and_key() { ProjectDto project1 = db.components().insertPublicProjectDto(p -> p.setName("Project One")); ProjectDto project2 = db.components().insertPublicProjectDto(p -> p.setName("Project Two")); ProjectDto project3 = db.components().insertPublicProjectDto(p -> p.setName("Project Three")); - ProjectDto project4 = db.components().insertPublicProjectDto(p -> p.setName("Project Four")); + db.components().insertPublicProjectDto(p -> p.setName("Project Four")); + ProjectDto project5 = db.components().insertPublicProjectDto(p -> p.setDbKey("Project the fifth")); + QProfileDto qualityProfile = db.qualityProfiles().insert(); associateProjectsWithProfile(qualityProfile, project1, project2); @@ -266,6 +269,11 @@ public class ProjectsActionTest { " \"key\": \"" + project2.getKey() + "\",\n" + " \"name\": \"" + project2.getName() + "\",\n" + " \"selected\": true\n" + + " },\n" + + " {\n" + + " \"key\": \"" + project5.getKey() + "\",\n" + + " \"name\": \"" + project5.getName() + "\",\n" + + " \"selected\": false\n" + " }\n" + " ]}\n"); } @@ -290,12 +298,8 @@ public class ProjectsActionTest { @Test public void fail_on_nonexistent_profile() { - assertThatThrownBy(() -> { - ws.newRequest() - .setParam(PARAM_KEY, "unknown") - .execute(); - }) - .isInstanceOf(NotFoundException.class); + TestRequest testRequest = ws.newRequest().setParam(PARAM_KEY, "unknown"); + assertThatThrownBy(testRequest::execute).isInstanceOf(NotFoundException.class); } @Test @@ -306,10 +310,11 @@ public class ProjectsActionTest { assertThat(definition.responseExampleAsString()).isNotEmpty(); assertThat(definition.params()).extracting(Param::key).containsExactlyInAnyOrder("key", "p", "ps", "q", "selected"); Param profile = definition.param("key"); + assertThat(profile).isNotNull(); assertThat(profile.deprecatedKey()).isNullOrEmpty(); assertThat(definition.param("p")).isNotNull(); assertThat(definition.param("ps")).isNotNull(); - Param query = definition.param("q"); + assertThat(definition.param("q")).isNotNull(); } private void associateProjectsWithProfile(QProfileDto profile, ProjectDto... projects) { -- 2.39.5