Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

ListActionTest.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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 org.junit.Rule;
  22. import org.junit.Test;
  23. import org.sonar.api.server.ws.WebService;
  24. import org.sonar.db.DbClient;
  25. import org.sonar.db.DbSession;
  26. import org.sonar.db.DbTester;
  27. import org.sonar.db.qualitygate.QualityGateDto;
  28. import org.sonar.db.user.UserDto;
  29. import org.sonar.server.component.TestComponentFinder;
  30. import org.sonar.server.qualitygate.QualityGateCaycChecker;
  31. import org.sonar.server.qualitygate.QualityGateFinder;
  32. import org.sonar.server.tester.UserSessionRule;
  33. import org.sonar.server.ws.WsActionTester;
  34. import org.sonarqube.ws.Qualitygates.ListWsResponse.QualityGate;
  35. import static org.assertj.core.api.Assertions.assertThat;
  36. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  37. import static org.assertj.core.api.AssertionsForClassTypes.tuple;
  38. import static org.mockito.ArgumentMatchers.any;
  39. import static org.mockito.ArgumentMatchers.eq;
  40. import static org.mockito.Mockito.mock;
  41. import static org.mockito.Mockito.when;
  42. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
  43. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
  44. import static org.sonar.test.JsonAssert.assertJson;
  45. import static org.sonarqube.ws.Qualitygates.ListWsResponse;
  46. public class ListActionTest {
  47. @Rule
  48. public UserSessionRule userSession = UserSessionRule.standalone();
  49. @Rule
  50. public DbTester db = DbTester.create();
  51. private final DbClient dbClient = db.getDbClient();
  52. private final QualityGateFinder qualityGateFinder = new QualityGateFinder(dbClient);
  53. private final QualityGateCaycChecker qualityGateCaycChecker = mock(QualityGateCaycChecker.class);
  54. private final WsActionTester ws = new WsActionTester(new ListAction(db.getDbClient(),
  55. new QualityGatesWsSupport(dbClient, userSession, TestComponentFinder.from(db)), qualityGateFinder, qualityGateCaycChecker));
  56. @Test
  57. public void list_quality_gates() {
  58. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate();
  59. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate();
  60. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  61. ListWsResponse response = ws.newRequest()
  62. .executeProtobuf(ListWsResponse.class);
  63. assertThat(response.getQualitygatesList())
  64. .extracting(QualityGate::getId, QualityGate::getName, QualityGate::getIsDefault)
  65. .containsExactlyInAnyOrder(
  66. tuple(defaultQualityGate.getUuid(), defaultQualityGate.getName(), true),
  67. tuple(otherQualityGate.getUuid(), otherQualityGate.getName(), false));
  68. }
  69. @Test
  70. public void test_built_in_flag() {
  71. QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate(qualityGate -> qualityGate.setBuiltIn(true));
  72. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(qualityGate -> qualityGate.setBuiltIn(false));
  73. db.qualityGates().setDefaultQualityGate(qualityGate1);
  74. ListWsResponse response = ws.newRequest()
  75. .executeProtobuf(ListWsResponse.class);
  76. assertThat(response.getQualitygatesList())
  77. .extracting(QualityGate::getId, QualityGate::getIsBuiltIn)
  78. .containsExactlyInAnyOrder(
  79. tuple(qualityGate1.getUuid(), true),
  80. tuple(qualityGate2.getUuid(), false));
  81. }
  82. @Test
  83. public void test_isCaycCompliant_flag() {
  84. QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate();
  85. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate();
  86. when(qualityGateCaycChecker.checkCaycCompliant(any(DbSession.class), eq(qualityGate1.getUuid()))).thenReturn(true);
  87. when(qualityGateCaycChecker.checkCaycCompliant(any(DbSession.class), eq(qualityGate2.getUuid()))).thenReturn(false);
  88. db.qualityGates().setDefaultQualityGate(qualityGate1);
  89. ListWsResponse response = ws.newRequest()
  90. .executeProtobuf(ListWsResponse.class);
  91. assertThat(response.getQualitygatesList())
  92. .extracting(QualityGate::getId, QualityGate::getIsCaycCompliant)
  93. .containsExactlyInAnyOrder(
  94. tuple(qualityGate1.getUuid(), true),
  95. tuple(qualityGate2.getUuid(), false));
  96. }
  97. @Test
  98. public void test_deprecated_default_field() {
  99. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate();
  100. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  101. ListWsResponse response = ws.newRequest()
  102. .executeProtobuf(ListWsResponse.class);
  103. assertThat(response.getDefault()).isEqualTo(defaultQualityGate.getUuid());
  104. }
  105. @Test
  106. public void no_default_quality_gate() {
  107. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  108. assertThatThrownBy(() -> ws.newRequest()
  109. .executeProtobuf(ListWsResponse.class))
  110. .isInstanceOf(IllegalStateException.class);
  111. }
  112. @Test
  113. public void actions_with_quality_gate_administer_permission() {
  114. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES);
  115. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Default").setBuiltIn(false));
  116. QualityGateDto builtInQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way").setBuiltIn(true));
  117. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way - Without Coverage").setBuiltIn(false));
  118. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  119. ListWsResponse response = ws.newRequest().executeProtobuf(ListWsResponse.class);
  120. assertThat(response.getActions())
  121. .extracting(ListWsResponse.RootActions::getCreate)
  122. .isEqualTo(true);
  123. assertThat(response.getQualitygatesList())
  124. .extracting(QualityGate::getName,
  125. qg -> qg.getActions().getRename(), qg -> qg.getActions().getDelete(), qg -> qg.getActions().getManageConditions(),
  126. qp -> qp.getActions().getCopy(), qp -> qp.getActions().getSetAsDefault(), qp -> qp.getActions().getAssociateProjects(),
  127. qp -> qp.getActions().getDelegate())
  128. .containsExactlyInAnyOrder(
  129. tuple(defaultQualityGate.getName(), true, false, true, true, false, false, true),
  130. tuple(builtInQualityGate.getName(), false, false, false, true, true, true, false),
  131. tuple(otherQualityGate.getName(), true, true, true, true, true, true, true));
  132. }
  133. @Test
  134. public void actions_with_quality_gate_delegate_permission() {
  135. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way"));
  136. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way - Without Coverage"));
  137. UserDto user = db.users().insertUser();
  138. db.qualityGates().addUserPermission(defaultQualityGate, user);
  139. db.qualityGates().addUserPermission(otherQualityGate, user);
  140. userSession.logIn(user);
  141. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  142. ListWsResponse response = ws.newRequest().executeProtobuf(ListWsResponse.class);
  143. assertThat(response.getActions())
  144. .extracting(ListWsResponse.RootActions::getCreate)
  145. .isEqualTo(false);
  146. assertThat(response.getQualitygatesList())
  147. .extracting(QualityGate::getName,
  148. qg -> qg.getActions().getRename(), qg -> qg.getActions().getDelete(), qg -> qg.getActions().getManageConditions(),
  149. qp -> qp.getActions().getCopy(), qp -> qp.getActions().getSetAsDefault(), qp -> qp.getActions().getAssociateProjects(),
  150. qp -> qp.getActions().getDelegate())
  151. .containsExactlyInAnyOrder(
  152. tuple(defaultQualityGate.getName(), false, false, true, false, false, false, true),
  153. tuple(otherQualityGate.getName(), false, false, true, false, false, false, true));
  154. }
  155. @Test
  156. public void actions_without_quality_gate_administer_permission() {
  157. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_PROFILES);
  158. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way").setBuiltIn(true));
  159. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way - Without Coverage").setBuiltIn(false));
  160. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  161. ListWsResponse response = ws.newRequest().executeProtobuf(ListWsResponse.class);
  162. assertThat(response.getActions())
  163. .extracting(ListWsResponse.RootActions::getCreate)
  164. .isEqualTo(false);
  165. assertThat(response.getQualitygatesList())
  166. .extracting(QualityGate::getName,
  167. qg -> qg.getActions().getRename(), qg -> qg.getActions().getDelete(), qg -> qg.getActions().getManageConditions(),
  168. qp -> qp.getActions().getCopy(), qp -> qp.getActions().getSetAsDefault(), qp -> qp.getActions().getAssociateProjects(),
  169. qp -> qp.getActions().getDelegate())
  170. .containsExactlyInAnyOrder(
  171. tuple(defaultQualityGate.getName(), false, false, false, false, false, false, false),
  172. tuple(otherQualityGate.getName(), false, false, false, false, false, false, false));
  173. }
  174. @Test
  175. public void json_example() {
  176. userSession.logIn("admin").addPermission(ADMINISTER_QUALITY_GATES);
  177. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qualityGate -> qualityGate.setName("Sonar way").setBuiltIn(true));
  178. db.qualityGates().insertQualityGate(qualityGate -> qualityGate.setName("Sonar way - Without Coverage").setBuiltIn(false));
  179. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  180. String response = ws.newRequest().execute().getInput();
  181. assertJson(response).ignoreFields("id", "default")
  182. .isSimilarTo(getClass().getResource("list-example.json"));
  183. }
  184. @Test
  185. public void verify_definition() {
  186. WebService.Action action = ws.getDef();
  187. assertThat(action.since()).isEqualTo("4.3");
  188. assertThat(action.key()).isEqualTo("list");
  189. assertThat(action.isPost()).isFalse();
  190. assertThat(action.isInternal()).isFalse();
  191. assertThat(action.changelog()).isNotEmpty();
  192. assertThat(action.params()).extracting(WebService.Param::key, WebService.Param::isRequired).isEmpty();
  193. }
  194. }