@Test public void add_does_not_count_ruleKey_if_null_neither_globally_nor_per_assignee() { String assignee = randomAlphanumeric(10); underTest.add(new DefaultIssue().setType(randomRuleTypeExceptHotspot).setRuleKey(null).setAssigneeUuid(assignee).setNew(new Random().nextBoolean())); DistributedMetricStatsInt globalDistribution = underTest.globalStatistics().getDistributedMetricStats(Metric.RULE); DistributedMetricStatsInt assigneeDistribution = underTest.getAssigneesStatistics().get(assignee).getDistributedMetricStats(Metric.RULE); Stream.of(globalDistribution, assigneeDistribution) .forEach(distribution -> { assertThat(distribution.getTotal()).isEqualTo(0); assertThat(distribution.getForLabel(null).isPresent()).isFalse(); }); }
private DefaultIssue createIssue(int line, RuleKey ruleKey) { DefaultIssue issue = new DefaultIssue() .setRuleKey(ruleKey) .setLine(line) .setMessage("msg" + line); return issue; }
@Test public void initNewOpenIssue() { DefaultIssue issue = new DefaultIssue() .setRuleKey(XOO_X1); when(debtCalculator.calculate(issue)).thenReturn(DEFAULT_DURATION); underTest.initNewOpenIssue(issue); assertThat(issue.key()).isNotNull(); assertThat(issue.creationDate()).isNotNull(); assertThat(issue.updateDate()).isNotNull(); assertThat(issue.status()).isEqualTo(STATUS_OPEN); assertThat(issue.effort()).isEqualTo(DEFAULT_DURATION); assertThat(issue.isNew()).isTrue(); assertThat(issue.isCopied()).isFalse(); assertThat(issue.isFromHotspot()).isFalse(); }
@Test public void filter_exclude_issues_on_common_rule() { RuleKey ruleKey = RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "InsufficientCoverage"); markRuleAsActive(ruleKey); when(issueFilter.accept(any(), eq(FILE))).thenReturn(false); when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); DefaultIssue ceIssue = new DefaultIssue() .setRuleKey(ruleKey) .setMessage("not enough coverage") .setGap(10.0); when(commonRuleEngine.process(FILE)).thenReturn(singletonList(ceIssue)); Input<DefaultIssue> input = underTest.create(FILE); assertThat(input.getIssues()).isEmpty(); }
@Test public void add_counts_issue_per_ruleKey_off_leak_globally_and_per_assignee() { String repository = randomAlphanumeric(3); List<String> ruleKeys = IntStream.range(0, 1 + new Random().nextInt(10)).mapToObj(i -> randomAlphabetic(3)).collect(Collectors.toList()); String assignee = randomAlphanumeric(10); ruleKeys.stream() .map(ruleKey -> new DefaultIssue().setType(randomRuleTypeExceptHotspot).setRuleKey(RuleKey.of(repository, ruleKey)).setAssigneeUuid(assignee).setNew(false)) .forEach(underTest::add); DistributedMetricStatsInt globalDistribution = underTest.globalStatistics().getDistributedMetricStats(Metric.RULE); DistributedMetricStatsInt assigneeDistribution = underTest.getAssigneesStatistics().get(assignee).getDistributedMetricStats(Metric.RULE); Stream.of(globalDistribution, assigneeDistribution) .forEach(distribution -> ruleKeys.forEach(ruleKey -> assertStats(distribution, RuleKey.of(repository, ruleKey).toString(), 0, 1, 1))); }
private static DefaultIssue createIssue(@Nullable String resolution, String status, String severity, RuleType ruleType, long creationDate) { return new DefaultIssue() .setResolution(resolution).setStatus(status) .setSeverity(severity).setRuleKey(RuleTesting.XOO_X1) .setType(ruleType) .setCreationDate(new Date(creationDate)); }
@Test public void add_counts_issue_per_ruleKey_on_leak_globally_and_per_assignee() { String repository = randomAlphanumeric(3); List<String> ruleKeys = IntStream.range(0, 1 + new Random().nextInt(10)).mapToObj(i -> randomAlphabetic(3)).collect(Collectors.toList()); String assignee = randomAlphanumeric(10); ruleKeys.stream() .map(ruleKey -> new DefaultIssue().setType(randomRuleTypeExceptHotspot).setRuleKey(RuleKey.of(repository, ruleKey)).setAssigneeUuid(assignee).setNew(true)) .forEach(underTest::add); DistributedMetricStatsInt globalDistribution = underTest.globalStatistics().getDistributedMetricStats(Metric.RULE); NewIssuesStatistics.Stats stats = underTest.getAssigneesStatistics().get(assignee); DistributedMetricStatsInt assigneeDistribution = stats.getDistributedMetricStats(Metric.RULE); Stream.of(globalDistribution, assigneeDistribution) .forEach(distribution -> ruleKeys.forEach(ruleKey -> assertStats(distribution, RuleKey.of(repository, ruleKey).toString(), 1, 0, 1))); }
@Test public void load_issues_of_compute_engine_common_rules() { RuleKey ruleKey = RuleKey.of(CommonRuleKeys.commonRepositoryForLang("java"), "InsufficientCoverage"); markRuleAsActive(ruleKey); when(issueFilter.accept(any(), eq(FILE))).thenReturn(true); when(sourceLinesHash.getLineHashesMatchingDBVersion(FILE)).thenReturn(Collections.singletonList("line")); DefaultIssue ceIssue = new DefaultIssue() .setRuleKey(ruleKey) .setMessage("not enough coverage") .setGap(10.0); when(commonRuleEngine.process(FILE)).thenReturn(singletonList(ceIssue)); Input<DefaultIssue> input = underTest.create(FILE); assertThat(input.getIssues()).containsOnly(ceIssue); assertInitializedIssue(input.getIssues().iterator().next()); }
@Test public void initNewOpenHotspot() { rule.setType(RuleType.SECURITY_HOTSPOT); DefaultIssue issue = new DefaultIssue() .setRuleKey(XOO_X1); when(debtCalculator.calculate(issue)).thenReturn(DEFAULT_DURATION); underTest.initNewOpenIssue(issue); assertThat(issue.key()).isNotNull(); assertThat(issue.creationDate()).isNotNull(); assertThat(issue.updateDate()).isNotNull(); assertThat(issue.status()).isEqualTo(STATUS_OPEN); assertThat(issue.effort()).isEqualTo(DEFAULT_DURATION); assertThat(issue.isNew()).isTrue(); assertThat(issue.isCopied()).isFalse(); assertThat(issue.isFromHotspot()).isTrue(); }
@Test public void list_no_out_transition_from_status_closed() { workflow.start(); DefaultIssue issue = new DefaultIssue().setStatus(STATUS_CLOSED).setRuleKey(RuleKey.of("java", "R1 ")); List<Transition> transitions = workflow.outTransitions(issue); assertThat(transitions).isEmpty(); }
@Test public void no_debt_if_function_is_not_defined() { DefaultIssue issue = new DefaultIssue().setRuleKey(rule.getKey()); assertThat(underTest.calculate(issue)).isNull(); }
@Test public void wont_fix() { DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setStatus(STATUS_OPEN) .setRuleKey(RuleKey.of("squid", "AvoidCycle")) .setAssigneeUuid("morgan"); workflow.start(); workflow.doManualTransition(issue, DefaultTransitions.WONT_FIX, IssueChangeContext.createScan(new Date())); assertThat(issue.resolution()).isEqualTo(RESOLUTION_WONT_FIX); assertThat(issue.status()).isEqualTo(STATUS_RESOLVED); // should remove assignee assertThat(issue.assignee()).isNull(); }
@Test public void no_debt_if_no_sqale_characteristic() { rule.setFunction(null); DefaultIssue issue = new DefaultIssue().setRuleKey(rule.getKey()); assertThat(underTest.calculate(issue)).isNull(); }
@Test public void flag_as_false_positive() { DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setStatus(STATUS_OPEN) .setRuleKey(RuleKey.of("squid", "AvoidCycle")) .setAssigneeUuid("morgan"); workflow.start(); workflow.doManualTransition(issue, DefaultTransitions.FALSE_POSITIVE, IssueChangeContext.createScan(new Date())); assertThat(issue.resolution()).isEqualTo(RESOLUTION_FALSE_POSITIVE); assertThat(issue.status()).isEqualTo(STATUS_RESOLVED); // should remove assignee assertThat(issue.assignee()).isNull(); }
@Test public void should_get_all_issues() { DefaultIssue issueOnModule = new DefaultIssue().setKey("1").setRuleKey(SQUID_RULE_KEY).setComponentKey("org.apache:struts-core"); DefaultIssue issueInModule = new DefaultIssue().setKey("2").setRuleKey(SQUID_RULE_KEY).setComponentKey("org.apache:struts-core:Action"); DefaultIssue resolvedIssueInModule = new DefaultIssue().setKey("3").setRuleKey(SQUID_RULE_KEY).setComponentKey("org.apache:struts-core:Action") .setResolution(Issue.RESOLUTION_FIXED); DefaultIssue issueOnRoot = new DefaultIssue().setKey("4").setRuleKey(SQUID_RULE_KEY).setSeverity(Severity.CRITICAL).setComponentKey("org.apache:struts"); DefaultIssue issueInRoot = new DefaultIssue().setKey("5").setRuleKey(SQUID_RULE_KEY).setSeverity(Severity.CRITICAL).setComponentKey("org.apache:struts:FileInRoot"); when(cache.all()).thenReturn(Arrays.<TrackedIssue>asList( toTrackedIssue(issueOnRoot), toTrackedIssue(issueInRoot), toTrackedIssue(issueOnModule), toTrackedIssue(issueInModule), toTrackedIssue(resolvedIssueInModule) )); // unresolved issues List<Issue> issues = Lists.newArrayList(projectIssues.issues()); assertThat(issues).containsOnly(issueOnRoot, issueInRoot, issueInModule, issueOnModule); List<Issue> resolvedIssues = Lists.newArrayList(projectIssues.resolvedIssues()); assertThat(resolvedIssues).containsOnly(resolvedIssueInModule); }
@Test public void mergeExistingOpenIssue_with_manual_severity() { DefaultIssue raw = new DefaultIssue() .setNew(true) .setKey("RAW_KEY") .setRuleKey(XOO_X1); DefaultIssue base = new DefaultIssue() .setKey("BASE_KEY") .setResolution(RESOLUTION_FIXED) .setStatus(STATUS_CLOSED) .setSeverity(BLOCKER) .setManualSeverity(true); underTest.mergeExistingOpenIssue(raw, base); assertThat(raw.manualSeverity()).isTrue(); assertThat(raw.severity()).isEqualTo(BLOCKER); verify(updater, never()).setPastSeverity(raw, BLOCKER, issueChangeContext); }
private static DefaultIssue createIssue(String key, RuleKey ruleKey, String status, @Nullable String resolution, Date creationDate) { DefaultIssue issue = new DefaultIssue(); issue.setKey(key); issue.setRuleKey(ruleKey); issue.setMessage("msg"); issue.setLine(1); issue.setStatus(status); issue.setResolution(resolution); issue.setCreationDate(creationDate); issue.setChecksum("checksum"); return issue; }
@Test public void automatically_close_resolved_issue() { workflow.start(); DefaultIssue issue = new DefaultIssue() .setKey("ABCDE") .setRuleKey(RuleKey.of("js", "S001")) .setResolution(RESOLUTION_FIXED) .setStatus(STATUS_RESOLVED) .setNew(false) .setBeingClosed(true); Date now = new Date(); workflow.doAutomaticTransition(issue, IssueChangeContext.createScan(now)); assertThat(issue.resolution()).isEqualTo(RESOLUTION_FIXED); assertThat(issue.status()).isEqualTo(STATUS_CLOSED); assertThat(issue.closeDate()).isNotNull(); assertThat(issue.updateDate()).isEqualTo(DateUtils.truncate(now, Calendar.SECOND)); }
@Test public void mergeExistingOpenIssue_with_base_changed() { DefaultIssue raw = new DefaultIssue() .setNew(true) .setKey("RAW_KEY") .setRuleKey(XOO_X1); DefaultIssue base = new DefaultIssue() .setChanged(true) .setKey("BASE_KEY") .setResolution(RESOLUTION_FALSE_POSITIVE) .setStatus(STATUS_RESOLVED); underTest.mergeExistingOpenIssue(raw, base); assertThat(raw.isChanged()).isTrue(); }
@Test public void mergeExistingOpenIssue_with_attributes() { DefaultIssue raw = new DefaultIssue() .setNew(true) .setKey("RAW_KEY") .setRuleKey(XOO_X1); DefaultIssue base = new DefaultIssue() .setKey("BASE_KEY") .setResolution(RESOLUTION_FIXED) .setStatus(STATUS_CLOSED) .setSeverity(BLOCKER) .setAttributes(ImmutableMap.of("JIRA", "SONAR-01")); underTest.mergeExistingOpenIssue(raw, base); assertThat(raw.attributes()).containsEntry("JIRA", "SONAR-01"); } }