From 4f9419017c1d412b6ed8a5652f1a5069ba2485ed Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Thu, 22 May 2014 19:01:44 +0200 Subject: [PATCH] SONAR-5007 fix parameter "f" of api/rules/search --- .../sonar/server/rule2/index/RuleIndex.java | 29 +---- .../server/rule2/index/RuleNormalizer.java | 3 + .../sonar/server/rule2/ws/RuleMapping.java | 39 +++--- .../sonar/server/rule2/ws/SearchAction.java | 41 ++++--- .../org/sonar/server/rule2/ws/ShowAction.java | 31 +---- .../org/sonar/server/search/QueryOptions.java | 13 +- .../sonar/server/search/ws/BaseMapping.java | 71 ++++++----- .../sonar/server/search/ws/SearchOptions.java | 17 ++- .../server/rule2/index/RuleMappingTest.java | 39 ------ .../server/rule2/ws/RuleMappingTest.java | 116 ++++++++++++++++++ .../sonar/server/search/QueryOptionsTest.java | 3 +- .../server/search/ws/SearchOptionsTest.java | 3 +- 12 files changed, 234 insertions(+), 171 deletions(-) delete mode 100644 sonar-server/src/test/java/org/sonar/server/rule2/index/RuleMappingTest.java create mode 100644 sonar-server/src/test/java/org/sonar/server/rule2/ws/RuleMappingTest.java diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java index 5e62870815b..886bf2ec875 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java @@ -20,7 +20,6 @@ package org.sonar.server.rule2.index; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -56,32 +55,6 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; public class RuleIndex extends BaseIndex { - public static final Set PUBLIC_FIELDS = ImmutableSet.of( - RuleNormalizer.RuleField.KEY.key(), - RuleNormalizer.RuleField.NAME.key(), - RuleNormalizer.RuleField.HTML_DESCRIPTION.key(), - RuleNormalizer.RuleField.LANGUAGE.key(), - RuleNormalizer.RuleField.SEVERITY.key(), - RuleNormalizer.RuleField.STATUS.key(), - RuleNormalizer.RuleField.TAGS.key(), - RuleNormalizer.RuleField.SYSTEM_TAGS.key(), - RuleNormalizer.RuleField.CREATED_AT.key(), - RuleNormalizer.RuleField.REPOSITORY.key(), - RuleNormalizer.RuleField.PARAMS.key(), - RuleNormalizer.RuleField.TEMPLATE.key(), - RuleNormalizer.RuleField.NOTE.key(), - RuleNormalizer.RuleField.NOTE_CREATED_AT.key(), - RuleNormalizer.RuleField.NOTE_UPDATED_AT.key(), - RuleNormalizer.RuleField.NOTE_LOGIN.key(), - RuleNormalizer.RuleField.INTERNAL_KEY.key(), - RuleNormalizer.RuleField.UPDATED_AT.key(), - RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key(), - RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key(), - RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key(), - RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key(), - RuleNormalizer.RuleField.CHARACTERISTIC.key()); - - public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue, ESNode node) { super(new RuleIndexDefinition(), normalizer, workQueue, node); } @@ -264,7 +237,7 @@ public class RuleIndex extends BaseIndex { /* integrate Option's Fields */ Set fields = new HashSet(); - if (options.getFieldsToReturn() != null && !options.getFieldsToReturn().isEmpty()) { + if (!options.getFieldsToReturn().isEmpty()) { fields.addAll(options.getFieldsToReturn()); // required field fields.add(RuleNormalizer.RuleField.KEY.key()); diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java index 6c39c5292e5..e89731caec3 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java @@ -163,6 +163,9 @@ public class RuleNormalizer extends BaseNormalizer { update.put(RuleField.CHARACTERISTIC.key(), db.debtCharacteristicDao().selectById(characteristic.getParentId()).getKey()); } + } else { + update.put(RuleField.CHARACTERISTIC.key(),null); + update.put(RuleField.SUB_CHARACTERISTIC.key(),null); } String dType = null, dCoefficient = null, dOffset = null; diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/RuleMapping.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/RuleMapping.java index 72160cc04b5..d983454e380 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/RuleMapping.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/RuleMapping.java @@ -36,31 +36,34 @@ public class RuleMapping extends BaseMapping { public RuleMapping(Languages languages, MacroInterpreter macroInterpreter) { super(); - addIndexField("repo", RuleNormalizer.RuleField.REPOSITORY.key()); - addIndexField("name", RuleNormalizer.RuleField.NAME.key()); + addIndexStringField("repo", RuleNormalizer.RuleField.REPOSITORY.key()); + addIndexStringField("name", RuleNormalizer.RuleField.NAME.key()); addIndexDatetimeField("createdAt", RuleNormalizer.RuleField.CREATED_AT.key()); addField("htmlDesc", new HtmlDescField(macroInterpreter)); - addIndexField("severity", RuleNormalizer.RuleField.SEVERITY.key()); - addIndexField("status", RuleNormalizer.RuleField.STATUS.key()); - addIndexField("internalKey", RuleNormalizer.RuleField.INTERNAL_KEY.key()); + addIndexStringField("severity", RuleNormalizer.RuleField.SEVERITY.key()); + addIndexStringField("status", RuleNormalizer.RuleField.STATUS.key()); + addIndexStringField("internalKey", RuleNormalizer.RuleField.INTERNAL_KEY.key()); addIndexBooleanField("template", RuleNormalizer.RuleField.TEMPLATE.key()); addIndexArrayField("tags", RuleNormalizer.RuleField.TAGS.key()); addIndexArrayField("sysTags", RuleNormalizer.RuleField.SYSTEM_TAGS.key()); - addIndexField("debtSubChar", RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key()); - addField("debtRemFn", new IndexField("debtRemFnType", RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key())); - addField("debtRemFn", new IndexField("debtRemFnCoeff", RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key())); - addField("debtRemFn", new IndexField("debtRemFnOffset", RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key())); - addIndexField("mdNote", RuleNormalizer.RuleField.NOTE.key()); - // TODO how to require NOTE ? + addField("debtChar", new IndexStringField("debtChar", RuleNormalizer.RuleField.CHARACTERISTIC.key())); + addField("debtChar", new IndexStringField("debtSubChar", RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key())); + addField("debtRemFn", new IndexStringField("debtRemFnType", RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key())); + addField("debtRemFn", new IndexStringField("debtRemFnCoeff", RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key())); + addField("debtRemFn", new IndexStringField("debtRemFnOffset", RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key())); + addIndexStringField("mdNote", RuleNormalizer.RuleField.NOTE.key()); addField("htmlNote", new HtmlNoteField(macroInterpreter)); - addIndexField("noteLogin", RuleNormalizer.RuleField.NOTE_LOGIN.key()); - addIndexField("lang", RuleNormalizer.RuleField.LANGUAGE.key()); + addIndexStringField("noteLogin", RuleNormalizer.RuleField.NOTE_LOGIN.key()); + addIndexStringField("lang", RuleNormalizer.RuleField.LANGUAGE.key()); addField("langName", new LangNameField(languages)); - // TODO how to require field "params" ? addField("params", new ParamsField()); } - private static class ParamsField implements Field { + private static class ParamsField extends IndexField { + ParamsField() { + super(RuleNormalizer.RuleField.PARAMS.key()); + } + @Override public void write(JsonWriter json, Rule rule) { json.name("params").beginArray(); @@ -76,10 +79,11 @@ public class RuleMapping extends BaseMapping { } } - private static class LangNameField implements Field { + private static class LangNameField extends IndexField { private final Languages languages; private LangNameField(Languages languages) { + super(RuleNormalizer.RuleField.LANGUAGE.key()); this.languages = languages; } @@ -91,10 +95,11 @@ public class RuleMapping extends BaseMapping { } } - private static class HtmlNoteField implements Field { + private static class HtmlNoteField extends IndexField { private final MacroInterpreter macroInterpreter; private HtmlNoteField(MacroInterpreter macroInterpreter) { + super(RuleNormalizer.RuleField.NOTE.key()); this.macroInterpreter = macroInterpreter; } diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java index 7824a64f27e..3db1c619ca4 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java @@ -219,29 +219,36 @@ public class SearchAction implements RequestHandler { json.name(entry.getKey()); json.beginArray(); for (ActiveRule activeRule : entry.getValue()) { - json - .beginObject() - .prop("qProfile", activeRule.key().qProfile().toString()) - .prop("inherit", activeRule.inheritance().toString()) - .prop("severity", activeRule.severity()); - if (activeRule.parentKey() != null) { - json.prop("parent", activeRule.parentKey().toString()); - } - json.name("params").beginArray(); - for (Map.Entry param : activeRule.params().entrySet()) { - json - .beginObject() - .prop("key", param.getKey()) - .prop("value", param.getValue()) - .endObject(); - } - json.endArray().endObject(); + writeActiveRule(json, activeRule); } json.endArray(); } json.endObject(); } + /** + * This method is static and package protected because it's used by {@link org.sonar.server.rule2.ws.ShowAction} + */ + static void writeActiveRule(JsonWriter json, ActiveRule activeRule) { + json + .beginObject() + .prop("qProfile", activeRule.key().qProfile().toString()) + .prop("inherit", activeRule.inheritance().toString()) + .prop("severity", activeRule.severity()); + if (activeRule.parentKey() != null) { + json.prop("parent", activeRule.parentKey().toString()); + } + json.name("params").beginArray(); + for (Map.Entry param : activeRule.params().entrySet()) { + json + .beginObject() + .prop("key", param.getKey()) + .prop("value", param.getValue()) + .endObject(); + } + json.endArray().endObject(); + } + private void writeFacets(RuleResult results, JsonWriter json) { json.name("facets").beginArray(); for (Map.Entry> facet : results.getFacets().entrySet()) { diff --git a/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java b/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java index 422fc4148f6..a19a4c0fb9a 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java +++ b/sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java @@ -34,7 +34,6 @@ import org.sonar.server.rule2.RuleService; import org.sonar.server.search.BaseDoc; import java.util.List; -import java.util.Map; /** * @since 4.4 @@ -71,10 +70,8 @@ public class ShowAction implements RequestHandler { action .createParam(PARAM_ACTIVATION) .setDescription("Show rule's activations for all profiles (ActiveRules)") - .setRequired(false) .setDefaultValue("true") - .setBooleanPossibleValues() - .setExampleValue("true"); + .setBooleanPossibleValues(); } @Override @@ -87,35 +84,17 @@ public class ShowAction implements RequestHandler { JsonWriter json = response.newJsonWriter().beginObject().name("rule"); mapping.write((BaseDoc) rule, json); - /** add activeRules (or not) */ - if (request.paramAsBoolean(PARAM_ACTIVATION)) { - writeActiveRules(key, activeRuleService.findByRuleKey(key), json); + if (request.mandatoryParamAsBoolean(PARAM_ACTIVATION)) { + writeActiveRules(activeRuleService.findByRuleKey(key), json); } json.endObject().close(); } - private void writeActiveRules(RuleKey key, List activeRules, JsonWriter json) { + void writeActiveRules(List activeRules, JsonWriter json) { json.name("actives").beginArray(); for (ActiveRule activeRule : activeRules) { - json - .beginObject() - .prop("qProfile", activeRule.key().qProfile().toString()) - .prop("inherit", activeRule.inheritance().toString()) - .prop("severity", activeRule.severity()); - if (activeRule.parentKey() != null) { - json.prop("parent", activeRule.parentKey().toString()); - } - json.name("params").beginArray(); - for (Map.Entry param : activeRule.params().entrySet()) { - json - .beginObject() - .prop("key", param.getKey()) - .prop("value", param.getValue()) - .endObject(); - } - json.endArray() - .endObject(); + SearchAction.writeActiveRule(json, activeRule); } json.endArray(); diff --git a/sonar-server/src/main/java/org/sonar/server/search/QueryOptions.java b/sonar-server/src/main/java/org/sonar/server/search/QueryOptions.java index 093a2e0cb37..f2f83415b5f 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/QueryOptions.java +++ b/sonar-server/src/main/java/org/sonar/server/search/QueryOptions.java @@ -20,12 +20,11 @@ package org.sonar.server.search; import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; -import javax.annotation.CheckForNull; import javax.annotation.Nullable; import java.util.Arrays; import java.util.Collection; -import java.util.HashSet; import java.util.Set; /** @@ -44,7 +43,7 @@ public class QueryOptions { private int offset = DEFAULT_OFFSET; private int limit = DEFAULT_LIMIT; private boolean facet = DEFAULT_FACET; - private Set fieldsToReturn = new HashSet(); + private Set fieldsToReturn = Sets.newHashSet(); /** * Whether or not the search returns facets for the domain. Defaults to {@link #DEFAULT_OFFSET} @@ -103,15 +102,14 @@ public class QueryOptions { return this; } - @CheckForNull public Set getFieldsToReturn() { return fieldsToReturn; } public QueryOptions setFieldsToReturn(@Nullable Collection c) { - this.fieldsToReturn.clear(); + fieldsToReturn.clear(); if (c != null) { - this.fieldsToReturn.addAll(c); + this.fieldsToReturn = Sets.newHashSet(c); } return this; } @@ -124,7 +122,6 @@ public class QueryOptions { } public QueryOptions addFieldsToReturn(String... c) { - fieldsToReturn.addAll(Arrays.asList(c)); - return this; + return addFieldsToReturn(Arrays.asList(c)); } } diff --git a/sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java b/sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java index c058f861371..28aedaa8ff2 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java +++ b/sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java @@ -28,6 +28,7 @@ import org.sonar.server.search.IndexUtils; import org.sonar.server.search.QueryOptions; import javax.annotation.Nullable; +import java.util.Arrays; import java.util.List; import java.util.Set; @@ -77,32 +78,28 @@ public abstract class BaseMapping implements ServerComponent { json.endObject(); } - protected BaseMapping addIndexField(String key, String indexKey) { - indexFields.put(key, indexKey); - fields.put(key, new BaseMapping.IndexField(key, indexKey)); - return this; + protected BaseMapping addIndexStringField(String key, String indexKey) { + return addField(key, new IndexStringField(key, indexKey)); } protected BaseMapping addIndexBooleanField(String key, String indexKey) { - indexFields.put(key, indexKey); - fields.put(key, new BaseMapping.IndexBooleanField(key, indexKey)); - return this; + return addField(key, new IndexBooleanField(key, indexKey)); } protected BaseMapping addIndexDatetimeField(String key, String indexKey) { - indexFields.put(key, indexKey); - fields.put(key, new BaseMapping.IndexDatetimeField(key, indexKey)); - return this; + return addField(key, new IndexDatetimeField(key, indexKey)); } protected BaseMapping addIndexArrayField(String key, String indexKey) { - indexFields.put(key, indexKey); - fields.put(key, new BaseMapping.IndexArrayField(key, indexKey)); - return this; + return addField(key, new IndexArrayField(key, indexKey)); } - protected BaseMapping addField(String key, BaseMapping.Field field) { + protected BaseMapping addField(String key, Field field) { fields.put(key, field); + if (field instanceof IndexField) { + IndexField indexField = (IndexField) field; + indexFields.putAll(key, Arrays.asList(indexField.indexFields())); + } return this; } @@ -110,65 +107,77 @@ public abstract class BaseMapping implements ServerComponent { void write(JsonWriter json, D doc); } + public static abstract class IndexField implements Field { + protected final String[] indexFields; + + protected IndexField(String... indexFields) { + this.indexFields = indexFields; + } + + String[] indexFields() { + return indexFields; + } + } + /** * String field */ - public static class IndexField implements Field { - private final String key, indexKey; + public static class IndexStringField extends IndexField { + private final String key; - public IndexField(String key, String indexKey) { + public IndexStringField(String key, String indexKey) { + super(indexKey); this.key = key; - this.indexKey = indexKey; } @Override public void write(JsonWriter json, BaseDoc doc) { - Object val = doc.getField(indexKey); + Object val = doc.getField(indexFields[0]); json.prop(key, val != null ? val.toString() : null); } } - public static class IndexBooleanField implements Field { - private final String key, indexKey; + public static class IndexBooleanField extends IndexField { + private final String key; public IndexBooleanField(String key, String indexKey) { + super(indexKey); this.key = key; - this.indexKey = indexKey; } @Override public void write(JsonWriter json, BaseDoc doc) { - Boolean val = doc.getField(indexKey); + Boolean val = doc.getField(indexFields[0]); json.prop(key, val != null ? val.booleanValue() : null); } } - public static class IndexArrayField implements Field { - private final String key, indexKey; + public static class IndexArrayField extends IndexField { + private final String key; public IndexArrayField(String key, String indexKey) { + super(indexKey); this.key = key; - this.indexKey = indexKey; } @Override public void write(JsonWriter json, BaseDoc doc) { - Iterable values = doc.getField(indexKey); + Iterable values = doc.getField(indexFields[0]); json.name(key).beginArray().values(values).endArray(); } } - public static class IndexDatetimeField implements Field { - private final String key, indexKey; + public static class IndexDatetimeField extends IndexField { + private final String key; public IndexDatetimeField(String key, String indexKey) { + super(indexKey); this.key = key; - this.indexKey = indexKey; } @Override public void write(JsonWriter json, BaseDoc doc) { - String val = doc.getField(indexKey); + String val = doc.getField(indexFields[0]); if (val != null) { json.propDateTime(key, IndexUtils.parseDateTime(val)); } diff --git a/sonar-server/src/main/java/org/sonar/server/search/ws/SearchOptions.java b/sonar-server/src/main/java/org/sonar/server/search/ws/SearchOptions.java index 39115212805..ea246307e50 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/ws/SearchOptions.java +++ b/sonar-server/src/main/java/org/sonar/server/search/ws/SearchOptions.java @@ -22,6 +22,7 @@ package org.sonar.server.search.ws; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.text.JsonWriter; +import org.sonar.server.search.QueryOptions; import org.sonar.server.search.Result; import javax.annotation.CheckForNull; @@ -65,13 +66,18 @@ public class SearchOptions { this.page = page; } + /** + * The fields to be returned in JSON response. null means that + * all the fields must be returned. + */ @CheckForNull public List fields() { return fields; } - public void setFields(@Nullable List fields) { + public SearchOptions setFields(@Nullable List fields) { this.fields = fields; + return this; } public boolean hasField(String key) { @@ -87,9 +93,14 @@ public class SearchOptions { public static SearchOptions create(Request request) { SearchOptions options = new SearchOptions(); + + // both parameters have default values options.setPage(request.mandatoryParamAsInt(PARAM_PAGE)); options.setPageSize(request.mandatoryParamAsInt(PARAM_PAGE_SIZE)); + + // optional field options.setFields(request.paramAsStrings(PARAM_FIELDS)); + return options; } @@ -114,7 +125,7 @@ public class SearchOptions { action .createParam(PARAM_PAGE_SIZE) .setDescription("Page size. Must be greater than 0.") - .setExampleValue("10") - .setDefaultValue("25"); + .setExampleValue("20") + .setDefaultValue(String.valueOf(QueryOptions.DEFAULT_LIMIT)); } } diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/index/RuleMappingTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/index/RuleMappingTest.java deleted file mode 100644 index a0986074b4e..00000000000 --- a/sonar-server/src/test/java/org/sonar/server/rule2/index/RuleMappingTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.rule2.index; - -import org.junit.Test; - -import static org.fest.assertions.Assertions.assertThat; - -public class RuleMappingTest { - - @Test - public void all_rule_fields() throws Exception { - assertThat(RuleNormalizer.RuleField.ALL_KEYS).contains( - RuleNormalizer.RuleField.KEY.key(), RuleNormalizer.RuleField.REPOSITORY.key(), RuleNormalizer.RuleField.TAGS.key(), - RuleNormalizer.RuleField.CREATED_AT.key()); - } - - @Test - public void key_of_rule_field() throws Exception { - assertThat(RuleNormalizer.RuleField.INTERNAL_KEY.key()).isEqualTo("internalKey"); - } -} diff --git a/sonar-server/src/test/java/org/sonar/server/rule2/ws/RuleMappingTest.java b/sonar-server/src/test/java/org/sonar/server/rule2/ws/RuleMappingTest.java new file mode 100644 index 00000000000..adf763572e7 --- /dev/null +++ b/sonar-server/src/test/java/org/sonar/server/rule2/ws/RuleMappingTest.java @@ -0,0 +1,116 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.server.rule2.ws; + +import org.junit.Test; +import org.sonar.api.resources.Languages; +import org.sonar.api.server.ws.internal.SimpleGetRequest; +import org.sonar.server.rule2.index.RuleNormalizer; +import org.sonar.server.search.QueryOptions; +import org.sonar.server.search.ws.SearchOptions; +import org.sonar.server.text.MacroInterpreter; + +import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +public class RuleMappingTest { + + Languages languages = new Languages(); + MacroInterpreter macroInterpreter = mock(MacroInterpreter.class); + + @Test + public void toQueryOptions_load_all_fields() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).isEmpty(); + } + + @Test + public void toQueryOptions_load_only_few_simple_fields() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + request.setParam("f", "repo,name,lang"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).containsOnly( + RuleNormalizer.RuleField.REPOSITORY.key(), + RuleNormalizer.RuleField.NAME.key(), + RuleNormalizer.RuleField.LANGUAGE.key()); + } + + @Test + public void toQueryOptions_langName_requires_lang() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + request.setParam("f", "langName"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).containsOnly(RuleNormalizer.RuleField.LANGUAGE.key()); + } + + @Test + public void toQueryOptions_debt_requires_group_of_fields() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + request.setParam("f", "debtRemFn"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).containsOnly( + RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key(), + RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key(), + RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key()); + } + + @Test + public void toQueryOptions_html_note_requires_markdown_note() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + request.setParam("f", "htmlNote"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).containsOnly(RuleNormalizer.RuleField.NOTE.key()); + } + + @Test + public void toQueryOptions_debt_characteristics() throws Exception { + RuleMapping mapping = new RuleMapping(languages, macroInterpreter); + SimpleGetRequest request = new SimpleGetRequest(); + request.setParam("p", "1"); + request.setParam("ps", "10"); + request.setParam("f", "debtChar"); + QueryOptions queryOptions = mapping.newQueryOptions(SearchOptions.create(request)); + + assertThat(queryOptions.getFieldsToReturn()).containsOnly( + RuleNormalizer.RuleField.CHARACTERISTIC.key(), + RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key()); + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/search/QueryOptionsTest.java b/sonar-server/src/test/java/org/sonar/server/search/QueryOptionsTest.java index abdb378360a..bfb3e891180 100644 --- a/sonar-server/src/test/java/org/sonar/server/search/QueryOptionsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/search/QueryOptionsTest.java @@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableList; import org.junit.Test; import java.util.Arrays; +import java.util.Collections; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Fail.fail; @@ -68,7 +69,7 @@ public class QueryOptionsTest { } @Test - public void fields_to_return() throws Exception { + public void getFieldsToReturn() throws Exception { assertThat(options.getFieldsToReturn()).isEmpty(); options.setFieldsToReturn(Arrays.asList("one", "two")); diff --git a/sonar-server/src/test/java/org/sonar/server/search/ws/SearchOptionsTest.java b/sonar-server/src/test/java/org/sonar/server/search/ws/SearchOptionsTest.java index 6f1d7d5e08b..f2cbdf3a3f8 100644 --- a/sonar-server/src/test/java/org/sonar/server/search/ws/SearchOptionsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/search/ws/SearchOptionsTest.java @@ -26,6 +26,7 @@ import org.sonar.api.server.ws.RequestHandler; import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.internal.SimpleGetRequest; import org.sonar.api.utils.text.JsonWriter; +import org.sonar.server.search.QueryOptions; import org.sonar.server.search.Result; import java.io.StringWriter; @@ -142,7 +143,7 @@ public class SearchOptionsTest { assertThat(page.defaultValue()).isEqualTo("1"); WebService.Param pageSize = searchAction.param("ps"); assertThat(pageSize).isNotNull(); - assertThat(pageSize.defaultValue()).isEqualTo("25"); + assertThat(pageSize.defaultValue()).isEqualTo("" + QueryOptions.DEFAULT_LIMIT); } } -- 2.39.5