*/
package org.sonar.api.issue;
-import com.google.common.collect.Lists;
import org.junit.Test;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.Severity;
import java.util.Arrays;
import java.util.Date;
+import java.util.List;
+import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
import static org.fest.assertions.Fail.fail;
@Test
public void should_build_query() throws Exception {
IssueQuery query = IssueQuery.builder()
- .issueKeys(Lists.newArrayList("ABCDE"))
- .severities(Lists.newArrayList(Severity.BLOCKER))
- .statuses(Lists.newArrayList(Issue.STATUS_RESOLVED))
- .resolutions(Lists.newArrayList(Issue.RESOLUTION_FALSE_POSITIVE))
- .components(Lists.newArrayList("org/struts/Action.java"))
- .componentRoots(Lists.newArrayList("org.struts:core"))
- .rules(Lists.newArrayList(RuleKey.of("squid", "AvoidCycle")))
- .actionPlans(Lists.newArrayList("AP1", "AP2"))
- .reporters(Lists.newArrayList("crunky"))
- .assignees(Lists.newArrayList("gargantua"))
+ .issueKeys(newArrayList("ABCDE"))
+ .severities(newArrayList(Severity.BLOCKER))
+ .statuses(newArrayList(Issue.STATUS_RESOLVED))
+ .resolutions(newArrayList(Issue.RESOLUTION_FALSE_POSITIVE))
+ .components(newArrayList("org/struts/Action.java"))
+ .componentRoots(newArrayList("org.struts:core"))
+ .rules(newArrayList(RuleKey.of("squid", "AvoidCycle")))
+ .actionPlans(newArrayList("AP1", "AP2"))
+ .reporters(newArrayList("crunky"))
+ .assignees(newArrayList("gargantua"))
.assigned(true)
.createdAfter(new Date())
.createdBefore(new Date())
@Test
public void should_build_query_without_dates() throws Exception {
IssueQuery query = IssueQuery.builder()
- .issueKeys(Lists.newArrayList("ABCDE"))
+ .issueKeys(newArrayList("ABCDE"))
.build();
assertThat(query.issueKeys()).containsOnly("ABCDE");
}
}
+ @Test
+ public void number_of_issue_keys_should_be_limited() throws Exception {
+ List<String> issueKeys = newArrayList();
+ for (int i=0; i<IssueQuery.MAX_ISSUE_KEYS; i++) {
+ issueKeys.add("issue-key-"+ i);
+ }
+ try {
+ IssueQuery.builder()
+ .issueKeys(issueKeys)
+ .build();
+ fail();
+ } catch (Exception e) {
+ assertThat(e).hasMessage("Number of issue keys must be less than 500 (got 500)").isInstanceOf(IllegalArgumentException.class);
+ }
+ }
+
@Test
public void should_accept_null_sort() throws Exception {
IssueQuery query = IssueQuery.builder().sort(null).build();
package org.sonar.server.issue;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Predicate;
import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.sonar.server.util.RubyUtils;
+import javax.annotation.Nullable;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Maps.newHashMap;
/**
}
private void parse(Map<String, Object> props, String comment) {
- this.issues = RubyUtils.toStrings(props.get("issues"));
+ this.issues = sanitizeList(RubyUtils.toStrings(props.get("issues")));
if (issues == null || issues.isEmpty()) {
throw new IllegalArgumentException("Issues must not be empty");
}
- actions = RubyUtils.toStrings(props.get("actions"));
+ actions = sanitizeList(RubyUtils.toStrings(props.get("actions")));
if (actions == null || actions.isEmpty()) {
throw new IllegalArgumentException("At least one action must be provided");
}
}
}
+ private List<String> sanitizeList(List<String> list){
+ if (list == null || list.isEmpty()){
+ return Collections.emptyList();
+ }
+ return newArrayList(Iterables.filter(list, new Predicate<String>() {
+ @Override
+ public boolean apply(@Nullable String input) {
+ return !Strings.isNullOrEmpty(input);
+ }
+ }));
+ }
+
public List<String> issues() {
return issues;
}
<form id="bulk-change-form" method="post" action="<%= ApplicationController.root_context -%>/issues/bulk_change">
<input type="hidden" name="issues" value="<%= @issues.join(',') -%>">
<input type="hidden" name="criteria_params" value="<%= @criteria_params.to_query -%>">
- <input type="hidden" name="actions[]" id="bulk-change-transition-action" value="">
+ <input type="hidden" name="actions[]" id="bulk-change-transition-action">
<fieldset>
<div class="modal-head">
<h2><%= message('issue_filter.bulk_change.form.title', {:params => @issues.size.to_s}) -%></h2>
assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
}
+ @Test
+ public void should_remove_empty_actions() {
+ Map<String, Object> params = newHashMap();
+ params.put("issues", newArrayList("ABCD", "EFGH"));
+ params.put("actions", newArrayList("do_transition", "", null));
+ params.put("do_transition.transition", "confirm");
+
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ assertThat(issueBulkChangeQuery.actions()).containsOnly("do_transition");
+ assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
+ }
+
+ @Test
+ public void should_remove_empty_issues() {
+ Map<String, Object> params = newHashMap();
+ params.put("issues", newArrayList("ABCD", "EFGH", "", null));
+ params.put("actions", newArrayList("do_transition"));
+ params.put("do_transition.transition", "confirm");
+
+ IssueBulkChangeQuery issueBulkChangeQuery = new IssueBulkChangeQuery(params);
+ assertThat(issueBulkChangeQuery.actions()).containsOnly("do_transition");
+ assertThat(issueBulkChangeQuery.issues()).containsOnly("ABCD", "EFGH");
+ }
+
@Test
public void should_create_query_with_comment() {
Map<String, Object> params = newHashMap();