]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-21776 Fix api/rules/list sorting
authorEric Giffon <eric.giffon@sonarsource.com>
Mon, 11 Mar 2024 09:10:15 +0000 (10:10 +0100)
committersonartech <sonartech@sonarsource.com>
Mon, 11 Mar 2024 20:02:51 +0000 (20:02 +0000)
server/sonar-webserver-webapi/src/it/java/org/sonar/server/rule/ws/ListActionIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/rule/ws/ListAction.java

index d636510aded446124c3e4699f6f9e230f7eea620..9d4ca40119068ab19ffa8cb978e73c33c8658b43 100644 (file)
@@ -21,6 +21,8 @@ package org.sonar.server.rule.ws;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Comparator;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import org.junit.Rule;
@@ -73,8 +75,9 @@ public class ListActionIT {
 
   @Test
   public void execute_shouldReturnRules() {
-    db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_1)).setConfigKey(null).setName(null));
-    db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_2)).setConfigKey("I002").setName("Rule Two"));
+    List<RuleDto> rules = List.of(
+      db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_1)).setConfigKey(null).setName(null)),
+      db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_2)).setConfigKey("I002").setName("Rule Two")));
     db.getSession().commit();
 
     Rules.ListResponse listResponse = ws.newRequest()
@@ -91,6 +94,24 @@ public class ListActionIT {
     assertThat(ruleS002.getKey()).isEqualTo(RULE_KEY_2);
     assertThat(ruleS002.getInternalKey()).isEqualTo("I002");
     assertThat(ruleS002.getName()).isEqualTo("Rule Two");
+
+    assertThat(listResponse.getRulesList()).extracting(Rules.Rule::getKey).containsExactly(
+      rules.stream().sorted(Comparator.comparing(RuleDto::getUuid)).map(rule -> rule.getKey().toString()).toArray(String[]::new));
+  }
+
+  @Test
+  public void execute_whenSortingDefined_shouldReturnSortedRules() {
+    db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_1)).setCreatedAt(2_000_000L));
+    db.rules().insert(RuleTesting.newRule(RuleKey.parse(RULE_KEY_2)).setCreatedAt(1_000_000L));
+    db.getSession().commit();
+
+    Rules.ListResponse listResponse = ws.newRequest()
+      .setParam(WebService.Param.SORT, "createdAt")
+      .setParam(WebService.Param.ASCENDING, "true")
+      .executeProtobuf(Rules.ListResponse.class);
+
+    assertThat(listResponse.getRulesCount()).isEqualTo(2);
+    assertThat(listResponse.getRulesList()).extracting(Rules.Rule::getKey).containsExactly(RULE_KEY_2, RULE_KEY_1);
   }
 
   @Test
index 74328f9f81f6f9b578cb7d0dc6161d10c5ceb3d5..fd0ee7595008227ecddb0d1e3c8476ef9ad48607 100644 (file)
@@ -21,7 +21,6 @@ package org.sonar.server.rule.ws;
 
 import com.google.common.collect.Maps;
 import java.util.Date;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -81,7 +80,9 @@ public class ListAction implements RulesWsAction {
       new Change("10.4", "Add pagination"),
       new Change("10.4", String.format("Add the '%s' parameter", PARAM_AVAILABLE_SINCE)),
       new Change("10.4", String.format("Add the '%s' parameter", PARAM_QPROFILE)),
-      new Change("10.4", "Add the 'createdAt' sorting parameter"));
+      new Change("10.4", "Add the 'createdAt' sorting field"),
+      new Change("10.5", String.format("The sorting parameter '%s' no longer has a default value (was 'createdAt')",
+        WebService.Param.SORT)));
 
     action.createParam(PARAM_AVAILABLE_SINCE)
       .setDescription("Filter rules available since the given date. If no value is provided, all rules are returned. Format is yyyy-MM-dd.")
@@ -90,7 +91,7 @@ public class ListAction implements RulesWsAction {
     action.createParam(PARAM_QPROFILE)
       .setDescription("Filter rules that are activated in the given quality profile.")
       .setSince("10.4");
-    action.createSortParams(Set.of("createdAt"), "createdAt", false)
+    action.createSortParams(Set.of("createdAt"), null, false)
       .setSince("10.4");
     action.addPagingParamsSince(100, 500, "10.4");
   }
@@ -139,7 +140,7 @@ public class ListAction implements RulesWsAction {
       Pagination.forPage(wsRequest.page).andSize(wsRequest.pageSize));
     Map<String, RuleDto> rulesByUuid = Maps.uniqueIndex(dbClient.ruleDao().selectByUuids(dbSession, ruleListResult.getUuids()), RuleDto::getUuid);
     Set<String> ruleUuids = rulesByUuid.keySet();
-    List<RuleDto> rules = new LinkedList<>(rulesByUuid.values());
+    List<RuleDto> rules = ruleListResult.getUuids().stream().map(rulesByUuid::get).toList();
 
     List<String> templateRuleUuids = rules.stream()
       .map(RuleDto::getTemplateUuid)