Skip to content

Commit 4b37b0a

Browse files
committed
use Optional for null safety and add a test for null versions coming from API
1 parent dfcd178 commit 4b37b0a

File tree

2 files changed

+43
-31
lines changed

2 files changed

+43
-31
lines changed

src/main/java/hudson/plugins/jira/JiraSession.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
package hudson.plugins.jira;
22

3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Optional;
10+
import java.util.Set;
11+
import java.util.concurrent.TimeoutException;
12+
import java.util.logging.Logger;
13+
import java.util.regex.Matcher;
14+
import java.util.regex.Pattern;
15+
16+
import org.apache.commons.lang.StringUtils;
317
import static org.apache.commons.lang.StringUtils.isNotEmpty;
418

519
import com.atlassian.jira.rest.client.api.domain.BasicIssue;
@@ -11,23 +25,11 @@
1125
import com.atlassian.jira.rest.client.api.domain.Status;
1226
import com.atlassian.jira.rest.client.api.domain.Transition;
1327
import com.atlassian.jira.rest.client.api.domain.Version;
28+
1429
import edu.umd.cs.findbugs.annotations.NonNull;
1530
import edu.umd.cs.findbugs.annotations.Nullable;
1631
import hudson.plugins.jira.extension.ExtendedVersion;
1732
import hudson.plugins.jira.model.JiraIssueField;
18-
import java.util.ArrayList;
19-
import java.util.Collections;
20-
import java.util.HashMap;
21-
import java.util.HashSet;
22-
import java.util.List;
23-
import java.util.Map;
24-
import java.util.Optional;
25-
import java.util.Set;
26-
import java.util.concurrent.TimeoutException;
27-
import java.util.logging.Logger;
28-
import java.util.regex.Matcher;
29-
import java.util.regex.Pattern;
30-
import org.apache.commons.lang.StringUtils;
3133

3234
/**
3335
* Connection to Jira.
@@ -268,7 +270,7 @@ public void replaceFixVersion(String projectKey, String fromVersion, String toVe
268270
newVersions.add(newVersion);
269271

270272
Iterable<Version> issueVersions =
271-
Optional.of(issue.getFixVersions()).orElse(Collections.emptyList());
273+
Optional.ofNullable(issue.getFixVersions()).orElse(Collections.emptyList());
272274
LOGGER.fine(String.format("[%s] current versions: %s", issue.getKey(), issueVersions));
273275

274276
if (StringUtils.startsWith(fromVersion, "/") && StringUtils.endsWith(fromVersion, "/")) {
@@ -323,7 +325,7 @@ public void addFixVersion(String projectKey, String version, String query) throw
323325
LOGGER.fine("Adding version: " + newVersion.getName() + " to issue: " + issue.getKey());
324326
List<Version> fixVersions = new ArrayList<>();
325327

326-
Optional.of(issue.getFixVersions()).orElse(Collections.emptyList()).forEach(fixVersions::add);
328+
Optional.ofNullable(issue.getFixVersions()).orElse(Collections.emptyList()).forEach(fixVersions::add);
327329

328330
fixVersions.add(newVersion);
329331
service.updateIssue(issue.getKey(), fixVersions);

src/test/java/hudson/plugins/jira/JiraSessionTest.java

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,5 @@
11
package hudson.plugins.jira;
22

3-
import static org.hamcrest.MatcherAssert.assertThat;
4-
import static org.hamcrest.Matchers.equalTo;
5-
import static org.hamcrest.Matchers.hasItem;
6-
import static org.hamcrest.Matchers.hasProperty;
7-
import static org.mockito.Mockito.spy;
8-
import static org.mockito.Mockito.times;
9-
import static org.mockito.Mockito.verify;
10-
import static org.mockito.Mockito.when;
11-
12-
import com.atlassian.jira.rest.client.api.domain.Issue;
13-
import com.atlassian.jira.rest.client.api.domain.Version;
14-
import hudson.plugins.jira.extension.ExtendedVersion;
153
import java.io.IOException;
164
import java.net.URI;
175
import java.net.URISyntaxException;
@@ -20,13 +8,27 @@
208
import java.util.List;
219
import java.util.concurrent.ThreadLocalRandom;
2210
import java.util.concurrent.TimeoutException;
11+
12+
import static org.hamcrest.MatcherAssert.assertThat;
13+
import static org.hamcrest.Matchers.equalTo;
14+
import static org.hamcrest.Matchers.hasItem;
15+
import static org.hamcrest.Matchers.hasProperty;
2316
import org.junit.jupiter.api.BeforeEach;
2417
import org.junit.jupiter.api.Test;
2518
import org.junit.jupiter.api.extension.ExtendWith;
2619
import org.mockito.ArgumentCaptor;
2720
import org.mockito.Mock;
21+
import static org.mockito.Mockito.spy;
22+
import static org.mockito.Mockito.times;
23+
import static org.mockito.Mockito.verify;
24+
import static org.mockito.Mockito.when;
2825
import org.mockito.junit.jupiter.MockitoExtension;
2926

27+
import com.atlassian.jira.rest.client.api.domain.Issue;
28+
import com.atlassian.jira.rest.client.api.domain.Version;
29+
30+
import hudson.plugins.jira.extension.ExtendedVersion;
31+
3032
@ExtendWith(MockitoExtension.class)
3133
class JiraSessionTest {
3234

@@ -63,7 +65,7 @@ void replaceWithFixVersionByRegex() throws URISyntaxException, TimeoutException
6365

6466
ArgumentCaptor<String> issueKeys = ArgumentCaptor.forClass(String.class);
6567
ArgumentCaptor<List> versionList = ArgumentCaptor.forClass(List.class);
66-
verify(service, times(2)).updateIssue(issueKeys.capture(), versionList.capture());
68+
verify(service, times(issues.size())).updateIssue(issueKeys.capture(), versionList.capture());
6769

6870
// First Issue, current FixVersion replaced by new one
6971
assertThat(issueKeys.getAllValues().get(0), equalTo(issues.get(0).getKey()));
@@ -95,13 +97,14 @@ void replaceFixVersion() throws URISyntaxException, TimeoutException {
9597
ArrayList<Issue> issues = new ArrayList<>();
9698
issues.add(getIssue(Arrays.asList("v1.0"), 1L));
9799
issues.add(getIssue(Arrays.asList("v1.0", "v1.0.0", "v2.0.0"), 2L));
100+
issues.add(getIssue(null, 3L));
98101
when(service.getIssuesFromJqlSearch(QUERY, JiraSession.MAX_ISSUES)).thenReturn(issues);
99102

100103
jiraSession.replaceFixVersion(PROJECT_KEY, "v1.0", newVersion.getName(), QUERY);
101104

102105
ArgumentCaptor<String> issueKeys = ArgumentCaptor.forClass(String.class);
103106
ArgumentCaptor<List> versionList = ArgumentCaptor.forClass(List.class);
104-
verify(service, times(2)).updateIssue(issueKeys.capture(), versionList.capture());
107+
verify(service, times(issues.size())).updateIssue(issueKeys.capture(), versionList.capture());
105108

106109
// First Issue, current FixVersion replaced by new one
107110
assertThat(issueKeys.getAllValues().get(0), equalTo(issues.get(0).getKey()));
@@ -116,16 +119,23 @@ void replaceFixVersion() throws URISyntaxException, TimeoutException {
116119
assertThat(secondIssueUpdatedFixVersions, hasItem(hasProperty("name", equalTo(newVersion.getName()))));
117120
assertThat(secondIssueUpdatedFixVersions, hasItem(hasProperty("name", equalTo("v1.0.0"))));
118121
assertThat(secondIssueUpdatedFixVersions, hasItem(hasProperty("name", equalTo("v2.0.0"))));
122+
123+
// Third Issue, no FixVersion, new fixVersion added.
124+
List<Version> thirdIssueVersions = versionList.getAllValues().get(2);
125+
assertThat(thirdIssueVersions.size(), equalTo(1));
126+
assertThat(thirdIssueVersions.get(0), equalTo(newVersion));
127+
119128
}
120129

121130
private Issue getIssue(List<String> versions, long id) throws URISyntaxException {
122-
List<Version> fixVersions = new ArrayList<>();
131+
List<Version> fixVersions = null;
123132
if (versions != null) {
133+
fixVersions = new ArrayList<>();
124134
for (String fixVersion : versions) {
125135
fixVersions.add(new Version(
126136
new URI("self"), ThreadLocalRandom.current().nextLong(), fixVersion, null, false, false, null));
127137
}
128-
}
138+
}
129139

130140
return new Issue(
131141
"",

0 commit comments

Comments
 (0)