You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FilterParserTest.java 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. package org.sonar.server.component.ws;
  21. import java.util.List;
  22. import org.junit.Rule;
  23. import org.junit.Test;
  24. import org.junit.rules.ExpectedException;
  25. import org.sonar.server.component.ws.FilterParser.Criterion;
  26. import static java.util.Arrays.asList;
  27. import static java.util.Collections.emptyList;
  28. import static org.assertj.core.api.Assertions.assertThat;
  29. import static org.assertj.core.api.Assertions.tuple;
  30. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.EQ;
  31. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.GT;
  32. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.GTE;
  33. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.IN;
  34. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.LT;
  35. import static org.sonar.server.measure.index.ProjectMeasuresQuery.Operator.LTE;
  36. public class FilterParserTest {
  37. @Rule
  38. public ExpectedException expectedException = ExpectedException.none();
  39. @Test
  40. public void parse_filter_having_operator_and_value() {
  41. List<Criterion> criterion = FilterParser.parse("ncloc > 10 and coverage <= 80");
  42. assertThat(criterion)
  43. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  44. .containsOnly(
  45. tuple("ncloc", GT, "10"),
  46. tuple("coverage", LTE, "80"));
  47. }
  48. @Test
  49. public void parse_filter_having_operator_and_value_ignores_white_spaces() {
  50. List<Criterion> criterion = FilterParser.parse(" ncloc > 10 ");
  51. assertThat(criterion)
  52. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  53. .containsOnly(
  54. tuple("ncloc", GT, "10"));
  55. }
  56. @Test
  57. public void parse_filter_having_in_operator() {
  58. List<Criterion> criterion = FilterParser.parse("ncloc in (80,90)");
  59. assertThat(criterion)
  60. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValues, Criterion::getValue)
  61. .containsOnly(
  62. tuple("ncloc", IN, asList("80", "90"), null));
  63. }
  64. @Test
  65. public void parse_filter_having_in_operator_ignores_white_spaces() {
  66. List<Criterion> criterion = FilterParser.parse(" ncloc in ( 80 , 90 ) ");
  67. assertThat(criterion)
  68. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValues, Criterion::getValue)
  69. .containsOnly(
  70. tuple("ncloc", IN, asList("80", "90"), null));
  71. }
  72. @Test
  73. public void parse_filter_having_only_key() {
  74. List<Criterion> criterion = FilterParser.parse("isFavorite");
  75. assertThat(criterion)
  76. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  77. .containsOnly(
  78. tuple("isFavorite", null, null));
  79. }
  80. @Test
  81. public void parse_filter_having_only_key_ignores_white_spaces() {
  82. List<Criterion> criterion = FilterParser.parse(" isFavorite ");
  83. assertThat(criterion)
  84. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  85. .containsOnly(
  86. tuple("isFavorite", null, null));
  87. }
  88. @Test
  89. public void parse_filter_having_different_criterion_types() {
  90. List<Criterion> criterion = FilterParser.parse(" ncloc > 10 and coverage <= 80 and isFavorite ");
  91. assertThat(criterion)
  92. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  93. .containsOnly(
  94. tuple("ncloc", GT, "10"),
  95. tuple("coverage", LTE, "80"),
  96. tuple("isFavorite", null, null));
  97. }
  98. @Test
  99. public void parse_filter_with_key_having_underscore() {
  100. List<Criterion> criterion = FilterParser.parse(" alert_status = OK");
  101. assertThat(criterion)
  102. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  103. .containsOnly(
  104. tuple("alert_status", EQ, "OK"));
  105. }
  106. @Test
  107. public void parse_filter_without_any_space_in_criteria() {
  108. List<Criterion> criterion = FilterParser.parse("ncloc>10 and coverage<=80 and tags in (java,platform)");
  109. assertThat(criterion)
  110. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue, Criterion::getValues)
  111. .containsOnly(
  112. tuple("ncloc", GT, "10", emptyList()),
  113. tuple("coverage", LTE, "80", emptyList()),
  114. tuple("tags", IN, null, asList("java", "platform")));
  115. }
  116. @Test
  117. public void parse_filter_having_all_operators() {
  118. List<Criterion> criterion = FilterParser.parse("ncloc < 10 and coverage <= 80 and debt > 50 and duplication >= 56.5 and security_rating = 1 and language in (java,js)");
  119. assertThat(criterion)
  120. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue, Criterion::getValues)
  121. .containsOnly(
  122. tuple("ncloc", LT, "10", emptyList()),
  123. tuple("coverage", LTE, "80", emptyList()),
  124. tuple("debt", GT, "50", emptyList()),
  125. tuple("duplication", GTE, "56.5", emptyList()),
  126. tuple("security_rating", EQ, "1", emptyList()),
  127. tuple("language", IN, null, asList("java", "js")));
  128. }
  129. @Test
  130. public void parse_filter_starting_and_ending_with_double_quotes() {
  131. assertThat(FilterParser.parse("q = \"Sonar Qube\""))
  132. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  133. .containsOnly(
  134. tuple("q", EQ, "Sonar Qube"));
  135. assertThat(FilterParser.parse("q = \"Sonar\"Qube\""))
  136. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  137. .containsOnly(
  138. tuple("q", EQ, "Sonar\"Qube"));
  139. assertThat(FilterParser.parse("q = Sonar\"Qube"))
  140. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  141. .containsOnly(
  142. tuple("q", EQ, "Sonar\"Qube"));
  143. assertThat(FilterParser.parse("q=\"Sonar Qube\""))
  144. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  145. .containsOnly(
  146. tuple("q", EQ, "Sonar Qube"));
  147. }
  148. @Test
  149. public void accept_empty_query() {
  150. List<Criterion> criterion = FilterParser.parse("");
  151. assertThat(criterion).isEmpty();
  152. }
  153. @Test
  154. public void accept_key_ending_by_in() {
  155. List<Criterion> criterion = FilterParser.parse("endingbyin > 10");
  156. assertThat(criterion)
  157. .extracting(Criterion::getKey, Criterion::getOperator, Criterion::getValue)
  158. .containsOnly(
  159. tuple("endingbyin", GT, "10"));
  160. }
  161. @Test
  162. public void search_is_case_insensitive() {
  163. List<Criterion> criterion = FilterParser.parse("ncloc > 10 AnD coverage <= 80 AND debt = 10 AND issues = 20");
  164. assertThat(criterion).hasSize(4);
  165. }
  166. @Test
  167. public void metric_key_with_and_string() {
  168. List<Criterion> criterion = FilterParser.parse("ncloc > 10 and operand = 5");
  169. assertThat(criterion).hasSize(2).extracting(Criterion::getKey, Criterion::getValue).containsExactly(tuple("ncloc", "10"), tuple("operand", "5"));
  170. }
  171. }