From 6cb158b2f20869d44f9fecd14914aecfb2c0c00c Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Wed, 30 Apr 2014 12:24:17 +0200 Subject: [PATCH] SONAR-5111 Refactored some ws to add response examples --- .../authentication/ws/AuthenticationWs.java | 4 +- .../server/issue/DefaultIssueFinder.java | 1 + .../issue/InternalRubyIssueService.java | 1 + .../org/sonar/server/issue/IssueService.java | 1 + .../org/sonar/server/issue/PlanAction.java | 1 + .../{ => actionplan}/ActionPlanService.java | 2 +- .../{ws => actionplan}/ActionPlanWs.java | 6 +- .../sonar/server/issue/filter/AppAction.java | 93 +++++++++ .../server/issue/filter/FavoritesAction.java | 66 ++++++ .../issue/filter/IssueFilterWriter.java | 49 +++++ .../server/issue/filter/IssueFilterWs.java | 149 +------------- .../sonar/server/issue/filter/ShowAction.java | 65 ++++++ ...howWsHandler.java => IssueShowAction.java} | 17 +- .../org/sonar/server/issue/ws/IssuesWs.java | 25 ++- .../server/platform/ServerComponents.java | 30 ++- .../authentication/ws/example-validate.json | 1 + .../issue/actionplan/example-search.json | 27 +++ .../server/issue/filter/example-show.json | 10 + .../app/controllers/api/issues_controller.rb | 2 +- .../app/controllers/issue_controller.rb | 2 +- .../ws/AuthenticationWsTest.java | 4 +- .../server/issue/DefaultIssueFinderTest.java | 1 + .../issue/InternalRubyIssueServiceTest.java | 1 + .../sonar/server/issue/IssueServiceTest.java | 1 + .../sonar/server/issue/PlanActionTest.java | 1 + .../ActionPlanServiceTest.java | 8 +- .../issue/actionplan/ActionPlanWsTest.java | 102 ++++++++++ .../server/issue/filter/AppActionTest.java | 102 ++++++++++ .../issue/filter/FavoritesActionTest.java | 75 +++++++ .../issue/filter/IssueFilterWriterTest.java | 115 +++++++++++ .../issue/filter/IssueFilterWsTest.java | 144 ++----------- .../server/issue/filter/ShowActionTest.java | 81 ++++++++ .../server/issue/ws/ActionPlanWsTest.java | 189 ------------------ ...dlerTest.java => IssueShowActionTest.java} | 6 +- .../sonar/server/issue/ws/IssuesWsTest.java | 44 +++- .../sonar/server/source/ws/SourcesWsTest.java | 9 +- .../org/sonar/server/ws/ListingWsTest.java | 3 +- .../anonymous_page.json | 0 .../logged_in_page.json | 0 .../logged_in_page_with_favorites.json | 0 .../logged_in_page_with_selected_filter.json | 0 .../selected_filter_can_not_be_modified.json | 0 .../show_filter.json | 0 .../show_issue.json | 0 .../show_issue_on_removed_component.json | 0 ...ssue_on_removed_project_and_component.json | 0 .../show_issue_with_action_plan.json | 0 .../show_issue_with_actions.json | 0 ...issue_with_actions_defined_by_plugins.json | 0 .../show_issue_with_assign_to_me_action.json | 0 .../show_issue_with_changelog.json | 0 .../show_issue_with_characteristics.json | 0 .../show_issue_with_comments.json | 0 .../show_issue_with_dates.json | 0 .../show_issue_with_set_severity_action.json | 0 .../show_issue_with_sub_project.json | 0 .../show_issue_with_technical_debt.json | 0 .../show_issue_with_transitions.json | 0 .../show_issue_with_users.json | 0 ...how_issue_without_assign_to_me_action.json | 0 60 files changed, 940 insertions(+), 498 deletions(-) rename sonar-server/src/main/java/org/sonar/server/issue/{ => actionplan}/ActionPlanService.java (99%) rename sonar-server/src/main/java/org/sonar/server/issue/{ws => actionplan}/ActionPlanWs.java (95%) create mode 100644 sonar-server/src/main/java/org/sonar/server/issue/filter/AppAction.java create mode 100644 sonar-server/src/main/java/org/sonar/server/issue/filter/FavoritesAction.java create mode 100644 sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWriter.java create mode 100644 sonar-server/src/main/java/org/sonar/server/issue/filter/ShowAction.java rename sonar-server/src/main/java/org/sonar/server/issue/ws/{IssueShowWsHandler.java => IssueShowAction.java} (95%) create mode 100644 sonar-server/src/main/resources/org/sonar/server/authentication/ws/example-validate.json create mode 100644 sonar-server/src/main/resources/org/sonar/server/issue/actionplan/example-search.json create mode 100644 sonar-server/src/main/resources/org/sonar/server/issue/filter/example-show.json rename sonar-server/src/test/java/org/sonar/server/issue/{ => actionplan}/ActionPlanServiceTest.java (98%) create mode 100644 sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanWsTest.java create mode 100644 sonar-server/src/test/java/org/sonar/server/issue/filter/AppActionTest.java create mode 100644 sonar-server/src/test/java/org/sonar/server/issue/filter/FavoritesActionTest.java create mode 100644 sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWriterTest.java create mode 100644 sonar-server/src/test/java/org/sonar/server/issue/filter/ShowActionTest.java delete mode 100644 sonar-server/src/test/java/org/sonar/server/issue/ws/ActionPlanWsTest.java rename sonar-server/src/test/java/org/sonar/server/issue/ws/{IssueShowWsHandlerTest.java => IssueShowActionTest.java} (99%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => AppActionTest}/anonymous_page.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => AppActionTest}/logged_in_page.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => AppActionTest}/logged_in_page_with_favorites.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => AppActionTest}/logged_in_page_with_selected_filter.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => AppActionTest}/selected_filter_can_not_be_modified.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/filter/{IssueFilterWsTest => ShowActionTest}/show_filter.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_on_removed_component.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_on_removed_project_and_component.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_action_plan.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_actions.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_actions_defined_by_plugins.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_assign_to_me_action.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_changelog.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_characteristics.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_comments.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_dates.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_set_severity_action.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_sub_project.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_technical_debt.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_transitions.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_with_users.json (100%) rename sonar-server/src/test/resources/org/sonar/server/issue/ws/{IssueShowWsHandlerTest => IssueShowActionTest}/show_issue_without_assign_to_me_action.json (100%) diff --git a/sonar-server/src/main/java/org/sonar/server/authentication/ws/AuthenticationWs.java b/sonar-server/src/main/java/org/sonar/server/authentication/ws/AuthenticationWs.java index b39bcb398b3..6de8f943005 100644 --- a/sonar-server/src/main/java/org/sonar/server/authentication/ws/AuthenticationWs.java +++ b/sonar-server/src/main/java/org/sonar/server/authentication/ws/AuthenticationWs.java @@ -20,6 +20,7 @@ package org.sonar.server.authentication.ws; +import com.google.common.io.Resources; import org.sonar.api.server.ws.RailsHandler; import org.sonar.api.server.ws.WebService; @@ -33,7 +34,8 @@ public class AuthenticationWs implements WebService { controller.createAction("validate") .setDescription("Check credentials") .setSince("3.3") - .setHandler(RailsHandler.INSTANCE); + .setHandler(RailsHandler.INSTANCE) + .setResponseExample(Resources.getResource(this.getClass(), "example-validate.json")); controller.done(); } diff --git a/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueFinder.java b/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueFinder.java index 4e8d3f6d78f..9882b276348 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueFinder.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/DefaultIssueFinder.java @@ -42,6 +42,7 @@ import org.sonar.core.issue.db.IssueDto; import org.sonar.core.persistence.MyBatis; import org.sonar.core.resource.ResourceDao; import org.sonar.core.rule.DefaultRuleFinder; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.user.UserSession; import javax.annotation.CheckForNull; diff --git a/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java b/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java index d0362da17d0..0ccfca938c2 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java @@ -44,6 +44,7 @@ import org.sonar.core.resource.ResourceDao; import org.sonar.core.resource.ResourceDto; import org.sonar.core.resource.ResourceQuery; import org.sonar.server.exceptions.BadRequestException; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.filter.IssueFilterParameters; import org.sonar.server.issue.filter.IssueFilterResult; import org.sonar.server.issue.filter.IssueFilterService; diff --git a/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java b/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java index 7db9d49daca..5e026586f1a 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java @@ -47,6 +47,7 @@ import org.sonar.core.resource.ResourceDao; import org.sonar.core.resource.ResourceDto; import org.sonar.core.resource.ResourceQuery; import org.sonar.core.user.AuthorizationDao; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.user.UserSession; import javax.annotation.Nullable; diff --git a/sonar-server/src/main/java/org/sonar/server/issue/PlanAction.java b/sonar-server/src/main/java/org/sonar/server/issue/PlanAction.java index d7974d2b575..49aa95a09ac 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/PlanAction.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/PlanAction.java @@ -27,6 +27,7 @@ import org.sonar.api.issue.Issue; import org.sonar.api.issue.condition.IsUnResolved; import org.sonar.api.issue.internal.DefaultIssue; import org.sonar.core.issue.IssueUpdater; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.user.UserSession; import java.util.List; diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ActionPlanService.java b/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanService.java similarity index 99% rename from sonar-server/src/main/java/org/sonar/server/issue/ActionPlanService.java rename to sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanService.java index 4ddaec8baf3..f3320dbdf69 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ActionPlanService.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanService.java @@ -18,7 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.issue; +package org.sonar.server.issue.actionplan; import com.google.common.base.Function; import com.google.common.collect.Iterables; diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ws/ActionPlanWs.java b/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanWs.java similarity index 95% rename from sonar-server/src/main/java/org/sonar/server/issue/ws/ActionPlanWs.java rename to sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanWs.java index 894518843f8..8842cbc17a0 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ws/ActionPlanWs.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanWs.java @@ -18,8 +18,9 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.issue.ws; +package org.sonar.server.issue.actionplan; +import com.google.common.io.Resources; import org.sonar.api.server.ws.RailsHandler; import org.sonar.api.server.ws.WebService; @@ -33,7 +34,8 @@ public class ActionPlanWs implements WebService { WebService.NewAction search = controller.createAction("search") .setDescription("Get a list of action plans. Requires Browse permission on project") .setSince("3.6") - .setHandler(RailsHandler.INSTANCE); + .setHandler(RailsHandler.INSTANCE) + .setResponseExample(Resources.getResource(this.getClass(), "example-search.json")); addProjectParam(search); WebService.NewAction create = controller.createAction("create") diff --git a/sonar-server/src/main/java/org/sonar/server/issue/filter/AppAction.java b/sonar-server/src/main/java/org/sonar/server/issue/filter/AppAction.java new file mode 100644 index 00000000000..24168bab8fb --- /dev/null +++ b/sonar-server/src/main/java/org/sonar/server/issue/filter/AppAction.java @@ -0,0 +1,93 @@ +/* + * 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.issue.filter; + +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.utils.text.JsonWriter; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.user.UserSession; + +import java.util.List; + +public class AppAction implements RequestHandler { + + private final IssueFilterService service; + private final IssueFilterWriter issueFilterWriter; + + public AppAction(IssueFilterService service, IssueFilterWriter issueFilterWriter) { + this.service = service; + this.issueFilterWriter = issueFilterWriter; + } + + void define(WebService.NewController controller) { + WebService.NewAction action = controller.createAction("app"); + action + .setDescription("Data required for rendering the page 'Issues'") + .setInternal(true) + .setHandler(this); + action.createParam("id").setDescription("Optionally, the ID of the current filter"); + } + + @Override + public void handle(Request request, Response response) throws Exception { + UserSession session = UserSession.get(); + + JsonWriter json = response.newJsonWriter(); + json.beginObject(); + + // Current filter (optional) + int filterId = request.paramAsInt("id", -1); + DefaultIssueFilter filter = null; + if (filterId >= 0) { + filter = service.find((long) filterId, session); + } + + // Permissions + json.prop("canManageFilters", session.isLoggedIn()); + json.prop("canBulkChange", session.isLoggedIn()); + + // Selected filter + if (filter != null) { + issueFilterWriter.write(session, filter, json); + } + + // Favorite filters, if logged in + if (session.isLoggedIn()) { + List favorites = service.findFavoriteFilters(session); + json.name("favorites").beginArray(); + for (DefaultIssueFilter favorite : favorites) { + json + .beginObject() + .prop("id", favorite.id()) + .prop("name", favorite.name()) + .endObject(); + } + json.endArray(); + } + + json.endObject(); + json.close(); + } + +} diff --git a/sonar-server/src/main/java/org/sonar/server/issue/filter/FavoritesAction.java b/sonar-server/src/main/java/org/sonar/server/issue/filter/FavoritesAction.java new file mode 100644 index 00000000000..1aeda5adca6 --- /dev/null +++ b/sonar-server/src/main/java/org/sonar/server/issue/filter/FavoritesAction.java @@ -0,0 +1,66 @@ +/* + * 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.issue.filter; + +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.utils.text.JsonWriter; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.user.UserSession; + +public class FavoritesAction implements RequestHandler { + + private final IssueFilterService service; + + public FavoritesAction(IssueFilterService service) { + this.service = service; + } + + void define(WebService.NewController controller) { + WebService.NewAction action = controller.createAction("favorites"); + action + .setDescription("The issue filters marked as favorite by request user") + .setSince("4.2") + .setHandler(this); + } + + @Override + public void handle(Request request, Response response) throws Exception { + UserSession session = UserSession.get(); + JsonWriter json = response.newJsonWriter(); + json.beginObject().name("favoriteFilters").beginArray(); + if (session.isLoggedIn()) { + for (DefaultIssueFilter favorite : service.findFavoriteFilters(session)) { + json.beginObject(); + json.prop("id", favorite.id()); + json.prop("name", favorite.name()); + json.prop("user", favorite.user()); + json.prop("shared", favorite.shared()); + // no need to export description and query fields + json.endObject(); + } + } + json.endArray().endObject().close(); + } + +} diff --git a/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWriter.java b/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWriter.java new file mode 100644 index 00000000000..940c67d8951 --- /dev/null +++ b/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWriter.java @@ -0,0 +1,49 @@ +/* + * 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.issue.filter; + +import org.apache.commons.lang.StringUtils; +import org.sonar.api.ServerComponent; +import org.sonar.api.utils.text.JsonWriter; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.core.permission.GlobalPermissions; +import org.sonar.server.user.UserSession; + +public class IssueFilterWriter implements ServerComponent { + + void write(UserSession session, DefaultIssueFilter filter, JsonWriter json) { + json.name("filter").beginObject() + .prop("id", filter.id()) + .prop("name", filter.name()) + .prop("description", filter.description()) + .prop("user", filter.user()) + .prop("shared", filter.shared()) + .prop("query", filter.data()) + .prop("canModify", canModifyFilter(session, filter)) + .endObject(); + } + + private boolean canModifyFilter(UserSession session, DefaultIssueFilter filter) { + return session.isLoggedIn() && + (StringUtils.equals(filter.user(), session.login()) || session.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)); + } + +} diff --git a/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWs.java b/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWs.java index 04dc4068583..aba50b9c285 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWs.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/filter/IssueFilterWs.java @@ -19,25 +19,18 @@ */ package org.sonar.server.issue.filter; -import org.apache.commons.lang.StringUtils; -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.utils.text.JsonWriter; -import org.sonar.core.issue.DefaultIssueFilter; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.server.user.UserSession; - -import java.util.List; public class IssueFilterWs implements WebService { - private static final String PARAM_ID = "id"; - private final IssueFilterService service; + private final AppAction appAction; + private final ShowAction showAction; + private final FavoritesAction favoritesAction; - public IssueFilterWs(IssueFilterService service) { - this.service = service; + public IssueFilterWs(AppAction appAction, ShowAction showAction, FavoritesAction favoritesAction) { + this.appAction = appAction; + this.showAction = showAction; + this.favoritesAction = favoritesAction; } @Override @@ -45,132 +38,10 @@ public class IssueFilterWs implements WebService { NewController controller = context.createController("api/issue_filters") .setSince("4.2") .setDescription("Issue Filters"); - - NewAction app = controller.createAction("app"); - app - .setDescription("Data required for rendering the page 'Issues'") - .setInternal(true) - .setHandler(new RequestHandler() { - @Override - public void handle(Request request, Response response) { - app(request, response); - } - }); - app.createParam(PARAM_ID).setDescription("Optionally, the ID of the current filter"); - - NewAction show = controller.createAction("show"); - show - .setDescription("Get detail of an issue filter. Requires to be authenticated") - .setSince("4.2") - .setHandler(new RequestHandler() { - @Override - public void handle(Request request, Response response) { - show(request, response); - } - }); - show.createParam(PARAM_ID) - .setDescription("ID of the issue filter") - .setRequired(true); - - NewAction fav = controller.createAction("favorites"); - fav - .setDescription("The issue filters marked as favorite by request user") - .setSince("4.2") - .setHandler(new RequestHandler() { - @Override - public void handle(Request request, Response response) { - favorites(request, response); - } - }); - + appAction.define(controller); + showAction.define(controller); + favoritesAction.define(controller); controller.done(); } - private void app(Request request, Response response) { - UserSession session = UserSession.get(); - - JsonWriter json = response.newJsonWriter(); - json.beginObject(); - - // Current filter (optional) - int filterId = request.paramAsInt(PARAM_ID, -1); - DefaultIssueFilter filter = null; - if (filterId >= 0) { - filter = service.find((long) filterId, session); - } - - // Permissions - json.prop("canManageFilters", session.isLoggedIn()); - json.prop("canBulkChange", session.isLoggedIn()); - - // Selected filter - if (filter != null) { - json.name("filter"); - writeFilterJson(session, filter, json); - } - - // Favorite filters, if logged in - if (session.isLoggedIn()) { - List favorites = service.findFavoriteFilters(session); - json.name("favorites").beginArray(); - for (DefaultIssueFilter favorite : favorites) { - json - .beginObject() - .prop(PARAM_ID, favorite.id()) - .prop("name", favorite.name()) - .endObject(); - } - json.endArray(); - } - - json.endObject(); - json.close(); - } - - private void show(Request request, Response response) { - UserSession session = UserSession.get(); - DefaultIssueFilter filter = service.find(Long.parseLong(request.mandatoryParam(PARAM_ID)), session); - - JsonWriter json = response.newJsonWriter(); - json.beginObject(); - json.name("filter"); - writeFilterJson(session, filter, json); - json.endObject(); - json.close(); - } - - private void favorites(Request request, Response response) { - UserSession session = UserSession.get(); - JsonWriter json = response.newJsonWriter(); - json.beginObject().name("favoriteFilters").beginArray(); - if (session.isLoggedIn()) { - for (DefaultIssueFilter favorite : service.findFavoriteFilters(session)) { - json.beginObject(); - json.prop(PARAM_ID, favorite.id()); - json.prop("name", favorite.name()); - json.prop("user", favorite.user()); - json.prop("shared", favorite.shared()); - // no need to export description and query fields - json.endObject(); - } - } - json.endArray().endObject().close(); - } - - private JsonWriter writeFilterJson(UserSession session, DefaultIssueFilter filter, JsonWriter json) { - return json.beginObject() - .prop(PARAM_ID, filter.id()) - .prop("name", filter.name()) - .prop("description", filter.description()) - .prop("user", filter.user()) - .prop("shared", filter.shared()) - .prop("query", filter.data()) - .prop("canModify", canModifyFilter(session, filter)) - .endObject(); - } - - private boolean canModifyFilter(UserSession session, DefaultIssueFilter filter) { - return session.isLoggedIn() && - (StringUtils.equals(filter.user(), session.login()) || session.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)); - } } diff --git a/sonar-server/src/main/java/org/sonar/server/issue/filter/ShowAction.java b/sonar-server/src/main/java/org/sonar/server/issue/filter/ShowAction.java new file mode 100644 index 00000000000..4d1faa365e3 --- /dev/null +++ b/sonar-server/src/main/java/org/sonar/server/issue/filter/ShowAction.java @@ -0,0 +1,65 @@ +/* + * 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.issue.filter; + +import com.google.common.io.Resources; +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.utils.text.JsonWriter; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.user.UserSession; + +public class ShowAction implements RequestHandler { + + private final IssueFilterService service; + private final IssueFilterWriter issueFilterWriter; + + public ShowAction(IssueFilterService service, IssueFilterWriter issueFilterWriter) { + this.service = service; + this.issueFilterWriter = issueFilterWriter; + } + + void define(WebService.NewController controller) { + WebService.NewAction action = controller.createAction("show"); + action + .setDescription("Get detail of an issue filter. Requires to be authenticated") + .setSince("4.2") + .setHandler(this) + .setResponseExample(Resources.getResource(this.getClass(), "example-show.json")); + action.createParam("id") + .setDescription("ID of the issue filter") + .setRequired(true); + } + + @Override + public void handle(Request request, Response response) throws Exception { + UserSession session = UserSession.get(); + DefaultIssueFilter filter = service.find(Long.parseLong(request.mandatoryParam("id")), session); + + JsonWriter json = response.newJsonWriter(); + json.beginObject(); + issueFilterWriter.write(session, filter, json); + json.endObject(); + json.close(); + } +} diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowWsHandler.java b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowAction.java similarity index 95% rename from sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowWsHandler.java rename to sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowAction.java index d32cf0202af..b244b6822d0 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowWsHandler.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssueShowAction.java @@ -32,6 +32,7 @@ import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; 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.user.User; import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.Duration; @@ -58,7 +59,7 @@ import java.util.List; import static com.google.common.collect.Lists.newArrayList; -public class IssueShowWsHandler implements RequestHandler { +public class IssueShowAction implements RequestHandler { private final IssueFinder issueFinder; private final IssueService issueService; @@ -68,8 +69,8 @@ public class IssueShowWsHandler implements RequestHandler { private final I18n i18n; private final Durations durations; - public IssueShowWsHandler(IssueFinder issueFinder, IssueService issueService, IssueChangelogService issueChangelogService, ActionService actionService, - DebtModelService debtModel, I18n i18n, Durations durations) { + public IssueShowAction(IssueFinder issueFinder, IssueService issueService, IssueChangelogService issueChangelogService, ActionService actionService, + DebtModelService debtModel, I18n i18n, Durations durations) { this.issueFinder = issueFinder; this.issueService = issueService; this.issueChangelogService = issueChangelogService; @@ -79,6 +80,16 @@ public class IssueShowWsHandler implements RequestHandler { this.durations = durations; } + void define (WebService.NewController controller) { + WebService.NewAction action = controller.createAction("show") + .setDescription("Detail of issue") + .setSince("4.2") + .setInternal(true) + .setHandler(this); + action.createParam("key") + .setDescription("Issue key"); + } + @Override public void handle(Request request, Response response) { String issueKey = request.mandatoryParam("key"); diff --git a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java index bd14da41b4b..e371a0380ff 100644 --- a/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java +++ b/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java @@ -19,13 +19,15 @@ */ package org.sonar.server.issue.ws; +import org.sonar.api.rule.Severity; +import org.sonar.api.server.ws.RailsHandler; import org.sonar.api.server.ws.WebService; public class IssuesWs implements WebService { - private final IssueShowWsHandler showHandler; + private final IssueShowAction showHandler; - public IssuesWs(IssueShowWsHandler showHandler) { + public IssuesWs(IssueShowAction showHandler) { this.showHandler = showHandler; } @@ -33,13 +35,20 @@ public class IssuesWs implements WebService { public void define(Context context) { NewController controller = context.createController("api/issues"); controller.setDescription("Coding rule issues"); + controller.setSince("3.6"); + showHandler.define(controller); - controller.createAction("show") - .setDescription("Detail of issue") - .setSince("4.2") - .setInternal(true) - .setHandler(showHandler) - .createParam("key", "Issue key"); + WebService.NewAction search = controller.createAction("search") + .setDescription("Get a list of issues. If the number of issues is greater than 10,000, only the first 10,000 ones are returned by the web service. Requires Browse permission on project(s).") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE); + search.createParam("issues") + .setDescription("Comma-separated list of issue keys.") + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + search.createParam("severities") + .setDescription("Comma-separated list of severities.") + .setExampleValue("BLOCKER,CRITICAL") + .setPossibleValues(Severity.ALL.toArray(new String[Severity.ALL.size()])); controller.done(); } diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index 28bda726b6b..c76338c9e57 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -19,10 +19,6 @@ */ package org.sonar.server.platform; -import org.sonar.server.cluster.LocalNonBlockingWorkQueue; - -import org.sonar.server.rule2.RuleDao; -import org.sonar.server.rule2.RuleService; import com.google.common.collect.Lists; import org.apache.commons.configuration.BaseConfiguration; import org.sonar.api.config.EmailSettings; @@ -82,6 +78,7 @@ import org.sonar.jpa.session.DefaultDatabaseConnector; import org.sonar.jpa.session.ThreadLocalDatabaseSessionFactory; import org.sonar.server.authentication.ws.AuthenticationWs; import org.sonar.server.charts.ChartFactory; +import org.sonar.server.cluster.LocalNonBlockingWorkQueue; import org.sonar.server.component.DefaultComponentFinder; import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.db.EmbeddedDatabaseFactory; @@ -91,10 +88,12 @@ import org.sonar.server.debt.*; import org.sonar.server.es.ESIndex; import org.sonar.server.es.ESNode; import org.sonar.server.issue.*; +import org.sonar.server.issue.actionplan.ActionPlanService; +import org.sonar.server.issue.actionplan.ActionPlanWs; import org.sonar.server.issue.filter.IssueFilterService; +import org.sonar.server.issue.filter.IssueFilterWriter; import org.sonar.server.issue.filter.IssueFilterWs; -import org.sonar.server.issue.ws.ActionPlanWs; -import org.sonar.server.issue.ws.IssueShowWsHandler; +import org.sonar.server.issue.ws.IssueShowAction; import org.sonar.server.issue.ws.IssuesWs; import org.sonar.server.notifications.NotificationCenter; import org.sonar.server.notifications.NotificationService; @@ -114,6 +113,7 @@ import org.sonar.server.qualityprofile.ws.QProfileBackupWsHandler; import org.sonar.server.qualityprofile.ws.QProfilesWs; import org.sonar.server.rule.*; import org.sonar.server.rule.ws.*; +import org.sonar.server.rule2.RuleService; import org.sonar.server.search.IndexUtils; import org.sonar.server.source.CodeColorizers; import org.sonar.server.source.DeprecatedSourceDecorator; @@ -356,19 +356,27 @@ class ServerComponents { pico.addSingleton(IssueStatsFinder.class); pico.addSingleton(PublicRubyIssueService.class); pico.addSingleton(InternalRubyIssueService.class); - pico.addSingleton(ActionPlanService.class); pico.addSingleton(IssueChangelogService.class); pico.addSingleton(IssueNotifications.class); pico.addSingleton(ActionService.class); pico.addSingleton(Actions.class); - pico.addSingleton(IssueFilterSerializer.class); - pico.addSingleton(IssueFilterService.class); pico.addSingleton(IssueBulkChangeService.class); pico.addSingleton(IssueChangelogFormatter.class); - pico.addSingleton(IssueFilterWs.class); - pico.addSingleton(IssueShowWsHandler.class); + pico.addSingleton(IssueShowAction.class); pico.addSingleton(IssuesWs.class); + + // issue filters + pico.addSingleton(IssueFilterService.class); + pico.addSingleton(IssueFilterSerializer.class); + pico.addSingleton(IssueFilterWs.class); + pico.addSingleton(IssueFilterWriter.class); + pico.addSingleton(org.sonar.server.issue.filter.AppAction.class); + pico.addSingleton(org.sonar.server.issue.filter.ShowAction.class); + pico.addSingleton(org.sonar.server.issue.filter.FavoritesAction.class); + + // action plan pico.addSingleton(ActionPlanWs.class); + pico.addSingleton(ActionPlanService.class); // issues actions pico.addSingleton(AssignAction.class); diff --git a/sonar-server/src/main/resources/org/sonar/server/authentication/ws/example-validate.json b/sonar-server/src/main/resources/org/sonar/server/authentication/ws/example-validate.json new file mode 100644 index 00000000000..df47e9149e9 --- /dev/null +++ b/sonar-server/src/main/resources/org/sonar/server/authentication/ws/example-validate.json @@ -0,0 +1 @@ +{"validate": true} diff --git a/sonar-server/src/main/resources/org/sonar/server/issue/actionplan/example-search.json b/sonar-server/src/main/resources/org/sonar/server/issue/actionplan/example-search.json new file mode 100644 index 00000000000..b96ee24ebab --- /dev/null +++ b/sonar-server/src/main/resources/org/sonar/server/issue/actionplan/example-search.json @@ -0,0 +1,27 @@ +{ + "actionPlans": [ + { + "key": "3f19de90-1521-4482-a737-a311758ff513", + "name": "Version 3.6", + "status": "OPEN", + "project": "java-sonar-runner-simple", + "userLogin": "admin", + "deadLine": "2013-12-31T00:00:00+0100", + "totalIssues": 1, + "unresolvedIssues": 0, + "createdAt": "2013-05-31T22:40:50+0200", + "updatedAt": "2013-05-31T22:40:50+0200" + }, + { + "key": "8ab022c0-f0dc-41b7-a762-82502bda749f", + "name": "Version 3.5", + "status": "CLOSED", + "project": "java-sonar-runner-simple4", + "userLogin": "admin", + "totalIssues": 0, + "unresolvedIssues": 0, + "createdAt": "2013-05-31T22:40:30+0200", + "updatedAt": "2013-05-31T22:42:13+0200" + } + ] +} diff --git a/sonar-server/src/main/resources/org/sonar/server/issue/filter/example-show.json b/sonar-server/src/main/resources/org/sonar/server/issue/filter/example-show.json new file mode 100644 index 00000000000..e7f6e7a691f --- /dev/null +++ b/sonar-server/src/main/resources/org/sonar/server/issue/filter/example-show.json @@ -0,0 +1,10 @@ +{ + "filter": { + "id": 1, + "name": "My Filter", + "user": "admin", + "shared": true, + "query": "statuses=OPEN,REOPENED|sort=UPDATE_DATE|asc=false", + "canModify": true + } +} diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb index 3b8222d789b..308fd2429b9 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/api/issues_controller.rb @@ -219,7 +219,7 @@ class Api::IssuesController < Api::ApiController require_parameters :issue plan = nil - plan = params[:plan] if params[:plan] && !params[:plan].blank? + plan = params[:actionplan] if params[:actionplan] && !params[:actionplan].blank? result = Internal.issues.plan(params[:issue], plan) render_result_issue(result) end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb b/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb index 9d37e5ac83e..0af0de79a32 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/controllers/issue_controller.rb @@ -83,7 +83,7 @@ class IssueController < ApplicationController elsif action_type=='severity' issue_result = Internal.issues.setSeverity(issue_key, params[:severity]) elsif action_type=='plan' - issue_result = Internal.issues.plan(issue_key, params[:plan]) + issue_result = Internal.issues.plan(issue_key, params[:actionplan]) elsif action_type=='unplan' issue_result = Internal.issues.plan(issue_key, nil) else diff --git a/sonar-server/src/test/java/org/sonar/server/authentication/ws/AuthenticationWsTest.java b/sonar-server/src/test/java/org/sonar/server/authentication/ws/AuthenticationWsTest.java index 21be810466e..d131b88e706 100644 --- a/sonar-server/src/test/java/org/sonar/server/authentication/ws/AuthenticationWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/authentication/ws/AuthenticationWsTest.java @@ -41,9 +41,7 @@ public class AuthenticationWsTest { WebService.Action validate = controller.action("validate"); assertThat(validate).isNotNull(); assertThat(validate.handler()).isInstanceOf(RailsHandler.class); - assertThat(validate.since()).isEqualTo("3.3"); - assertThat(validate.isPost()).isFalse(); - assertThat(validate.isInternal()).isFalse(); + assertThat(validate.responseExampleAsString()).isNotEmpty(); assertThat(validate.params()).isEmpty(); } } diff --git a/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueFinderTest.java b/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueFinderTest.java index 75f50312e61..2ec0c9bb183 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueFinderTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/DefaultIssueFinderTest.java @@ -43,6 +43,7 @@ import org.sonar.core.persistence.MyBatis; import org.sonar.core.resource.ResourceDao; import org.sonar.core.rule.DefaultRuleFinder; import org.sonar.core.user.DefaultUser; +import org.sonar.server.issue.actionplan.ActionPlanService; import java.util.Collections; import java.util.List; diff --git a/sonar-server/src/test/java/org/sonar/server/issue/InternalRubyIssueServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/InternalRubyIssueServiceTest.java index 44b5cc3df88..f637730d0ec 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/InternalRubyIssueServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/InternalRubyIssueServiceTest.java @@ -41,6 +41,7 @@ import org.sonar.core.resource.ResourceDao; import org.sonar.core.resource.ResourceDto; import org.sonar.core.resource.ResourceQuery; import org.sonar.server.exceptions.BadRequestException; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.filter.IssueFilterService; import org.sonar.server.user.UserSession; diff --git a/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceTest.java index 3f842e788f4..f62b7272acb 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceTest.java @@ -50,6 +50,7 @@ import org.sonar.core.resource.ResourceDto; import org.sonar.core.resource.ResourceQuery; import org.sonar.core.user.AuthorizationDao; import org.sonar.core.user.DefaultUser; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.user.UserSession; import java.util.Collections; diff --git a/sonar-server/src/test/java/org/sonar/server/issue/PlanActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/PlanActionTest.java index b19ee382493..e7d1b7ef08e 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/PlanActionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/PlanActionTest.java @@ -30,6 +30,7 @@ import org.sonar.api.issue.internal.DefaultIssue; import org.sonar.api.issue.internal.IssueChangeContext; import org.sonar.core.issue.DefaultActionPlan; import org.sonar.core.issue.IssueUpdater; +import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.user.UserSession; import java.util.List; diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ActionPlanServiceTest.java b/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanServiceTest.java similarity index 98% rename from sonar-server/src/test/java/org/sonar/server/issue/ActionPlanServiceTest.java rename to sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanServiceTest.java index 4ceb7c0560e..a7bb7ec50f3 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ActionPlanServiceTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanServiceTest.java @@ -18,8 +18,9 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.issue; +package org.sonar.server.issue.actionplan; +import org.fest.assertions.Fail; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,7 +49,6 @@ import java.util.Collection; import static com.google.common.collect.Lists.newArrayList; import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @@ -103,7 +103,7 @@ public class ActionPlanServiceTest { try { actionPlanService.create(actionPlan, unauthorizedUserSession); - fail(); + Fail.fail(); } catch (Exception e) { assertThat(e).isInstanceOf(ForbiddenException.class); } @@ -195,7 +195,7 @@ public class ActionPlanServiceTest { try { actionPlanService.findOpenByProjectKey(projectKey, unauthorizedUserSession); - fail(); + Fail.fail(); } catch (Exception e) { assertThat(e).isInstanceOf(ForbiddenException.class); } diff --git a/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanWsTest.java b/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanWsTest.java new file mode 100644 index 00000000000..7d0677e13ec --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/issue/actionplan/ActionPlanWsTest.java @@ -0,0 +1,102 @@ +/* + * 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.issue.actionplan; + +import org.junit.Test; +import org.sonar.api.server.ws.RailsHandler; +import org.sonar.api.server.ws.WebService; +import org.sonar.server.ws.WsTester; + +import static org.fest.assertions.Assertions.assertThat; + +public class ActionPlanWsTest { + + WsTester tester = new WsTester(new ActionPlanWs()); + + @Test + public void define_controller() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + assertThat(controller).isNotNull(); + assertThat(controller.description()).isNotEmpty(); + assertThat(controller.actions()).hasSize(6); + } + + @Test + public void define_search_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("search"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.responseExampleAsString()).isNotEmpty(); + assertThat(action.params()).hasSize(1); + } + + @Test + public void define_create_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("create"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(4); + } + + @Test + public void define_delete_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("delete"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(1); + } + + @Test + public void define_update_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("update"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(4); + } + + @Test + public void define_open_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("open"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(1); + } + + @Test + public void define_close_action() throws Exception { + WebService.Controller controller = tester.controller("api/action_plans"); + + WebService.Action action = controller.action("close"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(1); + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/filter/AppActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/filter/AppActionTest.java new file mode 100644 index 00000000000..b9b9288773b --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/issue/filter/AppActionTest.java @@ -0,0 +1,102 @@ +/* + * 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.issue.filter; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.user.MockUserSession; +import org.sonar.server.ws.WsTester; + +import java.util.Arrays; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class AppActionTest { + + @Mock + IssueFilterService service; + + IssueFilterWriter writer = new IssueFilterWriter(); + + AppAction action; + + WsTester tester; + + @Before + public void setUp() throws Exception { + action = new AppAction(service, writer); + tester = new WsTester(new IssueFilterWs(action, mock(ShowAction.class), mock(FavoritesAction.class))); + } + + @Test + public void anonymous_app() throws Exception { + MockUserSession.set().setLogin(null); + tester.newRequest("app").execute().assertJson(getClass(), "anonymous_page.json"); + } + + @Test + public void logged_in_app() throws Exception { + MockUserSession.set().setLogin("eric").setUserId(123); + tester.newRequest("app").execute() + .assertJson(getClass(), "logged_in_page.json"); + } + + @Test + public void logged_in_app_with_favorites() throws Exception { + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); + when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList( + new DefaultIssueFilter().setId(6L).setName("My issues"), + new DefaultIssueFilter().setId(13L).setName("Blocker issues") + )); + tester.newRequest("app").execute() + .assertJson(getClass(), "logged_in_page_with_favorites.json"); + } + + @Test + public void logged_in_app_with_selected_filter() throws Exception { + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); + when(service.find(13L, session)).thenReturn( + new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("eric") + ); + + tester.newRequest("app").setParam("id", "13").execute() + .assertJson(getClass(), "logged_in_page_with_selected_filter.json"); + } + + @Test + public void app_selected_filter_can_not_be_modified() throws Exception { + // logged-in user is 'eric' but filter is owned by 'simon' + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); + when(service.find(13L, session)).thenReturn( + new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("simon").setShared(true) + ); + + tester.newRequest("app").setParam("id", "13").execute() + .assertJson(getClass(), "selected_filter_can_not_be_modified.json"); + } + +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/filter/FavoritesActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/filter/FavoritesActionTest.java new file mode 100644 index 00000000000..cbde7f90c9c --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/issue/filter/FavoritesActionTest.java @@ -0,0 +1,75 @@ +/* + * 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.issue.filter; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.user.MockUserSession; +import org.sonar.server.ws.WsTester; + +import java.util.Arrays; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class FavoritesActionTest { + + @Mock + IssueFilterService service; + + @Mock + IssueFilterWriter writer; + + FavoritesAction action; + + WsTester tester; + + @Before + public void setUp() throws Exception { + action = new FavoritesAction(service); + tester = new WsTester(new IssueFilterWs(mock(AppAction.class), mock(ShowAction.class), action)); + } + + @Test + public void favorites_of_anonymous() throws Exception { + MockUserSession.set(); + + tester.newRequest("favorites").execute() + .assertJson("{'favoriteFilters': []}"); + } + + @Test + public void favorites_of_logged_in_user() throws Exception { + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); + when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList( + new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("simon").setShared(true) + )); + + tester.newRequest("favorites").execute() + .assertJson("{'favoriteFilters': [{'id': 13, 'name': 'Blocker issues', 'user': 'simon', 'shared': true}]}"); + } + +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWriterTest.java b/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWriterTest.java new file mode 100644 index 00000000000..922b76f5cde --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWriterTest.java @@ -0,0 +1,115 @@ +/* + * 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.issue.filter; + +import org.json.JSONException; +import org.junit.Test; +import org.skyscreamer.jsonassert.JSONAssert; +import org.sonar.api.utils.text.JsonWriter; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.core.permission.GlobalPermissions; +import org.sonar.server.user.MockUserSession; +import org.sonar.server.user.UserSession; + +import java.io.StringWriter; + +public class IssueFilterWriterTest { + + IssueFilterWriter writer = new IssueFilterWriter(); + + @Test + public void write_filter() throws Exception { + UserSession userSession = MockUserSession.set(); + test(userSession, + new DefaultIssueFilter() + .setId(13L) + .setName("Blocker issues") + .setDescription("All Blocker Issues") + .setShared(true) + .setUser("simon") + .setData("severity=BLOCKER"), + "{\"filter\":{\n" + + " \"id\":13,\n" + + " \"name\":\"Blocker issues\",\n" + + " \"description\":\"All Blocker Issues\",\n" + + " \"shared\":true,\n" + + " \"query\":\"severity=BLOCKER\",\n" + + " \"user\":\"simon\",\n" + + " \"canModify\":false\n" + + " }}" + ); + } + + @Test + public void can_modify_if_logged_user_own_filter() throws Exception { + UserSession userSession = MockUserSession.set().setLogin("simon"); + test(userSession, + new DefaultIssueFilter() + .setId(13L) + .setName("Blocker issues") + .setDescription("All Blocker Issues") + .setShared(true) + .setUser("simon") + .setData("severity=BLOCKER"), + "{\"filter\":{\n" + + " \"id\":13,\n" + + " \"name\":\"Blocker issues\",\n" + + " \"description\":\"All Blocker Issues\",\n" + + " \"shared\":true,\n" + + " \"query\":\"severity=BLOCKER\",\n" + + " \"user\":\"simon\",\n" + + " \"canModify\":true\n" + + " }}" + ); + } + + @Test + public void can_modify_if_logged_user_has_permission() throws Exception { + UserSession userSession = MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); + test(userSession, + new DefaultIssueFilter() + .setId(13L) + .setName("Blocker issues") + .setDescription("All Blocker Issues") + .setShared(true) + .setUser("julien") + .setData("severity=BLOCKER"), + "{\"filter\":{\n" + + " \"id\":13,\n" + + " \"name\":\"Blocker issues\",\n" + + " \"description\":\"All Blocker Issues\",\n" + + " \"shared\":true,\n" + + " \"query\":\"severity=BLOCKER\",\n" + + " \"user\":\"julien\",\n" + + " \"canModify\":true\n" + + " }}" + ); + } + + private void test(UserSession userSession, DefaultIssueFilter filter, String expected) throws JSONException { + StringWriter output = new StringWriter(); + JsonWriter jsonWriter = JsonWriter.of(output); + jsonWriter.beginObject(); + writer.write(userSession, filter, jsonWriter); + jsonWriter.endObject(); + JSONAssert.assertEquals(output.toString(), expected, true); + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWsTest.java b/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWsTest.java index 3eb495bbb7f..82125ccc627 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/filter/IssueFilterWsTest.java @@ -19,25 +19,34 @@ */ package org.sonar.server.issue.filter; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; import org.sonar.api.server.ws.WebService; -import org.sonar.core.issue.DefaultIssueFilter; -import org.sonar.server.exceptions.NotFoundException; -import org.sonar.server.user.MockUserSession; import org.sonar.server.ws.WsTester; -import java.util.Arrays; - import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +@RunWith(MockitoJUnitRunner.class) public class IssueFilterWsTest { - IssueFilterService service = mock(IssueFilterService.class); - IssueFilterWs ws = new IssueFilterWs(service); - WsTester tester = new WsTester(ws); + @Mock + IssueFilterService service; + + @Mock + IssueFilterWriter issueFilterWriter; + + IssueFilterWs ws; + + WsTester tester; + + @Before + public void setUp() throws Exception { + ws = new IssueFilterWs(new AppAction(service, issueFilterWriter), new ShowAction(service, issueFilterWriter), new FavoritesAction(service)); + tester = new WsTester(ws); + } @Test public void define_ws() throws Exception { @@ -48,127 +57,16 @@ public class IssueFilterWsTest { WebService.Action app = controller.action("app"); assertThat(app).isNotNull(); - assertThat(app.handler()).isNotNull(); - assertThat(app.isPost()).isFalse(); - assertThat(app.isInternal()).isTrue(); - assertThat(app.since()).isEqualTo("4.2"); assertThat(app.params()).hasSize(1); - WebService.Param appId = app.param("id"); - assertThat(appId).isNotNull(); - assertThat(appId.description()).isNotNull(); - assertThat(appId.isRequired()).isFalse(); - WebService.Action show = controller.action("show"); assertThat(show).isNotNull(); - assertThat(show.handler()).isNotNull(); - assertThat(show.isPost()).isFalse(); - assertThat(show.isInternal()).isFalse(); - assertThat(show.since()).isEqualTo("4.2"); + assertThat(show.responseExampleAsString()).isNotEmpty(); assertThat(show.params()).hasSize(1); - WebService.Param showId = show.param("id"); - assertThat(showId).isNotNull(); - assertThat(showId.description()).isNotNull(); - assertThat(showId.isRequired()).isTrue(); - WebService.Action favorites = controller.action("favorites"); assertThat(favorites).isNotNull(); - assertThat(favorites.handler()).isNotNull(); - assertThat(favorites.isPost()).isFalse(); - assertThat(favorites.isInternal()).isFalse(); - assertThat(favorites.since()).isEqualTo("4.2"); assertThat(favorites.params()).isEmpty(); } - @Test - public void anonymous_app() throws Exception { - MockUserSession.set().setLogin(null); - tester.newRequest("app").execute().assertJson(getClass(), "anonymous_page.json"); - } - - @Test - public void logged_in_app() throws Exception { - MockUserSession.set().setLogin("eric").setUserId(123); - tester.newRequest("app").execute() - .assertJson(getClass(), "logged_in_page.json"); - } - - @Test - public void logged_in_app_with_favorites() throws Exception { - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); - when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList( - new DefaultIssueFilter().setId(6L).setName("My issues"), - new DefaultIssueFilter().setId(13L).setName("Blocker issues") - )); - tester.newRequest("app").execute() - .assertJson(getClass(), "logged_in_page_with_favorites.json"); - } - - @Test - public void logged_in_app_with_selected_filter() throws Exception { - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); - when(service.find(13L, session)).thenReturn( - new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("eric") - ); - - tester.newRequest("app").setParam("id", "13").execute() - .assertJson(getClass(), "logged_in_page_with_selected_filter.json"); - } - - @Test - public void app_selected_filter_can_not_be_modified() throws Exception { - // logged-in user is 'eric' but filter is owned by 'simon' - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); - when(service.find(13L, session)).thenReturn( - new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("simon").setShared(true) - ); - - tester.newRequest("app").setParam("id", "13").execute() - .assertJson(getClass(), "selected_filter_can_not_be_modified.json"); - } - - @Test - public void show_filter() throws Exception { - // logged-in user is 'eric' but filter is owned by 'simon' - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); - when(service.find(13L, session)).thenReturn( - new DefaultIssueFilter().setId(13L).setName("Blocker issues").setDescription("All Blocker Issues").setData("severity=BLOCKER").setUser("simon").setShared(true) - ); - - tester.newRequest("show").setParam("id", "13").execute() - .assertJson(getClass(), "show_filter.json"); - } - - @Test - public void show_unknown_filter() throws Exception { - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); - when(service.find(42L, session)).thenThrow(new NotFoundException("Filter 42 does not exist")); - - try { - tester.newRequest("show").setParam("id", "42").execute(); - fail(); - } catch (NotFoundException e) { - assertThat(e).hasMessage("Filter 42 does not exist"); - } - } - - @Test - public void favorites_of_anonymous() throws Exception { - MockUserSession.set(); - - tester.newRequest("favorites").execute() - .assertJson("{'favoriteFilters': []}"); - } - - @Test - public void favorites_of_logged_in_user() throws Exception { - MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123); - when(service.findFavoriteFilters(session)).thenReturn(Arrays.asList( - new DefaultIssueFilter().setId(13L).setName("Blocker issues").setData("severity=BLOCKER").setUser("simon").setShared(true) - )); - - tester.newRequest("favorites").execute() - .assertJson("{'favoriteFilters': [{'id': 13, 'name': 'Blocker issues', 'user': 'simon', 'shared': true}]}"); - } } diff --git a/sonar-server/src/test/java/org/sonar/server/issue/filter/ShowActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/filter/ShowActionTest.java new file mode 100644 index 00000000000..fde9db1089f --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/issue/filter/ShowActionTest.java @@ -0,0 +1,81 @@ +/* + * 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.issue.filter; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.core.issue.DefaultIssueFilter; +import org.sonar.server.exceptions.NotFoundException; +import org.sonar.server.user.MockUserSession; +import org.sonar.server.ws.WsTester; + +import static org.fest.assertions.Assertions.assertThat; +import static org.fest.assertions.Fail.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class ShowActionTest { + + @Mock + IssueFilterService service; + + IssueFilterWriter writer = new IssueFilterWriter(); + + ShowAction action; + + WsTester tester; + + @Before + public void setUp() throws Exception { + action = new ShowAction(service, writer); + tester = new WsTester(new IssueFilterWs(mock(AppAction.class), action, mock(FavoritesAction.class))); + } + + @Test + public void show_filter() throws Exception { + // logged-in user is 'eric' but filter is owned by 'simon' + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); + when(service.find(13L, session)).thenReturn( + new DefaultIssueFilter().setId(13L).setName("Blocker issues").setDescription("All Blocker Issues").setData("severity=BLOCKER").setUser("simon").setShared(true) + ); + + tester.newRequest("show").setParam("id", "13").execute() + .assertJson(getClass(), "show_filter.json"); + } + + @Test + public void show_unknown_filter() throws Exception { + MockUserSession session = MockUserSession.set().setLogin("eric").setUserId(123).setGlobalPermissions("none"); + when(service.find(42L, session)).thenThrow(new NotFoundException("Filter 42 does not exist")); + + try { + tester.newRequest("show").setParam("id", "42").execute(); + fail(); + } catch (NotFoundException e) { + assertThat(e).hasMessage("Filter 42 does not exist"); + } + } + +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/ActionPlanWsTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/ActionPlanWsTest.java deleted file mode 100644 index ec3223d1f09..00000000000 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/ActionPlanWsTest.java +++ /dev/null @@ -1,189 +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.issue.ws; - -import org.junit.Test; -import org.sonar.api.server.ws.RailsHandler; -import org.sonar.api.server.ws.WebService; -import org.sonar.server.ws.WsTester; - -import static org.fest.assertions.Assertions.assertThat; - -public class ActionPlanWsTest { - - WsTester tester = new WsTester(new ActionPlanWs()); - - @Test - public void define_action_plan_controller() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - assertThat(controller).isNotNull(); - assertThat(controller.description()).isNotEmpty(); - assertThat(controller.actions()).hasSize(6); - } - - @Test - public void define_search_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("search"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isFalse(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(1); - - WebService.Param project = action.param("project"); - assertThat(project).isNotNull(); - assertThat(project.description()).isNotNull(); - assertThat(project.exampleValue()).isNotNull(); - assertThat(project.isRequired()).isTrue(); - } - - @Test - public void define_create_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("create"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isTrue(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(4); - - WebService.Param name = action.param("name"); - assertThat(name).isNotNull(); - assertThat(name.description()).isNotNull(); - assertThat(name.exampleValue()).isNotNull(); - assertThat(name.isRequired()).isTrue(); - - WebService.Param description = action.param("description"); - assertThat(description).isNotNull(); - assertThat(description.description()).isNotNull(); - assertThat(description.isRequired()).isFalse(); - - WebService.Param project = action.param("project"); - assertThat(project).isNotNull(); - assertThat(project.description()).isNotNull(); - assertThat(project.exampleValue()).isNotNull(); - assertThat(project.isRequired()).isTrue(); - - WebService.Param deadLine = action.param("deadLine"); - assertThat(deadLine).isNotNull(); - assertThat(deadLine.description()).isNotNull(); - assertThat(deadLine.exampleValue()).isNotNull(); - assertThat(deadLine.isRequired()).isFalse(); - } - - @Test - public void define_delete_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("delete"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isTrue(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(1); - - WebService.Param key = action.param("key"); - assertThat(key).isNotNull(); - assertThat(key.description()).isNotNull(); - assertThat(key.exampleValue()).isNotNull(); - assertThat(key.isRequired()).isTrue(); - } - - @Test - public void define_update_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("update"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isTrue(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(4); - - WebService.Param project = action.param("key"); - assertThat(project).isNotNull(); - assertThat(project.description()).isNotNull(); - assertThat(project.exampleValue()).isNotNull(); - assertThat(project.isRequired()).isTrue(); - - WebService.Param name = action.param("name"); - assertThat(name).isNotNull(); - assertThat(name.description()).isNotNull(); - assertThat(name.exampleValue()).isNotNull(); - assertThat(name.isRequired()).isTrue(); - - WebService.Param description = action.param("description"); - assertThat(description).isNotNull(); - assertThat(description.description()).isNotNull(); - assertThat(description.isRequired()).isFalse(); - - WebService.Param deadLine = action.param("deadLine"); - assertThat(deadLine).isNotNull(); - assertThat(deadLine.description()).isNotNull(); - assertThat(deadLine.exampleValue()).isNotNull(); - assertThat(deadLine.isRequired()).isFalse(); - } - - @Test - public void define_open_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("open"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isTrue(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(1); - - WebService.Param key = action.param("key"); - assertThat(key).isNotNull(); - assertThat(key.description()).isNotNull(); - assertThat(key.exampleValue()).isNotNull(); - assertThat(key.isRequired()).isTrue(); - } - - @Test - public void define_close_action() throws Exception { - WebService.Controller controller = tester.controller("api/action_plans"); - - WebService.Action action = controller.action("close"); - assertThat(action).isNotNull(); - assertThat(action.handler()).isInstanceOf(RailsHandler.class); - assertThat(action.since()).isEqualTo("3.6"); - assertThat(action.isPost()).isTrue(); - assertThat(action.isInternal()).isFalse(); - assertThat(action.params()).hasSize(1); - - WebService.Param key = action.param("key"); - assertThat(key).isNotNull(); - assertThat(key.description()).isNotNull(); - assertThat(key.exampleValue()).isNotNull(); - assertThat(key.isRequired()).isTrue(); - } -} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowWsHandlerTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java similarity index 99% rename from sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowWsHandlerTest.java rename to sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java index 01ddbfbabd9..20d023e6ec6 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowWsHandlerTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java @@ -38,7 +38,6 @@ import org.sonar.api.issue.internal.FieldDiffs; import org.sonar.api.rule.RuleKey; import org.sonar.api.rules.Rule; import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic; -import org.sonar.server.ws.WsTester; import org.sonar.api.user.User; import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.Duration; @@ -56,6 +55,7 @@ import org.sonar.server.issue.IssueChangelogService; import org.sonar.server.issue.IssueService; import org.sonar.server.user.MockUserSession; import org.sonar.server.user.UserSession; +import org.sonar.server.ws.WsTester; import java.util.ArrayList; import java.util.Date; @@ -69,7 +69,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) -public class IssueShowWsHandlerTest { +public class IssueShowActionTest { @Mock IssueFinder issueFinder; @@ -113,7 +113,7 @@ public class IssueShowWsHandlerTest { when(i18n.message(any(Locale.class), eq("created"), eq((String) null))).thenReturn("Created"); - tester = new WsTester(new IssuesWs(new IssueShowWsHandler(issueFinder, issueService, issueChangelogService, actionService, debtModel, i18n, durations))); + tester = new WsTester(new IssuesWs(new IssueShowAction(issueFinder, issueService, issueChangelogService, actionService, debtModel, i18n, durations))); } @Test diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java index 9fd33aa4b2d..fe1401d646a 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssuesWsTest.java @@ -20,23 +20,38 @@ package org.sonar.server.issue.ws; import org.junit.Test; +import org.sonar.api.i18n.I18n; +import org.sonar.api.issue.IssueFinder; +import org.sonar.api.server.ws.RailsHandler; import org.sonar.api.server.ws.WebService; +import org.sonar.api.utils.Durations; +import org.sonar.server.debt.DebtModelService; +import org.sonar.server.issue.ActionService; +import org.sonar.server.issue.IssueChangelogService; +import org.sonar.server.issue.IssueService; import org.sonar.server.ws.WsTester; import static org.fest.assertions.Assertions.assertThat; import static org.mockito.Mockito.mock; - public class IssuesWsTest { - IssueShowWsHandler showHandler = mock(IssueShowWsHandler.class); - WsTester tester = new WsTester(new IssuesWs(showHandler)); + IssueShowAction showAction = new IssueShowAction(mock(IssueFinder.class), mock(IssueService.class), mock(IssueChangelogService.class), mock(ActionService.class), + mock(DebtModelService.class), mock(I18n.class), mock(Durations.class)); + WsTester tester = new WsTester(new IssuesWs(showAction)); @Test - public void define_ws() throws Exception { + public void define_controller() throws Exception { WebService.Controller controller = tester.controller("api/issues"); assertThat(controller).isNotNull(); assertThat(controller.description()).isNotEmpty(); + assertThat(controller.since()).isEqualTo("3.6"); + assertThat(controller.actions()).hasSize(2); + } + + @Test + public void define_show_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); WebService.Action show = controller.action("show"); assertThat(show).isNotNull(); @@ -44,7 +59,26 @@ public class IssuesWsTest { assertThat(show.since()).isEqualTo("4.2"); assertThat(show.isPost()).isFalse(); assertThat(show.isInternal()).isTrue(); - assertThat(show.handler()).isSameAs(showHandler); + assertThat(show.handler()).isSameAs(showAction); + + WebService.Param key = show.param("key"); + assertThat(key).isNotNull(); + assertThat(key.description()).isNotNull(); + assertThat(key.isRequired()).isFalse(); + } + + @Test + public void define_search_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action show = controller.action("search"); + assertThat(show).isNotNull(); + assertThat(show.handler()).isNotNull(); + assertThat(show.since()).isEqualTo("3.6"); + assertThat(show.isPost()).isFalse(); + assertThat(show.isInternal()).isFalse(); + assertThat(show.handler()).isInstanceOf(RailsHandler.class); + assertThat(show.params()).hasSize(2); } } diff --git a/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java b/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java index 6ddbd9f4845..1a480af5e23 100644 --- a/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java @@ -42,9 +42,12 @@ public class SourcesWsTest { WebService.Action show = controller.action("show"); assertThat(show).isNotNull(); - assertThat(show.handler()).isNotNull(); - assertThat(show.since()).isEqualTo("4.2"); - assertThat(show.isPost()).isFalse(); assertThat(show.handler()).isSameAs(showAction); + assertThat(show.params()).hasSize(5); + + WebService.Action scm = controller.action("scm"); + assertThat(scm).isNotNull(); + assertThat(scm.handler()).isSameAs(scmAction); + assertThat(scm.params()).hasSize(4); } } diff --git a/sonar-server/src/test/java/org/sonar/server/ws/ListingWsTest.java b/sonar-server/src/test/java/org/sonar/server/ws/ListingWsTest.java index 0daf8447175..5378eb8a8ef 100644 --- a/sonar-server/src/test/java/org/sonar/server/ws/ListingWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/ws/ListingWsTest.java @@ -19,6 +19,7 @@ */ package org.sonar.server.ws; +import com.google.common.io.Resources; import org.junit.Test; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.RequestHandler; @@ -89,7 +90,7 @@ public class ListingWsTest { .setSince("4.1") .setPost(true) .setInternal(true) - .setResponseExample(getClass().getResource("/org/sonar/server/ws/ListingWsTest/metrics_example.json")) + .setResponseExample(Resources.getResource(getClass(), "ListingWsTest/metrics_example.json")) .setHandler(new RequestHandler() { @Override public void handle(Request request, Response response) { diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/anonymous_page.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/anonymous_page.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/anonymous_page.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/anonymous_page.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page_with_favorites.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page_with_favorites.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page_with_favorites.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page_with_favorites.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page_with_selected_filter.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page_with_selected_filter.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/logged_in_page_with_selected_filter.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/logged_in_page_with_selected_filter.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/selected_filter_can_not_be_modified.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/selected_filter_can_not_be_modified.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/selected_filter_can_not_be_modified.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/AppActionTest/selected_filter_can_not_be_modified.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/show_filter.json b/sonar-server/src/test/resources/org/sonar/server/issue/filter/ShowActionTest/show_filter.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/filter/IssueFilterWsTest/show_filter.json rename to sonar-server/src/test/resources/org/sonar/server/issue/filter/ShowActionTest/show_filter.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_on_removed_component.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_on_removed_component.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_on_removed_component.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_on_removed_component.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_on_removed_project_and_component.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_on_removed_project_and_component.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_on_removed_project_and_component.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_on_removed_project_and_component.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_action_plan.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_action_plan.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_action_plan.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_action_plan.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_actions.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_actions.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_actions.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_actions.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_actions_defined_by_plugins.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_actions_defined_by_plugins.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_actions_defined_by_plugins.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_actions_defined_by_plugins.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_assign_to_me_action.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_assign_to_me_action.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_assign_to_me_action.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_assign_to_me_action.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_changelog.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_changelog.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_changelog.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_changelog.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_characteristics.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_characteristics.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_characteristics.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_characteristics.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_comments.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_comments.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_comments.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_comments.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_dates.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_dates.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_dates.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_dates.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_set_severity_action.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_set_severity_action.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_set_severity_action.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_set_severity_action.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_sub_project.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_sub_project.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_sub_project.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_sub_project.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_technical_debt.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_technical_debt.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_technical_debt.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_technical_debt.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_transitions.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_transitions.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_transitions.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_transitions.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_users.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_users.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_with_users.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_with_users.json diff --git a/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_without_assign_to_me_action.json b/sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_without_assign_to_me_action.json similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowWsHandlerTest/show_issue_without_assign_to_me_action.json rename to sonar-server/src/test/resources/org/sonar/server/issue/ws/IssueShowActionTest/show_issue_without_assign_to_me_action.json -- 2.39.5