Skip to content

Commit a467a09

Browse files
authored
Fix NPE when no cause can be identified (#746)
1 parent a6c8c6a commit a467a09

File tree

4 files changed

+159
-0
lines changed

4 files changed

+159
-0
lines changed

src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UpstreamCauseRunDetailsItem.java

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public class UpstreamCauseRunDetailsItem {
1616

1717
public static Optional<RunDetailsItem> get(WorkflowRun run) {
1818
CauseAction causeAction = run.getAction(CauseAction.class);
19+
if (causeAction == null) {
20+
return Optional.empty();
21+
}
1922
List<Cause> causes = causeAction.getCauses();
2023
return causes.stream()
2124
.filter(cause -> cause instanceof Cause.UpstreamCause)

src/main/java/io/jenkins/plugins/pipelinegraphview/cards/items/UserIdCauseRunDetailsItem.java

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public class UserIdCauseRunDetailsItem {
1717

1818
public static Optional<RunDetailsItem> get(WorkflowRun run) {
1919
CauseAction causeAction = run.getAction(CauseAction.class);
20+
if (causeAction == null) {
21+
return Optional.empty();
22+
}
2023
List<Cause> causes = causeAction.getCauses();
2124
return causes.stream()
2225
.filter(cause -> cause instanceof Cause.UserIdCause)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package io.jenkins.plugins.pipelinegraphview.cards.items;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import hudson.model.Cause;
7+
import hudson.model.CauseAction;
8+
import hudson.model.Result;
9+
import io.jenkins.plugins.pipelinegraphview.Messages;
10+
import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem;
11+
import io.jenkins.plugins.pipelinegraphview.utils.TestUtils;
12+
import java.util.Optional;
13+
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
14+
import org.junit.jupiter.api.BeforeAll;
15+
import org.junit.jupiter.api.BeforeEach;
16+
import org.junit.jupiter.api.Test;
17+
import org.jvnet.hudson.test.JenkinsRule;
18+
import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
19+
20+
@WithJenkins
21+
class UpstreamCauseRunDetailsItemTest {
22+
23+
private static WorkflowRun run;
24+
private static String baseUrl;
25+
26+
@BeforeAll
27+
static void beforeAll(JenkinsRule j) throws Exception {
28+
run = TestUtils.createAndRunJob(j, "simple", "singleStagePipeline.jenkinsfile", Result.SUCCESS);
29+
baseUrl = j.getURL().toString();
30+
}
31+
32+
@BeforeEach
33+
void setUp() {
34+
run.removeActions(CauseAction.class);
35+
}
36+
37+
@Test
38+
void get_noActionsOfType() {
39+
Optional<RunDetailsItem> detailsItem = UpstreamCauseRunDetailsItem.get(run);
40+
41+
assertTrue(detailsItem.isEmpty());
42+
}
43+
44+
@Test
45+
void get_noUpstreamCause() {
46+
run.addAction(new CauseAction(new Cause.UserIdCause("User Id")));
47+
48+
Optional<RunDetailsItem> detailsItem = UpstreamCauseRunDetailsItem.get(run);
49+
50+
assertTrue(detailsItem.isEmpty());
51+
}
52+
53+
@Test
54+
void get() {
55+
run.addAction(new CauseAction(new Cause.UpstreamCause(run)));
56+
57+
Optional<RunDetailsItem> detailsItem = UpstreamCauseRunDetailsItem.get(run);
58+
59+
assertTrue(detailsItem.isPresent());
60+
61+
RunDetailsItem.RunDetail userDetails = (RunDetailsItem.RunDetail) detailsItem.get();
62+
63+
assertEquals(
64+
new RunDetailsItem.ItemContent.LinkContent(baseUrl + run.getUrl(), Messages.cause_upstream("#1")),
65+
userDetails.content());
66+
assertEquals("symbol-play-circle-outline plugin-ionicons-api", userDetails.icon());
67+
}
68+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package io.jenkins.plugins.pipelinegraphview.cards.items;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import hudson.model.Cause;
7+
import hudson.model.CauseAction;
8+
import hudson.model.Result;
9+
import hudson.model.User;
10+
import io.jenkins.plugins.pipelinegraphview.Messages;
11+
import io.jenkins.plugins.pipelinegraphview.cards.RunDetailsItem;
12+
import io.jenkins.plugins.pipelinegraphview.utils.TestUtils;
13+
import java.io.IOException;
14+
import java.util.HashMap;
15+
import java.util.Optional;
16+
import org.jenkinsci.plugins.workflow.job.WorkflowRun;
17+
import org.junit.jupiter.api.BeforeAll;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
20+
import org.jvnet.hudson.test.JenkinsRule;
21+
import org.jvnet.hudson.test.junit.jupiter.WithJenkins;
22+
23+
@WithJenkins
24+
class UserIdCauseRunDetailsItemTest {
25+
26+
private static WorkflowRun run;
27+
28+
@BeforeAll
29+
static void beforeAll(JenkinsRule j) throws Exception {
30+
run = TestUtils.createAndRunJob(j, "simple", "singleStagePipeline.jenkinsfile", Result.SUCCESS);
31+
}
32+
33+
@BeforeEach
34+
void setUp() {
35+
run.removeActions(CauseAction.class);
36+
User.getAll().forEach(user -> {
37+
try {
38+
user.delete();
39+
} catch (IOException e) {
40+
throw new RuntimeException(e);
41+
}
42+
});
43+
}
44+
45+
@Test
46+
void get_noActionsOfType() {
47+
Optional<RunDetailsItem> detailsItem = UserIdCauseRunDetailsItem.get(run);
48+
49+
assertTrue(detailsItem.isEmpty());
50+
}
51+
52+
@Test
53+
void get_noUserIdCause() {
54+
run.addAction(new CauseAction(new Cause.UpstreamCause(run)));
55+
56+
Optional<RunDetailsItem> detailsItem = UserIdCauseRunDetailsItem.get(run);
57+
58+
assertTrue(detailsItem.isEmpty());
59+
}
60+
61+
@Test
62+
void get_userNotFound() {
63+
run.addAction(new CauseAction(new Cause.UserIdCause("User Id")));
64+
65+
Optional<RunDetailsItem> detailsItem = UserIdCauseRunDetailsItem.get(run);
66+
67+
assertTrue(detailsItem.isEmpty());
68+
}
69+
70+
@Test
71+
void get() {
72+
run.addAction(new CauseAction(new Cause.UserIdCause("User Id")));
73+
User.get("User Id", true, new HashMap<>());
74+
75+
Optional<RunDetailsItem> detailsItem = UserIdCauseRunDetailsItem.get(run);
76+
77+
assertTrue(detailsItem.isPresent());
78+
79+
RunDetailsItem.RunDetail userDetails = (RunDetailsItem.RunDetail) detailsItem.get();
80+
81+
assertEquals(
82+
new RunDetailsItem.ItemContent.PlainContent(Messages.cause_user("User Id")), userDetails.content());
83+
assertEquals("symbol-person-outline plugin-ionicons-api", userDetails.icon());
84+
}
85+
}

0 commit comments

Comments
 (0)