From: Julien Lancelot Date: Wed, 30 Apr 2014 16:36:57 +0000 (+0200) Subject: SONAR-5111 Complete "api/issues" WS documentation X-Git-Tag: 4.4-RC1~1301 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=804443b52b0bf4ef16b1c4163f6715ba1309bd38;p=sonarqube.git SONAR-5111 Complete "api/issues" WS documentation --- diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/DefaultTransitions.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/DefaultTransitions.java index 6c837f206dc..94109badb36 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/DefaultTransitions.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/DefaultTransitions.java @@ -19,14 +19,24 @@ */ package org.sonar.api.issue; +import com.google.common.collect.ImmutableList; + +import java.util.List; + /** * @since 3.6 */ public interface DefaultTransitions { + String CONFIRM = "confirm"; String UNCONFIRM = "unconfirm"; String REOPEN = "reopen"; String RESOLVE = "resolve"; String FALSE_POSITIVE = "falsepositive"; String CLOSE = "close"; + + /** + * @since 4.4 + */ + List ALL = ImmutableList.of(CONFIRM, UNCONFIRM, REOPEN, RESOLVE, FALSE_POSITIVE, CLOSE); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java b/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java index b0f3b34cb6f..01fb13b1f5a 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/issue/Issue.java @@ -62,6 +62,13 @@ public interface Issue extends Serializable { List RESOLUTIONS = ImmutableList.of(RESOLUTION_FALSE_POSITIVE, RESOLUTION_FIXED, RESOLUTION_REMOVED); + /** + * Return all available statuses + * + * @since 4.4 + */ + List STATUSES = ImmutableList.of(STATUS_OPEN, STATUS_CONFIRMED, STATUS_REOPENED, STATUS_RESOLVED, STATUS_CLOSED); + /** * Unique generated key. It looks like "d2de809c-1512-4ae2-9f34-f5345c9f1a13". */ diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/issue/action/ActionsTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/issue/action/ActionsTest.java new file mode 100644 index 00000000000..75663b2ff29 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/issue/action/ActionsTest.java @@ -0,0 +1,37 @@ +/* + * 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.api.issue.action; + +import org.junit.Test; + +import static org.fest.assertions.Assertions.assertThat; + +public class ActionsTest { + + @Test + public void add_action() throws Exception { + Actions actions = new Actions(); + actions.add("plan"); + + assertThat(actions.list()).hasSize(1); + } + +} 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 e371a0380ff..2caf43db2f2 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,6 +19,9 @@ */ package org.sonar.server.issue.ws; +import com.google.common.io.Resources; +import org.sonar.api.issue.DefaultTransitions; +import org.sonar.api.issue.Issue; import org.sonar.api.rule.Severity; import org.sonar.api.server.ws.RailsHandler; import org.sonar.api.server.ws.WebService; @@ -36,20 +39,286 @@ public class IssuesWs implements WebService { NewController controller = context.createController("api/issues"); controller.setDescription("Coding rule issues"); controller.setSince("3.6"); + showHandler.define(controller); + defineSearchAction(controller); + defineAssignAction(controller); + defineAddCommentAction(controller); + defineDeleteCommentAction(controller); + defineEditCommentAction(controller); + defineChangeSeverityAction(controller); + definePlanAction(controller); + defineDoTransitionAction(controller); + defineTransitionsAction(controller); + defineCreateAction(controller); + defineBulkChangeAction(controller); + + controller.done(); + } - 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).") + private void defineSearchAction(NewController controller) { + WebService.NewAction action = 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") + .setHandler(RailsHandler.INSTANCE) + .setResponseExample(Resources.getResource(this.getClass(), "example-search.json")); + + action.createParam("issues") .setDescription("Comma-separated list of issue keys.") .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); - search.createParam("severities") + action.createParam("severities") .setDescription("Comma-separated list of severities.") - .setExampleValue("BLOCKER,CRITICAL") - .setPossibleValues(Severity.ALL.toArray(new String[Severity.ALL.size()])); + .setExampleValue(Severity.BLOCKER + "," + Severity.CRITICAL) + .setPossibleValues(Severity.ALL); + action.createParam("statuses") + .setDescription("Comma-separated list of statuses.") + .setExampleValue(Issue.STATUS_OPEN + "," + Issue.STATUS_REOPENED) + .setPossibleValues(Issue.STATUSES); + action.createParam("resolutions") + .setDescription("Comma-separated list of resolutions.") + .setExampleValue(Issue.RESOLUTION_FIXED + "," + Issue.RESOLUTION_REMOVED) + .setPossibleValues(Issue.RESOLUTIONS); + action.createParam("resolved") + .setDescription("To match resolved or unresolved issues.") + .setExampleValue("true") + .setPossibleValues("true", "false"); + action.createParam("components") + .setDescription("To retrieve issues associated to a specific list of components (comma-separated list of component keys). " + + "Note that if you set the value to a project key, only issues associated to this project are retrieved. " + + "Issues associated to its sub-components (such as files, packages, etc.) are not retrieved. See also componentRoots.") + .setExampleValue("org.apache.struts:struts:org.apache.struts.Action"); + action.createParam("componentRoots") + .setDescription("To retrieve issues associated to a specific list of components and their sub-components (comma-separated list of component keys). " + + "Views are not supported.") + .setExampleValue("org.apache.struts:struts"); + action.createParam("rules") + .setDescription("Comma-separated list of coding rule keys. Format is :.") + .setExampleValue("squid:AvoidCycles"); + action.createParam("actionPlans") + .setDescription("Comma-separated list of action plan keys (not names).") + .setExampleValue("3f19de90-1521-4482-a737-a311758ff513"); + action.createParam("planned") + .setDescription("To retrieve issues associated to an action plan or not.") + .setExampleValue("true") + .setPossibleValues("true", "false"); + action.createParam("reporters") + .setDescription("Comma-separated list of reporter logins.") + .setExampleValue("admin"); + action.createParam("assignees") + .setDescription("Comma-separated list of assignee logins.") + .setExampleValue("admin,usera"); + action.createParam("assigned") + .setDescription("To retrieve assigned or unassigned issues.") + .setExampleValue("true") + .setPossibleValues("true", "false"); + action.createParam("createdAfter") + .setDescription("To retrieve issues created after the given date (inclusive). Format: date or datetime ISO formats.") + .setExampleValue("2013-05-01 (or 2013-05-01T13:00:00+0100)"); + action.createParam("createdBefore") + .setDescription("To retrieve issues created before the given date (exclusive). Format: date or datetime ISO formats.") + .setExampleValue("2013-05-01 (or 2013-05-01T13:00:00+0100)"); + action.createParam("pageSize") + .setDescription("Maximum number of results per page.\n" + + "Default value: 100 (except when the 'components' parameter is set, value is set to \"-1\" in this case)\n" + + "If set to \"-1\", the max possible value is used.") + .setExampleValue("50"); + action.createParam("pageIndex") + .setDescription("Index of the selected page") + .setDefaultValue("1") + .setExampleValue("2"); + } - controller.done(); + private void defineAssignAction(NewController controller) { + WebService.NewAction action = controller.createAction("assign") + .setDescription("Assign/Unassign an issue. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + action.createParam("assignee") + .setDescription("Login of the assignee.") + .setExampleValue("admin"); + } + + private void defineAddCommentAction(NewController controller) { + WebService.NewAction action = controller.createAction("add_comment") + .setDescription("Add a comment. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + action.createParam("text") + .setDescription("Comment.") + .setExampleValue("blabla..."); + } + + private void defineDeleteCommentAction(NewController controller) { + WebService.NewAction action = controller.createAction("delete_comment") + .setDescription("Delete a comment. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("key") + .setDescription("Key of the comment.") + .setRequired(true) + .setExampleValue("392160d3-a4f2-4c52-a565-e4542cfa2096"); + } + + private void defineEditCommentAction(NewController controller) { + WebService.NewAction action = controller.createAction("edit_comment") + .setDescription("Edit a comment. Requires authentication and User role on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("key") + .setDescription("Key of the comment.") + .setRequired(true) + .setExampleValue("392160d3-a4f2-4c52-a565-e4542cfa2096"); + action.createParam("text") + .setDescription("New comment.") + .setExampleValue("blabla2..."); + } + + private void defineChangeSeverityAction(NewController controller) { + WebService.NewAction action = controller.createAction("set_severity") + .setDescription("Change severity. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + action.createParam("severity") + .setDescription("New severity.") + .setExampleValue(Severity.BLOCKER) + .setPossibleValues(Severity.ALL); + } + + private void definePlanAction(NewController controller) { + WebService.NewAction action = controller.createAction("plan") + .setDescription("Plan/Unplan an issue. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + action.createParam("plan") + .setDescription("Key of the action plan.") + .setExampleValue("3f19de90-1521-4482-a737-a311758ff513"); + } + + private void defineDoTransitionAction(NewController controller) { + WebService.NewAction action = controller.createAction("do_transition") + .setDescription("Do workflow transition on an issue. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); + action.createParam("transition") + .setDescription("Transition.") + .setExampleValue("reopen") + .setPossibleValues(DefaultTransitions.ALL); + } + + private void defineTransitionsAction(NewController controller) { + WebService.NewAction action = controller.createAction("transitions") + .setDescription("Get Possible Workflow Transitions for an Issue. Requires Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setResponseExample(Resources.getResource(this.getClass(), "example-transitions.json")); + + action.createParam("issue") + .setDescription("Key of the issue.") + .setRequired(true) + .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef"); } + + private void defineCreateAction(NewController controller) { + WebService.NewAction action = controller.createAction("create") + .setDescription("Create a manual issue. Requires authentication and Browse permission on project.") + .setSince("3.6") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("component") + .setDescription("Key of the component on which to log the issue.") + .setRequired(true) + .setExampleValue("org.apache.struts:struts:org.apache.struts.Action"); + action.createParam("rule") + .setDescription("Manual rule key.") + .setRequired(true) + .setExampleValue("manual:performance"); + action.createParam("severity") + .setDescription("Severity of the issue.") + .setExampleValue(Severity.BLOCKER + "," + Severity.CRITICAL) + .setPossibleValues(Severity.ALL); + action.createParam("line") + .setDescription("Line on which to log the issue.\n" + + "If no line is specified, the issue is attached to the component and not to a specific line.") + .setExampleValue("15"); + action.createParam("message") + .setDescription("Description of the issue.") + .setExampleValue("blabla..."); + } + + private void defineBulkChangeAction(NewController controller) { + WebService.NewAction action = controller.createAction("bulk_change") + .setDescription("Bulk change on issues. Requires authentication and User role on project(s).") + .setSince("3.7") + .setHandler(RailsHandler.INSTANCE) + .setPost(true); + + action.createParam("issues") + .setDescription("Comma-separated list of issue keys.") + .setRequired(true) + .setExampleValue("01fc972e-2a3c-433e-bcae-0bd7f88f5123,01fc972e-2a3c-433e-bcae-0bd7f88f9999"); + action.createParam("actions") + // TODO It's not possible to load actions as actions defined by plugins are not availables + .setDescription("Comma-separated list of actions to perform. Possible values: assign | set_severity | plan | do_transition.") + .setRequired(true) + .setExampleValue("assign,plan"); + action.createParam("assign.assignee") + .setDescription("To assign the list of issues to a specific user (login), or unassign all the issues.") + .setExampleValue("sbrandhof"); + action.createParam("set_severity.severity") + .setDescription("To change the severity of the list of issues.") + .setExampleValue(Severity.BLOCKER) + .setPossibleValues(Severity.ALL); + action.createParam("plan.plan") + .setDescription("To plan the list of issues to a specific action plan (key), or unlink all the issues from an action plan.") + .setExampleValue("3f19de90-1521-4482-a737-a311758ff513"); + action.createParam("do_transition.transition") + .setDescription("Transition.") + .setExampleValue("reopen") + .setPossibleValues(DefaultTransitions.ALL); + action.createParam("comment") + .setDescription("To add a comment to a list of issues.") + .setExampleValue("blabla..."); + action.createParam("sendNotifications") + .setDescription("Available since version 4.0.") + .setDefaultValue("false") + .setExampleValue("true") + .setPossibleValues("true", "false"); + } + } diff --git a/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-search.json b/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-search.json new file mode 100644 index 00000000000..c216a337a57 --- /dev/null +++ b/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-search.json @@ -0,0 +1,67 @@ +{ + "securityExclusions": false, + "maxResultsReached": false, + "paging": { + "pageIndex": 1, + "pageSize": 5, + "total": 206, + "pages": 42 + }, + "issues": [ + { + "key": "01fc972e-2a3c-433e-bcae-0bd7f88f5123", + "component": "com.github.kevinsawicki:http-request:com.github.kevinsawicki.http.HttpRequest", + "project": "com.github.kevinsawicki:http-request", + "rule": "checkstyle:com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck", + "status": "RESOLVED", + "resolution": "FALSE-POSITIVE", + "severity": "MINOR", + "message": "'3' is a magic number.", + "line": 530, + "author": "Developer 1", + "creationDate": "2013-05-13T17:55:39+0200", + "updateDate": "2013-05-13T17:55:39+0200", + "comments": [ + { + "key": "7d7c56f5-7b5a-41b9-87f8-36fa70caa5ba", + "login": "admin", + "htmlText": "foooooo", + "createdAt": "2013-05-13T18:08:34+0200" + } + ] + } + ], + "components": [ + { + "key": "com.github.kevinsawicki:http-request:com.github.kevinsawicki.http.HttpRequest", + "qualifier": "CLA", + "name": "HttpRequest", + "longName": "com.github.kevinsawicki.http.HttpRequest" + } + ], + "projects": [ + { + "key": "com.github.kevinsawicki:http-request", + "qualifier": "TRK", + "name": "http-request", + "longName": "http-request" + } + ], + "rules": [ + { + "key": "checkstyle:com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck", + "name": "Magic Number", + "desc": "Checks for magic numbers.", + "status": "READY" + } + ], + "users": [ + { + "login": "admin", + "name": "Administrator", + "active": true, + "email": "admin@sonarqube.org" + } + ] + +} diff --git a/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-transitions.json b/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-transitions.json new file mode 100644 index 00000000000..fcee98bfcee --- /dev/null +++ b/sonar-server/src/main/resources/org/sonar/server/issue/ws/example-transitions.json @@ -0,0 +1,3 @@ +{ + "transitions": ["confirm", "resolve", "falsepositive"] +} diff --git a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java index 20d023e6ec6..914d7d5ecc7 100644 --- a/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java +++ b/sonar-server/src/test/java/org/sonar/server/issue/ws/IssueShowActionTest.java @@ -134,19 +134,19 @@ public class IssueShowActionTest { issues.add(issue); result.addComponents(Lists.newArrayList(new ComponentDto() - .setId(10L) - .setKey("org.sonar.server.issue.IssueClient") - .setLongName("SonarQube :: Issue Client") - .setQualifier("FIL") - .setSubProjectId(1L) - .setProjectId(1L) + .setId(10L) + .setKey("org.sonar.server.issue.IssueClient") + .setLongName("SonarQube :: Issue Client") + .setQualifier("FIL") + .setSubProjectId(1L) + .setProjectId(1L) )); result.addComponents(Lists.newArrayList(new ComponentDto() - .setId(1L) - .setKey("org.sonar.Sonar") - .setLongName("SonarQube") - .setProjectId(1L) + .setId(1L) + .setKey("org.sonar.Sonar") + .setLongName("SonarQube") + .setProjectId(1L) )); MockUserSession.set(); @@ -396,7 +396,8 @@ public class IssueShowActionTest { .setKey("COMMENT-ABCD") .setMarkdownText("*My comment*") .setUserLogin("john") - .setCreatedAt(date1)) + .setCreatedAt(date1) + ) .addComment( new DefaultIssueComment() .setKey("COMMENT-ABCE") @@ -542,19 +543,19 @@ public class IssueShowActionTest { private void addComponentAndProject() { result.addComponents(Lists.newArrayList(new ComponentDto() - .setId(10L) - .setKey("org.sonar.server.issue.IssueClient") - .setLongName("SonarQube :: Issue Client") - .setQualifier("FIL") - .setSubProjectId(1L) - .setProjectId(1L) + .setId(10L) + .setKey("org.sonar.server.issue.IssueClient") + .setLongName("SonarQube :: Issue Client") + .setQualifier("FIL") + .setSubProjectId(1L) + .setProjectId(1L) )); result.addComponents(Lists.newArrayList(new ComponentDto() - .setId(1L) - .setKey("org.sonar.Sonar") - .setLongName("SonarQube") - .setProjectId(1L) + .setId(1L) + .setKey("org.sonar.Sonar") + .setLongName("SonarQube") + .setProjectId(1L) )); } 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 fe1401d646a..2c908aa63fd 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 @@ -19,6 +19,7 @@ */ package org.sonar.server.issue.ws; +import org.junit.Before; import org.junit.Test; import org.sonar.api.i18n.I18n; import org.sonar.api.issue.IssueFinder; @@ -36,9 +37,16 @@ import static org.mockito.Mockito.mock; public class IssuesWsTest { - 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)); + IssueShowAction showAction; + + WsTester tester; + + @Before + public void setUp() throws Exception { + showAction = new IssueShowAction(mock(IssueFinder.class), mock(IssueService.class), mock(IssueChangelogService.class), mock(ActionService.class), + mock(DebtModelService.class), mock(I18n.class), mock(Durations.class)); + tester = new WsTester(new IssuesWs(showAction)); + } @Test public void define_controller() throws Exception { @@ -46,22 +54,23 @@ public class IssuesWsTest { assertThat(controller).isNotNull(); assertThat(controller.description()).isNotEmpty(); assertThat(controller.since()).isEqualTo("3.6"); - assertThat(controller.actions()).hasSize(2); + assertThat(controller.actions()).hasSize(12); } @Test public void define_show_action() throws Exception { WebService.Controller controller = tester.controller("api/issues"); - 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.isInternal()).isTrue(); - assertThat(show.handler()).isSameAs(showAction); + WebService.Action action = controller.action("show"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("4.2"); + assertThat(action.isPost()).isFalse(); + assertThat(action.isInternal()).isTrue(); + assertThat(action.handler()).isSameAs(showAction); + assertThat(action.params()).hasSize(1); - WebService.Param key = show.param("key"); + WebService.Param key = action.param("key"); assertThat(key).isNotNull(); assertThat(key.description()).isNotNull(); assertThat(key.isRequired()).isFalse(); @@ -78,7 +87,148 @@ public class IssuesWsTest { assertThat(show.isPost()).isFalse(); assertThat(show.isInternal()).isFalse(); assertThat(show.handler()).isInstanceOf(RailsHandler.class); - assertThat(show.params()).hasSize(2); + assertThat(show.responseExampleAsString()).isNotEmpty(); + assertThat(show.params()).hasSize(17); + } + + @Test + public void define_assign_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("assign"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_add_comment_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("add_comment"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_delete_comment_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("delete_comment"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(1); + } + + @Test + public void define_edit_comment_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("edit_comment"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_change_severity_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("set_severity"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_plan_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("plan"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_do_transition_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("do_transition"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(2); + } + + @Test + public void define_transitions_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("transitions"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isFalse(); + assertThat(action.isInternal()).isFalse(); + 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/issues"); + + WebService.Action action = controller.action("create"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.6"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.params()).hasSize(5); + } + + @Test + public void define_bulk_change_action() throws Exception { + WebService.Controller controller = tester.controller("api/issues"); + + WebService.Action action = controller.action("bulk_change"); + assertThat(action).isNotNull(); + assertThat(action.handler()).isNotNull(); + assertThat(action.since()).isEqualTo("3.7"); + assertThat(action.isPost()).isTrue(); + assertThat(action.isInternal()).isFalse(); + assertThat(action.handler()).isInstanceOf(RailsHandler.class); + assertThat(action.params()).hasSize(8); } }