Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add images base URL property #150

Merged
merged 3 commits into from
May 17, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
public class CommunityBranchPlugin implements Plugin, CoreExtension {

public static final String PULL_REQUEST_PROVIDER = "sonar.pullrequest.provider";
public static final String IMAGE_URL_BASE = "com.github.mc1arke.sonarqube.plugin.branch.image-url-base";
private static final String PULL_REQUEST_CATEGORY_LABEL = "Pull Request";
private static final String GITHUB_INTEGRATION_SUBCATEGORY_LABEL = "Integration With Github";
private static final String GENERAL = "General";
Expand Down Expand Up @@ -89,8 +90,13 @@ public void load(CoreExtension.Context context) {
if (SonarQubeSide.COMPUTE_ENGINE == context.getRuntime().getSonarQubeSide() ||
SonarQubeSide.SERVER == context.getRuntime().getSonarQubeSide()) {
context.addExtensions(
PropertyDefinition.builder(IMAGE_URL_BASE).category(PULL_REQUEST_CATEGORY_LABEL)
.subCategory(GENERAL).onQualifiers(Qualifiers.APP).name("Images base URL")
.description("Base URL used to load the images for the PR comments (please use this only if images are not displayed properly).")
.type(PropertyType.STRING).build(),

PropertyDefinition.builder(PULL_REQUEST_PROVIDER).category(PULL_REQUEST_CATEGORY_LABEL)
.subCategory("General").onQualifiers(Qualifiers.PROJECT).name("Provider")
.subCategory(GENERAL).onQualifiers(Qualifiers.PROJECT).name("Provider")
.type(PropertyType.SINGLE_SELECT_LIST).options("Github", "BitbucketServer", "GitlabServer").build(),

PropertyDefinition.builder(GraphqlCheckRunProvider.PULL_REQUEST_GITHUB_TOKEN)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.github.mc1arke.sonarqube.plugin.ce.pullrequest;


import com.github.mc1arke.sonarqube.plugin.CommunityBranchPlugin;
import com.github.mc1arke.sonarqube.plugin.SonarqubeCompatibility;
import org.apache.commons.lang.StringUtils;
import com.github.mc1arke.sonarqube.plugin.ce.pullrequest.markup.Document;
Expand All @@ -34,6 +35,7 @@
import org.sonar.api.ce.posttask.Project;
import org.sonar.api.ce.posttask.QualityGate;
import org.sonar.api.ce.posttask.QualityGate.EvaluationStatus;
import org.sonar.api.config.Configuration;
import org.sonar.api.issue.Issue;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Metric;
Expand Down Expand Up @@ -79,10 +81,11 @@ public class AnalysisDetails {
private final QualityGate qualityGate;
private final Analysis analysis;
private final Project project;
private final Configuration configuration;

AnalysisDetails(BranchDetails branchDetails, PostAnalysisIssueVisitor postAnalysisIssueVisitor,
QualityGate qualityGate, MeasuresHolder measuresHolder, Analysis analysis, Project project,
String publicRootURL) {
Configuration configuration, String publicRootURL) {
super();
this.publicRootURL = publicRootURL;
this.branchDetails = branchDetails;
Expand All @@ -91,6 +94,7 @@ public class AnalysisDetails {
this.qualityGate = qualityGate;
this.analysis = analysis;
this.project = project;
this.configuration = configuration;
}

public String getBranchName() {
Expand Down Expand Up @@ -132,7 +136,7 @@ public String createAnalysisSummary(FormatterFactory formatterFactory) {

List<QualityGate.Condition> failedConditions = findFailedConditions();

String baseImageUrl = getBaseImageUrl();
String baseImageUrl = configuration.get(CommunityBranchPlugin.IMAGE_URL_BASE).orElse(getBaseImageUrl());

Document document = new Document(new Paragraph((QualityGate.Status.OK == getQualityGateStatus() ?
new Image("Passed", baseImageUrl +
Expand Down Expand Up @@ -187,7 +191,7 @@ public String createAnalysisSummary(FormatterFactory formatterFactory) {
public String createAnalysisIssueSummary(PostAnalysisIssueVisitor.ComponentIssue componentIssue, FormatterFactory formatterFactory) {
final DefaultIssue issue = componentIssue.getIssue();

String baseImageUrl = getBaseImageUrl();
String baseImageUrl = configuration.get(CommunityBranchPlugin.IMAGE_URL_BASE).orElse(getBaseImageUrl());

Long effort = issue.effortInMinutes();
Node effortNode = (null == effort ? new Text("") : new Paragraph(new Text(String.format("**Duration (min):** %s", effort))));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public void finished(PostProjectAnalysisTask.ProjectAnalysis projectAnalysis) {
postAnalysisIssueVisitor, qualityGate,
new AnalysisDetails.MeasuresHolder(metricRepository, measureRepository,
treeRootHolder), analysis,
projectAnalysis.getProject(), server.getPublicRootUrl());
projectAnalysis.getProject(), configuration, server.getPublicRootUrl());

PullRequestBuildStatusDecorator pullRequestDecorator = optionalPullRequestDecorator.get();
LOGGER.info("using pull request decorator" + pullRequestDecorator.name());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void testServerSideLoad() {
final ArgumentCaptor<Object> argumentCaptor = ArgumentCaptor.forClass(Object.class);
verify(context, times(2)).addExtensions(argumentCaptor.capture(), argumentCaptor.capture());

assertEquals(22, argumentCaptor.getAllValues().size());
assertEquals(23, argumentCaptor.getAllValues().size());

assertEquals(Arrays.asList(CommunityBranchFeatureExtension.class, CommunityBranchSupportDelegate.class),
argumentCaptor.getAllValues().subList(0, 2));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package com.github.mc1arke.sonarqube.plugin.ce.pullrequest;

import com.github.mc1arke.sonarqube.plugin.CommunityBranchPlugin;
import com.github.mc1arke.sonarqube.plugin.ce.pullrequest.markup.Document;
import com.github.mc1arke.sonarqube.plugin.ce.pullrequest.markup.Formatter;
import com.github.mc1arke.sonarqube.plugin.ce.pullrequest.markup.FormatterFactory;
Expand All @@ -33,6 +34,7 @@
import org.sonar.api.ce.posttask.Analysis;
import org.sonar.api.ce.posttask.Project;
import org.sonar.api.ce.posttask.QualityGate;
import org.sonar.api.config.Configuration;
import org.sonar.api.issue.Issue;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.rules.RuleType;
Expand Down Expand Up @@ -76,10 +78,11 @@ public void testGetBranchName() {
QualityGate qualityGate = mock(QualityGate.class);
Analysis analysis = mock(Analysis.class);
Project project = mock(Project.class);
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals("branchName", testCase.getBranchName());
}
Expand All @@ -94,10 +97,11 @@ public void testGetCommitSha() {
QualityGate qualityGate = mock(QualityGate.class);
Analysis analysis = mock(Analysis.class);
Project project = mock(Project.class);
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals("commitId", testCase.getCommitSha());
}
Expand All @@ -111,10 +115,11 @@ public void testGetQualityGateStatus() {
doReturn(QualityGate.Status.ERROR).when(qualityGate).getStatus();
Analysis analysis = mock(Analysis.class);
Project project = mock(Project.class);
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals(QualityGate.Status.ERROR, testCase.getQualityGateStatus());
}
Expand All @@ -128,10 +133,11 @@ public void testGetAnalysisDate() {
Analysis analysis = mock(Analysis.class);
doReturn(new Date()).when(analysis).getDate();
Project project = mock(Project.class);
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals(analysis.getDate(), testCase.getAnalysisDate());
}
Expand All @@ -145,10 +151,11 @@ public void testGetAnalysisId() {
Analysis analysis = mock(Analysis.class);
doReturn("Analysis ID").when(analysis).getAnalysisUuid();
Project project = mock(Project.class);
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals("Analysis ID", testCase.getAnalysisId());
}
Expand All @@ -162,10 +169,11 @@ public void testGetAnalysisProjectKey() {
Analysis analysis = mock(Analysis.class);
Project project = mock(Project.class);
doReturn("Project Key").when(project).getKey();
Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, null);
project, configuration, null);

assertEquals("Project Key", testCase.getAnalysisProjectKey());
}
Expand Down Expand Up @@ -279,9 +287,11 @@ public void testCreateAnalysisSummary() {
doReturn(mock(Metric.class)).when(metricRepository).getByKey(anyString());
doReturn(metricRepository).when(measuresHolder).getMetricRepository();

Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, "http://localhost:9000");
project, configuration, "http://localhost:9000");

Formatter<Document> formatter = mock(Formatter.class);
doReturn("formatted content").when(formatter).format(any(), any());
Expand Down Expand Up @@ -386,9 +396,11 @@ public void testCreateAnalysisSummary2() {
doReturn(mock(Metric.class)).when(metricRepository).getByKey(anyString());
doReturn(metricRepository).when(measuresHolder).getMetricRepository();

Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, "http://localhost:9000");
project, configuration, "http://localhost:9000");

Formatter<Document> formatter = mock(Formatter.class);
doReturn("formatted content").when(formatter).format(any(), any());
Expand Down Expand Up @@ -487,9 +499,13 @@ public void testCreateAnalysisSummary3() {
doReturn(mock(Metric.class)).when(metricRepository).getByKey(anyString());
doReturn(metricRepository).when(measuresHolder).getMetricRepository();

Configuration configuration = mock(Configuration.class);
doReturn(Optional.of("http://host.name/path")).when(configuration)
.get(eq(CommunityBranchPlugin.IMAGE_URL_BASE));

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, "http://localhost:9000");
project, configuration, "http://localhost:9000");

Formatter<Document> formatter = mock(Formatter.class);
doReturn("formatted content").when(formatter).format(any(), any());
Expand All @@ -502,37 +518,37 @@ public void testCreateAnalysisSummary3() {
verify(formatter).format(documentArgumentCaptor.capture(), eq(formatterFactory));

Document expectedDocument = new Document(new Paragraph(
new Image("Passed", "http://localhost:9000/static/communityBranchPlugin/checks/QualityGateBadge/passed.svg?sanitize=true")),
new Image("Passed", "http://host.name/path/checks/QualityGateBadge/passed.svg?sanitize=true")),
new Text(""), new Heading(1, new Text("Analysis Details")),
new Heading(2, new Text("1 Issue")), new List(List.Style.BULLET,
new ListItem(
new Image("Bug",
"http://localhost:9000/static/communityBranchPlugin/common/bug.svg?sanitize=true"),
"http://host.name/path/common/bug.svg?sanitize=true"),
new Text(" "),
new Text(
"1 Bug")),
new ListItem(new Image(
"Vulnerability",
"http://localhost:9000/static/communityBranchPlugin/common/vulnerability.svg?sanitize=true"),
"http://host.name/path/common/vulnerability.svg?sanitize=true"),
new Text(
" "),
new Text(
"0 Vulnerabilities")),
new ListItem(new Image(
"Code Smell",
"http://localhost:9000/static/communityBranchPlugin/common/vulnerability.svg?sanitize=true"),
"http://host.name/path/common/vulnerability.svg?sanitize=true"),
new Text(
" "),
new Text(
"0 Code Smells"))),
new Heading(2, new Text("Coverage and Duplications")),
new List(List.Style.BULLET, new ListItem(
new Image("25 percent coverage",
"http://localhost:9000/static/communityBranchPlugin/checks/CoverageChart/25.svg?sanitize=true"),
"http://host.name/path/checks/CoverageChart/25.svg?sanitize=true"),
new Text(" "),
new Text("25.00% Coverage (21.78% Estimated after merge)")),
new ListItem(new Image("10 percent duplication",
"http://localhost:9000/static/communityBranchPlugin/checks/Duplications/10.svg?sanitize=true"),
"http://host.name/path/checks/Duplications/10.svg?sanitize=true"),
new Text(" "), new Text(
"10.00% Duplicated Code (21.78% Estimated after merge)"))),
new Link("http://localhost:9000/dashboard?id=Project+Key&pullRequest=5", new Text("View in SonarQube")));
Expand Down Expand Up @@ -582,9 +598,11 @@ public void testCreateAnalysisSummary4() {
doReturn(mock(Metric.class)).when(metricRepository).getByKey(anyString());
doReturn(metricRepository).when(measuresHolder).getMetricRepository();

Configuration configuration = mock(Configuration.class);

AnalysisDetails testCase =
new AnalysisDetails(branchDetails, postAnalysisIssueVisitor, qualityGate, measuresHolder, analysis,
project, "http://localhost:9000");
project, configuration, "http://localhost:9000");

Formatter<Document> formatter = mock(Formatter.class);
doReturn("formatted content").when(formatter).format(any(), any());
Expand Down Expand Up @@ -678,7 +696,7 @@ public void testCorrectPostAnalysisIssueVisitorReturned() {
AnalysisDetails analysisDetails =
new AnalysisDetails(mock(AnalysisDetails.BranchDetails.class), postAnalysisIssueVisitor,
mock(QualityGate.class), mock(AnalysisDetails.MeasuresHolder.class),
mock(Analysis.class), mock(Project.class), null);
mock(Analysis.class), mock(Project.class), mock(Configuration.class), null);
assertSame(postAnalysisIssueVisitor, analysisDetails.getPostAnalysisIssueVisitor());
}

Expand All @@ -705,7 +723,7 @@ public void testReflectiveOperationPropagated() {
AnalysisDetails testCase =
new AnalysisDetails(mock(AnalysisDetails.BranchDetails.class), mock(PostAnalysisIssueVisitor.class),
qualityGate, measuresHolder, mock(Analysis.class), mock(Project.class),
null);
mock(Configuration.class), null);
assertThatThrownBy(() -> testCase.createAnalysisSummary(mock(FormatterFactory.class)))
.hasMessage("Could not invoke getDoubleValue").isExactlyInstanceOf(IllegalStateException.class)
.hasCauseExactlyInstanceOf(InvocationTargetException.class);
Expand Down
Loading