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

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