Skip to content

Commit e98115d

Browse files
committed
Fix styling of select boxes for issue and version parameter
1 parent 2efe857 commit e98115d

File tree

5 files changed

+145
-7
lines changed

5 files changed

+145
-7
lines changed

src/main/java/hudson/plugins/jira/listissuesparameter/JiraIssueParameterDefinition.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import hudson.model.ParametersDefinitionProperty;
3030
import hudson.plugins.jira.JiraSession;
3131
import hudson.plugins.jira.JiraSite;
32+
import hudson.plugins.jira.Messages;
3233
import hudson.util.ListBoxModel;
3334
import java.io.IOException;
3435
import java.util.ArrayList;
@@ -60,7 +61,7 @@ public JiraIssueParameterDefinition(String name, String description, String jira
6061
@Override
6162
public ParameterValue createValue(StaplerRequest2 req) {
6263
String[] values = req.getParameterValues(getName());
63-
if (values == null || values.length != 1) {
64+
if (values == null || values.length != 1 || values[0].isEmpty()) {
6465
return null;
6566
}
6667

@@ -141,9 +142,12 @@ public ListBoxModel doFillValueItems(@AncestorInPath Job<?, ?> job, @QueryParame
141142
ParameterDefinition def = prop.getParameterDefinition(name);
142143
if (def instanceof JiraIssueParameterDefinition jiraIssueDef) {
143144
List<Result> issueValues = jiraIssueDef.getIssues(job);
144-
issueValues.forEach(it -> items.add(it.summary, it.key));
145+
issueValues.forEach(it -> items.add(it.key + ": " + it.summary, it.key));
145146
}
146147
}
148+
if (items.isEmpty()) {
149+
items.add(Messages.JiraIssueParameterDefinition_NoIssueMatchedSearch(), "");
150+
}
147151
}
148152
return items;
149153
}

src/main/java/hudson/plugins/jira/versionparameter/JiraVersionParameterDefinition.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
import com.atlassian.jira.rest.client.api.domain.Version;
55
import hudson.Extension;
66
import hudson.cli.CLICommand;
7-
import hudson.model.*;
7+
import hudson.model.Item;
8+
import hudson.model.Job;
9+
import hudson.model.ParameterDefinition;
10+
import hudson.model.ParameterValue;
11+
import hudson.model.ParametersDefinitionProperty;
812
import hudson.plugins.jira.JiraSession;
913
import hudson.plugins.jira.JiraSite;
14+
import hudson.plugins.jira.Messages;
1015
import hudson.util.ListBoxModel;
1116
import java.io.IOException;
1217
import java.util.List;
@@ -15,7 +20,11 @@
1520
import java.util.stream.Collectors;
1621
import net.sf.json.JSONObject;
1722
import org.jenkinsci.Symbol;
18-
import org.kohsuke.stapler.*;
23+
import org.kohsuke.stapler.AncestorInPath;
24+
import org.kohsuke.stapler.DataBoundConstructor;
25+
import org.kohsuke.stapler.QueryParameter;
26+
import org.kohsuke.stapler.Stapler;
27+
import org.kohsuke.stapler.StaplerRequest2;
1928
import org.kohsuke.stapler.interceptor.RequirePOST;
2029

2130
public class JiraVersionParameterDefinition extends ParameterDefinition {
@@ -48,7 +57,7 @@ public JiraVersionParameterDefinition(
4857
@Override
4958
public ParameterValue createValue(StaplerRequest2 req) {
5059
String[] values = req.getParameterValues(getName());
51-
if (values == null || values.length != 1) {
60+
if (values == null || values.length != 1 || values[0].isEmpty()) {
5261
return null;
5362
}
5463
return new JiraVersionParameterValue(getName(), values[0]);
@@ -187,6 +196,9 @@ public ListBoxModel doFillVersionItems(@AncestorInPath Job<?, ?> job, @QueryPara
187196
issueValues.forEach(it -> items.add(it.name));
188197
}
189198
}
199+
if (items.isEmpty()) {
200+
items.add(Messages.JiraVersionParameterDefinition_NoIssueMatchedSearch(), "");
201+
}
190202
}
191203
return items;
192204
}

src/main/resources/hudson/plugins/jira/Messages.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,5 @@ ErrorCommentingIssues=[Jira] Could not comment on some issues: {0}
4747
JiraSite.threadExecutorMinimunSize = Thread Executor Size must be at least {0} (higher values are recommended)
4848
JiraSite.timeoutMinimunValue = Connection timeout must be at least {0}
4949
JiraSite.readTimeoutMinimunValue = Read timeout must be at least {0}
50+
JiraIssueParameterDefinition.NoIssueMatchedSearch = No issues matched the search
51+
JiraVersionParameterDefinition.NoIssueMatchedSearch = No version matched the search

src/test/java/hudson/plugins/jira/listissuesparameter/JiraIssueParameterDefinitionTest.java

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static org.hamcrest.MatcherAssert.assertThat;
44
import static org.hamcrest.Matchers.hasSize;
55
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.assertNotNull;
7+
import static org.junit.jupiter.api.Assertions.assertNull;
68
import static org.mockito.ArgumentMatchers.any;
79
import static org.mockito.Mockito.verify;
810
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -11,19 +13,59 @@
1113
import com.atlassian.jira.rest.client.api.domain.Issue;
1214
import hudson.model.Item;
1315
import hudson.model.Job;
16+
import hudson.model.ParameterValue;
1417
import hudson.model.ParametersDefinitionProperty;
18+
import hudson.plugins.jira.Messages;
1519
import hudson.util.ListBoxModel;
1620
import java.util.List;
21+
import java.util.stream.Stream;
1722
import org.junit.jupiter.api.Nested;
1823
import org.junit.jupiter.api.Test;
1924
import org.junit.jupiter.api.extension.ExtendWith;
25+
import org.junit.jupiter.params.ParameterizedTest;
26+
import org.junit.jupiter.params.provider.Arguments;
27+
import org.junit.jupiter.params.provider.MethodSource;
28+
import org.junit.jupiter.params.provider.NullSource;
29+
import org.kohsuke.stapler.StaplerRequest2;
2030
import org.mockito.Mock;
2131
import org.mockito.junit.jupiter.MockitoExtension;
2232

33+
@ExtendWith(MockitoExtension.class)
2334
class JiraIssueParameterDefinitionTest {
2435

36+
private JiraIssueParameterDefinition definition =
37+
new JiraIssueParameterDefinition("PARAM_NAME", "desc", "jqlQuery");
38+
39+
static Stream<Arguments> createValueInvalidParameters() {
40+
return Stream.of(
41+
Arguments.of((Object) new String[] {}),
42+
Arguments.of((Object) new String[] {"a", "b"}),
43+
Arguments.of((Object) new String[] {""}));
44+
}
45+
46+
@ParameterizedTest
47+
@NullSource
48+
@MethodSource("createValueInvalidParameters")
49+
void shouldCreateNullParameterForInvalidValues(String[] values, @Mock StaplerRequest2 req) {
50+
when(req.getParameterValues(any())).thenReturn(values);
51+
52+
ParameterValue result = definition.createValue(req);
53+
54+
assertNull(result);
55+
}
56+
57+
@Test
58+
void shouldCreateValue(@Mock StaplerRequest2 req) {
59+
when(req.getParameterValues(any())).thenReturn(new String[] {"value"});
60+
61+
ParameterValue result = definition.createValue(req);
62+
63+
assertNotNull(result);
64+
assertEquals("PARAM_NAME", result.getName());
65+
assertEquals("value", result.getValue());
66+
}
67+
2568
@Nested
26-
@ExtendWith(MockitoExtension.class)
2769
class DescriptorImplTest {
2870

2971
private JiraIssueParameterDefinition.DescriptorImpl uut = new JiraIssueParameterDefinition.DescriptorImpl();
@@ -47,7 +89,7 @@ void shouldFillValueItems(
4789
assertThat(result, hasSize(1));
4890
ListBoxModel.Option option = result.get(0);
4991
assertEquals("JIRA-1234", option.value);
50-
assertEquals("Summary", option.name);
92+
assertEquals("JIRA-1234: Summary", option.name);
5193
verify(job).hasPermission(Item.BUILD);
5294
}
5395

@@ -59,5 +101,24 @@ void shouldNotFillValueItemsIfPermissionMissing(@Mock Job<?, ?> job) {
59101
verify(job).hasPermission(Item.BUILD);
60102
verifyNoMoreInteractions(job);
61103
}
104+
105+
@Test
106+
void shouldHaveNoSearchMatchesItemIfSearchMatchesNoItem(
107+
@Mock Job<?, ?> job,
108+
@Mock ParametersDefinitionProperty propertyDef,
109+
@Mock JiraIssueParameterDefinition paramDef,
110+
@Mock Issue issue) {
111+
when(job.hasPermission(Item.BUILD)).thenReturn(true);
112+
when(job.getProperty(ParametersDefinitionProperty.class)).thenReturn(propertyDef);
113+
when(propertyDef.getParameterDefinition("PARAM_NAME")).thenReturn(paramDef);
114+
115+
ListBoxModel result = uut.doFillValueItems(job, "PARAM_NAME");
116+
117+
assertThat(result, hasSize(1));
118+
ListBoxModel.Option option = result.get(0);
119+
assertEquals("", option.value);
120+
assertEquals(Messages.JiraIssueParameterDefinition_NoIssueMatchedSearch(), option.name);
121+
verify(job).hasPermission(Item.BUILD);
122+
}
62123
}
63124
}

src/test/java/hudson/plugins/jira/versionparameter/JiraVersionParameterDefinitionTest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,21 @@
1414
import hudson.model.ParametersDefinitionProperty;
1515
import hudson.plugins.jira.JiraSession;
1616
import hudson.plugins.jira.JiraSite;
17+
import hudson.plugins.jira.Messages;
1718
import hudson.plugins.jira.extension.ExtendedVersion;
1819
import hudson.util.ListBoxModel;
1920
import java.io.IOException;
2021
import java.util.ArrayList;
2122
import java.util.List;
23+
import java.util.stream.Stream;
2224
import org.junit.jupiter.api.BeforeEach;
2325
import org.junit.jupiter.api.Nested;
2426
import org.junit.jupiter.api.Test;
2527
import org.junit.jupiter.api.extension.ExtendWith;
28+
import org.junit.jupiter.params.ParameterizedTest;
29+
import org.junit.jupiter.params.provider.Arguments;
30+
import org.junit.jupiter.params.provider.MethodSource;
31+
import org.junit.jupiter.params.provider.NullSource;
2632
import org.kohsuke.stapler.Stapler;
2733
import org.kohsuke.stapler.StaplerRequest2;
2834
import org.mockito.Mock;
@@ -80,6 +86,41 @@ void parameterValueMethodOverrides() throws Exception {
8086
assertEquals("Jira Version 1.2.3", value.getValue());
8187
}
8288

89+
static Stream<Arguments> createValueInvalidParameters() {
90+
return Stream.of(
91+
Arguments.of((Object) new String[] {}),
92+
Arguments.of((Object) new String[] {"a", "b"}),
93+
Arguments.of((Object) new String[] {""}));
94+
}
95+
96+
@ParameterizedTest
97+
@NullSource
98+
@MethodSource("createValueInvalidParameters")
99+
void shouldCreateNullParameterForInvalidValues(String[] values) {
100+
JiraVersionParameterDefinition definition =
101+
new JiraVersionParameterDefinition("pname", "pdesc", "JIRAKEY", null, "false", "true", "true");
102+
103+
when(request2.getParameterValues(any())).thenReturn(values);
104+
105+
ParameterValue result = definition.createValue(request2);
106+
107+
assertNull(result);
108+
}
109+
110+
@Test
111+
void shouldCreateValue() {
112+
JiraVersionParameterDefinition definition =
113+
new JiraVersionParameterDefinition("pname", "pdesc", "JIRAKEY", null, "false", "true", "true");
114+
115+
when(request2.getParameterValues(any())).thenReturn(new String[] {"value"});
116+
117+
ParameterValue result = definition.createValue(request2);
118+
119+
assertNotNull(result);
120+
assertEquals("pname", result.getName());
121+
assertEquals("value", result.getValue());
122+
}
123+
83124
@Test
84125
void showReleasedVersions() {
85126
withJiraStaticMocks(() -> {
@@ -304,5 +345,23 @@ void shouldNotFillVersionsItemsIfPermissionMissing(@Mock Job<?, ?> job) {
304345
verify(job).hasPermission(Item.BUILD);
305346
verifyNoMoreInteractions(job);
306347
}
348+
349+
@Test
350+
void shouldHaveNoSearchMatchesItemIfSearchMatchesNoItem(
351+
@Mock Job<?, ?> job,
352+
@Mock ParametersDefinitionProperty propertyDef,
353+
@Mock JiraVersionParameterDefinition paramDef) {
354+
when(job.hasPermission(Item.BUILD)).thenReturn(true);
355+
when(job.getProperty(ParametersDefinitionProperty.class)).thenReturn(propertyDef);
356+
when(propertyDef.getParameterDefinition("PARAM_NAME")).thenReturn(paramDef);
357+
358+
ListBoxModel result = uut.doFillVersionItems(job, "PARAM_NAME");
359+
360+
assertThat(result, hasSize(1));
361+
ListBoxModel.Option option = result.get(0);
362+
assertEquals("", option.value);
363+
assertEquals(Messages.JiraVersionParameterDefinition_NoIssueMatchedSearch(), option.name);
364+
verify(job).hasPermission(Item.BUILD);
365+
}
307366
}
308367
}

0 commit comments

Comments
 (0)