@Test public void encode_and_decode_pull_request_data() { String branch = "feature/pr1"; String title = "Dummy Feature Title"; String url = "http://example.com/pullRequests/pr1"; DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch) .setTitle(title) .setUrl(url) .build(); underTest.setPullRequestData(pullRequestData); DbProjectBranches.PullRequestData decoded = underTest.getPullRequestData(); assertThat(decoded).isNotNull(); assertThat(decoded.getBranch()).isEqualTo(branch); assertThat(decoded.getTitle()).isEqualTo(title); assertThat(decoded.getUrl()).isEqualTo(url); }
String tokenAttributeName = "token"; String tokenAttributeValue = "dummy token"; DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch) .setTitle(title)
String tokenAttributeName = "token"; String tokenAttributeValue = "dummy token"; DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch) .setTitle(title)
private BranchDto toBranchDto(ComponentDto componentDto, Branch branch) { BranchDto dto = new BranchDto(); dto.setUuid(componentDto.uuid()); // MainBranchProjectUuid will be null if it's a main branch dto.setProjectUuid(firstNonNull(componentDto.getMainBranchProjectUuid(), componentDto.projectUuid())); dto.setBranchType(branch.getType()); // merge branch is only present if it's a short living branch dto.setMergeBranchUuid(branch.getMergeBranchUuid().orElse(null)); if (branch.getType() == BranchType.PULL_REQUEST) { dto.setKey(analysisMetadataHolder.getPullRequestKey()); DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch.getName()) .setTitle(branch.getName()) .build(); dto.setPullRequestData(pullRequestData); } else { dto.setKey(branch.getName()); } return dto; }
String tokenAttributeName = "token"; String tokenAttributeValue = "dummy token"; DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch + "-dummy-suffix") .setTitle(title + "-dummy-suffix") pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch) .setTitle(title)
.setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/pr1").build())); .setBranchType(PULL_REQUEST) .setMergeBranchUuid(longLivingBranch2.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/pr2").build()));
@Test @UseDataProvider("nullOrNotNullString") public void persist_creates_row_in_PROJECTS_BRANCHES_for_pull_request(@Nullable String mergeBranchUuid) { String pullRequestId = "pr-123"; // add project and branch in table PROJECTS ComponentDto mainComponent = ComponentTesting.newPrivateProjectDto(dbTester.organizations().insert(), MAIN.getUuid()).setDbKey(MAIN.getKey()); ComponentDto component = ComponentTesting.newProjectBranch(mainComponent, new BranchDto().setUuid(BRANCH.getUuid()).setKey(BRANCH.getKey()).setBranchType(PULL_REQUEST)); dbTester.getDbClient().componentDao().insert(dbTester.getSession(), mainComponent, component); dbTester.commit(); // set project in metadata treeRootHolder.setRoot(BRANCH); analysisMetadataHolder.setBranch(createBranch(PULL_REQUEST, false, pullRequestId, mergeBranchUuid)); analysisMetadataHolder.setProject(Project.from(mainComponent)); analysisMetadataHolder.setPullRequestKey(pullRequestId); underTest.persist(dbTester.getSession()); dbTester.getSession().commit(); assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(2); Optional<BranchDto> branchDto = dbTester.getDbClient().branchDao().selectByUuid(dbTester.getSession(), BRANCH.getUuid()); assertThat(branchDto).isPresent(); assertThat(branchDto.get().getBranchType()).isEqualTo(PULL_REQUEST); assertThat(branchDto.get().getKey()).isEqualTo(pullRequestId); assertThat(branchDto.get().getMergeBranchUuid()).isEqualTo(mergeBranchUuid); assertThat(branchDto.get().getProjectUuid()).isEqualTo(MAIN.getUuid()); assertThat(branchDto.get().getPullRequestData()).isEqualTo(DbProjectBranches.PullRequestData.newBuilder() .setBranch(pullRequestId) .setTitle(pullRequestId) .build()); }
@Test public void status_on_pull_requests() { ComponentDto project = db.components().insertMainBranch(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG)); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(longLivingBranch.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); db.measures().insertLiveMeasure(pullRequest, qualityGateStatus, m -> m.setData("ERROR")); RuleDefinitionDto rule = db.rules().insert(); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(BUG).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(BUG).setResolution(RESOLUTION_FIXED)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(VULNERABILITY).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(VULNERABILITY).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(CODE_SMELL).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(CODE_SMELL).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(CODE_SMELL).setResolution(null)); db.issues().insert(rule, pullRequest, pullRequest, i -> i.setType(CODE_SMELL).setResolution(RESOLUTION_FALSE_POSITIVE)); issueIndexer.indexOnStartup(emptySet()); permissionIndexerTester.allowOnlyAnyone(project); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList().stream().map(PullRequest::getStatus)) .extracting(Status::getQualityGateStatus, Status::hasBugs, Status::getBugs, Status::hasVulnerabilities, Status::getVulnerabilities, Status::hasCodeSmells, Status::getCodeSmells) .containsExactlyInAnyOrder(tuple("ERROR", true, 1L, true, 2L, true, 3L)); }
@Test public void pull_requests() { ComponentDto project = db.components().insertMainBranch(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setKey("long").setBranchType(BranchType.LONG)); ComponentDto pullRequestOnLong = db.components().insertProjectBranch(project, b -> b.setKey("pull_request_on_long") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(longLivingBranch.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); ComponentDto pullRequestOnMaster = db.components().insertProjectBranch(project, b -> b.setKey("pull_request_on_master") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey, PullRequest::getBase) .containsExactlyInAnyOrder( tuple(pullRequestOnLong.getPullRequest(), longLivingBranch.getBranch()), tuple(pullRequestOnMaster.getPullRequest(), "master")); }
@Test public void json_example() { ComponentDto project = db.components().insertPrivateProject(p -> p.setDbKey("sonarqube")); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setKey("feature/foo").setBranchType(LONG)); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(longLivingBranch.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder() .setBranch("feature/bar") .setTitle("Add feature X") .setUrl("https://github.com/SonarSource/sonar-core-plugins/pull/32") .build())); db.getDbClient().snapshotDao().insert(db.getSession(), newAnalysis(pullRequest).setLast(true).setCreatedAt(DateUtils.parseDateTime("2017-04-01T01:15:42+0100").getTime())); db.measures().insertLiveMeasure(pullRequest, qualityGateStatus, m -> m.setData("OK")); userSession.logIn().addProjectPermission(UserRole.USER, project); db.commit(); String json = ws.newRequest() .setParam(PARAM_PROJECT, project.getKey()) .execute() .getInput(); assertJson(json).isSimilarTo(ws.getDef().responseExampleAsString()); assertJson(ws.getDef().responseExampleAsString()).isSimilarTo(json); }
@Test public void status_on_pull_request_with_no_issue() { ComponentDto project = db.components().insertMainBranch(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto longLivingBranch = db.components().insertProjectBranch(project, b -> b.setBranchType(BranchType.LONG)); db.components().insertProjectBranch(project, b -> b.setKey("pr-123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(longLivingBranch.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); issueIndexer.indexOnStartup(emptySet()); permissionIndexerTester.allowOnlyAnyone(project); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList().stream().map(PullRequest::getStatus)) .extracting(Status::getBugs, Status::getVulnerabilities, Status::getCodeSmells) .containsExactlyInAnyOrder(tuple(0L, 0L, 0L)); }
protected BranchDto toBranchDto(ComponentDto componentDto, Branch branch) { BranchDto dto = new BranchDto(); dto.setUuid(componentDto.uuid()); // MainBranchProjectUuid will be null if it's a main branch dto.setProjectUuid(firstNonNull(componentDto.getMainBranchProjectUuid(), componentDto.projectUuid())); dto.setBranchType(branch.getType()); // merge branch is only present if it's a short living branch dto.setMergeBranchUuid(branch.getMergeBranchUuid().orElse(null)); if (branch.getType() == BranchType.PULL_REQUEST) { dto.setKey(analysisMetadataHolder.getPullRequestKey()); DbProjectBranches.PullRequestData pullRequestData = DbProjectBranches.PullRequestData.newBuilder() .setBranch(branch.getName()) .setTitle(branch.getName()) .build(); dto.setPullRequestData(pullRequestData); } else { dto.setKey(branch.getName()); } return dto; }
@Test public void pull_request_on_removed_branch() { ComponentDto project = db.components().insertMainBranch(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid("unknown") .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey, PullRequest::hasBase, PullRequest::getIsOrphan) .containsExactlyInAnyOrder( tuple(pullRequest.getPullRequest(), false, true)); }
@Test public void does_not_fail_when_only_browse_permission_on_project() { ComponentDto project = db.components().insertMainBranch(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); userSession.logIn().addProjectPermission(UserRole.USER, project); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey) .containsExactlyInAnyOrder("123"); }
@Test public void base_branch_is_using_default_main_name_when_main_branch_has_no_name() { ComponentDto project = db.components().insertMainBranch(); userSession.logIn().addProjectPermission(UserRole.USER, project); ComponentDto pullRequest = db.components().insertProjectBranch(project, b -> b.setKey("pr-123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder() .setBranch("feature123").build())); ListWsResponse response = ws.newRequest() .setParam("project", pullRequest.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequests(0)) .extracting(PullRequest::getKey, PullRequest::getBase) .containsExactlyInAnyOrder(pullRequest.getPullRequest(), "master"); }
@Test public void does_not_fail_when_only_scan_permission_on_project() { ComponentDto project = db.components().insertMainBranch(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); userSession.logIn().addProjectPermission(SCAN_EXECUTION, project); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey) .containsExactlyInAnyOrder("123"); }
@Test public void pull_request() { ComponentDto project = db.components().insertMainBranch(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); userSession.logIn().addProjectPermission(UserRole.USER, project); ListWsResponse response = ws.newRequest() .setParam("project", project.getDbKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey, PullRequest::getBranch, PullRequest::getIsOrphan, PullRequest::hasUrl, PullRequest::hasTitle) .containsExactlyInAnyOrder(tuple("123", "feature/bar", false, false, false)); }
@Test public void does_not_fail_when_only_scan_permission_on_organization() { OrganizationDto organization = db.organizations().insert(); userSession.logIn().addPermission(OrganizationPermission.SCAN, organization); ComponentDto project = db.components().insertMainBranch(organization); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); ListWsResponse response = ws.newRequest() .setParam("project", project.getKey()) .executeProtobuf(ListWsResponse.class); assertThat(response.getPullRequestsList()) .extracting(PullRequest::getKey) .containsExactlyInAnyOrder("123"); }
@Test public void fail_when_not_having_right_permission() { ComponentDto project = db.components().insertMainBranch(); db.components().insertProjectBranch(project, b -> b.setKey("123") .setBranchType(PULL_REQUEST) .setMergeBranchUuid(project.uuid()) .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder().setBranch("feature/bar").build())); userSession.logIn().addProjectPermission(CODEVIEWER, project); expectedException.expect(ForbiddenException.class); ws.newRequest() .setParam("project", project.getDbKey()) .execute(); }