package pl.touk.sputnik.processor.pmd; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; import net.sourceforge.pmd.Report; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.RuleViolation; import org.jetbrains.annotations.NotNull; import org.junit.Test; import pl.touk.sputnik.TestEnvironment; import pl.touk.sputnik.configuration.Configuration; import pl.touk.sputnik.configuration.ConfigurationSetup; import pl.touk.sputnik.configuration.GeneralOption; import pl.touk.sputnik.review.Severity; import pl.touk.sputnik.review.Violation; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CollectorRendererTest extends TestEnvironment { private CollectorRenderer renderer; private static final String VIOLATION_DESCRIPTION = "this is bug!"; private static final String RULE_DESCRIPTION = "...and should be fixed"; private static final String EXTERNAL_INFO_URL = "www.solution.tip"; private static final String DESCRIPTION_WITH_DETAILS = Joiner.on('\n').join(VIOLATION_DESCRIPTION, RULE_DESCRIPTION, EXTERNAL_INFO_URL); @Test public void shouldReportViolationWithDetails() throws IOException { Configuration config = new ConfigurationSetup().setUp(ImmutableMap.of(GeneralOption.PMD_SHOW_VIOLATION_DETAILS.getKey(), "true")); Rule rule = createRule(RULE_DESCRIPTION, EXTERNAL_INFO_URL, RulePriority.HIGH, config); Report report = createReportWithVolation(createRuleViolation(rule, VIOLATION_DESCRIPTION, config), config); renderer.renderFileReport(report); Violation violation = renderer.getReviewResult().getViolations().get(0); assertThat(violation.getMessage()).isEqualTo(DESCRIPTION_WITH_DETAILS); assertThat(violation.getSeverity()).isEqualTo(Severity.ERROR); } @Test public void shouldReportViolationWithoutDetails() throws IOException { Configuration config = new ConfigurationSetup().setUp(ImmutableMap.of(GeneralOption.PMD_SHOW_VIOLATION_DETAILS.getKey(), "false")); Rule rule = createRule(RULE_DESCRIPTION, EXTERNAL_INFO_URL, RulePriority.MEDIUM, config); Report report = createReportWithVolation(createRuleViolation(rule, VIOLATION_DESCRIPTION, config), config); renderer.renderFileReport(report); Violation violation = renderer.getReviewResult().getViolations().get(0); assertThat(violation.getMessage()).isEqualTo(VIOLATION_DESCRIPTION); } @NotNull private Rule createRule(String ruleDescription, String externalInfoUrl, RulePriority priority, @NotNull Configuration config) { renderer = new CollectorRenderer(config); Rule rule = mock(Rule.class); when(rule.getDescription()).thenReturn(ruleDescription); when(rule.getExternalInfoUrl()).thenReturn(externalInfoUrl); when(rule.getPriority()).thenReturn(priority); return rule; } @NotNull private RuleViolation createRuleViolation(@NotNull Rule rule, String violationDescription, @NotNull Configuration config) { renderer = new CollectorRenderer(config); RuleViolation violation = mock(RuleViolation.class); when(violation.getRule()).thenReturn(rule); when(violation.getDescription()).thenReturn(violationDescription); return violation; } @NotNull private Report createReportWithVolation(@NotNull RuleViolation violation, @NotNull Configuration config) { renderer = new CollectorRenderer(config); Report report = mock(Report.class); List<RuleViolation> list = new ArrayList<RuleViolation>(); list.add(violation); when(report.iterator()).thenReturn(list.iterator()); return report; } }