Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ShowActionIT.java 14KB

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