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.

QualityProfileExportDaoTest.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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.db.qualityprofile;
  21. import com.google.common.collect.Sets;
  22. import java.util.Collection;
  23. import java.util.List;
  24. import java.util.Optional;
  25. import java.util.stream.Collectors;
  26. import java.util.stream.IntStream;
  27. import java.util.stream.Stream;
  28. import javax.annotation.Nullable;
  29. import org.junit.Assert;
  30. import org.junit.Rule;
  31. import org.junit.Test;
  32. import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
  33. import org.sonar.api.rule.RuleStatus;
  34. import org.sonar.api.rules.RuleType;
  35. import org.sonar.db.DbSession;
  36. import org.sonar.db.DbTester;
  37. import org.sonar.db.rule.RuleDefinitionDto;
  38. import org.sonar.db.rule.RuleMetadataDto;
  39. import org.sonar.db.rule.RuleParamDto;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. public class QualityProfileExportDaoTest {
  42. @Rule
  43. public DbTester db = DbTester.create(new AlwaysIncreasingSystem2());
  44. private DbSession dbSession = db.getSession();
  45. private QualityProfileExportDao underTest = db.getDbClient().qualityProfileExportDao();
  46. @Test
  47. public void selectRulesByProfile_ready_rules_only() {
  48. String language = "java";
  49. RuleDefinitionDto rule1 = createRule(language);
  50. RuleDefinitionDto rule2 = createRule(language);
  51. RuleDefinitionDto rule3 = createRule(language);
  52. createRule(language, RuleStatus.REMOVED);
  53. QProfileDto profile = createProfile(language);
  54. activate(profile, rule1, rule2, rule3);
  55. List<ExportRuleDto> results = underTest.selectRulesByProfile(dbSession, profile);
  56. assertThat(results).isNotNull();
  57. assertThat(results)
  58. .extracting("ruleKey")
  59. .containsOnly(rule1.getKey(), rule2.getKey(), rule3.getKey());
  60. }
  61. @Test
  62. public void selectRulesByProfile_verify_columns() {
  63. String language = "java";
  64. RuleDefinitionDto ruleTemplate = createRule(language);
  65. RuleDefinitionDto customRule = createRule(language, RuleStatus.READY, ruleTemplate.getId());
  66. RuleMetadataDto customRuleMetadata = createRuleMetadata(new RuleMetadataDto()
  67. .setRuleId(customRule.getId())
  68. .setOrganizationUuid(db.getDefaultOrganization().getUuid())
  69. .setNoteData("Extended description")
  70. .setTags(Sets.newHashSet("tag1", "tag2", "tag3")));
  71. RuleDefinitionDto rule = createRule(language, RuleStatus.READY, null);
  72. RuleMetadataDto ruleMetadata = createRuleMetadata(new RuleMetadataDto()
  73. .setRuleId(rule.getId())
  74. .setOrganizationUuid(db.getDefaultOrganization().getUuid()));
  75. QProfileDto profile = createProfile(language);
  76. List<ActiveRuleDto> activeRules = activate(profile, customRule, rule);
  77. List<ExportRuleDto> results = underTest.selectRulesByProfile(dbSession, profile);
  78. assertThat(results).isNotNull();
  79. assertThat(results).isNotEmpty();
  80. //verify custom rule
  81. ExportRuleDto exportCustomRuleDto = results.stream().filter(ExportRuleDto::isCustomRule).findFirst().get();
  82. assertThat(exportCustomRuleDto).isNotNull();
  83. assertThat(exportCustomRuleDto.isCustomRule()).isTrue();
  84. assertThat(exportCustomRuleDto.getParams()).isEmpty();
  85. assertThat(exportCustomRuleDto.getDescription()).isEqualTo(customRule.getDescription());
  86. assertThat(exportCustomRuleDto.getExtendedDescription()).isEqualTo(customRuleMetadata.getNoteData());
  87. assertThat(exportCustomRuleDto.getName()).isEqualTo(customRule.getName());
  88. assertThat(exportCustomRuleDto.getRuleKey()).isEqualTo(customRule.getKey());
  89. assertThat(exportCustomRuleDto.getRuleType()).isEqualTo(RuleType.valueOf(customRule.getType()));
  90. assertThat(exportCustomRuleDto.getTags()).isEqualTo(String.join(",", customRuleMetadata.getTags()));
  91. assertThat(exportCustomRuleDto.getTemplateRuleKey()).isEqualTo(ruleTemplate.getKey());
  92. ActiveRuleDto activeCustomRule = activeRules.stream().filter(activeRuleDto -> activeRuleDto.getRuleKey().equals(customRule.getKey())).findFirst().get();
  93. assertThat(exportCustomRuleDto.getSeverityString()).isEqualTo(activeCustomRule.getSeverityString());
  94. //verify regular rule
  95. ExportRuleDto exportRuleDto = results.stream().filter(regularRule -> !regularRule.isCustomRule()).findFirst().get();
  96. assertThat(exportRuleDto).isNotNull();
  97. assertThat(exportRuleDto.isCustomRule()).isFalse();
  98. assertThat(exportRuleDto.getParams()).isEmpty();
  99. assertThat(exportRuleDto.getDescription()).isEqualTo(rule.getDescription());
  100. assertThat(exportRuleDto.getExtendedDescription()).isEqualTo(ruleMetadata.getNoteData());
  101. assertThat(exportRuleDto.getName()).isEqualTo(rule.getName());
  102. assertThat(exportRuleDto.getRuleKey()).isEqualTo(rule.getKey());
  103. assertThat(exportRuleDto.getRuleType()).isEqualTo(RuleType.valueOf(rule.getType()));
  104. ActiveRuleDto activeRule = activeRules.stream().filter(activeRuleDto -> activeRuleDto.getRuleKey().equals(rule.getKey())).findFirst().get();
  105. assertThat(exportRuleDto.getSeverityString()).isEqualTo(activeRule.getSeverityString());
  106. }
  107. @Test
  108. public void selectRulesByProfile_verify_rows_over_1000() {
  109. String language = "java";
  110. int numberOfParamsToCreate = 1005;
  111. RuleDefinitionDto rule = createRule(language);
  112. List<RuleParamDto> ruleParams = addParamsToRule(rule, numberOfParamsToCreate);
  113. QProfileDto profile = createProfile(language);
  114. ActiveRuleDto activatedRule = activate(profile, rule, ruleParams);
  115. List<ExportRuleDto> results = underTest.selectRulesByProfile(dbSession, profile);
  116. assertThat(results)
  117. .extracting("activeRuleId")
  118. .containsOnly(activatedRule.getId());
  119. assertThat(results.get(0).getParams())
  120. .extracting("key")
  121. .containsOnly(ruleParams.stream().map(RuleParamDto::getName).toArray());
  122. }
  123. @Test
  124. public void selectRulesByProfile_params_assigned_correctly() {
  125. String language = "java";
  126. RuleDefinitionDto firstRule = createRule(language);
  127. List<RuleParamDto> ruleParamsOfFirstRule = addParamsToRule(firstRule, 2);
  128. RuleDefinitionDto secondRule = createRule(language);
  129. List<RuleParamDto> ruleParamsOfSecondRule = addParamsToRule(secondRule, 3);
  130. String otherLanguage = "js";
  131. RuleDefinitionDto thirdRule = createRule(otherLanguage);
  132. List<RuleParamDto> ruleParamsOfThirdRule = addParamsToRule(thirdRule, 4);
  133. QProfileDto profile = createProfile(language);
  134. QProfileDto otherProfile = createProfile(otherLanguage);
  135. ActiveRuleDto firstActivatedRule = activate(profile, firstRule, ruleParamsOfFirstRule);
  136. ActiveRuleDto secondActivatedRule = activate(profile, secondRule, ruleParamsOfSecondRule);
  137. ActiveRuleDto thirdActivatedRule = activate(otherProfile, thirdRule, ruleParamsOfThirdRule);
  138. List<ExportRuleDto> results = underTest.selectRulesByProfile(dbSession, profile);
  139. List<ExportRuleDto> otherProfileResults = underTest.selectRulesByProfile(dbSession, otherProfile);
  140. assertThat(results)
  141. .extracting("activeRuleId")
  142. .containsOnly(firstActivatedRule.getId(), secondActivatedRule.getId());
  143. assertThat(otherProfileResults)
  144. .extracting("activeRuleId")
  145. .containsOnly(thirdActivatedRule.getId());
  146. ExportRuleDto firstExportedRule = findExportedRuleById(firstActivatedRule.getId(), results);
  147. assertThat(firstExportedRule.getParams())
  148. .extracting("key")
  149. .containsOnly(ruleParamsOfFirstRule.stream().map(RuleParamDto::getName).toArray());
  150. ExportRuleDto secondExportedRule = findExportedRuleById(secondActivatedRule.getId(), results);
  151. assertThat(secondExportedRule.getParams())
  152. .extracting("key")
  153. .containsOnly(ruleParamsOfSecondRule.stream().map(RuleParamDto::getName).toArray());
  154. ExportRuleDto thirdExportedRule = findExportedRuleById(thirdActivatedRule.getId(), otherProfileResults);
  155. assertThat(thirdExportedRule.getParams())
  156. .extracting("key")
  157. .containsOnly(ruleParamsOfThirdRule.stream().map(RuleParamDto::getName).toArray());
  158. }
  159. private ExportRuleDto findExportedRuleById(Integer id, List<ExportRuleDto> results) {
  160. Optional<ExportRuleDto> found = results.stream().filter(exportRuleDto -> id.equals(exportRuleDto.getActiveRuleId())).findFirst();
  161. if (!found.isPresent()) {
  162. Assert.fail();
  163. }
  164. return found.get();
  165. }
  166. private List<RuleParamDto> addParamsToRule(RuleDefinitionDto firstRule, int numberOfParams) {
  167. return IntStream.range(0, numberOfParams)
  168. .mapToObj(value -> db.rules().insertRuleParam(firstRule,
  169. ruleParamDto -> ruleParamDto.setName("name_" + firstRule.getId() + "_" + value)))
  170. .collect(Collectors.toList());
  171. }
  172. private RuleDefinitionDto createRule(String language) {
  173. return createRule(language, RuleStatus.READY);
  174. }
  175. private RuleDefinitionDto createRule(String language, RuleStatus status) {
  176. return createRule(language, status, null);
  177. }
  178. private RuleDefinitionDto createRule(String language, RuleStatus status, @Nullable Integer templateId) {
  179. return db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setRepositoryKey("repoKey").setLanguage(language).setStatus(status).setTemplateId(templateId));
  180. }
  181. private RuleMetadataDto createRuleMetadata(RuleMetadataDto metadataDto) {
  182. return db.rules().insertOrUpdateMetadata(metadataDto);
  183. }
  184. private QProfileDto createProfile(String lanugage) {
  185. return db.qualityProfiles().insert(db.getDefaultOrganization(), p -> p.setLanguage(lanugage));
  186. }
  187. private List<ActiveRuleDto> activate(QProfileDto profile, RuleDefinitionDto... rules) {
  188. return Stream.of(rules)
  189. .map(ruleDefinitionDto -> db.qualityProfiles().activateRule(profile, ruleDefinitionDto))
  190. .collect(Collectors.toList());
  191. }
  192. private ActiveRuleDto activate(QProfileDto profile, RuleDefinitionDto rule, Collection<RuleParamDto> params) {
  193. ActiveRuleDto activeRule = db.qualityProfiles().activateRule(profile, rule);
  194. params.forEach(ruleParamDto -> {
  195. ActiveRuleParamDto dto = ActiveRuleParamDto.createFor(ruleParamDto)
  196. .setKey(ruleParamDto.getName())
  197. .setValue("20")
  198. .setActiveRuleId(activeRule.getId());
  199. db.getDbClient().activeRuleDao().insertParam(db.getSession(), activeRule, dto);
  200. });
  201. return activeRule;
  202. }
  203. }