Browse Source

SONAR-7290 Add changelog action in IssueClient from ws-client

tags/6.3-RC1
Julien Lancelot 7 years ago
parent
commit
548d182e25

+ 9
- 3
it/it-tests/src/test/java/it/authorisation/IssuePermissionTest.java View File

@@ -33,6 +33,7 @@ import org.sonar.wsclient.issue.BulkChangeQuery;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueQuery;
import org.sonar.wsclient.user.UserParameters;
import org.sonarqube.ws.Issues;
import org.sonarqube.ws.client.WsClient;
import org.sonarqube.ws.client.permission.AddUserWsRequest;
import org.sonarqube.ws.client.permission.RemoveGroupWsRequest;
@@ -40,6 +41,7 @@ import org.sonarqube.ws.client.permission.RemoveGroupWsRequest;
import static junit.framework.TestCase.fail;
import static org.assertj.core.api.Assertions.assertThat;
import static util.ItUtils.newAdminWsClient;
import static util.ItUtils.newUserWsClient;
import static util.ItUtils.projectDir;

public class IssuePermissionTest {
@@ -122,14 +124,14 @@ public class IssuePermissionTest {

// Without user permission, a user cannot see issue changelog on the project
try {
orchestrator.getServer().wsClient(withoutBrowsePermission, "password").issueClient().changes(issue.key());
changelog(issue.key(), withoutBrowsePermission, "password");
fail();
} catch (Exception e) {
assertThat(e).isInstanceOf(HttpException.class).describedAs("404");
assertThat(e).isInstanceOf(org.sonarqube.ws.client.HttpException.class).describedAs("403");
}

// Without user permission, a user cannot see issues on the project
assertThat(orchestrator.getServer().wsClient(withBrowsePermission, "password").issueClient().changes(issue.key())).isNotEmpty();
assertThat(changelog(issue.key(), withBrowsePermission, "password").getChangelogList()).isNotEmpty();

} finally {
client.userClient().deactivate(withBrowsePermission);
@@ -242,4 +244,8 @@ public class IssuePermissionTest {
.setProjectKey(projectKey)
.setPermission(permission));
}

private static Issues.ChangelogWsResponse changelog(String issueKey, String login, String password) {
return newUserWsClient(orchestrator, login, password).issues().changelog(issueKey);
}
}

+ 27
- 43
it/it-tests/src/test/java/it/issue/IssueChangelogTest.java View File

@@ -24,12 +24,14 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueChange;
import org.sonar.wsclient.issue.IssueChangeDiff;
import org.sonarqube.ws.Issues;
import org.sonarqube.ws.Issues.ChangelogWsResponse.Changelog;
import util.ProjectAnalysis;
import util.ProjectAnalysisRule;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static util.ItUtils.newAdminWsClient;

public class IssueChangelogTest extends AbstractIssueTest {

@@ -54,16 +56,14 @@ public class IssueChangelogTest extends AbstractIssueTest {

adminIssueClient().assign(issue.key(), "admin");

List<IssueChange> changes = retrieveChangeForIssue(issue.key());
List<Changelog> changes = changelog(issue.key()).getChangelogList();
assertThat(changes).hasSize(1);
IssueChange change = changes.get(0);
assertThat(change.user()).isEqualTo("admin");
assertThat(change.creationDate()).isNotNull();
assertThat(change.diffs()).hasSize(1);
IssueChangeDiff changeDiff = change.diffs().get(0);
assertThat(changeDiff.key()).isEqualTo("assignee");
assertThat(changeDiff.oldValue()).isNull();
assertThat(changeDiff.newValue()).isEqualTo("Administrator");
Changelog change = changes.get(0);
assertThat(change.getUser()).isEqualTo("admin");
assertThat(change.getCreationDate()).isNotNull();
assertThat(change.getDiffsList())
.extracting(Changelog.Diff::getKey, Changelog.Diff::hasOldValue, Changelog.Diff::getNewValue)
.containsOnly(tuple("assignee", false, "Administrator"));
}

@Test
@@ -74,48 +74,32 @@ public class IssueChangelogTest extends AbstractIssueTest {
adminIssueClient().doTransition(issue.key(), "resolve");
xooSampleAnalysis.run();

List<IssueChange> changes = retrieveChangeForIssue(issue.key());
List<Changelog> changes = changelog(issue.key()).getChangelogList();
assertThat(changes).hasSize(2);

// Change done by the user (first change is be the oldest one)
IssueChange change1 = changes.get(0);
assertThat(change1.user()).isEqualTo("admin");
assertThat(change1.creationDate()).isNotNull();
assertThat(change1.diffs()).hasSize(2);

IssueChangeDiff change1Diff1 = change1.diffs().get(0);
assertThat(change1Diff1.key()).isEqualTo("resolution");
assertThat(change1Diff1.oldValue()).isNull();
assertThat(change1Diff1.newValue()).isEqualTo("FIXED");

IssueChangeDiff change1Diff2 = change1.diffs().get(1);
assertThat(change1Diff2.key()).isEqualTo("status");
assertThat(change1Diff2.oldValue()).isEqualTo("OPEN");
assertThat(change1Diff2.newValue()).isEqualTo("RESOLVED");
Changelog change1 = changes.get(0);
assertThat(change1.getUser()).isEqualTo("admin");
assertThat(change1.getCreationDate()).isNotNull();
assertThat(change1.getDiffsList())
.extracting(Changelog.Diff::getKey, Changelog.Diff::getOldValue, Changelog.Diff::getNewValue)
.containsOnly(tuple("resolution", "", "FIXED"), tuple("status", "OPEN", "RESOLVED"));

// Change done by scan
IssueChange change2 = changes.get(1);
assertThat(change2.user()).isNull();
assertThat(change2.creationDate()).isNotNull();
assertThat(change2.diffs()).hasSize(2);

IssueChangeDiff changeDiff1 = change2.diffs().get(0);
assertThat(changeDiff1.key()).isEqualTo("resolution");
assertThat(changeDiff1.oldValue()).isNull();
assertThat(changeDiff1.newValue()).isNull();

IssueChangeDiff changeDiff2 = change2.diffs().get(1);
assertThat(changeDiff2.key()).isEqualTo("status");
assertThat(changeDiff2.oldValue()).isEqualTo("RESOLVED");
assertThat(changeDiff2.newValue()).isEqualTo("REOPENED");
Changelog change2 = changes.get(1);
assertThat(change2.hasUser()).isFalse();
assertThat(change2.getCreationDate()).isNotNull();
assertThat(change2.getDiffsList())
.extracting(Changelog.Diff::getKey, Changelog.Diff::getOldValue, Changelog.Diff::getNewValue)
.containsOnly(tuple("resolution", "", ""), tuple("status", "RESOLVED", "REOPENED"));
}

private void assertIssueHasNoChange(String issueKey) {
assertThat(retrieveChangeForIssue(issueKey)).isEmpty();
assertThat(changelog(issueKey).getChangelogList()).isEmpty();
}

private List<IssueChange> retrieveChangeForIssue(String issueKey) {
return issueClient().changes(issueKey);
private static Issues.ChangelogWsResponse changelog(String issueKey) {
return newAdminWsClient(ORCHESTRATOR).issues().changelog(issueKey);
}

}

+ 10
- 9
it/it-tests/src/test/java/it/qualityModel/TechnicalDebtInIssueChangelogTest.java View File

@@ -29,12 +29,13 @@ import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueChange;
import org.sonar.wsclient.issue.IssueChangeDiff;
import org.sonar.wsclient.issue.IssueClient;
import org.sonar.wsclient.issue.IssueQuery;
import org.sonarqube.ws.Issues;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static util.ItUtils.newAdminWsClient;
import static util.ItUtils.projectDir;

/**
@@ -71,16 +72,16 @@ public class TechnicalDebtInIssueChangelogTest {

IssueClient issueClient = orchestrator.getServer().wsClient().issueClient();
Issue issue = issueClient.find(IssueQuery.create()).list().get(0);
List<IssueChange> changes = issueClient.changes(issue.key());

List<Issues.ChangelogWsResponse.Changelog> changes = changelog(issue.key()).getChangelogList();
assertThat(changes).hasSize(1);
IssueChange change = changes.get(0);
assertThat(changes.get(0).getDiffsList())
.extracting(Issues.ChangelogWsResponse.Changelog.Diff::getKey, Issues.ChangelogWsResponse.Changelog.Diff::getOldValue, Issues.ChangelogWsResponse.Changelog.Diff::getNewValue)
.containsOnly(tuple("effort", "10", "100"));
}

assertThat(change.diffs()).hasSize(1);
IssueChangeDiff changeDiff = change.diffs().get(0);
assertThat(changeDiff.key()).isEqualTo("effort");
assertThat(changeDiff.oldValue()).isEqualTo("10");
assertThat(changeDiff.newValue()).isEqualTo("100");
private static Issues.ChangelogWsResponse changelog(String issueKey) {
return newAdminWsClient(orchestrator).issues().changelog(issueKey);
}

}

+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/issue/ws/ChangelogAction.java View File

@@ -45,11 +45,11 @@ import static org.sonar.core.util.Protobuf.setNullable;
import static org.sonar.core.util.Uuids.UUID_EXAMPLE_01;
import static org.sonar.server.issue.IssueFieldsSetter.TECHNICAL_DEBT;
import static org.sonar.server.ws.WsUtils.writeProtobuf;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.ACTION_CHANGELOG;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.PARAM_ISSUE;

public class ChangelogAction implements IssuesWsAction {

private static final String ACTION_CHANGELOG = "changelog";
private static final String EFFORT_CHANGELOG_KEY = "effort";

private final DbClient dbClient;

+ 3
- 3
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java View File

@@ -25,9 +25,9 @@ import org.sonar.api.rules.RuleType;
import org.sonar.api.server.ws.RailsHandler;
import org.sonar.api.server.ws.WebService;

public class IssuesWs implements WebService {
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CONTROLLER_ISSUES;

public static final String API_ENDPOINT = "api/issues";
public class IssuesWs implements WebService {

public static final String ADD_COMMENT_ACTION = "add_comment";
public static final String DELETE_COMMENT_ACTION = "delete_comment";
@@ -42,7 +42,7 @@ public class IssuesWs implements WebService {

@Override
public void define(Context context) {
NewController controller = context.createController(API_ENDPOINT);
NewController controller = context.createController(CONTROLLER_ISSUES);
controller.setDescription("Read and update issues.");
controller.setSince("3.6");
for (IssuesWsAction action : actions) {

+ 36
- 35
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsMediumTest.java View File

@@ -69,6 +69,7 @@ import static org.sonar.core.util.Uuids.UUID_EXAMPLE_02;
import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newModuleDto;
import static org.sonar.db.component.SnapshotTesting.newAnalysis;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CONTROLLER_ISSUES;

public class SearchActionComponentsMediumTest {

@@ -122,7 +123,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION).execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION).execute();
result.assertJson(this.getClass(), "issues_on_different_projects.json");
}

@@ -166,22 +167,22 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.PROJECT_UUIDS, project.uuid())
.execute()
.assertJson(this.getClass(), "search_by_project_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.PROJECT_UUIDS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, project.uuid())
.execute()
.assertJson(this.getClass(), "search_by_project_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -208,7 +209,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, project.uuid())
.setParam(IssuesWsParameters.SINCE_LEAK_PERIOD, "true")
.execute()
@@ -236,7 +237,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, project.uuid())
.setParam(IssuesWsParameters.FILE_UUIDS, file.uuid())
.setParam(IssuesWsParameters.SINCE_LEAK_PERIOD, "true")
@@ -263,7 +264,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.PROJECT_UUIDS, project1.uuid())
.setParam(WebService.Param.FACETS, "projectUuids")
.execute()
@@ -280,22 +281,22 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.FILE_UUIDS, file.uuid())
.execute()
.assertJson(this.getClass(), "search_by_file_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.FILE_UUIDS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, file.uuid())
.execute()
.assertJson(this.getClass(), "search_by_file_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -314,12 +315,12 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENTS, file.key())
.execute()
.assertJson(this.getClass(), "search_by_file_key.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENTS, unitTest.key())
.execute()
.assertJson(this.getClass(), "search_by_test_key.json");
@@ -339,7 +340,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, project.uuid())
.setParam(IssuesWsParameters.FILE_UUIDS, file1.uuid() + "," + file3.uuid())
.setParam(WebService.Param.FACETS, "fileUuids")
@@ -358,22 +359,22 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, directory.uuid())
.execute()
.assertJson(this.getClass(), "search_by_file_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java/dir")
.execute()
.assertJson(this.getClass(), "search_by_file_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java")
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -396,34 +397,34 @@ public class SearchActionComponentsMediumTest {

tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, directory1.uuid())
.execute()
.assertJson(this.getClass(), "search_by_directory_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, directory2.uuid())
.execute()
.assertJson(this.getClass(), "no_issue.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.MODULE_UUIDS, module1.uuid())
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java/dir")
.execute()
.assertJson(this.getClass(), "search_by_directory_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.MODULE_UUIDS, module2.uuid())
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java/dir")
.execute()
.assertJson(this.getClass(), "no_issue.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java/dir")
.execute()
.assertJson(this.getClass(), "search_by_directory_uuid.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.DIRECTORIES, "src/main/java")
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -446,7 +447,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, module.uuid())
.setParam(IssuesWsParameters.MODULE_UUIDS, subModule1.uuid() + "," + subModule3.uuid())
.setParam(WebService.Param.FACETS, "moduleUuids")
@@ -466,7 +467,7 @@ public class SearchActionComponentsMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam("resolved", "false")
.setParam(WebService.Param.FACETS, "directories")
.execute();
@@ -486,7 +487,7 @@ public class SearchActionComponentsMediumTest {
setAnyoneProjectPermission(view, UserRole.USER);
userSessionRule.login("john").addProjectUuidPermissions(UserRole.USER, view.uuid());

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, view.uuid())
.execute()
.assertJson(this.getClass(), "search_by_view_uuid.json");
@@ -506,7 +507,7 @@ public class SearchActionComponentsMediumTest {
// User has wrong permission on the view, no issue will be returned
userSessionRule.login("john").addProjectUuidPermissions(UserRole.CODEVIEWER, view.uuid());

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, view.uuid())
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -527,7 +528,7 @@ public class SearchActionComponentsMediumTest {
setAnyoneProjectPermission(view, UserRole.USER);
userSessionRule.login("john").addComponentUuidPermission(UserRole.USER, view.uuid(), subView.uuid());

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, subView.uuid())
.execute()
.assertJson(this.getClass(), "search_by_view_uuid.json");
@@ -549,7 +550,7 @@ public class SearchActionComponentsMediumTest {
// User has wrong permission on the view, no issue will be returned
userSessionRule.login("john").addComponentUuidPermission(UserRole.CODEVIEWER, view.uuid(), subView.uuid());

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, subView.uuid())
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -568,13 +569,13 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.AUTHORS, "leia")
.setParam(WebService.Param.FACETS, "authors")
.execute()
.assertJson(this.getClass(), "search_by_authors.json");

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.AUTHORS, "unknown")
.execute()
.assertJson(this.getClass(), "no_issue.json");
@@ -597,7 +598,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, developer.uuid())
.execute()
.assertJson(this.getClass(), "search_by_developer.json");
@@ -629,7 +630,7 @@ public class SearchActionComponentsMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION)
Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SearchAction.SEARCH_ACTION)
.setParam(IssuesWsParameters.COMPONENT_UUIDS, technicalProject.uuid())
.execute();
result

+ 24
- 24
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java View File

@@ -58,10 +58,10 @@ import org.sonar.server.ws.WsTester;

import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.issue.ws.IssuesWs.API_ENDPOINT;
import static org.sonar.server.issue.ws.SearchAction.SEARCH_ACTION;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.ADDITIONAL_FIELDS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.COMPONENTS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CONTROLLER_ISSUES;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CREATED_AFTER;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.DEPRECATED_FACET_MODE_DEBT;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.FACET_MODE_EFFORT;
@@ -112,7 +112,7 @@ public class SearchActionMediumTest {

@Test
public void empty_search() throws Exception {
WsTester.TestRequest request = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION);
WsTester.TestRequest request = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION);
WsTester.Result result = request.execute();

assertThat(result).isNotNull();
@@ -143,7 +143,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION).execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION).execute();
result.assertJson(this.getClass(), "response_contains_all_fields_except_additional_fields.json");
}

@@ -177,7 +177,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("additionalFields", "comments,users")
.execute();
result.assertJson(this.getClass(), "issue_with_comments.json");
@@ -213,7 +213,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION).setParam(HIDE_COMMENTS, "true").execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION).setParam(HIDE_COMMENTS, "true").execute();
result.assertJson(this.getClass(), "issue_with_comment_hidden.json");
assertThat(result.outputAsString()).doesNotContain("fabrice");
}
@@ -235,7 +235,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("additionalFields", "_all").execute();
result.assertJson(this.getClass(), "load_additional_fields.json");
}
@@ -260,7 +260,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.execute();
result.assertJson(this.getClass(), "issue_on_removed_file.json");
}
@@ -275,7 +275,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION).execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION).execute();
assertThat(result.outputAsString()).contains("\"componentId\":" + file.getId() + ",");
}

@@ -292,7 +292,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION).setParam(COMPONENTS, file.getKey()).execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION).setParam(COMPONENTS, file.getKey()).execute();
result.assertJson(this.getClass(), "apply_paging_with_one_component.json");
}

@@ -307,7 +307,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION).setParam(ADDITIONAL_FIELDS, "_all").execute();
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION).setParam(ADDITIONAL_FIELDS, "_all").execute();
result.assertJson(this.getClass(), "components_contains_sub_projects.json");
}

@@ -328,7 +328,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam(WebService.Param.FACETS, "statuses,severities,resolutions,projectUuids,rules,fileUuids,assignees,languages,actionPlans,types")
.execute();
@@ -352,7 +352,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam(WebService.Param.FACETS, "statuses,severities,resolutions,projectUuids,rules,fileUuids,assignees,languages,actionPlans")
.setParam("facetMode", FACET_MODE_EFFORT)
@@ -377,7 +377,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam("severities", "MAJOR,MINOR")
.setParam("languages", "xoo,polop,palap")
@@ -392,7 +392,7 @@ public class SearchActionMediumTest {
userSessionRule.login("foo[");

// should not fail
wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam(WebService.Param.FACETS, "assigned_to_me")
.execute()
.assertJson(this.getClass(), "assignedToMe_facet_must_escape_login_of_authenticated_user.json");
@@ -435,7 +435,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam("assignees", "__me__")
.setParam(WebService.Param.FACETS, "assignees,assigned_to_me")
@@ -466,7 +466,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam("assignees", "__me__")
.execute()
@@ -509,7 +509,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john-bob.polop");
wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam("assignees", "alice")
.setParam(WebService.Param.FACETS, "assignees,assigned_to_me")
@@ -535,7 +535,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("sort", IssueQuery.SORT_BY_UPDATE_DATE)
.setParam("asc", "false")
.execute();
@@ -555,7 +555,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.TestRequest request = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION);
WsTester.TestRequest request = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION);
request.setParam(WebService.Param.PAGE, "2");
request.setParam(WebService.Param.PAGE_SIZE, "9");

@@ -576,7 +576,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.TestRequest request = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION);
WsTester.TestRequest request = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION);
request.setParam(WebService.Param.PAGE, "1");
request.setParam(WebService.Param.PAGE_SIZE, "-1");

@@ -597,7 +597,7 @@ public class SearchActionMediumTest {
session.commit();
tester.get(IssueIndexer.class).indexAll();

WsTester.TestRequest request = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION);
WsTester.TestRequest request = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION);
request.setParam(PAGE_INDEX, "2");
request.setParam(PAGE_SIZE, "9");

@@ -607,7 +607,7 @@ public class SearchActionMediumTest {

@Test
public void default_page_size_is_100() throws Exception {
WsTester.TestRequest request = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION);
WsTester.TestRequest request = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION);

WsTester.Result result = request.execute();
result.assertJson(this.getClass(), "default_page_size_is_100.json");
@@ -630,7 +630,7 @@ public class SearchActionMediumTest {
tester.get(IssueIndexer.class).indexAll();

userSessionRule.login("john");
WsTester.Result result = wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
WsTester.Result result = wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam("resolved", "false")
.setParam(WebService.Param.FACETS, "severities")
.setParam("facetMode", DEPRECATED_FACET_MODE_DEBT)
@@ -643,7 +643,7 @@ public class SearchActionMediumTest {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Date 'wrong-date-input' cannot be parsed as either a date or date+time");

wsTester.newGetRequest(API_ENDPOINT, SEARCH_ACTION)
wsTester.newGetRequest(CONTROLLER_ISSUES, SEARCH_ACTION)
.setParam(CREATED_AFTER, "wrong-date-input")
.execute();
}

+ 7
- 1
sonar-ws/src/main/java/org/sonarqube/ws/client/issue/IssuesService.java View File

@@ -19,6 +19,7 @@
*/
package org.sonarqube.ws.client.issue;

import org.sonarqube.ws.Issues.ChangelogWsResponse;
import org.sonarqube.ws.Issues.SearchWsResponse;
import org.sonarqube.ws.client.BaseService;
import org.sonarqube.ws.client.GetRequest;
@@ -34,6 +35,7 @@ import static org.sonarqube.ws.client.issue.IssuesWsParameters.COMPONENT_KEYS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.COMPONENT_ROOTS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.COMPONENT_ROOT_UUIDS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.COMPONENT_UUIDS;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CONTROLLER_ISSUES;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CREATED_AFTER;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CREATED_AT;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.CREATED_BEFORE;
@@ -61,7 +63,7 @@ import static org.sonarqube.ws.client.issue.IssuesWsParameters.TYPES;
public class IssuesService extends BaseService {

public IssuesService(WsConnector wsConnector) {
super(wsConnector, "api/issues");
super(wsConnector, CONTROLLER_ISSUES);
}

public SearchWsResponse search(SearchWsRequest request) {
@@ -106,4 +108,8 @@ public class IssuesService extends BaseService {
.setParam(TYPES, inlineMultipleParamValue(request.getTypes())),
SearchWsResponse.parser());
}

public ChangelogWsResponse changelog(String issueKey) {
return call(new GetRequest(path("changelog")).setParam(IssuesWsParameters.PARAM_ISSUE, issueKey), ChangelogWsResponse.parser());
}
}

+ 4
- 0
sonar-ws/src/main/java/org/sonarqube/ws/client/issue/IssuesWsParameters.java View File

@@ -29,6 +29,10 @@ import java.util.List;
*/
public class IssuesWsParameters {

public static final String CONTROLLER_ISSUES = "api/issues";

public static final String ACTION_CHANGELOG = "changelog";

public static final String PARAM_ISSUE = "issue";

public static final String ISSUES = "issues";

+ 53
- 0
sonar-ws/src/test/java/org/sonarqube/ws/client/issue/IssuesServiceTest.java View File

@@ -0,0 +1,53 @@
/*
* SonarQube
* Copyright (C) 2009-2016 SonarSource SA
* mailto:contact AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

package org.sonarqube.ws.client.issue;

import org.junit.Rule;
import org.junit.Test;
import org.sonarqube.ws.Issues;
import org.sonarqube.ws.client.GetRequest;
import org.sonarqube.ws.client.ServiceTester;
import org.sonarqube.ws.client.WsConnector;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.sonarqube.ws.client.issue.IssuesWsParameters.PARAM_ISSUE;

public class IssuesServiceTest {

@Rule
public ServiceTester<IssuesService> serviceTester = new ServiceTester<>(new IssuesService(mock(WsConnector.class)));

private IssuesService underTest = serviceTester.getInstanceUnderTest();

@Test
public void changelog() {
underTest.changelog("ABCD");

GetRequest getRequest = serviceTester.getGetRequest();

assertThat(serviceTester.getGetParser()).isSameAs(Issues.ChangelogWsResponse.parser());
serviceTester.assertThat(getRequest)
.hasParam(PARAM_ISSUE, "ABCD")
.andNoOtherParam();
}

}

Loading…
Cancel
Save