Browse Source

SONAR-19888 Update test framework to not use addProjectPermission(java.lang.String, org.sonar.db.component.ComponentDto...)

tags/10.2.0.77647
Léo Geoffroy 8 months ago
parent
commit
12639b9a55
31 changed files with 436 additions and 318 deletions
  1. 18
    1
      server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java
  2. 7
    4
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java
  3. 1
    1
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java
  4. 24
    23
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java
  5. 6
    5
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java
  6. 5
    4
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java
  7. 1
    2
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java
  8. 12
    5
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java
  9. 9
    4
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java
  10. 8
    4
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java
  11. 8
    1
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java
  12. 11
    8
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java
  13. 2
    2
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java
  14. 17
    7
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java
  15. 19
    5
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java
  16. 11
    9
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java
  17. 83
    78
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java
  18. 4
    4
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java
  19. 1
    1
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java
  20. 8
    6
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java
  21. 5
    5
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java
  22. 7
    7
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java
  23. 15
    13
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java
  24. 12
    12
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java
  25. 11
    11
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java
  26. 37
    20
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java
  27. 4
    3
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java
  28. 4
    3
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java
  29. 58
    55
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java
  30. 18
    10
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java
  31. 10
    5
      server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java

+ 18
- 1
server/sonar-db-dao/src/testFixtures/java/org/sonar/db/component/ComponentTesting.java View File

return newProjectCopy(Uuids.createFast(), project.getMainBranchComponent(), view.getMainBranchComponent()); return newProjectCopy(Uuids.createFast(), project.getMainBranchComponent(), view.getMainBranchComponent());
} }


public static ComponentDto newProjectCopy(ProjectData project, PortfolioData view) {
return newProjectCopy(Uuids.createFast(), project.getMainBranchComponent(), view.getRootComponent());
}

public static ComponentDto newProjectCopy(ComponentDto project, ComponentDto view) { public static ComponentDto newProjectCopy(ComponentDto project, ComponentDto view) {
return newProjectCopy(Uuids.createFast(), project, view); return newProjectCopy(Uuids.createFast(), project, view);
} }
.setBranchType(BranchType.BRANCH); .setBranchType(BranchType.BRANCH);
} }


public static BranchDto newMainBranchDto(String projectUUid) {
return new BranchDto()
.setKey(DEFAULT_MAIN_BRANCH_NAME)
.setIsMain(true)
.setUuid(Uuids.createFast())
.setProjectUuid(projectUUid)
.setBranchType(BranchType.BRANCH);
}

public static ProjectDto newProjectDto() { public static ProjectDto newProjectDto() {
return newProjectDto("uuid").setPrivate(true);
}

public static ProjectDto newProjectDto(String projectUuid) {
return new ProjectDto() return new ProjectDto()
.setKey("projectKey") .setKey("projectKey")
.setUuid("uuid")
.setUuid(projectUuid)
.setName("projectName") .setName("projectName")
.setQualifier(Qualifiers.PROJECT); .setQualifier(Qualifiers.PROJECT);
} }

+ 7
- 4
server/sonar-webserver-webapi/src/it/java/org/sonar/server/ce/queue/ReportSubmitterIT.java View File

public void submit_a_report_on_existing_project() { public void submit_a_report_on_existing_project() {
ProjectData project = db.components().insertPrivateProject(); ProjectData project = db.components().insertPrivateProject();
UserDto user = db.users().insertUser(); UserDto user = db.users().insertUser();
userSession.logIn(user).addProjectPermission(SCAN.getKey(), project.getMainBranchComponent());
userSession.logIn(user).addProjectPermission(SCAN.getKey(), project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());
mockSuccessfulPrepareSubmitCall(); mockSuccessfulPrepareSubmitCall();


underTest.submit(project.projectKey(), project.getProjectDto().getName(), emptyMap(), IOUtils.toInputStream("{binary}", UTF_8)); underTest.submit(project.projectKey(), project.getProjectDto().getName(), emptyMap(), IOUtils.toInputStream("{binary}", UTF_8));


@Test @Test
public void submit_a_report_on_existing_project_with_project_scan_permission() { public void submit_a_report_on_existing_project_with_project_scan_permission() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(SCAN.getKey(), project);
ProjectData projectData = db.components().insertPrivateProject();
ProjectDto project = projectData.getProjectDto();
userSession.addProjectPermission(SCAN.getKey(), project)
.addProjectBranchMapping(project.getUuid(), projectData.getMainBranchComponent());
mockSuccessfulPrepareSubmitCall(); mockSuccessfulPrepareSubmitCall();


underTest.submit(project.getKey(), project.name(), emptyMap(), IOUtils.toInputStream("{binary}", UTF_8));
underTest.submit(project.getKey(), project.getName(), emptyMap(), IOUtils.toInputStream("{binary}", UTF_8));


verify(queue).submit(any(CeTaskSubmit.class)); verify(queue).submit(any(CeTaskSubmit.class));
} }

+ 1
- 1
server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/ShowActionIT.java View File

public void fail_if_component_is_removed() { public void fail_if_component_is_removed() {
ProjectData projectData = db.components().insertPrivateProject(); ProjectData projectData = db.components().insertPrivateProject();
ComponentDto mainBranch = projectData.getMainBranchComponent(); ComponentDto mainBranch = projectData.getMainBranchComponent();
userSession.addProjectPermission(USER, mainBranch)
userSession.addProjectPermission(USER, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto()); .registerBranches(projectData.getMainBranchDto());
db.components().insertComponent(newFileDto(mainBranch).setKey("file-key").setEnabled(false)); db.components().insertComponent(newFileDto(mainBranch).setKey("file-key").setEnabled(false));



+ 24
- 23
server/sonar-webserver-webapi/src/it/java/org/sonar/server/component/ws/TreeActionIT.java View File



@Test @Test
public void branch() { public void branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
String branchKey = "my_branch"; String branchKey = "my_branch";
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(branchKey));
userSession.addProjectBranchMapping(project.uuid(), branch);
ComponentDto directory = db.components().insertComponent(newDirectoryOnBranch(branch, "dir", project.uuid()));
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(directory, project.uuid()));
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(branchKey));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto directory = db.components().insertComponent(newDirectoryOnBranch(branch, "dir", project.mainBranchUuid()));
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(directory, project.mainBranchUuid()));


TreeWsResponse response = ws.newRequest() TreeWsResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, branch.getKey()) .setParam(PARAM_COMPONENT, branch.getKey())


@Test @Test
public void dont_show_branch_if_main_branch() { public void dont_show_branch_if_main_branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project));
userSession.addProjectPermission(UserRole.USER, project);
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertFile(project.getMainBranchDto());
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), project.getMainBranchComponent());


TreeWsResponse response = ws.newRequest() TreeWsResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, file.getKey()) .setParam(PARAM_COMPONENT, file.getKey())


@Test @Test
public void pull_request() { public void pull_request() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
String pullRequestId = "pr-123"; String pullRequestId = "pr-123";
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(pullRequestId).setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.uuid(), branch);
ComponentDto directory = db.components().insertComponent(newDirectoryOnBranch(branch, "dir", project.uuid()));
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(directory, project.uuid()));
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(pullRequestId).setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto directory = db.components().insertComponent(newDirectoryOnBranch(branch, "dir", project.mainBranchUuid()));
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(directory, project.mainBranchUuid()));


TreeWsResponse response = ws.newRequest() TreeWsResponse response = ws.newRequest()
.setParam(PARAM_COMPONENT, directory.getKey()) .setParam(PARAM_COMPONENT, directory.getKey())


@Test @Test
public void fail_when_not_enough_privileges() { public void fail_when_not_enough_privileges() {
ComponentDto project = db.components().insertPrivateProject("project-uuid").getMainBranchComponent();
ProjectData project = db.components().insertPrivateProject("project-uuid");
userSession.logIn() userSession.logIn()
.addProjectPermission(UserRole.CODEVIEWER, project);
.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto());
db.commit(); db.commit();


TestRequest request = ws.newRequest() TestRequest request = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey());
.setParam(PARAM_COMPONENT, project.projectKey());
assertThatThrownBy(request::execute) assertThatThrownBy(request::execute)
.isInstanceOf(ForbiddenException.class); .isInstanceOf(ForbiddenException.class);
} }


@Test @Test
public void fail_if_branch_does_not_exist() { public void fail_if_branch_does_not_exist() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
db.components().insertProjectBranch(project, b -> b.setKey("my_branch"));
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));


TestRequest request = ws.newRequest() TestRequest request = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
.setParam(PARAM_COMPONENT, project.projectKey())
.setParam(PARAM_BRANCH, "another_branch"); .setParam(PARAM_BRANCH, "another_branch");
assertThatThrownBy(request::execute) assertThatThrownBy(request::execute)
.isInstanceOf(NotFoundException.class) .isInstanceOf(NotFoundException.class)
.hasMessage(format("Component '%s' on branch '%s' not found", project.getKey(), "another_branch"));
.hasMessage(format("Component '%s' on branch '%s' not found", project.projectKey(), "another_branch"));
} }


private static ComponentDto newFileDto(ComponentDto moduleOrProject, @Nullable ComponentDto directory, int i) { private static ComponentDto newFileDto(ComponentDto moduleOrProject, @Nullable ComponentDto directory, int i) {

+ 6
- 5
server/sonar-webserver-webapi/src/it/java/org/sonar/server/developers/ws/SearchEventsActionNewIssuesIT.java View File

@Test @Test
public void does_not_return_old_issue() { public void does_not_return_old_issue() {
userSession.logIn(); userSession.logIn();
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(USER, project);
SnapshotDto analysis = insertAnalysis(project, 1_500_000_000_000L);
db.issues().insert(db.rules().insert(), project, project, i -> i.setIssueCreationDate(new Date(analysis.getCreatedAt() - 10_000L)));
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(USER, project.getProjectDto());
SnapshotDto analysis = insertAnalysis(project.getMainBranchComponent(), 1_500_000_000_000L);
db.issues().insert(db.rules().insert(), project.getMainBranchComponent(), project.getMainBranchComponent(),
i -> i.setIssueCreationDate(new Date(analysis.getCreatedAt() - 10_000L)));
issueIndexer.indexAllIssues(); issueIndexer.indexAllIssues();


SearchEventsWsResponse result = ws.newRequest() SearchEventsWsResponse result = ws.newRequest()
.setParam(PARAM_PROJECTS, project.getKey())
.setParam(PARAM_PROJECTS, project.projectKey())
.setParam(PARAM_FROM, formatDateTime(analysis.getCreatedAt() - 1_000L)) .setParam(PARAM_FROM, formatDateTime(analysis.getCreatedAt() - 1_000L))
.executeProtobuf(SearchEventsWsResponse.class); .executeProtobuf(SearchEventsWsResponse.class);



+ 5
- 4
server/sonar-webserver-webapi/src/it/java/org/sonar/server/favorite/ws/AddActionIT.java View File

import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.property.PropertyDto; import org.sonar.db.property.PropertyDto;
import org.sonar.db.property.PropertyQuery; import org.sonar.db.property.PropertyQuery;


@Test @Test
public void fail_when_no_browse_permission_on_the_project() { public void fail_when_no_browse_permission_on_the_project() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ProjectDto project = db.components().insertPrivateProject().getProjectDto();
userSession.logIn().addProjectPermission(UserRole.ADMIN, project); userSession.logIn().addProjectPermission(UserRole.ADMIN, project);


assertThatThrownBy(() -> call(project.getKey())) assertThatThrownBy(() -> call(project.getKey()))


@Test @Test
public void fail_on_file() { public void fail_on_file() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
UserDto user = db.users().insertUser(); UserDto user = db.users().insertUser();
userSession.logIn(user).addProjectPermission(USER, project);
userSession.logIn(user).addProjectPermission(USER, project.getProjectDto());


assertThatThrownBy(() -> call(file.getKey())) assertThatThrownBy(() -> call(file.getKey()))
.isInstanceOf(NotFoundException.class) .isInstanceOf(NotFoundException.class)

+ 1
- 2
server/sonar-webserver-webapi/src/it/java/org/sonar/server/hotspot/ws/SearchActionIT.java View File

@Test @Test
public void fail_if_hotspots_provided_with_onlyMine_param() { public void fail_if_hotspots_provided_with_onlyMine_param() {
ProjectData projectData = dbTester.components().insertPrivateProject(); ProjectData projectData = dbTester.components().insertPrivateProject();
ComponentDto project = projectData.getMainBranchComponent();


userSessionRule.registerProjects(projectData.getProjectDto()); userSessionRule.registerProjects(projectData.getProjectDto());
userSessionRule.logIn().addProjectPermission(USER, project);
userSessionRule.logIn().addProjectPermission(USER, projectData.getProjectDto());


TestRequest request = actionTester.newRequest() TestRequest request = actionTester.newRequest()
.setParam(PARAM_HOTSPOTS, IntStream.range(2, 10).mapToObj(String::valueOf).collect(joining(","))) .setParam(PARAM_HOTSPOTS, IntStream.range(2, 10).mapToObj(String::valueOf).collect(joining(",")))

+ 12
- 5
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/IssueFinderIT.java View File

import org.junit.Test; import org.junit.Test;
import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.issue.IssueDbTester; import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDbTester; import org.sonar.db.rule.RuleDbTester;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
IssueDto issueDto = insertIssue(); IssueDto issueDto = insertIssue();
addProjectPermission(issueDto, USER); addProjectPermission(issueDto, USER);


assertThatThrownBy(() -> underTest.getByKey(db.getSession(), "UNKNOWN"))
assertThatThrownBy(() -> underTest.getByKey(db.getSession(), "UNKNOWN"))
.isInstanceOf(NotFoundException.class) .isInstanceOf(NotFoundException.class)
.hasMessage("Issue with key 'UNKNOWN' does not exist"); .hasMessage("Issue with key 'UNKNOWN' does not exist");
} }


private IssueDto insertIssue() { private IssueDto insertIssue() {
RuleDto rule = ruleDbTester.insert(newRule()); RuleDto rule = ruleDbTester.insert(newRule());
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
return issueDbTester.insert(newIssue(rule, project, file));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
return issueDbTester.insert(newIssue(rule, project.getMainBranchComponent(), file));
} }


private void addProjectPermission(IssueDto issueDto, String permission) { private void addProjectPermission(IssueDto issueDto, String permission) {
userSession.addProjectPermission(permission, db.getDbClient().componentDao().selectByUuid(db.getSession(), issueDto.getProjectUuid()).get());
BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException("Couldn't find branch :" + issueDto.getProjectUuid()));
ProjectDto projectDto = db.getDbClient().projectDao().selectByUuid(db.getSession(), branchDto.getProjectUuid()).get();
userSession.addProjectPermission(permission, projectDto)
.registerBranches(branchDto);
} }
} }

+ 9
- 4
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetSeverityActionIT.java View File

import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.FieldDiffs; import org.sonar.core.issue.FieldDiffs;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueTesting; import org.sonar.db.issue.IssueTesting;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.tester.AnonymousMockUserSession; import org.sonar.server.tester.AnonymousMockUserSession;
import org.sonar.server.tester.UserSessionRule; import org.sonar.server.tester.UserSessionRule;
} }


private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issue) { private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issue) {
ComponentDto project = db.getDbClient().componentDao().selectByUuid(db.getSession(), issue.getProjectUuid()).get();
ComponentDto component = db.getDbClient().componentDao().selectByUuid(db.getSession(), issue.getComponentUuid()).get();

BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), issue.getProjectUuid())
.orElseThrow(() -> new IllegalStateException("Couldn't find branch :" + issue.getProjectUuid()));
ProjectDto project = db.getDbClient().projectDao().selectByUuid(db.getSession(), branchDto.getProjectUuid()).get();
userSession.logIn(USER_LOGIN) userSession.logIn(USER_LOGIN)
.addProjectPermission(ISSUE_ADMIN, project, component)
.addProjectPermission(USER, project, component);
.addProjectPermission(ISSUE_ADMIN, project)
.addProjectPermission(USER, project)
.registerBranches(branchDto);
} }


private IssueDto newIssue() { private IssueDto newIssue() {

+ 8
- 4
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/SetTypeActionIT.java View File

import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.issue.FieldDiffs; import org.sonar.core.issue.FieldDiffs;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueTesting; import org.sonar.db.issue.IssueTesting;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.tester.UserSessionRule; import org.sonar.server.tester.UserSessionRule;


} }


private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) { private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) {
ComponentDto project = db.getDbClient().componentDao().selectByUuid(db.getSession(), issueDto.getProjectUuid()).get();
ComponentDto component = db.getDbClient().componentDao().selectByUuid(db.getSession(), issueDto.getComponentUuid()).get();
BranchDto branchDto = db.getDbClient().branchDao().selectByUuid(db.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException("Couldn't find branch :" + issueDto.getProjectUuid()));
ProjectDto project = db.getDbClient().projectDao().selectByUuid(db.getSession(), branchDto.getProjectUuid()).get();
userSession.logIn(USER_LOGIN) userSession.logIn(USER_LOGIN)
.addProjectPermission(ISSUE_ADMIN, project, component)
.addProjectPermission(USER, project, component);
.addProjectPermission(ISSUE_ADMIN, project)
.addProjectPermission(USER, project)
.registerBranches(branchDto);
} }


private IssueDto newIssue() { private IssueDto newIssue() {

+ 8
- 1
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionActionIT.java View File

import org.sonar.api.rules.RuleType; import org.sonar.api.rules.RuleType;
import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.DefaultIssue;
import org.sonar.core.util.Uuids; import org.sonar.core.util.Uuids;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.issue.IssueTesting; import org.sonar.db.issue.IssueTesting;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.issue.workflow.FunctionExecutor; import org.sonar.server.issue.workflow.FunctionExecutor;
import org.sonar.server.issue.workflow.IssueWorkflow; import org.sonar.server.issue.workflow.IssueWorkflow;
assertThat(action.supports(new DefaultIssue().setResolution(Issue.RESOLUTION_FIXED))).isTrue(); assertThat(action.supports(new DefaultIssue().setResolution(Issue.RESOLUTION_FIXED))).isTrue();
} }



private IssueDto newIssue() { private IssueDto newIssue() {
RuleDto rule = newRule().setUuid(Uuids.createFast()); RuleDto rule = newRule().setUuid(Uuids.createFast());
ComponentDto project = ComponentTesting.newPrivateProjectDto(); ComponentDto project = ComponentTesting.newPrivateProjectDto();
} }


private void loginAndAddProjectPermission(String login, String permission) { private void loginAndAddProjectPermission(String login, String permission) {
userSession.logIn(login).addProjectPermission(permission, ComponentTesting.newPrivateProjectDto(issue.projectUuid()));
ProjectDto projectDto = ComponentTesting.newProjectDto();
BranchDto branchDto = ComponentTesting.newBranchDto(projectDto.getUuid(), BranchType.BRANCH).setIsMain(true).setUuid(issue.projectUuid());
userSession.logIn(login).addProjectPermission(permission, projectDto)
.registerBranches(branchDto);
} }


} }

+ 11
- 8
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/TransitionServiceIT.java View File

import org.sonar.core.issue.IssueChangeContext; import org.sonar.core.issue.IssueChangeContext;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.issue.workflow.FunctionExecutor; import org.sonar.server.issue.workflow.FunctionExecutor;


@Test @Test
public void list_transitions() { public void list_transitions() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
RuleDto rule = db.rules().insert(); RuleDto rule = db.rules().insert();
IssueDto issue = db.issues().insert(rule, project, file, i -> i.setStatus(STATUS_OPEN).setResolution(null).setType(CODE_SMELL));
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project);
IssueDto issue = db.issues().insert(rule, project.getMainBranchComponent(), file, i -> i.setStatus(STATUS_OPEN).setResolution(null).setType(CODE_SMELL));
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


List<Transition> result = underTest.listTransitions(issue.toDefaultIssue()); List<Transition> result = underTest.listTransitions(issue.toDefaultIssue());




@Test @Test
public void list_transitions_returns_empty_list_on_external_issue() { public void list_transitions_returns_empty_list_on_external_issue() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
RuleDto externalRule = db.rules().insert(r -> r.setIsExternal(true)); RuleDto externalRule = db.rules().insert(r -> r.setIsExternal(true));
IssueDto externalIssue = db.issues().insert(externalRule, project, file, i -> i.setStatus(STATUS_OPEN).setResolution(null).setType(CODE_SMELL));
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project);
IssueDto externalIssue = db.issues().insert(externalRule, project.getMainBranchComponent(), file, i -> i.setStatus(STATUS_OPEN).setResolution(null).setType(CODE_SMELL));
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


List<Transition> result = underTest.listTransitions(externalIssue.toDefaultIssue()); List<Transition> result = underTest.listTransitions(externalIssue.toDefaultIssue());



+ 2
- 2
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SearchActionComponentsIT.java View File

import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.server.es.EsTester;
import org.sonar.server.common.avatar.AvatarResolverImpl; import org.sonar.server.common.avatar.AvatarResolverImpl;
import org.sonar.server.es.EsTester;
import org.sonar.server.issue.IssueFieldsSetter; import org.sonar.server.issue.IssueFieldsSetter;
import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.issue.TextRangeResponseFormatter;
import org.sonar.server.issue.TransitionService; import org.sonar.server.issue.TransitionService;
IssueDto issueOnProject2 = db.issues().insertIssue(issueRule, project2, project2); IssueDto issueOnProject2 = db.issues().insertIssue(issueRule, project2, project2);
db.issues().insertHotspot(hotspotRule, project2, project2); db.issues().insertHotspot(hotspotRule, project2, project2);
allowAnyoneOnProjects(projectData1.getProjectDto(), projectData2.getProjectDto(), applicatioData.getProjectDto()); allowAnyoneOnProjects(projectData1.getProjectDto(), projectData2.getProjectDto(), applicatioData.getProjectDto());
userSession.addProjectPermission(USER, application);
userSession.addProjectPermission(USER, applicatioData.getProjectDto());
indexIssuesAndViews(); indexIssuesAndViews();


// All issues on applicationBranch1 // All issues on applicationBranch1

+ 17
- 7
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetSeverityActionIT.java View File

import org.sonar.core.util.SequenceUuidFactory; import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.BranchType; import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDbTester; import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;
import org.sonar.server.es.EsTester; import org.sonar.server.es.EsTester;
import org.sonar.server.ws.TestResponse; import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester; import org.sonar.server.ws.WsActionTester;


import static java.lang.String.format;
import static java.util.Optional.ofNullable; import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
@Test @Test
public void set_severity_is_not_distributed_for_pull_request() { public void set_severity_is_not_distributed_for_pull_request() {
RuleDto rule = dbTester.rules().insertIssueRule(); RuleDto rule = dbTester.rules().insertIssueRule();
ComponentDto project = dbTester.components().insertPrivateProject().getMainBranchComponent();
ComponentDto mainBranch = dbTester.components().insertPrivateProject().getMainBranchComponent();


ComponentDto pullRequest = dbTester.components().insertProjectBranch(project, b -> b.setKey("myBranch1")
ComponentDto pullRequest = dbTester.components().insertProjectBranch(mainBranch, b -> b.setKey("myBranch1")
.setBranchType(BranchType.PULL_REQUEST) .setBranchType(BranchType.PULL_REQUEST)
.setMergeBranchUuid(project.uuid()));
.setMergeBranchUuid(mainBranch.uuid()));


ComponentDto file = dbTester.components().insertComponent(newFileDto(pullRequest)); ComponentDto file = dbTester.components().insertComponent(newFileDto(pullRequest));
IssueDto issue = newIssue(rule, pullRequest, file).setType(CODE_SMELL).setSeverity(MAJOR); IssueDto issue = newIssue(rule, pullRequest, file).setType(CODE_SMELL).setSeverity(MAJOR);


@Test @Test
public void fail_when_not_authenticated() { public void fail_when_not_authenticated() {
assertThatThrownBy(() -> call("ABCD", MAJOR))
assertThatThrownBy(() -> call("ABCD", MAJOR))
.isInstanceOf(UnauthorizedException.class); .isInstanceOf(UnauthorizedException.class);
} }


} }


private void logInAndAddProjectPermission(IssueDto issueDto, String permission) { private void logInAndAddProjectPermission(IssueDto issueDto, String permission) {
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
UserDto user = dbTester.users().insertUser("john"); UserDto user = dbTester.users().insertUser("john");
userSession.logIn(user) userSession.logIn(user)
.addProjectPermission(permission, dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get());
.addProjectPermission(permission, dbClient.projectDao().selectByUuid(dbTester.getSession(), branchDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find project with uuid %s", branchDto.getProjectUuid()))));
} }


private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) { private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) {
ComponentDto project = dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get();
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
ProjectDto project = dbClient.projectDao().selectByUuid(dbTester.getSession(), branchDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find project with uuid : %s", branchDto.getProjectUuid())));
UserDto user = dbTester.users().insertUser("john"); UserDto user = dbTester.users().insertUser("john");
userSession.logIn(user) userSession.logIn(user)
.addProjectPermission(ISSUE_ADMIN, project) .addProjectPermission(ISSUE_ADMIN, project)
.addProjectPermission(USER, project);
.addProjectPermission(USER, project)
.registerBranches(branchDto);
} }


private void verifyContentOfPreloadedSearchResponseData(IssueDto issue) { private void verifyContentOfPreloadedSearchResponseData(IssueDto issue) {

+ 19
- 5
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/SetTypeActionIT.java View File

import org.sonar.core.util.SequenceUuidFactory; import org.sonar.core.util.SequenceUuidFactory;
import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.BranchType; import org.sonar.db.component.BranchType;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.issue.IssueDbTester; import org.sonar.db.issue.IssueDbTester;
import org.sonar.db.issue.IssueDto; import org.sonar.db.issue.IssueDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.rule.RuleDto; import org.sonar.db.rule.RuleDto;
import org.sonar.db.user.UserDto;
import org.sonar.server.es.EsTester; import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.ws.TestResponse; import org.sonar.server.ws.TestResponse;
import org.sonar.server.ws.WsActionTester; import org.sonar.server.ws.WsActionTester;


import static java.lang.String.format;
import static java.util.Optional.ofNullable; import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
new IssueFinder(dbClient, userSession), new IssueFieldsSetter(), new IssueFinder(dbClient, userSession), new IssueFieldsSetter(),
new IssueUpdater(dbClient, new IssueUpdater(dbClient,
new WebIssueStorage(system2, dbClient, new DefaultRuleFinder(dbClient, mock(RuleDescriptionFormatter.class)), issueIndexer, new SequenceUuidFactory()), new WebIssueStorage(system2, dbClient, new DefaultRuleFinder(dbClient, mock(RuleDescriptionFormatter.class)), issueIndexer, new SequenceUuidFactory()),
mock(NotificationManager.class), issueChangePostProcessor, issuesChangesSerializer), responseWriter, system2));
mock(NotificationManager.class), issueChangePostProcessor, issuesChangesSerializer),
responseWriter, system2));


@Test @Test
@UseDataProvider("allTypesFromToExceptHotspots") @UseDataProvider("allTypesFromToExceptHotspots")
} }


private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) { private void setUserWithBrowseAndAdministerIssuePermission(IssueDto issueDto) {
ComponentDto project = dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get();
userSession.logIn(dbTester.users().insertUser("john"))
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
ProjectDto project = dbClient.projectDao().selectByUuid(dbTester.getSession(), branchDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find project with uuid : %s", branchDto.getProjectUuid())));
UserDto user = dbTester.users().insertUser("john");
userSession.logIn(user)
.addProjectPermission(ISSUE_ADMIN, project) .addProjectPermission(ISSUE_ADMIN, project)
.addProjectPermission(USER, project);
.addProjectPermission(USER, project)
.registerBranches(branchDto);
} }


private void logInAndAddProjectPermission(String login, IssueDto issueDto, String permission) { private void logInAndAddProjectPermission(String login, IssueDto issueDto, String permission) {
userSession.logIn(login).addProjectPermission(permission, dbClient.componentDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid()).get());
BranchDto branchDto = dbClient.branchDao().selectByUuid(dbTester.getSession(), issueDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find branch with uuid : %s", issueDto.getProjectUuid())));
userSession.logIn(login)
.addProjectPermission(permission, dbClient.projectDao().selectByUuid(dbTester.getSession(), branchDto.getProjectUuid())
.orElseThrow(() -> new IllegalStateException(format("Couldn't find project with uuid %s", branchDto.getProjectUuid()))));
} }


private void verifyContentOfPreloadedSearchResponseData(IssueDto issue) { private void verifyContentOfPreloadedSearchResponseData(IssueDto issue) {

+ 11
- 9
server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/ComponentActionIT.java View File

import org.sonar.api.utils.System2; import org.sonar.api.utils.System2;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.PortfolioData;
import org.sonar.db.component.ProjectData; import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.measure.LiveMeasureDto; import org.sonar.db.measure.LiveMeasureDto;


@Test @Test
public void reference_key_in_the_response() { public void reference_key_in_the_response() {
ComponentDto mainBranch = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto view = db.components().insertPrivatePortfolio();
userSession.addProjectPermission(USER, view);
db.components().insertSnapshot(view);
ComponentDto projectCopy = db.components().insertComponent(newProjectCopy("project-uuid-copy", mainBranch, view));
ProjectData mainBranch = db.components().insertPrivateProject();
PortfolioData view = db.components().insertPrivatePortfolioData();
userSession.addProjectPermission(USER, view.getRootComponent());
db.components().insertSnapshot(view.getPortfolioDto());
ComponentDto projectCopy = db.components().insertComponent(newProjectCopy("project-uuid-copy", mainBranch.getMainBranchComponent(), view.getRootComponent()));
MetricDto metric = db.measures().insertMetric(m -> m.setValueType("INT")); MetricDto metric = db.measures().insertMetric(m -> m.setValueType("INT"));


ComponentWsResponse response = newRequest(projectCopy.getKey(), metric.getKey()); ComponentWsResponse response = newRequest(projectCopy.getKey(), metric.getKey());


assertThat(response.getComponent().getRefKey()).isEqualTo(mainBranch.getKey());
assertThat(response.getComponent().getRefKey()).isEqualTo(mainBranch.getMainBranchComponent().getKey());
} }


@Test @Test


@Test @Test
public void use_best_values() { public void use_best_values() {
ComponentDto mainBranch = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(mainBranch));
userSession.addProjectPermission(USER, mainBranch);
ProjectData projectData = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(projectData.getMainBranchComponent()));
userSession.addProjectPermission(USER, projectData.getProjectDto())
.registerBranches(projectData.getMainBranchDto());
MetricDto metric = db.measures().insertMetric(m -> m MetricDto metric = db.measures().insertMetric(m -> m
.setValueType("INT") .setValueType("INT")
.setBestValue(7.0d) .setBestValue(7.0d)

+ 83
- 78
server/sonar-webserver-webapi/src/it/java/org/sonar/server/measure/ws/SearchHistoryActionIT.java View File

import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.measure.MeasureDto; import org.sonar.db.measure.MeasureDto;
import org.sonar.db.metric.MetricDto; import org.sonar.db.metric.MetricDto;
import static org.sonar.api.utils.DateUtils.formatDateTime; import static org.sonar.api.utils.DateUtils.formatDateTime;
import static org.sonar.api.utils.DateUtils.parseDateTime; import static org.sonar.api.utils.DateUtils.parseDateTime;
import static org.sonar.db.component.BranchType.PULL_REQUEST; import static org.sonar.db.component.BranchType.PULL_REQUEST;
import static org.sonar.db.component.ComponentDbTester.toProjectDto;
import static org.sonar.db.component.ComponentTesting.newFileDto; import static org.sonar.db.component.ComponentTesting.newFileDto;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.component.SnapshotDto.STATUS_UNPROCESSED; import static org.sonar.db.component.SnapshotDto.STATUS_UNPROCESSED;
import static org.sonar.db.component.SnapshotTesting.newAnalysis; import static org.sonar.db.component.SnapshotTesting.newAnalysis;
import static org.sonar.db.measure.MeasureTesting.newMeasureDto; import static org.sonar.db.measure.MeasureTesting.newMeasureDto;


private final WsActionTester ws = new WsActionTester(new SearchHistoryAction(dbClient, TestComponentFinder.from(db), userSession)); private final WsActionTester ws = new WsActionTester(new SearchHistoryAction(dbClient, TestComponentFinder.from(db), userSession));


private ComponentDto project;
private ProjectData project;
private SnapshotDto analysis; private SnapshotDto analysis;
private MetricDto complexityMetric; private MetricDto complexityMetric;
private MetricDto nclocMetric; private MetricDto nclocMetric;


@Before @Before
public void setUp() { public void setUp() {
project = newPrivateProjectDto();
analysis = db.components().insertProjectAndSnapshot(project);
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
analysis = db.components().insertSnapshot(project.getProjectDto());
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
nclocMetric = insertNclocMetric(); nclocMetric = insertNclocMetric();
complexityMetric = insertComplexityMetric(); complexityMetric = insertComplexityMetric();
newViolationMetric = insertNewViolationMetric(); newViolationMetric = insertNewViolationMetric();


@Test @Test
public void empty_response() { public void empty_response() {
project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(singletonList(complexityMetric.getKey())) .setMetrics(singletonList(complexityMetric.getKey()))
.build(); .build();




@Test @Test
public void analyses_but_no_measure() { public void analyses_but_no_measure() {
project = db.components().insertPrivateProject().getMainBranchComponent();
analysis = db.components().insertSnapshot(project);
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
analysis = db.components().insertSnapshot(project.getProjectDto());
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(singletonList(complexityMetric.getKey())) .setMetrics(singletonList(complexityMetric.getKey()))
.build(); .build();




@Test @Test
public void return_metrics() { public void return_metrics() {
dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project, analysis).setValue(42.0d));
dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project.mainBranchUuid(), analysis).setValue(42.0d));
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))
.build(); .build();




@Test @Test
public void return_measures() { public void return_measures() {
SnapshotDto laterAnalysis = dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setCreatedAt(analysis.getCreatedAt() + 42_000));
ComponentDto file = db.components().insertComponent(newFileDto(project));
SnapshotDto laterAnalysis = dbClient.snapshotDao().insert(dbSession, newAnalysis(project.getMainBranchDto()).setCreatedAt(analysis.getCreatedAt() + 42_000));
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
dbClient.measureDao().insert(dbSession, dbClient.measureDao().insert(dbSession,
newMeasureDto(complexityMetric, project, analysis).setValue(101d),
newMeasureDto(complexityMetric, project, laterAnalysis).setValue(100d),
newMeasureDto(complexityMetric, project.mainBranchUuid(), analysis).setValue(101d),
newMeasureDto(complexityMetric, project.mainBranchUuid(), laterAnalysis).setValue(100d),
newMeasureDto(complexityMetric, file, analysis).setValue(42d), newMeasureDto(complexityMetric, file, analysis).setValue(42d),
newMeasureDto(nclocMetric, project, analysis).setValue(201d),
newMeasureDto(newViolationMetric, project, analysis).setValue(5d),
newMeasureDto(newViolationMetric, project, laterAnalysis).setValue(10d));
newMeasureDto(nclocMetric, project.mainBranchUuid(), analysis).setValue(201d),
newMeasureDto(newViolationMetric, project.mainBranchUuid(), analysis).setValue(5d),
newMeasureDto(newViolationMetric, project.mainBranchUuid(), laterAnalysis).setValue(10d));
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))
.build(); .build();
SearchHistoryResponse result = call(request); SearchHistoryResponse result = call(request);


@Test @Test
public void pagination_applies_to_analyses() { public void pagination_applies_to_analyses() {
project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
List<String> analysisDates = LongStream.rangeClosed(1, 9) List<String> analysisDates = LongStream.rangeClosed(1, 9)
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setCreatedAt(i * 1_000_000_000)))
.peek(a -> dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project, a).setValue(101d)))
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project.mainBranchUuid()).setCreatedAt(i * 1_000_000_000)))
.peek(a -> dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project.mainBranchUuid(), a).setValue(101d)))
.map(a -> formatDateTime(a.getCreatedAt())) .map(a -> formatDateTime(a.getCreatedAt()))
.toList(); .toList();
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))
.setPage(2) .setPage(2)
.setPageSize(3) .setPageSize(3)


@Test @Test
public void inclusive_from_and_to_dates() { public void inclusive_from_and_to_dates() {
project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
List<String> analysisDates = LongStream.rangeClosed(1, 9) List<String> analysisDates = LongStream.rangeClosed(1, 9)
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setCreatedAt(System2.INSTANCE.now() + i * 1_000_000_000L)))
.peek(a -> dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project, a).setValue(Double.valueOf(a.getCreatedAt()))))
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project.mainBranchUuid()).setCreatedAt(System2.INSTANCE.now() + i * 1_000_000_000L)))
.peek(a -> dbClient.measureDao().insert(dbSession, newMeasureDto(complexityMetric, project.mainBranchUuid(), a).setValue(Double.valueOf(a.getCreatedAt()))))
.map(a -> formatDateTime(a.getCreatedAt())) .map(a -> formatDateTime(a.getCreatedAt()))
.toList(); .toList();
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))
.setFrom(analysisDates.get(1)) .setFrom(analysisDates.get(1))
.setTo(analysisDates.get(3)) .setTo(analysisDates.get(3))
dbClient.metricDao().insert(dbSession, newMetricDto().setKey("optimized").setValueType(ValueType.INT.name()).setOptimizedBestValue(true).setBestValue(456d)); dbClient.metricDao().insert(dbSession, newMetricDto().setKey("optimized").setValueType(ValueType.INT.name()).setOptimizedBestValue(true).setBestValue(456d));
dbClient.metricDao().insert(dbSession, newMetricDto().setKey("new_optimized").setValueType(ValueType.INT.name()).setOptimizedBestValue(true).setBestValue(789d)); dbClient.metricDao().insert(dbSession, newMetricDto().setKey("new_optimized").setValueType(ValueType.INT.name()).setOptimizedBestValue(true).setBestValue(789d));
db.commit(); db.commit();
ComponentDto file = db.components().insertComponent(newFileDto(project));
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(file.getKey()) .setComponent(file.getKey())


// Best value is not applied to project // Best value is not applied to project
request = SearchHistoryRequest.builder() request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList("optimized", "new_optimized")) .setMetrics(asList("optimized", "new_optimized"))
.build(); .build();
result = call(request); result = call(request);


@Test @Test
public void do_not_return_unprocessed_analyses() { public void do_not_return_unprocessed_analyses() {
dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setStatus(STATUS_UNPROCESSED));
dbClient.snapshotDao().insert(dbSession, newAnalysis(project.getMainBranchDto()).setStatus(STATUS_UNPROCESSED));
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))
.build(); .build();
SearchHistoryResponse result = call(request); SearchHistoryResponse result = call(request);


@Test @Test
public void branch() { public void branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("my_branch"));
userSession.addProjectBranchMapping(project.uuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.uuid()));
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey("my_branch"));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.mainBranchUuid()));
SnapshotDto analysis = db.components().insertSnapshot(branch); SnapshotDto analysis = db.components().insertSnapshot(branch);
MeasureDto measure = db.measures().insertMeasure(file, analysis, nclocMetric, m -> m.setValue(2d)); MeasureDto measure = db.measures().insertMeasure(file, analysis, nclocMetric, m -> m.setValue(2d));




@Test @Test
public void pull_request() { public void pull_request() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey("pr-123").setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.uuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.uuid()));
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey("pr-123").setBranchType(PULL_REQUEST));
userSession.addProjectBranchMapping(project.projectUuid(), branch);
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.mainBranchUuid()));
SnapshotDto analysis = db.components().insertSnapshot(branch); SnapshotDto analysis = db.components().insertSnapshot(branch);
MeasureDto measure = db.measures().insertMeasure(file, analysis, nclocMetric, m -> m.setValue(2d)); MeasureDto measure = db.measures().insertMeasure(file, analysis, nclocMetric, m -> m.setValue(2d));


@Test @Test
public void fail_if_unknown_metric() { public void fail_if_unknown_metric() {
SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), "METRIC_42", "42_METRIC")) .setMetrics(asList(complexityMetric.getKey(), nclocMetric.getKey(), "METRIC_42", "42_METRIC"))
.build(); .build();




@Test @Test
public void fail_if_not_enough_permissions() { public void fail_if_not_enough_permissions() {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());
SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(singletonList(complexityMetric.getKey())) .setMetrics(singletonList(complexityMetric.getKey()))
.build(); .build();




@Test @Test
public void fail_if_not_enough_permissions_for_application() { public void fail_if_not_enough_permissions_for_application() {
ComponentDto application = db.components().insertPrivateApplication().getMainBranchComponent();
ComponentDto project1 = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto project2 = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData application = db.components().insertPrivateApplication();
ProjectData project1 = db.components().insertPrivateProject();
ProjectData project2 = db.components().insertPrivateProject();


userSession.logIn() userSession.logIn()
.registerApplication( .registerApplication(
toProjectDto(application, 1L),
toProjectDto(project1, 1L),
toProjectDto(project2, 1L))
.addProjectPermission(UserRole.USER, application, project1);
application.getProjectDto(),
project1.getProjectDto(),
project2.getProjectDto())
.addProjectPermission(UserRole.USER, application.getProjectDto(), project1.getProjectDto());


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(application.getKey())
.setComponent(application.projectKey())
.setMetrics(singletonList(complexityMetric.getKey())) .setMetrics(singletonList(complexityMetric.getKey()))
.build(); .build();




@Test @Test
public void fail_when_component_is_removed() { public void fail_when_component_is_removed() {
ComponentDto project = db.components().insertComponent(newPrivateProjectDto());
db.components().insertComponent(newFileDto(project).setKey("file-key").setEnabled(false));
userSession.addProjectPermission(UserRole.USER, project);
ProjectData projectData = db.components().insertPrivateProject();
db.components().insertComponent(newFileDto(project.getMainBranchComponent()).setKey("file-key").setEnabled(false));
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_COMPONENT, "file-key") .setParam(PARAM_COMPONENT, "file-key")
.setParam(PARAM_METRICS, "ncloc") .setParam(PARAM_METRICS, "ncloc")
.execute()) .execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining("Component key 'file-key' not found");
.isInstanceOf(NotFoundException.class)
.hasMessageContaining("Component key 'file-key' not found");
} }


@Test @Test
public void fail_if_branch_does_not_exist() { public void fail_if_branch_does_not_exist() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
userSession.addProjectPermission(UserRole.USER, project);
db.components().insertProjectBranch(project, b -> b.setKey("my_branch"));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_COMPONENT, file.getKey()) .setParam(PARAM_COMPONENT, file.getKey())
.setParam(PARAM_BRANCH, "another_branch") .setParam(PARAM_BRANCH, "another_branch")
.setParam(PARAM_METRICS, "ncloc") .setParam(PARAM_METRICS, "ncloc")
.execute()) .execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(String.format("Component '%s' on branch '%s' not found", file.getKey(), "another_branch"));
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(String.format("Component '%s' on branch '%s' not found", file.getKey(), "another_branch"));
} }


@Test @Test


@Test @Test
public void json_example() { public void json_example() {
project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(UserRole.USER, project);
project = db.components().insertPrivateProject();
userSession.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
long now = parseDateTime("2017-01-23T17:00:53+0100").getTime(); long now = parseDateTime("2017-01-23T17:00:53+0100").getTime();
LongStream.rangeClosed(0, 2) LongStream.rangeClosed(0, 2)
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project).setCreatedAt(now + i * 24 * 1_000 * 60 * 60)))
.mapToObj(i -> dbClient.snapshotDao().insert(dbSession, newAnalysis(project.getMainBranchDto()).setCreatedAt(now + i * 24 * 1_000 * 60 * 60)))
.forEach(analysis -> dbClient.measureDao().insert(dbSession, .forEach(analysis -> dbClient.measureDao().insert(dbSession,
newMeasureDto(complexityMetric, project, analysis).setValue(45d),
newMeasureDto(newViolationMetric, project, analysis).setValue(46d),
newMeasureDto(nclocMetric, project, analysis).setValue(47d)));
newMeasureDto(complexityMetric, project.mainBranchUuid(), analysis).setValue(45d),
newMeasureDto(newViolationMetric, project.mainBranchUuid(), analysis).setValue(46d),
newMeasureDto(nclocMetric, project.mainBranchUuid(), analysis).setValue(47d)));
db.commit(); db.commit();


String result = ws.newRequest() String result = ws.newRequest()
.setParam(PARAM_COMPONENT, project.getKey())
.setParam(PARAM_COMPONENT, project.projectKey())
.setParam(PARAM_METRICS, String.join(",", asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey()))) .setParam(PARAM_METRICS, String.join(",", asList(complexityMetric.getKey(), nclocMetric.getKey(), newViolationMetric.getKey())))
.execute().getInput(); .execute().getInput();




@Test @Test
public void measure_without_values() { public void measure_without_values() {
dbClient.measureDao().insert(dbSession, newMeasureDto(stringMetric, project, analysis).setValue(null).setData(null));
dbClient.measureDao().insert(dbSession, newMeasureDto(stringMetric, project.mainBranchUuid(), analysis).setValue(null).setData(null));
db.commit(); db.commit();


SearchHistoryRequest request = SearchHistoryRequest.builder() SearchHistoryRequest request = SearchHistoryRequest.builder()
.setComponent(project.getKey())
.setComponent(project.projectKey())
.setMetrics(singletonList(stringMetric.getKey())) .setMetrics(singletonList(stringMetric.getKey()))
.build(); .build();
SearchHistoryResponse result = call(request); SearchHistoryResponse result = call(request);

+ 4
- 4
server/sonar-webserver-webapi/src/it/java/org/sonar/server/notification/ws/AddActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;
import org.sonar.server.component.TestComponentFinder; import org.sonar.server.component.TestComponentFinder;


@Test @Test
public void fail_when_unknown_project_dispatcher_on_private_project() { public void fail_when_unknown_project_dispatcher_on_private_project() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.addProjectPermission(USER, project);
ProjectData project = db.components().insertPrivateProject();
userSession.addProjectPermission(USER, project.getProjectDto());
when(dispatchers.getGlobalDispatchers()).thenReturn(asList(NOTIF_MY_NEW_ISSUES, NOTIF_NEW_ISSUES)); when(dispatchers.getGlobalDispatchers()).thenReturn(asList(NOTIF_MY_NEW_ISSUES, NOTIF_NEW_ISSUES));
when(dispatchers.getProjectDispatchers()).thenReturn(asList(NOTIF_MY_NEW_ISSUES, NOTIF_NEW_ISSUES)); when(dispatchers.getProjectDispatchers()).thenReturn(asList(NOTIF_MY_NEW_ISSUES, NOTIF_NEW_ISSUES));


String projectKey = project.getKey();
assertThatThrownBy(() -> call("Dispatcher42", null, projectKey, null))
assertThatThrownBy(() -> call("Dispatcher42", null, project.projectKey(), null))
.isInstanceOf(BadRequestException.class) .isInstanceOf(BadRequestException.class)
.hasMessageContaining("Value of parameter 'type' (Dispatcher42) must be one of: [Dispatcher1, Dispatcher2]"); .hasMessageContaining("Value of parameter 'type' (Dispatcher42) must be one of: [Dispatcher1, Dispatcher2]");
} }

+ 1
- 1
server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/AddUserActionIT.java View File

import org.sonar.db.portfolio.PortfolioDto; import org.sonar.db.portfolio.PortfolioDto;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;
import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.exceptions.ServerException; import org.sonar.server.exceptions.ServerException;
import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.permission.PermissionService; import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl; import org.sonar.server.permission.PermissionServiceImpl;
import org.sonar.server.ws.TestRequest; import org.sonar.server.ws.TestRequest;

+ 8
- 6
server/sonar-webserver-webapi/src/it/java/org/sonar/server/permission/ws/UsersActionIT.java View File

import org.sonar.api.server.ws.WebService.Param; import org.sonar.api.server.ws.WebService.Param;
import org.sonar.api.server.ws.WebService.SelectionMode; import org.sonar.api.server.ws.WebService.SelectionMode;
import org.sonar.api.web.UserRole; import org.sonar.api.web.UserRole;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.ResourceTypesRule; import org.sonar.db.component.ResourceTypesRule;
import org.sonar.db.permission.GlobalPermission; import org.sonar.db.permission.GlobalPermission;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;
import org.sonar.server.common.avatar.AvatarResolverImpl;
import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.exceptions.NotFoundException;
import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.exceptions.UnauthorizedException;
import org.sonar.server.common.avatar.AvatarResolverImpl;
import org.sonar.server.management.ManagedInstanceService; import org.sonar.server.management.ManagedInstanceService;
import org.sonar.server.permission.PermissionService; import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl; import org.sonar.server.permission.PermissionServiceImpl;
@Test @Test
public void fail_when_using_branch_uuid() { public void fail_when_using_branch_uuid() {
UserDto user = db.users().insertUser(newUserDto()); UserDto user = db.users().insertUser(newUserDto());
ComponentDto project = db.components().insertPublicProject().getMainBranchComponent();
ComponentDto branch = db.components().insertProjectBranch(project);
db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project);
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
ProjectData project = db.components().insertPublicProject();
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
db.users().insertProjectPermissionOnUser(user, UserRole.ISSUE_ADMIN, project.getProjectDto());
userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto());


assertThatThrownBy(() -> { assertThatThrownBy(() -> {
newRequest() newRequest()
.setParam(PARAM_PROJECT_ID, branch.uuid())
.setParam(PARAM_PROJECT_ID, branch.getUuid())
.setParam(PARAM_USER_LOGIN, user.getLogin()) .setParam(PARAM_USER_LOGIN, user.getLogin())
.setParam(PARAM_PERMISSION, GlobalPermission.ADMINISTER.getKey()) .setParam(PARAM_PERMISSION, GlobalPermission.ADMINISTER.getKey())
.execute(); .execute();

+ 5
- 5
server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/DeleteActionIT.java View File



@Test @Test
public void return_403_if_not_project_admin_nor_org_admin() { public void return_403_if_not_project_admin_nor_org_admin() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData project = db.components().insertPrivateProject();


userSessionRule.logIn() userSessionRule.logIn()
.addProjectPermission(UserRole.CODEVIEWER, project)
.addProjectPermission(UserRole.ISSUE_ADMIN, project)
.addProjectPermission(UserRole.USER, project);
.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto())
.addProjectPermission(UserRole.USER, project.getProjectDto());


TestRequest request = tester.newRequest().setParam(PARAM_PROJECT, project.getKey());
TestRequest request = tester.newRequest().setParam(PARAM_PROJECT, project.projectKey());
assertThatThrownBy(() -> call(request)) assertThatThrownBy(() -> call(request))
.isInstanceOf(ForbiddenException.class); .isInstanceOf(ForbiddenException.class);
} }

+ 7
- 7
server/sonar-webserver-webapi/src/it/java/org/sonar/server/project/ws/UpdateVisibilityActionIT.java View File

import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.user.GroupDto; import org.sonar.db.user.GroupDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;
import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.es.EsTester; import org.sonar.server.es.EsTester;
import org.sonar.server.es.Indexers; import org.sonar.server.es.Indexers;
import org.sonar.server.es.TestIndexers; import org.sonar.server.es.TestIndexers;
import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.exceptions.UnauthorizedException; import org.sonar.server.exceptions.UnauthorizedException;
import org.sonar.server.common.management.ManagedInstanceChecker;
import org.sonar.server.permission.PermissionService; import org.sonar.server.permission.PermissionService;
import org.sonar.server.permission.PermissionServiceImpl; import org.sonar.server.permission.PermissionServiceImpl;
import org.sonar.server.permission.index.FooIndexDefinition; import org.sonar.server.permission.index.FooIndexDefinition;


@Test @Test
public void execute_throws_ForbiddenException_if_user_has_all_permissions_but_ADMIN_on_specified_component() { public void execute_throws_ForbiddenException_if_user_has_all_permissions_but_ADMIN_on_specified_component() {
ComponentDto project = dbTester.components().insertPublicProject().getMainBranchComponent();
request.setParam(PARAM_PROJECT, project.getKey())
ProjectData project = dbTester.components().insertPublicProject();
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility); .setParam(PARAM_VISIBILITY, randomVisibility);
userSessionRule.addProjectPermission(UserRole.ISSUE_ADMIN, project);
userSessionRule.addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto());
Arrays.stream(GlobalPermission.values()) Arrays.stream(GlobalPermission.values())
.forEach(userSessionRule::addPermission); .forEach(userSessionRule::addPermission);


@Test @Test
public void execute_throws_ForbiddenException_if_user_has_ADMIN_permission_but_sonar_allowPermissionManagementForProjectAdmins_is_set_to_false() { public void execute_throws_ForbiddenException_if_user_has_ADMIN_permission_but_sonar_allowPermissionManagementForProjectAdmins_is_set_to_false() {
when(configuration.getBoolean(CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY)).thenReturn(of(false)); when(configuration.getBoolean(CORE_ALLOW_PERMISSION_MANAGEMENT_FOR_PROJECT_ADMINS_PROPERTY)).thenReturn(of(false));
ComponentDto project = dbTester.components().insertPublicProject().getMainBranchComponent();
request.setParam(PARAM_PROJECT, project.getKey())
ProjectData project = dbTester.components().insertPublicProject();
request.setParam(PARAM_PROJECT, project.projectKey())
.setParam(PARAM_VISIBILITY, randomVisibility); .setParam(PARAM_VISIBILITY, randomVisibility);
userSessionRule.addProjectPermission(UserRole.ADMIN, project);
userSessionRule.addProjectPermission(UserRole.ADMIN, project.getProjectDto());


assertThatThrownBy(request::execute) assertThatThrownBy(request::execute)
.isInstanceOf(ForbiddenException.class) .isInstanceOf(ForbiddenException.class)

+ 15
- 13
server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteActionIT.java View File

import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.newcodeperiod.NewCodePeriodDto; import org.sonar.db.newcodeperiod.NewCodePeriodDto;
import org.sonar.db.newcodeperiod.NewCodePeriodType; import org.sonar.db.newcodeperiod.NewCodePeriodType;


@Test @Test
public void project_administrator_deletes_analysis() { public void project_administrator_deletes_analysis() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.components().insertSnapshot(newAnalysis(project).setUuid("A1").setLast(false).setStatus(STATUS_PROCESSED));
db.components().insertSnapshot(newAnalysis(project).setUuid("A2").setLast(true).setStatus(STATUS_PROCESSED));
ProjectData project = db.components().insertPrivateProject();
db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid("A1").setLast(false).setStatus(STATUS_PROCESSED));
db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid("A2").setLast(true).setStatus(STATUS_PROCESSED));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);


call("A1"); call("A1");


@Test @Test
public void last_analysis_cannot_be_deleted() { public void last_analysis_cannot_be_deleted() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.components().insertSnapshot(newAnalysis(project).setUuid("A1").setLast(true));
ProjectData project = db.components().insertPrivateProject();
db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid("A1").setLast(true));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);


assertThatThrownBy(() -> call("A1")) assertThatThrownBy(() -> call("A1"))
@Test @Test
public void fail_when_analysis_is_new_code_period_baseline() { public void fail_when_analysis_is_new_code_period_baseline() {
String analysisUuid = RandomStringUtils.randomAlphabetic(12); String analysisUuid = RandomStringUtils.randomAlphabetic(12);
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setUuid(analysisUuid).setLast(false));
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid(analysisUuid).setLast(false));
db.newCodePeriods().insert(new NewCodePeriodDto() db.newCodePeriods().insert(new NewCodePeriodDto()
.setProjectUuid(project.uuid())
.setBranchUuid(project.uuid())
.setProjectUuid(project.projectUuid())
.setBranchUuid(project.mainBranchUuid())
.setType(NewCodePeriodType.SPECIFIC_ANALYSIS) .setType(NewCodePeriodType.SPECIFIC_ANALYSIS)
.setValue(analysis.getUuid())); .setValue(analysis.getUuid()));
db.commit(); db.commit();


@Test @Test
public void fail_when_analysis_is_unprocessed() { public void fail_when_analysis_is_unprocessed() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
db.components().insertSnapshot(newAnalysis(project).setUuid("A1").setLast(false).setStatus(STATUS_UNPROCESSED));
ProjectData project = db.components().insertPrivateProject();
db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid("A1").setLast(false).setStatus(STATUS_UNPROCESSED));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);


assertThatThrownBy(() -> call("A1")) assertThatThrownBy(() -> call("A1"))
.execute(); .execute();
} }


private void logInAsProjectAdministrator(ComponentDto project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
private void logInAsProjectAdministrator(ProjectData project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
} }
} }

+ 12
- 12
server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/DeleteEventActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.event.EventDto; import org.sonar.db.event.EventDto;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;


import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.sonar.db.component.ComponentTesting.newPrivateProjectDto;
import static org.sonar.db.component.SnapshotTesting.newAnalysis; import static org.sonar.db.component.SnapshotTesting.newAnalysis;
import static org.sonar.db.event.EventTesting.newEvent; import static org.sonar.db.event.EventTesting.newEvent;
import static org.sonar.server.projectanalysis.ws.EventCategory.VERSION; import static org.sonar.server.projectanalysis.ws.EventCategory.VERSION;


@Test @Test
public void delete_event() { public void delete_event() {
ComponentDto project = ComponentTesting.newPrivateProjectDto();
SnapshotDto analysis = db.components().insertProjectAndSnapshot(project);
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchDto());
db.events().insertEvent(newEvent(analysis).setUuid("E1")); db.events().insertEvent(newEvent(analysis).setUuid("E1"));
db.events().insertEvent(newEvent(analysis).setUuid("E2")); db.events().insertEvent(newEvent(analysis).setUuid("E2"));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);


@Test @Test
public void delete_version_event() { public void delete_version_event() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setProjectVersion("5.6.3").setLast(false));
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setProjectVersion("5.6.3").setLast(false));
db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory(VERSION.getLabel())); db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory(VERSION.getLabel()));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);




@Test @Test
public void fail_if_version_for_last_analysis() { public void fail_if_version_for_last_analysis() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setProjectVersion("5.6.3").setLast(true));
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setProjectVersion("5.6.3").setLast(true));
db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory(VERSION.getLabel())); db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory(VERSION.getLabel()));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);




@Test @Test
public void fail_if_category_different_than_other_and_version() { public void fail_if_category_different_than_other_and_version() {
ComponentDto project = newPrivateProjectDto("P1");
SnapshotDto analysis = db.components().insertProjectAndSnapshot(project);
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchDto());
db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory("Profile")); db.events().insertEvent(newEvent(analysis).setUuid("E1").setCategory("Profile"));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);


request.execute(); request.execute();
} }


private void logInAsProjectAdministrator(ComponentDto project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
private void logInAsProjectAdministrator(ProjectData project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
} }
} }

+ 11
- 11
server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectanalysis/ws/UpdateEventActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.event.EventDto; import org.sonar.db.event.EventDto;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;


@Test @Test
public void json_example() { public void json_example() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setUuid("A2"));
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setUuid("A2"));
db.events().insertEvent(newEvent(analysis) db.events().insertEvent(newEvent(analysis)
.setUuid("E1") .setUuid("E1")
.setCategory(OTHER.getLabel()) .setCategory(OTHER.getLabel())


@Test @Test
public void throw_ForbiddenException_if_not_project_administrator() { public void throw_ForbiddenException_if_not_project_administrator() {
ComponentDto project = ComponentTesting.newPrivateProjectDto();
SnapshotDto analysis = db.components().insertProjectAndSnapshot(project);
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(project.getMainBranchDto());
db.events().insertEvent(newEvent(analysis).setUuid("E1")); db.events().insertEvent(newEvent(analysis).setUuid("E1"));
userSession.logIn().addProjectPermission(UserRole.USER, project);
userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto());


assertThatThrownBy(() -> call("E1", "name")) assertThatThrownBy(() -> call("E1", "name"))
.isInstanceOf(ForbiddenException.class); .isInstanceOf(ForbiddenException.class);
return request.executeProtobuf(UpdateEventResponse.class); return request.executeProtobuf(UpdateEventResponse.class);
} }


private void logInAsProjectAdministrator(ComponentDto project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);
private void logInAsProjectAdministrator(ProjectData project) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project.getProjectDto())
.registerBranches(project.getMainBranchDto());
} }


private SnapshotDto createAnalysisAndLogInAsProjectAdministrator(String version) { private SnapshotDto createAnalysisAndLogInAsProjectAdministrator(String version) {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project).setProjectVersion(version));
ProjectData project = db.components().insertPrivateProject();
SnapshotDto analysis = db.components().insertSnapshot(newAnalysis(project.getMainBranchDto()).setProjectVersion(version));
logInAsProjectAdministrator(project); logInAsProjectAdministrator(project);
return analysis; return analysis;
} }

+ 37
- 20
server/sonar-webserver-webapi/src/it/java/org/sonar/server/projectlink/ws/CreateActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbSession; import org.sonar.db.DbSession;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.PortfolioData;
import org.sonar.db.component.ProjectData; import org.sonar.db.component.ProjectData;
import org.sonar.db.component.ProjectLinkDto; import org.sonar.db.component.ProjectLinkDto;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;


@Test @Test
public void fail_if_directory() { public void fail_if_directory() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto directory = db.components().insertComponent(ComponentTesting.newDirectory(project, "A/B"));
failIfNotAProjectWithKey(project, directory);
failIfNotAProjectWithUuid(project, directory);
ProjectData project = db.components().insertPrivateProject();
ComponentDto directory = db.components().insertComponent(ComponentTesting.newDirectory(project.getMainBranchComponent(), "A/B"));
failIfNotAProjectWithKey(project.getProjectDto(), directory);
failIfNotAProjectWithUuid(project.getProjectDto(), directory);
} }


@Test @Test
public void fail_if_file() { public void fail_if_file() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project));
failIfNotAProjectWithKey(project, file);
failIfNotAProjectWithUuid(project, file);
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project.getMainBranchComponent()));
failIfNotAProjectWithKey(project.getProjectDto(), file);
failIfNotAProjectWithUuid(project.getProjectDto(), file);
} }


@Test @Test
public void fail_if_view() { public void fail_if_view() {
ComponentDto view = db.components().insertPrivatePortfolio();
failIfNotAProjectWithKey(view, view);
failIfNotAProjectWithUuid(view, view);
PortfolioData view = db.components().insertPrivatePortfolioData();

userSession.logIn().addProjectPermission(UserRole.ADMIN, view.getRootComponent());
assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_NAME, "Custom")
.setParam(PARAM_URL, "http://example.org")
.setParam(PARAM_PROJECT_KEY, view.getPortfolioDto().getKey())
.execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining("Project '" + view.getPortfolioDto().getKey() + "' not found");

assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_NAME, "Custom")
.setParam(PARAM_URL, "http://example.org")
.setParam(PARAM_PROJECT_ID, view.getPortfolioDto().getUuid())
.execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining("Project '" + view.getPortfolioDto().getUuid() + "' not found");


} }


@Test @Test
public void fail_when_using_branch_db_uuid() { public void fail_when_using_branch_db_uuid() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.logIn().addProjectPermission(UserRole.USER, project);
ComponentDto branch = db.components().insertProjectBranch(project);
ProjectData project = db.components().insertPrivateProject();
userSession.logIn().addProjectPermission(UserRole.USER, project.getProjectDto());
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_PROJECT_ID, branch.uuid())
.setParam(PARAM_PROJECT_ID, branch.getUuid())
.setParam(PARAM_NAME, "Custom") .setParam(PARAM_NAME, "Custom")
.setParam(PARAM_URL, "http://example.org") .setParam(PARAM_URL, "http://example.org")
.execute()) .execute())
.isInstanceOf(NotFoundException.class) .isInstanceOf(NotFoundException.class)
.hasMessageContaining(format("Project '%s' not found", branch.uuid()));
.hasMessageContaining(format("Project '%s' not found", branch.getUuid()));
} }


@Test @Test
assertThat(action.params()).hasSize(4); assertThat(action.params()).hasSize(4);
} }


private void failIfNotAProjectWithKey(ComponentDto root, ComponentDto component) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, root);
private void failIfNotAProjectWithKey(ProjectDto project, ComponentDto component) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_NAME, "Custom") .setParam(PARAM_NAME, "Custom")
.hasMessageContaining("Project '" + component.getKey() + "' not found"); .hasMessageContaining("Project '" + component.getKey() + "' not found");
} }


private void failIfNotAProjectWithUuid(ComponentDto root, ComponentDto component) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, root);
private void failIfNotAProjectWithUuid(ProjectDto project, ComponentDto component) {
userSession.logIn().addProjectPermission(UserRole.ADMIN, project);


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_NAME, "Custom") .setParam(PARAM_NAME, "Custom")

+ 4
- 3
server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/DeselectActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentFinder;


@Test @Test
public void fail_when_not_project_admin() { public void fail_when_not_project_admin() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.logIn().addProjectPermission(UserRole.ISSUE_ADMIN, project);
ProjectData project = db.components().insertPrivateProject();
userSession.logIn().addProjectPermission(UserRole.ISSUE_ADMIN, project.getProjectDto());


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam("projectKey", project.getKey())
.setParam("projectKey", project.projectKey())
.execute()) .execute())
.isInstanceOf(ForbiddenException.class); .isInstanceOf(ForbiddenException.class);
} }

+ 4
- 3
server/sonar-webserver-webapi/src/it/java/org/sonar/server/qualitygate/ws/SelectActionIT.java View File

import org.sonar.db.DbClient; import org.sonar.db.DbClient;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData;
import org.sonar.db.project.ProjectDto; import org.sonar.db.project.ProjectDto;
import org.sonar.db.qualitygate.QualityGateDto; import org.sonar.db.qualitygate.QualityGateDto;
import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentFinder;
@Test @Test
public void fail_when_not_project_admin() { public void fail_when_not_project_admin() {
QualityGateDto qualityGate = db.qualityGates().insertQualityGate(); QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project);
ProjectData project = db.components().insertPrivateProject();
userSession.logIn().addProjectPermission(ISSUE_ADMIN, project.getProjectDto());


assertThatThrownBy(() -> ws.newRequest() assertThatThrownBy(() -> ws.newRequest()
.setParam(PARAM_GATE_NAME, qualityGate.getName()) .setParam(PARAM_GATE_NAME, qualityGate.getName())
.setParam("projectKey", project.getKey())
.setParam("projectKey", project.projectKey())
.execute()) .execute())
.isInstanceOf(ForbiddenException.class); .isInstanceOf(ForbiddenException.class);
} }

+ 58
- 55
server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/LinesActionIT.java View File

import org.sonar.core.util.Uuids; import org.sonar.core.util.Uuids;
import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.audit.NoOpAuditPersister; import org.sonar.db.audit.NoOpAuditPersister;
import org.sonar.db.component.BranchDto;
import org.sonar.db.component.ComponentDao; import org.sonar.db.component.ComponentDao;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ProjectData; import org.sonar.db.component.ProjectData;
import org.sonar.db.component.SnapshotDao; import org.sonar.db.component.SnapshotDao;
import org.sonar.db.component.SnapshotDto; import org.sonar.db.component.SnapshotDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.protobuf.DbFileSources; import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto; import org.sonar.db.source.FileSourceDto;
import org.sonar.db.user.UserDto; import org.sonar.db.user.UserDto;


@Test @Test
public void show_source() { public void show_source() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(3).build(), privateProject);
setUserWithValidPermission(file, privateProject);
ProjectData privateProject = db.components().insertPrivateProject();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(3).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


TestResponse response = tester.newRequest() TestResponse response = tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())


@Test @Test
public void fail_to_show_source_if_no_source_found() { public void fail_to_show_source_if_no_source_found() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = insertFile(privateProject);
setUserWithValidPermission(file, privateProject);
ProjectData privateProject = db.components().insertPrivateProject();
ComponentDto file = insertFile(privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


TestRequest request = tester.newRequest() TestRequest request = tester.newRequest()
.setParam("uuid", file.uuid()); .setParam("uuid", file.uuid());


@Test @Test
public void show_paginated_lines() { public void show_paginated_lines() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(3).build(), privateProject);
setUserWithValidPermission(file, privateProject);
ProjectData privateProject = db.components().insertPrivateProject();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(3).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


tester tester
.newRequest() .newRequest()


@Test @Test
public void branch() { public void branch() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData project = db.components().insertPrivateProject();


String branchName = randomAlphanumeric(248); String branchName = randomAlphanumeric(248);
ComponentDto branch = db.components().insertProjectBranch(project, b -> b.setKey(branchName));
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.uuid()));
ComponentDto branch = db.components().insertProjectBranch(project.getMainBranchComponent(), b -> b.setKey(branchName));
ComponentDto file = db.components().insertComponent(newFileDto(branch, project.mainBranchUuid()));
db.getDbClient().fileSourceDao().insert(db.getSession(), new FileSourceDto() db.getDbClient().fileSourceDao().insert(db.getSession(), new FileSourceDto()
.setUuid(Uuids.createFast()) .setUuid(Uuids.createFast())
.setProjectUuid(branch.uuid()) .setProjectUuid(branch.uuid())
db.commit(); db.commit();


userSession.logIn("login") userSession.logIn("login")
.addProjectPermission(UserRole.USER, project)
.addProjectBranchMapping(project.uuid(), branch)
.addProjectPermission(UserRole.CODEVIEWER, project, file);
.addProjectPermission(UserRole.USER, project.getProjectDto())
.addProjectBranchMapping(project.projectUuid(), branch)
.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto());


tester.newRequest() tester.newRequest()
.setParam("key", file.getKey()) .setParam("key", file.getKey())
userSession.logIn("login") userSession.logIn("login")
.addProjectPermission(UserRole.USER, projectData.getProjectDto()) .addProjectPermission(UserRole.USER, projectData.getProjectDto())
.addProjectPermission(UserRole.CODEVIEWER, projectData.getProjectDto()) .addProjectPermission(UserRole.CODEVIEWER, projectData.getProjectDto())
.addProjectPermission(UserRole.CODEVIEWER, file);
.addProjectBranchMapping(projectData.projectUuid(), branch);


tester.newRequest() tester.newRequest()
.setParam("key", file.getKey()) .setParam("key", file.getKey())


@Test @Test
public void fail_when_file_is_removed() { public void fail_when_file_is_removed() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = newFileDto(privateProject).setKey("file-key").setEnabled(false);
ProjectData privateProject = db.components().insertPrivateProject();
ComponentDto file = newFileDto(privateProject.getMainBranchComponent()).setKey("file-key").setEnabled(false);
db.components().insertComponents(file); db.components().insertComponents(file);
setUserWithValidPermission(file, privateProject);
setUserWithValidPermission(privateProject);


assertThatThrownBy(() -> tester.newRequest().setParam("key", "file-key").execute()) assertThatThrownBy(() -> tester.newRequest().setParam("key", "file-key").execute())
.isInstanceOf(NotFoundException.class) .isInstanceOf(NotFoundException.class)


@Test @Test
public void display_deprecated_fields() { public void display_deprecated_fields() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(1).build(), privateProject);
setUserWithValidPermission(file, privateProject);
ProjectData privateProject = db.components().insertPrivateProject();
ComponentDto file = insertFileWithData(FileSourceTesting.newFakeData(1).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


tester.newRequest() tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())
dataBuilder.addLines(DbFileSources.Line.newBuilder().setLine(2).setScmDate(2000L).build()); dataBuilder.addLines(DbFileSources.Line.newBuilder().setLine(2).setScmDate(2000L).build());
// only this line should be considered as new // only this line should be considered as new
dataBuilder.addLines(DbFileSources.Line.newBuilder().setLine(3).setScmDate(3000L).build()); dataBuilder.addLines(DbFileSources.Line.newBuilder().setLine(3).setScmDate(3000L).build());
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
insertPeriod(project, 2000L);
ComponentDto file = insertFileWithData(dataBuilder.build(), project);
setUserWithValidPermission(file, project);
ProjectData project = db.components().insertPrivateProject();
insertPeriod(project.getMainBranchComponent(), 2000L);
ComponentDto file = insertFileWithData(dataBuilder.build(), project.getMainBranchComponent());
setUserWithValidPermission(project);


tester.newRequest() tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())


@Test @Test
public void use_deprecated_overall_coverage_fields_if_exists() { public void use_deprecated_overall_coverage_fields_if_exists() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData privateProject = db.components().insertPrivateProject();
DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder(); DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder() ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder()
.setDeprecatedOverallLineHits(1) .setDeprecatedOverallLineHits(1)
.setDeprecatedUtCoveredConditions(3) .setDeprecatedUtCoveredConditions(3)
.setDeprecatedItLineHits(1) .setDeprecatedItLineHits(1)
.setDeprecatedItConditions(2) .setDeprecatedItConditions(2)
.setDeprecatedItCoveredConditions(3)).build(), privateProject);
setUserWithValidPermission(file, privateProject);
.setDeprecatedItCoveredConditions(3)).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


tester.newRequest() tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())


@Test @Test
public void use_deprecated_ut_coverage_fields_if_exists() { public void use_deprecated_ut_coverage_fields_if_exists() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData privateProject = db.components().insertPrivateProject();
DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder(); DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder() ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder()
.setDeprecatedUtLineHits(1) .setDeprecatedUtLineHits(1)
.setDeprecatedUtCoveredConditions(3) .setDeprecatedUtCoveredConditions(3)
.setDeprecatedItLineHits(1) .setDeprecatedItLineHits(1)
.setDeprecatedItConditions(2) .setDeprecatedItConditions(2)
.setDeprecatedItCoveredConditions(3)).build(), privateProject);
setUserWithValidPermission(file, privateProject);
.setDeprecatedItCoveredConditions(3)).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


tester.newRequest() tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())


@Test @Test
public void use_deprecated_it_coverage_fields_if_exists() { public void use_deprecated_it_coverage_fields_if_exists() {
ComponentDto privateProject = db.components().insertPrivateProject().getMainBranchComponent();
ProjectData privateProject = db.components().insertPrivateProject();
DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder(); DbFileSources.Data.Builder dataBuilder = DbFileSources.Data.newBuilder();
ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder() ComponentDto file = insertFileWithData(dataBuilder.addLines(newLineBuilder()
.setDeprecatedItLineHits(1) .setDeprecatedItLineHits(1)
.setDeprecatedItConditions(2) .setDeprecatedItConditions(2)
.setDeprecatedItCoveredConditions(3)).build(), privateProject);
setUserWithValidPermission(file, privateProject);
.setDeprecatedItCoveredConditions(3)).build(), privateProject.getMainBranchComponent());
setUserWithValidPermission(privateProject);


tester.newRequest() tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())


@Test @Test
public void fail_if_branch_does_not_exist() { public void fail_if_branch_does_not_exist() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
userSession.addProjectPermission(UserRole.USER, project);
db.components().insertProjectBranch(project, b -> b.setKey("my_branch"));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));


assertThatThrownBy(() -> tester.newRequest() assertThatThrownBy(() -> tester.newRequest()
.setParam("key", file.getKey()) .setParam("key", file.getKey())
.setParam("branch", "another_branch") .setParam("branch", "another_branch")
.execute()) .execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(String.format("Component '%s' on branch '%s' not found", file.getKey(), "another_branch"));
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(String.format("Component '%s' on branch '%s' not found", file.getKey(), "another_branch"));
} }


@Test @Test
public void fail_when_uuid_and_branch_params_are_used_together() { public void fail_when_uuid_and_branch_params_are_used_together() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto file = db.components().insertComponent(newFileDto(project));
userSession.addProjectPermission(UserRole.USER, project);
db.components().insertProjectBranch(project, b -> b.setKey("my_branch"));
ProjectData project = db.components().insertPrivateProject();
ComponentDto file = db.components().insertComponent(newFileDto(project.getMainBranchComponent()));
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());
db.components().insertProjectBranch(project.getProjectDto(), b -> b.setKey("my_branch"));


assertThatThrownBy(() -> tester.newRequest() assertThatThrownBy(() -> tester.newRequest()
.setParam("uuid", file.uuid()) .setParam("uuid", file.uuid())
.setParam("branch", "another_branch") .setParam("branch", "another_branch")
.execute()) .execute())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Parameter 'uuid' cannot be used at the same time as 'branch' or 'pullRequest'");
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("Parameter 'uuid' cannot be used at the same time as 'branch' or 'pullRequest'");
} }


@Test @Test
public void fail_when_using_branch_uuid() { public void fail_when_using_branch_uuid() {
ComponentDto project = db.components().insertPrivateProject().getMainBranchComponent();
ComponentDto branch = db.components().insertProjectBranch(project);
userSession.addProjectPermission(UserRole.USER, project);
ProjectData project = db.components().insertPrivateProject();
BranchDto branch = db.components().insertProjectBranch(project.getProjectDto());
userSession.addProjectPermission(UserRole.USER, project.getProjectDto());


assertThatThrownBy(() -> tester.newRequest() assertThatThrownBy(() -> tester.newRequest()
.setParam("uuid", branch.uuid())
.setParam("uuid", branch.getUuid())
.execute()) .execute())
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(format("Component id '%s' not found", branch.uuid()));
.isInstanceOf(NotFoundException.class)
.hasMessageContaining(format("Component id '%s' not found", branch.getUuid()));
} }


@Test @Test
return file; return file;
} }


private void setUserWithValidPermission(ComponentDto file, ComponentDto privateProject) {
private void setUserWithValidPermission(ProjectData privateProject) {
userSession.logIn("login") userSession.logIn("login")
.addProjectPermission(UserRole.CODEVIEWER, privateProject, file);
.addProjectPermission(UserRole.CODEVIEWER, privateProject.getProjectDto())
.registerBranches(privateProject.getMainBranchDto());
} }


private ComponentDto insertFile(ComponentDto project) { private ComponentDto insertFile(ComponentDto project) {

+ 18
- 10
server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ScmActionIT.java View File

import org.sonar.db.DbTester; import org.sonar.db.DbTester;
import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ProjectData;
import org.sonar.db.protobuf.DbFileSources; import org.sonar.db.protobuf.DbFileSources;
import org.sonar.db.source.FileSourceDto; import org.sonar.db.source.FileSourceDto;
import org.sonar.server.component.TestComponentFinder; import org.sonar.server.component.TestComponentFinder;
private final ScmAction underTest = new ScmAction(dbClient, new SourceService(dbTester.getDbClient(), new HtmlSourceDecorator()), private final ScmAction underTest = new ScmAction(dbClient, new SourceService(dbTester.getDbClient(), new HtmlSourceDecorator()),
userSessionRule, TestComponentFinder.from(dbTester)); userSessionRule, TestComponentFinder.from(dbTester));
private final WsActionTester tester = new WsActionTester(underTest); private final WsActionTester tester = new WsActionTester(underTest);
private ComponentDto project;
private ProjectData project;
private ComponentDto file; private ComponentDto file;


@Before @Before
public void setUp() { public void setUp() {
project = dbTester.components().insertPrivateProject(PROJECT_UUID).getMainBranchComponent();
file = ComponentTesting.newFileDto(project, null, FILE_UUID).setKey(FILE_KEY);
project = dbTester.components().insertPrivateProject(PROJECT_UUID);
file = ComponentTesting.newFileDto(project.getMainBranchComponent(), null, FILE_UUID).setKey(FILE_KEY);
dbClient.componentDao().insertOnMainBranch(dbTester.getSession(), file); dbClient.componentDao().insertOnMainBranch(dbTester.getSession(), file);
dbTester.getSession().commit(); dbTester.getSession().commit();
} }


@Test @Test
public void show_scm() { public void show_scm() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
.setUuid(Uuids.createFast()) .setUuid(Uuids.createFast())


@Test @Test
public void show_scm_from_given_range_lines() { public void show_scm_from_given_range_lines() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
.setUuid(Uuids.createFast()) .setUuid(Uuids.createFast())


@Test @Test
public void not_group_lines_by_commit() { public void not_group_lines_by_commit() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


// lines 1 and 2 are the same commit, but not 3 (different date) // lines 1 and 2 are the same commit, but not 3 (different date)
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()


@Test @Test
public void group_lines_by_commit() { public void group_lines_by_commit() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


// lines 1 and 2 are the same commit, but not 3 (different date) // lines 1 and 2 are the same commit, but not 3 (different date)
dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()


@Test @Test
public void accept_negative_value_in_from_parameter() { public void accept_negative_value_in_from_parameter() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
.setUuid(Uuids.createFast()) .setUuid(Uuids.createFast())


@Test @Test
public void return_empty_value_when_no_scm() { public void return_empty_value_when_no_scm() {
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project, file);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto() dbTester.getDbClient().fileSourceDao().insert(dbSession, new FileSourceDto()
.setUuid(Uuids.createFast()) .setUuid(Uuids.createFast())


@Test @Test
public void fail_without_code_viewer_permission() { public void fail_without_code_viewer_permission() {
userSessionRule.addProjectPermission(UserRole.USER, project, file);
userSessionRule.addProjectPermission(UserRole.USER, project.getProjectDto())
.registerBranches(project.getMainBranchDto());


assertThatThrownBy(() -> { assertThatThrownBy(() -> {
tester.newRequest() tester.newRequest()

+ 10
- 5
server/sonar-webserver-webapi/src/it/java/org/sonar/server/source/ws/ShowActionIT.java View File

import org.sonar.db.component.ComponentDto; import org.sonar.db.component.ComponentDto;
import org.sonar.db.component.ComponentTesting; import org.sonar.db.component.ComponentTesting;
import org.sonar.db.component.ResourceTypesRule; import org.sonar.db.component.ResourceTypesRule;
import org.sonar.db.project.ProjectDto;
import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.ComponentFinder;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.source.SourceService; import org.sonar.server.source.SourceService;
private DbSession session = mock(DbSession.class); private DbSession session = mock(DbSession.class);
private ComponentDao componentDao = mock(ComponentDao.class); private ComponentDao componentDao = mock(ComponentDao.class);
private BranchDao branchDao = mock(BranchDao.class); private BranchDao branchDao = mock(BranchDao.class);
private ComponentDto project = ComponentTesting.newPrivateProjectDto();
private ComponentDto file = ComponentTesting.newFileDto(project);
private ProjectDto project = ComponentTesting.newProjectDto();
private ComponentDto mainBranchComponentDto = ComponentTesting.newBranchComponent(project, ComponentTesting.newMainBranchDto(project.getUuid()));
private ComponentDto file = ComponentTesting.newFileDto(mainBranchComponentDto);
private ShowAction underTest = new ShowAction(sourceService, dbClient, userSessionRule, private ShowAction underTest = new ShowAction(sourceService, dbClient, userSessionRule,
new ComponentFinder(dbClient, new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT))); new ComponentFinder(dbClient, new ResourceTypesRule().setRootQualifiers(Qualifiers.PROJECT)));
private WsActionTester tester = new WsActionTester(underTest); private WsActionTester tester = new WsActionTester(underTest);
@Test @Test
public void show_source() { public void show_source() {
String fileKey = "src/Foo.java"; String fileKey = "src/Foo.java";
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file)); when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(eq(session), eq(file.uuid()), anyInt(), anyInt())).thenReturn(Optional.of(newArrayList( when(sourceService.getLinesAsHtml(eq(session), eq(file.uuid()), anyInt(), anyInt())).thenReturn(Optional.of(newArrayList(
"/*", "/*",
@Test @Test
public void show_source_with_from_and_to_params() { public void show_source_with_from_and_to_params() {
String fileKey = "src/Foo.java"; String fileKey = "src/Foo.java";
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file)); when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(session, file.uuid(), 3, 5)).thenReturn(Optional.of(newArrayList( when(sourceService.getLinesAsHtml(session, file.uuid(), 3, 5)).thenReturn(Optional.of(newArrayList(
" */", " */",
@Test @Test
public void show_source_accept_from_less_than_one() { public void show_source_accept_from_less_than_one() {
String fileKey = "src/Foo.java"; String fileKey = "src/Foo.java";
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project);
userSessionRule.addProjectPermission(UserRole.CODEVIEWER, project)
.addProjectBranchMapping(project.getUuid(), mainBranchComponentDto);
when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file)); when(componentDao.selectByKey(session, fileKey)).thenReturn(Optional.of(file));
when(sourceService.getLinesAsHtml(session, file.uuid(), 1, 5)).thenReturn(Optional.of(newArrayList( when(sourceService.getLinesAsHtml(session, file.uuid(), 1, 5)).thenReturn(Optional.of(newArrayList(
" */", " */",

Loading…
Cancel
Save