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.

ShowActionTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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.api.server.ws.WebService.Param;
  26. import org.sonar.api.utils.System2;
  27. import org.sonar.db.DbSession;
  28. import org.sonar.db.DbTester;
  29. import org.sonar.db.metric.MetricDto;
  30. import org.sonar.db.qualitygate.QualityGateConditionDto;
  31. import org.sonar.db.qualitygate.QualityGateDto;
  32. import org.sonar.db.user.UserDto;
  33. import org.sonar.server.component.TestComponentFinder;
  34. import org.sonar.server.exceptions.NotFoundException;
  35. import org.sonar.server.qualitygate.QualityGateCaycChecker;
  36. import org.sonar.server.qualitygate.QualityGateFinder;
  37. import org.sonar.server.tester.UserSessionRule;
  38. import org.sonar.server.ws.WsActionTester;
  39. import org.sonarqube.ws.Qualitygates.ShowWsResponse;
  40. import org.sonarqube.ws.Qualitygates.ShowWsResponse.Condition;
  41. import static java.lang.String.format;
  42. import static org.assertj.core.api.Assertions.assertThat;
  43. import static org.assertj.core.api.Assertions.assertThatThrownBy;
  44. import static org.assertj.core.api.AssertionsForClassTypes.tuple;
  45. import static org.junit.Assert.assertEquals;
  46. import static org.mockito.ArgumentMatchers.any;
  47. import static org.mockito.ArgumentMatchers.eq;
  48. import static org.mockito.Mockito.mock;
  49. import static org.mockito.Mockito.when;
  50. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_GATES;
  51. import static org.sonar.db.permission.GlobalPermission.ADMINISTER_QUALITY_PROFILES;
  52. import static org.sonar.server.qualitygate.QualityGateCaycStatus.COMPLIANT;
  53. import static org.sonar.test.JsonAssert.assertJson;
  54. import static org.sonarqube.ws.Qualitygates.Actions;
  55. public class ShowActionTest {
  56. @Rule
  57. public UserSessionRule userSession = UserSessionRule.standalone();
  58. @Rule
  59. public DbTester db = DbTester.create(System2.INSTANCE);
  60. private final QualityGateCaycChecker qualityGateCaycChecker = mock(QualityGateCaycChecker.class);
  61. private final WsActionTester ws = new WsActionTester(
  62. new ShowAction(db.getDbClient(), new QualityGateFinder(db.getDbClient()),
  63. new QualityGatesWsSupport(db.getDbClient(), userSession, TestComponentFinder.from(db)), qualityGateCaycChecker));
  64. @Before
  65. public void setUp() {
  66. when(qualityGateCaycChecker.checkCaycCompliant(any(), any())).thenReturn(COMPLIANT);
  67. }
  68. @Test
  69. public void show() {
  70. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  71. db.qualityGates().setDefaultQualityGate(qualityGate);
  72. MetricDto metric1 = db.measures().insertMetric();
  73. MetricDto metric2 = db.measures().insertMetric();
  74. QualityGateConditionDto condition1 = db.qualityGates().addCondition(qualityGate, metric1, c -> c.setOperator("GT"));
  75. QualityGateConditionDto condition2 = db.qualityGates().addCondition(qualityGate, metric2, c -> c.setOperator("LT"));
  76. ShowWsResponse response = ws.newRequest()
  77. .setParam("name", qualityGate.getName())
  78. .executeProtobuf(ShowWsResponse.class);
  79. assertThat(response.getId()).isEqualTo(qualityGate.getUuid());
  80. assertThat(response.getName()).isEqualTo(qualityGate.getName());
  81. assertThat(response.getIsBuiltIn()).isFalse();
  82. assertThat(response.getConditionsList()).hasSize(2);
  83. assertThat(response.getConditionsList())
  84. .extracting(Condition::getId, Condition::getMetric, Condition::getOp, Condition::getError)
  85. .containsExactlyInAnyOrder(
  86. tuple(condition1.getUuid(), metric1.getKey(), "GT", condition1.getErrorThreshold()),
  87. tuple(condition2.getUuid(), metric2.getKey(), "LT", condition2.getErrorThreshold()));
  88. }
  89. @Test
  90. public void show_built_in() {
  91. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true));
  92. db.qualityGates().setDefaultQualityGate(qualityGate);
  93. ShowWsResponse response = ws.newRequest()
  94. .setParam("name", qualityGate.getName())
  95. .executeProtobuf(ShowWsResponse.class);
  96. assertThat(response.getIsBuiltIn()).isTrue();
  97. }
  98. @Test
  99. public void show_isCaycCompliant() {
  100. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  101. when(qualityGateCaycChecker.checkCaycCompliant(any(DbSession.class), eq(qualityGate.getUuid()))).thenReturn(COMPLIANT);
  102. db.qualityGates().setDefaultQualityGate(qualityGate);
  103. ShowWsResponse response = ws.newRequest()
  104. .setParam("name", qualityGate.getName())
  105. .executeProtobuf(ShowWsResponse.class);
  106. assertEquals(COMPLIANT.toString(), response.getCaycStatus());
  107. }
  108. @Test
  109. public void show_by_id() {
  110. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  111. db.qualityGates().setDefaultQualityGate(qualityGate);
  112. ShowWsResponse response = ws.newRequest()
  113. .setParam("name", qualityGate.getName())
  114. .executeProtobuf(ShowWsResponse.class);
  115. assertThat(response.getId()).isEqualTo(qualityGate.getUuid());
  116. assertThat(response.getName()).isEqualTo(qualityGate.getName());
  117. }
  118. @Test
  119. public void no_condition() {
  120. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  121. db.qualityGates().setDefaultQualityGate(qualityGate);
  122. ShowWsResponse response = ws.newRequest()
  123. .setParam("name", qualityGate.getName())
  124. .executeProtobuf(ShowWsResponse.class);
  125. assertThat(response.getId()).isEqualTo(qualityGate.getUuid());
  126. assertThat(response.getName()).isEqualTo(qualityGate.getName());
  127. assertThat(response.getConditionsList()).isEmpty();
  128. }
  129. @Test
  130. public void actions() {
  131. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES);
  132. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  133. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate();
  134. db.qualityGates().setDefaultQualityGate(qualityGate2);
  135. ShowWsResponse response = ws.newRequest()
  136. .setParam("name", qualityGate.getName())
  137. .executeProtobuf(ShowWsResponse.class);
  138. Actions actions = response.getActions();
  139. assertThat(actions.getRename()).isTrue();
  140. assertThat(actions.getManageConditions()).isTrue();
  141. assertThat(actions.getDelete()).isTrue();
  142. assertThat(actions.getCopy()).isTrue();
  143. assertThat(actions.getSetAsDefault()).isTrue();
  144. assertThat(actions.getAssociateProjects()).isTrue();
  145. }
  146. @Test
  147. public void actions_on_default() {
  148. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES);
  149. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  150. db.qualityGates().setDefaultQualityGate(qualityGate);
  151. ShowWsResponse response = ws.newRequest()
  152. .setParam("name", qualityGate.getName())
  153. .executeProtobuf(ShowWsResponse.class);
  154. Actions actions = response.getActions();
  155. assertThat(actions.getRename()).isTrue();
  156. assertThat(actions.getManageConditions()).isTrue();
  157. assertThat(actions.getDelete()).isFalse();
  158. assertThat(actions.getCopy()).isTrue();
  159. assertThat(actions.getSetAsDefault()).isFalse();
  160. assertThat(actions.getAssociateProjects()).isFalse();
  161. }
  162. @Test
  163. public void actions_on_built_in() {
  164. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES);
  165. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true));
  166. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(false));
  167. db.qualityGates().setDefaultQualityGate(qualityGate2);
  168. ShowWsResponse response = ws.newRequest()
  169. .setParam("name", qualityGate.getName())
  170. .executeProtobuf(ShowWsResponse.class);
  171. Actions actions = response.getActions();
  172. assertThat(actions.getRename()).isFalse();
  173. assertThat(actions.getManageConditions()).isFalse();
  174. assertThat(actions.getDelete()).isFalse();
  175. assertThat(actions.getCopy()).isTrue();
  176. assertThat(actions.getSetAsDefault()).isTrue();
  177. assertThat(actions.getAssociateProjects()).isTrue();
  178. }
  179. @Test
  180. public void actions_when_not_quality_gate_administer() {
  181. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_PROFILES);
  182. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setBuiltIn(true));
  183. db.qualityGates().setDefaultQualityGate(qualityGate);
  184. ShowWsResponse response = ws.newRequest()
  185. .setParam("name", qualityGate.getName())
  186. .executeProtobuf(ShowWsResponse.class);
  187. Actions actions = response.getActions();
  188. assertThat(actions.getRename()).isFalse();
  189. assertThat(actions.getManageConditions()).isFalse();
  190. assertThat(actions.getDelete()).isFalse();
  191. assertThat(actions.getCopy()).isFalse();
  192. assertThat(actions.getSetAsDefault()).isFalse();
  193. assertThat(actions.getAssociateProjects()).isFalse();
  194. }
  195. @Test
  196. public void actions_when_delegate_quality_gate_administer() {
  197. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way"));
  198. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("Sonar way - Without Coverage"));
  199. UserDto user = db.users().insertUser();
  200. db.qualityGates().addUserPermission(defaultQualityGate, user);
  201. db.qualityGates().addUserPermission(otherQualityGate, user);
  202. userSession.logIn(user);
  203. db.qualityGates().setDefaultQualityGate(defaultQualityGate);
  204. ShowWsResponse response = ws.newRequest()
  205. .setParam("name", defaultQualityGate.getName())
  206. .executeProtobuf(ShowWsResponse.class);
  207. assertThat(response.getActions())
  208. .extracting(
  209. Actions::getRename, Actions::getDelete, Actions::getManageConditions,
  210. Actions::getCopy, Actions::getSetAsDefault, Actions::getAssociateProjects, Actions::getDelegate)
  211. .containsExactlyInAnyOrder(
  212. false, false, true, false, false, false, true);
  213. response = ws.newRequest()
  214. .setParam("name", otherQualityGate.getName())
  215. .executeProtobuf(ShowWsResponse.class);
  216. assertThat(response.getActions())
  217. .extracting(
  218. Actions::getRename, Actions::getDelete, Actions::getManageConditions,
  219. Actions::getCopy, Actions::getSetAsDefault, Actions::getAssociateProjects, Actions::getDelegate)
  220. .containsExactlyInAnyOrder(
  221. false, false, true, false, false, false, true);
  222. }
  223. @Test
  224. public void fail_when_no_name() {
  225. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  226. assertThatThrownBy(() -> ws.newRequest().execute())
  227. .isInstanceOf(IllegalArgumentException.class)
  228. .hasMessageContaining("The 'name' parameter is missing");
  229. }
  230. @Test
  231. public void fail_when_condition_is_on_disabled_metric() {
  232. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  233. db.qualityGates().setDefaultQualityGate(qualityGate);
  234. MetricDto metric = db.measures().insertMetric();
  235. db.qualityGates().addCondition(qualityGate, metric);
  236. db.getDbClient().metricDao().disableByKey(db.getSession(), metric.getKey());
  237. db.commit();
  238. assertThatThrownBy(() -> ws.newRequest()
  239. .setParam("name", qualityGate.getName())
  240. .execute())
  241. .isInstanceOf(IllegalStateException.class)
  242. .hasMessageContaining(format("Could not find metric with id %s", metric.getUuid()));
  243. }
  244. @Test
  245. public void fail_when_quality_name_does_not_exist() {
  246. QualityGateDto qualityGate = db.qualityGates().insertQualityGate();
  247. assertThatThrownBy(() -> ws.newRequest()
  248. .setParam("name", "UNKNOWN")
  249. .execute())
  250. .isInstanceOf(NotFoundException.class)
  251. .hasMessageContaining("No quality gate has been found for name UNKNOWN");
  252. }
  253. @Test
  254. public void json_example() {
  255. userSession.logIn("admin").addPermission(ADMINISTER_QUALITY_GATES);
  256. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(qg -> qg.setName("My Quality Gate"));
  257. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(qg -> qg.setName("My Quality Gate 2"));
  258. db.qualityGates().setDefaultQualityGate(qualityGate2);
  259. MetricDto blockerViolationsMetric = db.measures().insertMetric(m -> m.setKey("blocker_violations"));
  260. MetricDto criticalViolationsMetric = db.measures().insertMetric(m -> m.setKey("tests"));
  261. db.qualityGates().addCondition(qualityGate, blockerViolationsMetric, c -> c.setOperator("GT").setErrorThreshold("0"));
  262. db.qualityGates().addCondition(qualityGate, criticalViolationsMetric, c -> c.setOperator("LT").setErrorThreshold("10"));
  263. String response = ws.newRequest()
  264. .setParam("name", qualityGate.getName())
  265. .execute()
  266. .getInput();
  267. assertJson(response).ignoreFields("id")
  268. .isSimilarTo(getClass().getResource("show-example.json"));
  269. }
  270. @Test
  271. public void verify_definition() {
  272. WebService.Action action = ws.getDef();
  273. assertThat(action.since()).isEqualTo("4.3");
  274. assertThat(action.params())
  275. .extracting(Param::key, Param::isRequired)
  276. .containsExactlyInAnyOrder(
  277. tuple("name", true));
  278. }
  279. }