From: Teryk Bellahsene Date: Wed, 30 Sep 2015 08:30:33 +0000 (+0200) Subject: SONAR-6857 Rename WS components/search -> components/search_view_components X-Git-Tag: 5.2-RC1~127 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=c1f0d8fa79c032c779b7f6f1009fae12ea93a130;p=sonarqube.git SONAR-6857 Rename WS components/search -> components/search_view_components --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWs.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWs.java index aba52c5b1bb..f4c83e3b18c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWs.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWs.java @@ -27,11 +27,13 @@ import org.sonar.api.server.ws.WebService; public class ComponentsWs implements WebService { private final AppAction appAction; - private final SearchAction searchAction; + private final SearchViewComponentsAction searchViewComponentsAction; + private final ComponentsWsAction[] actions; - public ComponentsWs(AppAction appAction, SearchAction searchAction) { + public ComponentsWs(AppAction appAction, SearchViewComponentsAction searchViewComponentsAction, ComponentsWsAction... actions) { this.appAction = appAction; - this.searchAction = searchAction; + this.searchViewComponentsAction = searchViewComponentsAction; + this.actions = actions; } @Override @@ -40,8 +42,11 @@ public class ComponentsWs implements WebService { .setSince("4.2") .setDescription("Components management"); + for (ComponentsWsAction action : actions) { + action.define(controller); + } appAction.define(controller); - searchAction.define(controller); + searchViewComponentsAction.define(controller); defineSuggestionsAction(controller); controller.done(); diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWsAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWsAction.java new file mode 100644 index 00000000000..58266ab5c88 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentsWsAction.java @@ -0,0 +1,27 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.component.ws; + +import org.sonar.server.ws.WsAction; + +public interface ComponentsWsAction extends WsAction { + // marker interface +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java index cc01d7470b6..36bb8722669 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java @@ -20,120 +20,24 @@ package org.sonar.server.component.ws; -import com.google.common.collect.Sets; -import java.util.Collection; -import java.util.List; -import java.util.Set; import org.sonar.api.server.ws.Request; -import org.sonar.api.server.ws.RequestHandler; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; -import org.sonar.api.server.ws.WebService.Param; -import org.sonar.api.utils.text.JsonWriter; -import org.sonar.api.web.UserRole; -import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.MyBatis; -import org.sonar.db.component.ComponentDto; -import org.sonar.server.component.ComponentFinder; -import org.sonar.server.es.SearchOptions; -import org.sonar.server.user.UserSession; -import static com.google.common.collect.Sets.newLinkedHashSet; -import static org.sonar.api.server.ws.WebService.Param.PAGE; -import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE; - -public class SearchAction implements RequestHandler { - - private static final short MINIMUM_SEARCH_CHARACTERS = 2; - - private static final String PARAM_COMPONENT_UUID = "componentUuid"; - - private final DbClient dbClient; - private final UserSession userSession; - private final ComponentFinder componentFinder; - - public SearchAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder) { - this.dbClient = dbClient; - this.userSession = userSession; - this.componentFinder = componentFinder; - } - - void define(WebService.NewController controller) { - WebService.NewAction action = controller.createAction("search") - .setDescription("Search for components. Currently limited to projects in a view or a sub-view") - .setSince("5.1") - .setInternal(true) +public class SearchAction implements ComponentsWsAction { + @Override + public void define(WebService.NewController context) { + WebService.NewAction action = context.createAction("search") + .setSince("5.2") + .setDescription("Search for components") + .addPagingParams(100) + .addSearchQuery("sona", "project names") + .setResponseExample(getClass().getResource("search-example.json")) .setHandler(this); - - action - .createParam(PARAM_COMPONENT_UUID) - .setRequired(true) - .setDescription("View or sub view UUID") - .setExampleValue("d6d9e1e5-5e13-44fa-ab82-3ec29efa8935"); - - action - .createParam(Param.TEXT_QUERY) - .setRequired(true) - .setDescription("UTF-8 search query") - .setExampleValue("sonar"); - - action.addPagingParams(10); } @Override - public void handle(Request request, Response response) { - String query = request.mandatoryParam(Param.TEXT_QUERY); - if (query.length() < MINIMUM_SEARCH_CHARACTERS) { - throw new IllegalArgumentException(String.format("Minimum search is %s characters", MINIMUM_SEARCH_CHARACTERS)); - } - String componentUuid = request.mandatoryParam(PARAM_COMPONENT_UUID); - - JsonWriter json = response.newJsonWriter(); - json.beginObject(); - - DbSession session = dbClient.openSession(false); - try { - ComponentDto componentDto = componentFinder.getByUuid(session, componentUuid); - userSession.checkProjectUuidPermission(UserRole.USER, componentDto.projectUuid()); - - Set projectIds = newLinkedHashSet(dbClient.componentIndexDao().selectProjectIdsFromQueryAndViewOrSubViewUuid(session, query, componentDto.uuid())); - Collection authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, userSession.getUserId(), UserRole.USER); - - SearchOptions options = new SearchOptions(); - options.setPage(request.mandatoryParamAsInt(PAGE), request.mandatoryParamAsInt(PAGE_SIZE)); - Set pagedProjectIds = pagedProjectIds(authorizedProjectIds, options); - - List projects = dbClient.componentDao().selectByIds(session, pagedProjectIds); - - options.writeJson(json, authorizedProjectIds.size()); - json.name("components").beginArray(); - for (ComponentDto project : projects) { - json.beginObject(); - json.prop("uuid", project.uuid()); - json.prop("name", project.name()); - json.endObject(); - } - json.endArray(); - } finally { - MyBatis.closeQuietly(session); - } - - json.endObject(); - json.close(); - } + public void handle(Request wsRequest, Response wsResponse) throws Exception { - private static Set pagedProjectIds(Collection projectIds, SearchOptions options) { - Set results = Sets.newLinkedHashSet(); - int index = 0; - for (Long projectId : projectIds) { - if (index >= options.getOffset() && results.size() < options.getLimit()) { - results.add(projectId); - } else if (results.size() >= options.getLimit()) { - break; - } - index++; - } - return results; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchViewComponentsAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchViewComponentsAction.java new file mode 100644 index 00000000000..7474b2bf9e6 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchViewComponentsAction.java @@ -0,0 +1,140 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.component.ws; + +import com.google.common.collect.Sets; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import org.sonar.api.server.ws.Request; +import org.sonar.api.server.ws.RequestHandler; +import org.sonar.api.server.ws.Response; +import org.sonar.api.server.ws.WebService; +import org.sonar.api.server.ws.WebService.Param; +import org.sonar.api.utils.text.JsonWriter; +import org.sonar.api.web.UserRole; +import org.sonar.core.util.Uuids; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.db.MyBatis; +import org.sonar.db.component.ComponentDto; +import org.sonar.server.component.ComponentFinder; +import org.sonar.server.es.SearchOptions; +import org.sonar.server.user.UserSession; + +import static com.google.common.collect.Sets.newLinkedHashSet; +import static org.sonar.api.server.ws.WebService.Param.PAGE; +import static org.sonar.api.server.ws.WebService.Param.PAGE_SIZE; + +public class SearchViewComponentsAction implements RequestHandler { + + private static final short MINIMUM_SEARCH_CHARACTERS = 2; + + private static final String PARAM_COMPONENT_UUID = "componentId"; + + private final DbClient dbClient; + private final UserSession userSession; + private final ComponentFinder componentFinder; + + public SearchViewComponentsAction(DbClient dbClient, UserSession userSession, ComponentFinder componentFinder) { + this.dbClient = dbClient; + this.userSession = userSession; + this.componentFinder = componentFinder; + } + + void define(WebService.NewController controller) { + WebService.NewAction action = controller.createAction("search_view_components") + .setDescription("Search for components. Currently limited to projects in a view or a sub-view") + .setSince("5.1") + .setInternal(true) + .setHandler(this); + + action + .createParam(PARAM_COMPONENT_UUID) + .setRequired(true) + .setDescription("View or sub view UUID") + .setExampleValue(Uuids.UUID_EXAMPLE_01); + + action + .createParam(Param.TEXT_QUERY) + .setRequired(true) + .setDescription("UTF-8 search query") + .setExampleValue("sonar"); + + action.addPagingParams(10); + } + + @Override + public void handle(Request request, Response response) { + String query = request.mandatoryParam(Param.TEXT_QUERY); + if (query.length() < MINIMUM_SEARCH_CHARACTERS) { + throw new IllegalArgumentException(String.format("Minimum search is %s characters", MINIMUM_SEARCH_CHARACTERS)); + } + String componentUuid = request.mandatoryParam(PARAM_COMPONENT_UUID); + + JsonWriter json = response.newJsonWriter(); + json.beginObject(); + + DbSession session = dbClient.openSession(false); + try { + ComponentDto componentDto = componentFinder.getByUuid(session, componentUuid); + userSession.checkProjectUuidPermission(UserRole.USER, componentDto.projectUuid()); + + Set projectIds = newLinkedHashSet(dbClient.componentIndexDao().selectProjectIdsFromQueryAndViewOrSubViewUuid(session, query, componentDto.uuid())); + Collection authorizedProjectIds = dbClient.authorizationDao().keepAuthorizedProjectIds(session, projectIds, userSession.getUserId(), UserRole.USER); + + SearchOptions options = new SearchOptions(); + options.setPage(request.mandatoryParamAsInt(PAGE), request.mandatoryParamAsInt(PAGE_SIZE)); + Set pagedProjectIds = pagedProjectIds(authorizedProjectIds, options); + + List projects = dbClient.componentDao().selectByIds(session, pagedProjectIds); + + options.writeJson(json, authorizedProjectIds.size()); + json.name("components").beginArray(); + for (ComponentDto project : projects) { + json.beginObject(); + json.prop("uuid", project.uuid()); + json.prop("name", project.name()); + json.endObject(); + } + json.endArray(); + } finally { + MyBatis.closeQuietly(session); + } + + json.endObject(); + json.close(); + } + + private static Set pagedProjectIds(Collection projectIds, SearchOptions options) { + Set results = Sets.newLinkedHashSet(); + int index = 0; + for (Long projectId : projectIds) { + if (index >= options.getOffset() && results.size() < options.getLimit()) { + results.add(projectId); + } else if (results.size() >= options.getLimit()) { + break; + } + index++; + } + return results; + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index f21981e8380..e0b8f64d16e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -61,6 +61,7 @@ import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.component.ws.ComponentsWs; import org.sonar.server.component.ws.EventsWs; import org.sonar.server.component.ws.ResourcesWs; +import org.sonar.server.component.ws.SearchViewComponentsAction; import org.sonar.server.computation.CeModule; import org.sonar.server.computation.container.ReportProcessingModule; import org.sonar.server.computation.queue.CeQueueModule; @@ -560,7 +561,7 @@ public class PlatformLevel4 extends PlatformLevel { ResourcesWs.class, ComponentsWs.class, org.sonar.server.component.ws.AppAction.class, - org.sonar.server.component.ws.SearchAction.class, + SearchViewComponentsAction.class, EventsWs.class, NewAlerts.class, NewAlerts.newMetadata(), diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/AppActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/AppActionTest.java index aead84b80bc..376305e19c2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/AppActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/AppActionTest.java @@ -108,7 +108,7 @@ public class AppActionTest { when(measureDao.selectByComponentKeyAndMetricKeys(eq(session), anyString(), anyListOf(String.class))).thenReturn(measures); - tester = new WsTester(new ComponentsWs(new AppAction(dbClient, durations, i18n, userSessionRule, new ComponentFinder(dbClient)), mock(SearchAction.class))); + tester = new WsTester(new ComponentsWs(new AppAction(dbClient, durations, i18n, userSessionRule, new ComponentFinder(dbClient)), mock(SearchViewComponentsAction.class))); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentsWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentsWsTest.java index 0f1ef335c94..0159481fafb 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentsWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentsWsTest.java @@ -45,8 +45,8 @@ public class ComponentsWsTest { public void setUp() { WsTester tester = new WsTester(new ComponentsWs( new AppAction(mock(DbClient.class), mock(Durations.class), mock(I18n.class), userSessionRule, mock(ComponentFinder.class)), - new SearchAction(mock(DbClient.class), userSessionRule, mock(ComponentFinder.class))) - ); + new SearchViewComponentsAction(mock(DbClient.class), userSessionRule, mock(ComponentFinder.class))) + ); controller = tester.controller("api/components"); } @@ -81,7 +81,7 @@ public class ComponentsWsTest { @Test public void define_search_action() { - WebService.Action action = controller.action("search"); + WebService.Action action = controller.action("search_view_components"); assertThat(action).isNotNull(); assertThat(action.isInternal()).isTrue(); assertThat(action.isPost()).isFalse(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchActionTest.java deleted file mode 100644 index a5d67302d32..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchActionTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube 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. - * - * SonarQube 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.server.component.ws; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.rules.ExpectedException; -import org.sonar.api.server.ws.WebService.Param; -import org.sonar.api.utils.System2; -import org.sonar.api.web.UserRole; -import org.sonar.db.DbTester; -import org.sonar.server.component.ComponentFinder; -import org.sonar.server.exceptions.NotFoundException; -import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.ws.WsTester; -import org.sonar.test.DbTests; - -import static org.mockito.Mockito.mock; - -@Category(DbTests.class) -public class SearchActionTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Rule - public DbTester dbTester = DbTester.create(System2.INSTANCE); - - @Rule - public UserSessionRule userSessionRule = UserSessionRule.standalone(); - - WsTester tester; - - @Before - public void setUp() { - dbTester.truncateTables(); - tester = new WsTester(new ComponentsWs(mock(AppAction.class), new SearchAction(dbTester.getDbClient(), userSessionRule, new ComponentFinder(dbTester.getDbClient())))); - } - - @Test - public void return_projects_from_view() throws Exception { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st"); - request.execute().assertJson(getClass(), "return_projects_from_view.json"); - } - - @Test - public void return_projects_from_subview() throws Exception { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addComponentUuidPermission(UserRole.USER, "EFGH", "FGHI"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "FGHI").setParam("q", "st"); - request.execute().assertJson(getClass(), "return_projects_from_subview.json"); - } - - @Test - public void return_only_authorized_projects_from_view() throws Exception { - dbTester.prepareDbUnit(getClass(), "return_only_authorized_projects_from_view.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st"); - request.execute().assertJson(getClass(), "return_only_authorized_projects_from_view.json"); - } - - @Test - public void return_paged_result() throws Exception { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st").setParam(Param.PAGE, "2") - .setParam(Param.PAGE_SIZE, "1"); - request.execute().assertJson(getClass(), "return_paged_result.json"); - } - - @Test - public void return_only_first_page() throws Exception { - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "st").setParam(Param.PAGE, "1") - .setParam(Param.PAGE_SIZE, "1"); - request.execute().assertJson(getClass(), "return_only_first_page.json"); - } - - @Test - public void fail_when_search_param_is_too_short() throws Exception { - thrown.expect(IllegalArgumentException.class); - thrown.expectMessage("Minimum search is 2 characters"); - - - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "EFGH").setParam("q", "s"); - request.execute(); - } - - @Test - public void fail_when_project_uuid_does_not_exists() throws Exception { - thrown.expect(NotFoundException.class); - thrown.expectMessage("Component id 'UNKNOWN' not found"); - - dbTester.prepareDbUnit(getClass(), "shared.xml"); - userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); - - WsTester.TestRequest request = tester.newGetRequest("api/components", "search").setParam("componentUuid", "UNKNOWN").setParam("q", "st"); - request.execute(); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchViewComponentsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchViewComponentsActionTest.java new file mode 100644 index 00000000000..1ad3bad1c4c --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/SearchViewComponentsActionTest.java @@ -0,0 +1,134 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube 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. + * + * SonarQube 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.server.component.ws; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.rules.ExpectedException; +import org.sonar.api.server.ws.WebService.Param; +import org.sonar.api.utils.System2; +import org.sonar.api.web.UserRole; +import org.sonar.db.DbTester; +import org.sonar.server.component.ComponentFinder; +import org.sonar.server.exceptions.NotFoundException; +import org.sonar.server.tester.UserSessionRule; +import org.sonar.server.ws.WsTester; +import org.sonar.test.DbTests; + +import static org.mockito.Mockito.mock; + +@Category(DbTests.class) +public class SearchViewComponentsActionTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Rule + public DbTester db = DbTester.create(System2.INSTANCE); + + @Rule + public UserSessionRule userSessionRule = UserSessionRule.standalone(); + + WsTester ws; + + @Before + public void setUp() { + db.truncateTables(); + ws = new WsTester(new ComponentsWs(mock(AppAction.class), new SearchViewComponentsAction(db.getDbClient(), userSessionRule, new ComponentFinder(db.getDbClient())))); + } + + @Test + public void return_projects_from_view() throws Exception { + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "EFGH").setParam("q", "st"); + request.execute().assertJson(getClass(), "return_projects_from_view.json"); + } + + @Test + public void return_projects_from_subview() throws Exception { + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addComponentUuidPermission(UserRole.USER, "EFGH", "FGHI"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "FGHI").setParam("q", "st"); + request.execute().assertJson(getClass(), "return_projects_from_subview.json"); + } + + @Test + public void return_only_authorized_projects_from_view() throws Exception { + db.prepareDbUnit(getClass(), "return_only_authorized_projects_from_view.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "EFGH").setParam("q", "st"); + request.execute().assertJson(getClass(), "return_only_authorized_projects_from_view.json"); + } + + @Test + public void return_paged_result() throws Exception { + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "EFGH").setParam("q", "st").setParam(Param.PAGE, "2") + .setParam(Param.PAGE_SIZE, "1"); + request.execute().assertJson(getClass(), "return_paged_result.json"); + } + + @Test + public void return_only_first_page() throws Exception { + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "EFGH").setParam("q", "st").setParam(Param.PAGE, "1") + .setParam(Param.PAGE_SIZE, "1"); + request.execute().assertJson(getClass(), "return_only_first_page.json"); + } + + @Test + public void fail_when_search_param_is_too_short() throws Exception { + thrown.expect(IllegalArgumentException.class); + thrown.expectMessage("Minimum search is 2 characters"); + + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "EFGH").setParam("q", "s"); + request.execute(); + } + + @Test + public void fail_when_project_uuid_does_not_exists() throws Exception { + thrown.expect(NotFoundException.class); + thrown.expectMessage("Component id 'UNKNOWN' not found"); + + db.prepareDbUnit(getClass(), "shared.xml"); + userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, "EFGH"); + + WsTester.TestRequest request = newRequest().setParam("componentId", "UNKNOWN").setParam("q", "st"); + request.execute(); + } + + private WsTester.TestRequest newRequest() { + return ws.newGetRequest("api/components", "search_view_components"); + } +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.json deleted file mode 100644 index 9676629feeb..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "total": 1, - "p": 1, - "ps": 10, - "components": [ - { - "uuid": "JKLM", - "name": "Struts" - } - ] -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.xml deleted file mode 100644 index 0b5c0343840..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_authorized_projects_from_view.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_first_page.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_first_page.json deleted file mode 100644 index e913f5e4c67..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_only_first_page.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "total": 2, - "p": 1, - "ps": 1 -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_paged_result.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_paged_result.json deleted file mode 100644 index d871108edce..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_paged_result.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "total": 2, - "p": 2, - "ps": 1 -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_subview.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_subview.json deleted file mode 100644 index 9676629feeb..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_subview.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "total": 1, - "p": 1, - "ps": 10, - "components": [ - { - "uuid": "JKLM", - "name": "Struts" - } - ] -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_view.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_view.json deleted file mode 100644 index f7f99cc9d73..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/return_projects_from_view.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "total": 2, - "p": 1, - "ps": 10, - "components": [ - { - "uuid": "JKLM", - "name": "Struts" - }, - { - "uuid": "KLMN", - "name": "Elasticsearch" - } - ] -} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/shared.xml deleted file mode 100644 index 687ef3d7b14..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchActionTest/shared.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.json new file mode 100644 index 00000000000..9676629feeb --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.json @@ -0,0 +1,11 @@ +{ + "total": 1, + "p": 1, + "ps": 10, + "components": [ + { + "uuid": "JKLM", + "name": "Struts" + } + ] +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.xml new file mode 100644 index 00000000000..0b5c0343840 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_authorized_projects_from_view.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_first_page.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_first_page.json new file mode 100644 index 00000000000..e913f5e4c67 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_only_first_page.json @@ -0,0 +1,5 @@ +{ + "total": 2, + "p": 1, + "ps": 1 +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_paged_result.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_paged_result.json new file mode 100644 index 00000000000..d871108edce --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_paged_result.json @@ -0,0 +1,5 @@ +{ + "total": 2, + "p": 2, + "ps": 1 +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_subview.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_subview.json new file mode 100644 index 00000000000..9676629feeb --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_subview.json @@ -0,0 +1,11 @@ +{ + "total": 1, + "p": 1, + "ps": 10, + "components": [ + { + "uuid": "JKLM", + "name": "Struts" + } + ] +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_view.json b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_view.json new file mode 100644 index 00000000000..f7f99cc9d73 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/return_projects_from_view.json @@ -0,0 +1,15 @@ +{ + "total": 2, + "p": 1, + "ps": 10, + "components": [ + { + "uuid": "JKLM", + "name": "Struts" + }, + { + "uuid": "KLMN", + "name": "Elasticsearch" + } + ] +} diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/shared.xml new file mode 100644 index 00000000000..687ef3d7b14 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/ws/SearchViewComponentsActionTest/shared.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sonar-db/src/main/resources/org/sonar/db/component/ResourceMapper.xml b/sonar-db/src/main/resources/org/sonar/db/component/ResourceMapper.xml index 39339fe5ec2..9c86d2c4e7f 100644 --- a/sonar-db/src/main/resources/org/sonar/db/component/ResourceMapper.xml +++ b/sonar-db/src/main/resources/org/sonar/db/component/ResourceMapper.xml @@ -64,7 +64,8 @@ and p.qualifier in - #{qualifier} + + #{qualifier}