From: Julien Lancelot Date: Thu, 14 Dec 2017 11:29:46 +0000 (+0100) Subject: SONAR-10134 Use QGateWithOrgDto instead of id in ProjectQgateAssociationQuery X-Git-Tag: 7.0-RC1~106 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2089d18f4994d347e8952142f3638eed999f80d1;p=sonarqube.git SONAR-10134 Use QGateWithOrgDto instead of id in ProjectQgateAssociationQuery --- diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationQuery.java b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationQuery.java index 3962d8f6ff8..f57e20bd308 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationQuery.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/qualitygate/ProjectQgateAssociationQuery.java @@ -54,7 +54,7 @@ public class ProjectQgateAssociationQuery { private final int pageIndex; private ProjectQgateAssociationQuery(Builder builder) { - this.gateId = Long.toString(builder.gateId); + this.gateId = Long.toString(builder.qualityGate.getId()); this.membership = builder.membership; this.projectSearch = builder.projectSearch; if (this.projectSearch == null) { @@ -97,7 +97,7 @@ public class ProjectQgateAssociationQuery { } public static class Builder { - private long gateId; + private QGateWithOrgDto qualityGate; private String membership; private String projectSearch; @@ -107,8 +107,8 @@ public class ProjectQgateAssociationQuery { private Builder() { } - public Builder gateId(long gateId) { - this.gateId = gateId; + public Builder qualityGate(QGateWithOrgDto qualityGate) { + this.qualityGate = qualityGate; return this; } 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 f79bd01d847..3de2b4f21e6 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 @@ -23,67 +23,111 @@ import java.util.List; import java.util.Optional; import org.junit.Rule; import org.junit.Test; -import org.sonar.api.utils.System2; -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.property.PropertyDto; +import org.sonar.db.organization.OrganizationDto; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; public class ProjectQgateAssociationDaoTest { @Rule - public DbTester db = DbTester.create(System2.INSTANCE); + public DbTester db = DbTester.create(); - private DbClient dbClient = db.getDbClient(); private DbSession dbSession = db.getSession(); private ProjectQgateAssociationDao underTest = db.getDbClient().projectQgateAssociationDao(); @Test public void select_all_projects_by_query() { - db.prepareDbUnit(getClass(), "shared.xml"); - - ProjectQgateAssociationQuery query = ProjectQgateAssociationQuery.builder().gateId(42L).build(); - List result = underTest.selectProjects(dbSession, query); - assertThat(result).hasSize(5); + OrganizationDto organization = db.organizations().insert(); + QGateWithOrgDto qualityGate1 = db.qualityGates().insertQualityGate(organization); + QGateWithOrgDto qualityGate2 = db.qualityGates().insertQualityGate(organization); + ComponentDto project1 = db.components().insertPrivateProject(organization); + ComponentDto project2 = db.components().insertPrivateProject(organization); + ComponentDto project3 = db.components().insertPrivateProject(organization); + db.qualityGates().associateProjectToQualityGate(project1, qualityGate1); + db.qualityGates().associateProjectToQualityGate(project2, qualityGate1); + db.qualityGates().associateProjectToQualityGate(project3, qualityGate2); + + List result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate1) + .build()); + + assertThat(result) + .extracting(ProjectQgateAssociationDto::getId, ProjectQgateAssociationDto::getName, ProjectQgateAssociationDto::getGateId) + .containsExactlyInAnyOrder( + tuple(project1.getId(), project1.name(), qualityGate1.getId().toString()), + tuple(project2.getId(), project2.name(), qualityGate1.getId().toString()), + tuple(project3.getId(), project3.name(), null)); } @Test public void select_projects_by_query() { - db.prepareDbUnit(getClass(), "shared.xml"); - - assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).membership(ProjectQgateAssociationQuery.IN).build())).hasSize(3); - assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).membership(ProjectQgateAssociationQuery.OUT).build())).hasSize(2); + OrganizationDto organization = db.organizations().insert(); + QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); + ComponentDto project1 = db.components().insertPrivateProject(organization); + ComponentDto project2 = db.components().insertPrivateProject(organization); + ComponentDto project3 = db.components().insertPrivateProject(organization); + db.qualityGates().associateProjectToQualityGate(project1, qualityGate); + db.qualityGates().associateProjectToQualityGate(project2, qualityGate); + + assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate) + .membership(ProjectQgateAssociationQuery.IN) + .build())) + .extracting(ProjectQgateAssociationDto::getId, ProjectQgateAssociationDto::getName, ProjectQgateAssociationDto::getGateId) + .containsExactlyInAnyOrder( + tuple(project1.getId(), project1.name(), qualityGate.getId().toString()), + tuple(project2.getId(), project2.name(), qualityGate.getId().toString())); + + assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate) + .membership(ProjectQgateAssociationQuery.OUT) + .build())) + .extracting(ProjectQgateAssociationDto::getId, ProjectQgateAssociationDto::getName, ProjectQgateAssociationDto::getGateId) + .containsExactlyInAnyOrder(tuple(project3.getId(), project3.name(), null)); } @Test public void search_by_project_name() { - db.prepareDbUnit(getClass(), "shared.xml"); - - List result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).projectSearch("one").build()); - assertThat(result).hasSize(1); - - assertThat(result.get(0).getName()).isEqualTo("Project One"); - - result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).projectSearch("one").build()); - assertThat(result).hasSize(1); - result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).projectSearch("project").build()); - assertThat(result).hasSize(5); + OrganizationDto organization = db.organizations().insert(); + QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); + ComponentDto project1 = db.components().insertPrivateProject(organization, p -> p.setName("Project One")); + ComponentDto project2 = db.components().insertPrivateProject(organization, p -> p.setName("Project Two")); + ComponentDto project3 = db.components().insertPrivateProject(organization, p -> p.setName("Project Three")); + db.qualityGates().associateProjectToQualityGate(project1, qualityGate); + db.qualityGates().associateProjectToQualityGate(project2, qualityGate); + + assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate) + .projectSearch("one") + .build())) + .extracting(ProjectQgateAssociationDto::getId) + .containsExactlyInAnyOrder(project1.getId()); + + assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate) + .projectSearch("project") + .build())) + .extracting(ProjectQgateAssociationDto::getId) + .containsExactlyInAnyOrder(project1.getId(), project2.getId(), project3.getId()); } @Test - public void should_be_sorted_by_project_name() { - db.prepareDbUnit(getClass(), "shared.xml"); - - List result = underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder().gateId(42L).build()); - assertThat(result).hasSize(5); - assertThat(result.get(0).getName()).isEqualTo("Project Five"); - assertThat(result.get(1).getName()).isEqualTo("Project Four"); - assertThat(result.get(2).getName()).isEqualTo("Project One"); - assertThat(result.get(3).getName()).isEqualTo("Project Three"); - assertThat(result.get(4).getName()).isEqualTo("Project Two"); + public void sorted_by_project_name() { + OrganizationDto organization = db.organizations().insert(); + QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization); + ComponentDto project1 = db.components().insertPrivateProject(organization, p -> p.setName("Project One")); + ComponentDto project2 = db.components().insertPrivateProject(organization, p -> p.setName("Project Two")); + ComponentDto project3 = db.components().insertPrivateProject(organization, p -> p.setName("Project Three")); + + assertThat(underTest.selectProjects(dbSession, ProjectQgateAssociationQuery.builder() + .qualityGate(qualityGate) + .build())) + .extracting(ProjectQgateAssociationDto::getId) + .containsExactly(project1.getId(), project3.getId(), project2.getId()); } @Test @@ -97,19 +141,17 @@ public class ProjectQgateAssociationDaoTest { @Test public void select_qgate_id() { - associateProjectToQualityGate(10L, 1L); - associateProjectToQualityGate(11L, 2L); + OrganizationDto organization = db.organizations().insert(); + QGateWithOrgDto qualityGate1 = db.qualityGates().insertQualityGate(organization); + QGateWithOrgDto qualityGate2 = db.qualityGates().insertQualityGate(organization); + ComponentDto project1 = db.components().insertPrivateProject(organization); + ComponentDto project2 = db.components().insertPrivateProject(organization); + db.qualityGates().associateProjectToQualityGate(project1, qualityGate1); + db.qualityGates().associateProjectToQualityGate(project2, qualityGate2); - Optional result = underTest.selectQGateIdByComponentId(dbSession, 10L); + Optional result = underTest.selectQGateIdByComponentId(dbSession, project1.getId()); - assertThat(result).contains(1L); + assertThat(result).contains(qualityGate1.getId()); } - private void associateProjectToQualityGate(long componentId, long qualityGateId) { - dbClient.propertiesDao().saveProperty(dbSession, new PropertyDto() - .setKey("sonar.qualitygate") - .setResourceId(componentId) - .setValue(String.valueOf(qualityGateId))); - db.commit(); - } } diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationQueryTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationQueryTest.java deleted file mode 100644 index 2ff682b9b30..00000000000 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/qualitygate/ProjectQgateAssociationQueryTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SonarQube - * Copyright (C) 2009-2017 SonarSource SA - * mailto:info AT sonarsource DOT com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.db.qualitygate; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -public class ProjectQgateAssociationQueryTest { - - @Rule - public ExpectedException expectedException = ExpectedException.none(); - - @Test - public void fail_on_invalid_membership() { - expectedException.expect(IllegalArgumentException.class); - expectedException.expectMessage("Membership is not valid (got unknown). Available values are [all, selected, deselected]"); - - ProjectQgateAssociationQuery.Builder builder = ProjectQgateAssociationQuery.builder(); - builder.gateId(42L); - builder.membership("unknown"); - - builder.build(); - } -} 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 deleted file mode 100644 index 081048e62f7..00000000000 --- a/server/sonar-db-dao/src/test/resources/org/sonar/db/qualitygate/ProjectQgateAssociationDaoTest/shared.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java index bca22fd5672..43edb6c4960 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/SearchAction.java @@ -34,6 +34,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.qualitygate.ProjectQgateAssociation; import org.sonar.db.qualitygate.ProjectQgateAssociationDto; import org.sonar.db.qualitygate.ProjectQgateAssociationQuery; +import org.sonar.db.qualitygate.QGateWithOrgDto; import org.sonar.server.qualitygate.QualityGateFinder; import org.sonar.server.user.UserSession; import org.sonarqube.ws.Qualitygates; @@ -98,9 +99,10 @@ public class SearchAction implements QualityGatesWsAction { try (DbSession dbSession = dbClient.openSession(false)) { OrganizationDto organization = wsSupport.getOrganization(dbSession, request); - Association associations = find(dbSession, organization, + QGateWithOrgDto qualityGate = qualityGateFinder.getByOrganizationAndId(dbSession, organization, request.mandatoryParamAsLong(PARAM_GATE_ID)); + Association associations = find(dbSession, ProjectQgateAssociationQuery.builder() - .gateId(request.mandatoryParamAsLong(PARAM_GATE_ID)) + .qualityGate(qualityGate) .membership(request.param(PARAM_QUERY) == null ? request.param(SELECTED) : ANY) .projectSearch(request.param(PARAM_QUERY)) .pageIndex(request.paramAsInt(PARAM_PAGE)) @@ -121,8 +123,7 @@ public class SearchAction implements QualityGatesWsAction { } } - private SearchAction.Association find(DbSession dbSession, OrganizationDto organization, ProjectQgateAssociationQuery query) { - qualityGateFinder.getByOrganizationAndId(dbSession, organization, Long.parseLong(query.gateId())); + private SearchAction.Association find(DbSession dbSession, ProjectQgateAssociationQuery query) { List projects = dbClient.projectQgateAssociationDao().selectProjects(dbSession, query); List authorizedProjects = keepAuthorizedProjects(dbSession, projects);