@Test public void scrollClosedByComponentUuid_does_not_return_closed_issues_without_close_date() { RuleType ruleType = randomSupportedRuleType(); OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issueWithoutCloseDate = insertNewClosedIssue(component, ruleType, t -> t.setIssueCloseDate(null)); insertToClosedDiff(issueWithoutCloseDate); IssueDto issueCloseDate = insertNewClosedIssue(component, ruleType); IssueChangeDto changeDto = insertToClosedDiff(issueCloseDate); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues).hasSize(1); IssueDto issue = resultHandler.issues.iterator().next(); assertThat(issue.getKey()).isEqualTo(issue.getKey()); assertThat(issue.getClosedChangeData()).contains(changeDto.getChangeData()); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_does_not_return_closed_issues_of_orphan_component(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issue = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issue); IssueDto issueMissingComponent = insertNewClosedIssue(component, ruleType, t -> t.setComponentUuid("does_not_exist")); insertToClosedDiff(issueMissingComponent); IssueDto issueMissingProject = insertNewClosedIssue(component, ruleType, t -> t.setProjectUuid("does_not_exist")); insertToClosedDiff(issueMissingProject); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly(tuple(issue.getKey(), issueChange.getChangeData())); }
@SafeVarargs private final IssueDto insertNewClosedIssue(ComponentDto component, RuleDefinitionDto rule, Consumer<IssueDto>... consumers) { return insertNewClosedIssue(component, rule, system2.now(), consumers); }
private IssueChangeDto insertToClosedDiff(IssueDto issueDto) { return insertToClosedDiff(issueDto, new Date()); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_returns_closed_issues_with_at_least_one_diff_to_CLOSED(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto expected = insertNewClosedIssue(component, ruleType); IssueChangeDto changeDto = insertToClosedDiff(expected); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues).hasSize(1); IssueDto issue = resultHandler.issues.iterator().next(); assertThat(issue.getKey()).isEqualTo(issue.getKey()); assertThat(issue.getClosedChangeData()).contains(changeDto.getChangeData()); }
@SafeVarargs private final IssueDto insertNewClosedIssue(ComponentDto component, RuleType ruleType, Consumer<IssueDto>... consumers) { RuleDefinitionDto rule = dbTester.rules().insert(t -> t.setType(ruleType)); return insertNewClosedIssue(component, rule, system2.now(), consumers); }
private IssueChangeDto insertToClosedDiff(IssueDto issueDto, Date date) { String[] statusesButClosed = Issue.STATUSES.stream() .filter(t -> !Issue.STATUS_CLOSED.equals(t)) .toArray(String[]::new); String previousStatus = statusesButClosed[random.nextInt(statusesButClosed.length)]; return insertToClosedDiff(issueDto, date, previousStatus, Issue.STATUS_CLOSED); }
@Test public void scrollClosedByComponentUuid_does_not_return_closed_issues_of_type_SECURITY_HOTSPOT() { RuleType ruleType = randomSupportedRuleType(); OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto securityHotspotIssue = insertNewClosedIssue(component, RuleType.SECURITY_HOTSPOT); insertToClosedDiff(securityHotspotIssue); IssueDto issue = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issue); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly(tuple(issue.getKey(), issueChange.getChangeData())); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_does_not_return_closed_issues_with_isHotspot_flag_true(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto fromHostSpotIssue = insertNewClosedIssue(component, ruleType, t -> t.setIsFromHotspot(true)); insertToClosedDiff(fromHostSpotIssue); IssueDto issue = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issue); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly(tuple(issue.getKey(), issueChange.getChangeData())); }
@Test public void scrollClosedByComponentUuid_returns_closed_issues_without_isHotspot_flag() { RuleType ruleType = randomSupportedRuleType(); OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto noHotspotFlagIssue = insertNewClosedIssue(component, ruleType); IssueChangeDto noFlagIssueChange = insertToClosedDiff(noHotspotFlagIssue); manuallySetToNullFromHotpotsColumn(noHotspotFlagIssue); IssueDto issue = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issue); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly( tuple(issue.getKey(), issueChange.getChangeData()), tuple(noHotspotFlagIssue.getKey(), noFlagIssueChange.getChangeData())); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_does_not_return_closed_issues_without_any_status_diff_to_CLOSED(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issueWithLineDiff = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issueWithLineDiff); insertNewClosedIssue(component, ruleType); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly(tuple(issueWithLineDiff.getKey(), issueChange.getChangeData())); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_does_not_return_closed_issues_of_non_existing_rule(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issueWithRule = insertNewClosedIssue(component, ruleType); IssueChangeDto issueChange = insertToClosedDiff(issueWithRule); IssueDto issueWithoutRule = insertNewClosedIssue(component, new RuleDefinitionDto().setType(ruleType).setId(-50)); insertToClosedDiff(issueWithoutRule); RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsOnly(tuple(issueWithRule.getKey(), issueChange.getChangeData())); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_does_not_return_row_for_status_change_from_close(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issue = insertNewClosedIssue(component, ruleType); Date date = new Date(); IssueChangeDto changes[] = new IssueChangeDto[] { insertToClosedDiff(issue, DateUtils.addDays(date, -10), Issue.STATUS_CLOSED, Issue.STATUS_REOPENED), insertToClosedDiff(issue, DateUtils.addDays(date, -60)), insertToClosedDiff(issue, date), insertToClosedDiff(issue, DateUtils.addDays(date, -5)) }; RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .hasSize(3) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsExactly( tuple(issue.getKey(), changes[2].getChangeData()), tuple(issue.getKey(), changes[3].getChangeData()), tuple(issue.getKey(), changes[1].getChangeData())); }
@Test @UseDataProvider("closedIssuesSupportedRuleTypes") public void scrollClosedByComponentUuid_return_one_row_per_status_diff_to_CLOSED_sorted_by_most_recent_creation_date_first(RuleType ruleType) { OrganizationDto organization = dbTester.organizations().insert(); ComponentDto component = randomComponent(organization); IssueDto issue = insertNewClosedIssue(component, ruleType); Date date = new Date(); IssueChangeDto changes[] = new IssueChangeDto[] { insertToClosedDiff(issue, DateUtils.addDays(date, -10)), insertToClosedDiff(issue, DateUtils.addDays(date, -60)), insertToClosedDiff(issue, date), insertToClosedDiff(issue, DateUtils.addDays(date, -5)) }; RecorderResultHandler resultHandler = new RecorderResultHandler(); underTest.scrollClosedByComponentUuid(component.uuid(), NO_FILTERING_ON_CLOSE_DATE, resultHandler); assertThat(resultHandler.issues) .hasSize(4) .extracting(IssueDto::getKey, t -> t.getClosedChangeData().get()) .containsExactly( tuple(issue.getKey(), changes[2].getChangeData()), tuple(issue.getKey(), changes[3].getChangeData()), tuple(issue.getKey(), changes[0].getChangeData()), tuple(issue.getKey(), changes[1].getChangeData())); }