diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2017-08-03 16:31:50 +0200 |
---|---|---|
committer | Janos Gyerik <janos.gyerik@sonarsource.com> | 2017-09-12 10:55:10 +0200 |
commit | f2bdffe9ab4d8079a639d203b804bd1b3118bcf6 (patch) | |
tree | 5ae22ea3c49a1459b215c707fa4d3d942fffb831 /server | |
parent | 66658a7557d78fd809d71227da15e56a2926d4f7 (diff) | |
download | sonarqube-f2bdffe9ab4d8079a639d203b804bd1b3118bcf6.tar.gz sonarqube-f2bdffe9ab4d8079a639d203b804bd1b3118bcf6.zip |
SONAR-9616 Support branch in api/project_analyses/search
Diffstat (limited to 'server')
2 files changed, 82 insertions, 21 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java index 3eddef80ffa..1b1dc030b0b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/projectanalysis/ws/SearchAction.java @@ -49,8 +49,10 @@ import static org.sonar.api.utils.DateUtils.parseStartingDateOrDateTime; import static org.sonar.core.util.Protobuf.setNullable; import static org.sonar.db.component.SnapshotQuery.SORT_FIELD.BY_DATE; import static org.sonar.db.component.SnapshotQuery.SORT_ORDER.DESC; +import static org.sonar.server.ws.KeyExamples.KEY_BRANCH_EXAMPLE_001; import static org.sonar.server.ws.WsUtils.writeProtobuf; import static org.sonarqube.ws.client.projectanalysis.EventCategory.OTHER; +import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_BRANCH; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_CATEGORY; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_FROM; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_PROJECT; @@ -86,6 +88,12 @@ public class SearchAction implements ProjectAnalysesWsAction { .setRequired(true) .setExampleValue(KeyExamples.KEY_PROJECT_EXAMPLE_001); + action.createParam(PARAM_BRANCH) + .setDescription("Branch key") + .setSince("6.6") + .setInternal(true) + .setExampleValue(KEY_BRANCH_EXAMPLE_001); + action.createParam(PARAM_CATEGORY) .setDescription("Event category. Filter analyses that have at least one event of the category specified.") .setPossibleValues(EnumSet.allOf(EventCategory.class)) @@ -100,6 +108,7 @@ public class SearchAction implements ProjectAnalysesWsAction { .setDescription("Filter analyses created before the given date (inclusive). Format: date or datetime ISO formats") .setExampleValue("2013-05-01T13:00:00+0100") .setSince("6.5"); + } @Override @@ -113,6 +122,7 @@ public class SearchAction implements ProjectAnalysesWsAction { String category = request.param(PARAM_CATEGORY); return SearchRequest.builder() .setProject(request.mandatoryParam(PARAM_PROJECT)) + .setBranch(request.param(PARAM_BRANCH)) .setCategory(category == null ? null : EventCategory.valueOf(category)) .setPage(request.mandatoryParamAsInt(Param.PAGE)) .setPageSize(request.mandatoryParamAsInt(Param.PAGE_SIZE)) @@ -152,9 +162,18 @@ public class SearchAction implements ProjectAnalysesWsAction { } private void addProject(SearchData.Builder data) { - ComponentDto project = componentFinder.getByKey(data.getDbSession(), data.getRequest().getProject()); + ComponentDto project = loadComponent(data.getDbSession(), data.getRequest()); checkArgument(Scopes.PROJECT.equals(project.scope()) && ALLOWED_QUALIFIERS.contains(project.qualifier()), "A project or application is required"); data.setProject(project); } + private ComponentDto loadComponent(DbSession dbSession, SearchRequest request) { + String project = request.getProject(); + String branch = request.getBranch(); + if (branch != null) { + return componentFinder.getByKeyAndBranch(dbSession, project, branch); + } + return componentFinder.getByKey(dbSession, project); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java index 24bf9f732a7..c711aec2fa1 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/projectanalysis/ws/SearchActionTest.java @@ -64,6 +64,7 @@ import static org.sonarqube.ws.client.WsRequest.Method.POST; import static org.sonarqube.ws.client.projectanalysis.EventCategory.OTHER; import static org.sonarqube.ws.client.projectanalysis.EventCategory.QUALITY_GATE; import static org.sonarqube.ws.client.projectanalysis.EventCategory.VERSION; +import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_BRANCH; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_CATEGORY; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_FROM; import static org.sonarqube.ws.client.projectanalysis.ProjectAnalysesWsParameters.PARAM_PROJECT; @@ -110,13 +111,13 @@ public class SearchActionTest { @Test public void return_analyses_ordered_by_analysis_date() { - ComponentDto project = db.components().insertComponent(ComponentTesting.newPrivateProjectDto(db.organizations().insert()).setDbKey("P1")); + ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); db.components().insertSnapshot(newAnalysis(project).setUuid("A1").setCreatedAt(1_000_000L)); db.components().insertSnapshot(newAnalysis(project).setUuid("A2").setCreatedAt(2_000_000L)); db.components().insertSnapshot(newAnalysis(project).setUuid("A3").setCreatedAt(3_000_000L)); - List<Analysis> result = call("P1").getAnalysesList(); + List<Analysis> result = call(project.getKey()).getAnalysesList(); assertThat(result).hasSize(3); assertThat(result).extracting(Analysis::getKey, a -> parseDateTime(a.getDate()).getTime()).containsExactly( @@ -296,7 +297,7 @@ public class SearchActionTest { assertThat(result.getAnalysesList()) .extracting(Analysis::getKey) .containsOnly(a2.getUuid(), a3.getUuid()) - .doesNotContain(a1.getUuid(), a4.getUuid()); + .doesNotContain(a1.getUuid(), a4.getUuid()); } @Test @@ -321,32 +322,34 @@ public class SearchActionTest { } @Test - public void empty_response() { + public void branch() { ComponentDto project = db.components().insertPrivateProject(); userSession.addProjectPermission(UserRole.USER, project); + ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); + SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(branch)); + EventDto event = db.events().insertEvent(newEvent(analysis).setCategory(EventCategory.QUALITY_GATE.getLabel())); - SearchResponse result = call(project.getDbKey()); + List<Analysis> result = call(SearchRequest.builder() + .setProject(project.getKey()) + .setBranch("my_branch") + .build()) + .getAnalysesList(); + + assertThat(result).extracting(Analysis::getKey).containsExactlyInAnyOrder(analysis.getUuid()); + assertThat(result.get(0).getEventsList()).extracting(Event::getKey).containsExactlyInAnyOrder(event.getUuid()); - assertThat(result.hasPaging()).isTrue(); - assertThat(result.getPaging()).extracting(Paging::getPageIndex, Paging::getPageSize, Paging::getTotal).containsExactly(1, 100, 0); - assertThat(result.getAnalysesCount()).isEqualTo(0); } @Test - public void definition() { - WebService.Action definition = ws.getDef(); - - assertThat(definition.key()).isEqualTo("search"); - assertThat(definition.since()).isEqualTo("6.3"); - assertThat(definition.responseExampleAsString()).isNotEmpty(); - assertThat(definition.param("project").isRequired()).isTrue(); - assertThat(definition.param("category")).isNotNull(); + public void empty_response() { + ComponentDto project = db.components().insertPrivateProject(); + userSession.addProjectPermission(UserRole.USER, project); - Param from = definition.param("from"); - assertThat(from.since()).isEqualTo("6.5"); + SearchResponse result = call(project.getDbKey()); - Param to = definition.param("to"); - assertThat(to.since()).isEqualTo("6.5"); + assertThat(result.hasPaging()).isTrue(); + assertThat(result.getPaging()).extracting(Paging::getPageIndex, Paging::getPageSize, Paging::getTotal).containsExactly(1, 100, 0); + assertThat(result.getAnalysesCount()).isEqualTo(0); } @Test @@ -378,6 +381,44 @@ public class SearchActionTest { call(view.getDbKey()); } + @Test + public void fail_if_branch_does_not_exist() { + ComponentDto project = db.components().insertPrivateProject(); + userSession.addProjectPermission(UserRole.USER, project); + db.components().insertProjectBranch(project, b -> b.setKey("my_branch")); + + expectedException.expect(NotFoundException.class); + expectedException.expectMessage(String.format("Component '%s' on branch '%s' not found", project.getKey(), "another_branch")); + + call(SearchRequest.builder() + .setProject(project.getKey()) + .setBranch("another_branch") + .build()); + } + + @Test + public void definition() { + WebService.Action definition = ws.getDef(); + + assertThat(definition.key()).isEqualTo("search"); + assertThat(definition.since()).isEqualTo("6.3"); + assertThat(definition.responseExampleAsString()).isNotEmpty(); + assertThat(definition.param("project").isRequired()).isTrue(); + assertThat(definition.param("category")).isNotNull(); + assertThat(definition.params()).hasSize(7); + + Param from = definition.param("from"); + assertThat(from.since()).isEqualTo("6.5"); + + Param to = definition.param("to"); + assertThat(to.since()).isEqualTo("6.5"); + + Param branch = definition.param("branch"); + assertThat(branch.since()).isEqualTo("6.6"); + assertThat(branch.isInternal()).isTrue(); + assertThat(branch.isRequired()).isFalse(); + } + private static Function<Event, String> wsToDbCategory() { return e -> e == null ? null : EventCategory.valueOf(e.getCategory()).getLabel(); } @@ -392,6 +433,7 @@ public class SearchActionTest { TestRequest request = ws.newRequest() .setMethod(POST.name()); setNullable(wsRequest.getProject(), project -> request.setParam(PARAM_PROJECT, project)); + setNullable(wsRequest.getBranch(), branch -> request.setParam(PARAM_BRANCH, branch)); setNullable(wsRequest.getCategory(), category -> request.setParam(PARAM_CATEGORY, category.name())); setNullable(wsRequest.getPage(), page -> request.setParam(Param.PAGE, String.valueOf(page))); setNullable(wsRequest.getPageSize(), pageSize -> request.setParam(Param.PAGE_SIZE, String.valueOf(pageSize))); |