]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5007 fix parameter "f" of api/rules/search
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 22 May 2014 17:01:44 +0000 (19:01 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Thu, 22 May 2014 17:02:17 +0000 (19:02 +0200)
12 files changed:
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/RuleMapping.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/ShowAction.java
sonar-server/src/main/java/org/sonar/server/search/QueryOptions.java
sonar-server/src/main/java/org/sonar/server/search/ws/BaseMapping.java
sonar-server/src/main/java/org/sonar/server/search/ws/SearchOptions.java
sonar-server/src/test/java/org/sonar/server/rule2/index/RuleMappingTest.java [deleted file]
sonar-server/src/test/java/org/sonar/server/rule2/ws/RuleMappingTest.java [new file with mode: 0644]
sonar-server/src/test/java/org/sonar/server/search/QueryOptionsTest.java
sonar-server/src/test/java/org/sonar/server/search/ws/SearchOptionsTest.java

index 5e62870815b88ad9567df0ed2f053cab7cf9cbbc..886bf2ec8757a9431f22e2c2726dbd91caeec528 100644 (file)
@@ -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<Rule, RuleDto, RuleKey> {
 
-  public static final Set<String> 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<Rule, RuleDto, RuleKey> {
 
     /* integrate Option's Fields */
     Set<String> fields = new HashSet<String>();
-    if (options.getFieldsToReturn() != null && !options.getFieldsToReturn().isEmpty()) {
+    if (!options.getFieldsToReturn().isEmpty()) {
       fields.addAll(options.getFieldsToReturn());
       // required field
       fields.add(RuleNormalizer.RuleField.KEY.key());
index 6c39c5292e50923eb09494e097809360d9a3722d..e89731caec3eaa3713579a78a572922167e8d86b 100644 (file)
@@ -163,6 +163,9 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
         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;
index 72160cc04b53101245673ac5a36b5a26c84d6c55..d983454e38022c6e1411acd693b931d0230a7838 100644 (file)
@@ -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<Rule> {
+  private static class ParamsField extends IndexField<Rule> {
+    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<Rule> {
+  private static class LangNameField extends IndexField<Rule> {
     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<Rule> {
+  private static class HtmlNoteField extends IndexField<Rule> {
     private final MacroInterpreter macroInterpreter;
 
     private HtmlNoteField(MacroInterpreter macroInterpreter) {
+      super(RuleNormalizer.RuleField.NOTE.key());
       this.macroInterpreter = macroInterpreter;
     }
 
index 7824a64f27e6f7e91652ac3304c57e574034d920..3db1c619ca401c2bf02aa919a6ce16c69cce8e9e 100644 (file)
@@ -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<String, String> 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<String, String> 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<String, Collection<FacetValue>> facet : results.getFacets().entrySet()) {
index 422fc4148f6323c565afe2c02dbb6b0241d00656..a19a4c0fb9aca45670b982b90013e05815c6075b 100644 (file)
@@ -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<ActiveRule> activeRules, JsonWriter json) {
+  void writeActiveRules(List<ActiveRule> 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<String, String> param : activeRule.params().entrySet()) {
-        json
-          .beginObject()
-          .prop("key", param.getKey())
-          .prop("value", param.getValue())
-          .endObject();
-      }
-      json.endArray()
-        .endObject();
+      SearchAction.writeActiveRule(json, activeRule);
     }
     json.endArray();
 
index 093a2e0cb375877bad352ff240f87cdbc6021438..f2f83415b5fc01ad04309284d69ea431e253e8e3 100644 (file)
 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<String> fieldsToReturn = new HashSet<String>();
+  private Set<String> 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<String> getFieldsToReturn() {
     return fieldsToReturn;
   }
 
   public QueryOptions setFieldsToReturn(@Nullable Collection<String> 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));
   }
 }
index c058f861371f73dfbfdf1ff57701cc6020de6633..28aedaa8ff2027e88d7802c2e1a19bebd0c4c949 100644 (file)
@@ -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<D> implements Field<D> {
+    protected final String[] indexFields;
+
+    protected IndexField(String... indexFields) {
+      this.indexFields = indexFields;
+    }
+
+    String[] indexFields() {
+      return indexFields;
+    }
+  }
+
   /**
    * String field
    */
-  public static class IndexField implements Field<BaseDoc> {
-    private final String key, indexKey;
+  public static class IndexStringField extends IndexField<BaseDoc> {
+    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<BaseDoc> {
-    private final String key, indexKey;
+  public static class IndexBooleanField extends IndexField<BaseDoc> {
+    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<BaseDoc> {
-    private final String key, indexKey;
+  public static class IndexArrayField extends IndexField<BaseDoc> {
+    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<String> values = doc.getField(indexKey);
+      Iterable<String> values = doc.getField(indexFields[0]);
       json.name(key).beginArray().values(values).endArray();
     }
   }
 
-  public static class IndexDatetimeField implements Field<BaseDoc> {
-    private final String key, indexKey;
+  public static class IndexDatetimeField extends IndexField<BaseDoc> {
+    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));
       }
index 391152128050efa5f0ad45456c7a245756c041eb..ea246307e506fc89daa1b9add357ee103c16235a 100644 (file)
@@ -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. <code>null</code> means that
+   * all the fields must be returned.
+   */
   @CheckForNull
   public List<String> fields() {
     return fields;
   }
 
-  public void setFields(@Nullable List<String> fields) {
+  public SearchOptions setFields(@Nullable List<String> 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 (file)
index a098607..0000000
+++ /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 (file)
index 0000000..adf7635
--- /dev/null
@@ -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());
+  }
+}
index abdb378360adb3db05346db60def74d3fa2a1c7b..bfb3e8911807f0813728a9aff1134bf4dee1a6de 100644 (file)
@@ -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"));
index 6f1d7d5e08b141b59a96dca3e3dfef0e68ec747c..f2cbdf3a3f882d4d682c2e27904ab752ffcd6288 100644 (file)
@@ -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);
 
   }
 }