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.

CopyActionTest.java 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2023 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.qualitygate.ws;
  21. import com.tngtech.java.junit.dataprovider.DataProvider;
  22. import com.tngtech.java.junit.dataprovider.DataProviderRunner;
  23. import com.tngtech.java.junit.dataprovider.UseDataProvider;
  24. import javax.annotation.Nullable;
  25. import org.junit.Rule;
  26. import org.junit.Test;
  27. import org.junit.runner.RunWith;
  28. import org.sonar.api.server.ws.WebService;
  29. import org.sonar.api.utils.System2;
  30. import org.sonar.core.util.UuidFactoryFast;
  31. import org.sonar.db.DbClient;
  32. import org.sonar.db.DbSession;
  33. import org.sonar.db.DbTester;
  34. import org.sonar.db.metric.MetricDto;
  35. import org.sonar.db.qualitygate.QualityGateConditionDto;
  36. import org.sonar.db.qualitygate.QualityGateDto;
  37. import org.sonar.server.component.TestComponentFinder;
  38. import org.sonar.server.exceptions.ForbiddenException;
  39. import org.sonar.server.exceptions.NotFoundException;
  40. import org.sonar.server.qualitygate.QualityGateUpdater;
  41. import org.sonar.server.tester.UserSessionRule;
  42. import org.sonar.server.ws.TestRequest;
  43. import org.sonar.server.ws.WsActionTester;
  44. import org.sonarqube.ws.Qualitygates.QualityGate;
  45. import static java.util.Optional.ofNullable;
  46. import static org.assertj.core.api.Assertions.assertThat;
  47. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  48. import static org.assertj.core.api.AssertionsForClassTypes.tuple;
  49. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
  50. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
  51. import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_NAME;
  52. import static org.sonar.server.qualitygate.ws.QualityGatesWsParameters.PARAM_SOURCE_NAME;
  53. @RunWith(DataProviderRunner.class)
  54. public class CopyActionTest {
  55. @Rule
  56. public final UserSessionRule userSession = UserSessionRule.standalone();
  57. @Rule
  58. public final DbTester db = DbTester.create(System2.INSTANCE);
  59. private final DbClient dbClient = db.getDbClient();
  60. private final DbSession dbSession = db.getSession();
  61. private final QualityGateUpdater qualityGateUpdater = new QualityGateUpdater(dbClient, UuidFactoryFast.getInstance());
  62. private final QualityGatesWsSupport wsSupport = new QualityGatesWsSupport(dbClient, userSession, TestComponentFinder.from(db));
  63. private final CopyAction underTest = new CopyAction(dbClient, userSession, qualityGateUpdater, wsSupport);
  64. private final WsActionTester ws = new WsActionTester(underTest);
  65. @Test
  66. public void definition() {
  67. WebService.Action action = ws.getDef();
  68. assertThat(action).isNotNull();
  69. assertThat(action.isInternal()).isFalse();
  70. assertThat(action.isPost()).isTrue();
  71. assertThat(action.responseExampleAsString()).isNullOrEmpty();
  72. assertThat(action.params())
  73. .extracting(WebService.Param::key, WebService.Param::isRequired)
  74. .containsExactlyInAnyOrder(
  75. tuple("sourceName", true),
  76. tuple("name", true));
  77. }
  78. @Test
  79. public void copy() {
  80. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  81. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  82. MetricDto metric = db.measures().insertMetric();
  83. QualityGateConditionDto condition = db.qualityGates().addCondition(qualityGate, metric);
  84. ws.newRequest()
  85. .setParam(PARAM_SOURCE_NAME, qualityGate.getName())
  86. .setParam(PARAM_NAME, "new-name")
  87. .execute();
  88. QualityGateDto actual = db.getDbClient().qualityGateDao().selectByName(dbSession, "new-name");
  89. assertThat(actual).isNotNull();
  90. assertThat(actual.isBuiltIn()).isFalse();
  91. assertThat(actual.getUuid()).isNotEqualTo(qualityGate.getUuid());
  92. assertThat(actual.getUuid()).isNotEqualTo(qualityGate.getUuid());
  93. assertThat(db.getDbClient().gateConditionDao().selectForQualityGate(dbSession, qualityGate.getUuid()))
  94. .extracting(QualityGateConditionDto::getMetricUuid, QualityGateConditionDto::getErrorThreshold)
  95. .containsExactlyInAnyOrder(tuple(metric.getUuid(), condition.getErrorThreshold()));
  96. }
  97. @Test
  98. public void copy_of_builtin_should_not_be_builtin() {
  99. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  100. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qualityGateDto -> qualityGateDto.setBuiltIn(true));
  101. ws.newRequest()
  102. .setParam(PARAM_SOURCE_NAME, qualityGate.getName())
  103. .setParam(PARAM_NAME, "new-name")
  104. .execute();
  105. QualityGateDto actual = db.getDbClient().qualityGateDao().selectByName(dbSession, "new-name");
  106. assertThat(actual).isNotNull();
  107. assertThat(actual.isBuiltIn()).isFalse();
  108. }
  109. @Test
  110. public void response_contains_quality_gate() {
  111. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  112. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  113. QualityGate response = ws.newRequest()
  114. .setParam(PARAM_SOURCE_NAME, qualityGate.getName())
  115. .setParam(PARAM_NAME, "new-name")
  116. .executeProtobuf(QualityGate.class);
  117. assertThat(response).isNotNull();
  118. assertThat(response.getId()).isNotEqualTo(qualityGate.getUuid());
  119. assertThat(response.getName()).isEqualTo("new-name");
  120. }
  121. @Test
  122. public void fail_when_missing_administer_quality_gate_permission() {
  123. userSession.addPermission(ADMINISTER_QUALITY_PROFILES);
  124. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  125. assertThatThrownBy(() -> ws.newRequest()
  126. .setParam(PARAM_SOURCE_NAME, qualityGate.getName())
  127. .setParam(PARAM_NAME, "new-name")
  128. .execute())
  129. .isInstanceOf(ForbiddenException.class);
  130. }
  131. @Test
  132. public void fail_when_source_name_parameter_is_missing() {
  133. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  134. assertThatThrownBy(() -> ws.newRequest()
  135. .setParam(PARAM_NAME, "new-name")
  136. .execute())
  137. .isInstanceOf(IllegalArgumentException.class)
  138. .hasMessageContaining("The 'sourceName' parameter is missing");
  139. }
  140. @Test
  141. public void fail_when_quality_gate_name_is_not_found() {
  142. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  143. assertThatThrownBy(() -> ws.newRequest()
  144. .setParam(PARAM_SOURCE_NAME, "unknown")
  145. .setParam(PARAM_NAME, "new-name")
  146. .execute())
  147. .isInstanceOf(NotFoundException.class)
  148. .hasMessageContaining("No quality gate has been found for name unknown");
  149. }
  150. @Test
  151. @UseDataProvider("nullOrEmpty")
  152. public void fail_when_name_parameter_is_missing(@Nullable String nameParameter) {
  153. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  154. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  155. TestRequest request = ws.newRequest()
  156. .setParam(PARAM_SOURCE_NAME, qualityGate.getName());
  157. ofNullable(nameParameter).ifPresent(t -> request.setParam(PARAM_NAME, t));
  158. assertThatThrownBy(() -> request.execute())
  159. .isInstanceOf(IllegalArgumentException.class)
  160. .hasMessageContaining("The 'name' parameter is missing");
  161. }
  162. @DataProvider
  163. public static Object[][] nullOrEmpty() {
  164. return new Object[][]{
  165. {null},
  166. {""},
  167. {" "}
  168. };
  169. }
  170. @Test
  171. public void fail_when_name_parameter_match_existing_quality_gate() {
  172. userSession.addPermission(ADMINISTER_QUALITY_GATES);
  173. QualityGateDto existingQualityGate = db.qualityGates().insertQualityGate();
  174. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  175. assertThatThrownBy(() -> ws.newRequest()
  176. .setParam(PARAM_SOURCE_NAME, qualityGate.getName())
  177. .setParam(PARAM_NAME, existingQualityGate.getName())
  178. .execute())
  179. .isInstanceOf(IllegalArgumentException.class)
  180. .hasMessageContaining("Name has already been taken");
  181. }
  182. }