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.

ListActionTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2019 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.junit.rules.ExpectedException;
  24. import org.sonar.api.server.ws.Change;
  25. import org.sonar.api.server.ws.WebService;
  26. import org.sonar.db.DbClient;
  27. import org.sonar.db.DbTester;
  28. import org.sonar.db.organization.OrganizationDto;
  29. import org.sonar.db.qualitygate.QGateWithOrgDto;
  30. import org.sonar.db.qualitygate.QualityGateDto;
  31. import org.sonar.db.user.UserDto;
  32. import org.sonar.server.exceptions.ForbiddenException;
  33. import org.sonar.server.organization.DefaultOrganizationProvider;
  34. import org.sonar.server.organization.TestDefaultOrganizationProvider;
  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.ListWsResponse.QualityGate;
  39. import static java.lang.String.format;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. import static org.assertj.core.api.AssertionsForClassTypes.tuple;
  42. import static org.sonar.db.organization.OrganizationDto.Subscription.PAID;
  43. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_GATES;
  44. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER_QUALITY_PROFILES;
  45. import static org.sonar.test.JsonAssert.assertJson;
  46. import static org.sonarqube.ws.Qualitygates.ListWsResponse;
  47. public class ListActionTest {
  48. @Rule
  49. public ExpectedException expectedException = ExpectedException.none();
  50. @Rule
  51. public UserSessionRule userSession = UserSessionRule.standalone();
  52. @Rule
  53. public DbTester db = DbTester.create();
  54. private DbClient dbClient = db.getDbClient();
  55. private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
  56. private QualityGateFinder qualityGateFinder = new QualityGateFinder(dbClient);
  57. private WsActionTester ws = new WsActionTester(new ListAction(db.getDbClient(),
  58. new QualityGatesWsSupport(dbClient, userSession, defaultOrganizationProvider), qualityGateFinder));
  59. @Test
  60. public void list_quality_gates() {
  61. OrganizationDto organization = db.organizations().insert();
  62. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(organization);
  63. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(organization);
  64. db.qualityGates().setDefaultQualityGate(organization, defaultQualityGate);
  65. ListWsResponse response = ws.newRequest()
  66. .setParam("organization", organization.getKey())
  67. .executeProtobuf(ListWsResponse.class);
  68. assertThat(response.getQualitygatesList())
  69. .extracting(QualityGate::getId, QualityGate::getName, QualityGate::getIsDefault)
  70. .containsExactlyInAnyOrder(
  71. tuple(defaultQualityGate.getId(), defaultQualityGate.getName(), true),
  72. tuple(otherQualityGate.getId(), otherQualityGate.getName(), false));
  73. }
  74. @Test
  75. public void default_organization_is_used_when_no_organization_parameter() {
  76. QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(db.getDefaultOrganization());
  77. db.qualityGates().setDefaultQualityGate(db.getDefaultOrganization(), qualityGate);
  78. OrganizationDto otherOrganization = db.organizations().insert();
  79. QGateWithOrgDto otherQualityGate = db.qualityGates().insertQualityGate(otherOrganization);
  80. db.qualityGates().setDefaultQualityGate(otherOrganization, otherQualityGate);
  81. ListWsResponse response = ws.newRequest().executeProtobuf(ListWsResponse.class);
  82. assertThat(response.getQualitygatesList())
  83. .extracting(QualityGate::getId)
  84. .containsExactlyInAnyOrder(qualityGate.getId());
  85. }
  86. @Test
  87. public void test_built_in_flag() {
  88. OrganizationDto organization = db.organizations().insert();
  89. QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate(organization, qualityGate -> qualityGate.setBuiltIn(true));
  90. QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(organization, qualityGate -> qualityGate.setBuiltIn(false));
  91. db.qualityGates().setDefaultQualityGate(organization, qualityGate1);
  92. ListWsResponse response = ws.newRequest()
  93. .setParam("organization", organization.getKey())
  94. .executeProtobuf(ListWsResponse.class);
  95. assertThat(response.getQualitygatesList())
  96. .extracting(QualityGate::getId, QualityGate::getIsBuiltIn)
  97. .containsExactlyInAnyOrder(
  98. tuple(qualityGate1.getId(), true),
  99. tuple(qualityGate2.getId(), false));
  100. }
  101. @Test
  102. public void test_deprecated_default_field() {
  103. OrganizationDto organization = db.organizations().insert();
  104. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(organization);
  105. db.qualityGates().setDefaultQualityGate(organization, defaultQualityGate);
  106. ListWsResponse response = ws.newRequest()
  107. .setParam("organization", organization.getKey())
  108. .executeProtobuf(ListWsResponse.class);
  109. assertThat(response.getDefault()).isEqualTo(defaultQualityGate.getId());
  110. }
  111. @Test
  112. public void no_default_quality_gate() {
  113. OrganizationDto organization = db.organizations().insert();
  114. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization);
  115. expectedException.expect(IllegalStateException.class);
  116. ListWsResponse response = ws.newRequest()
  117. .setParam("organization", organization.getKey())
  118. .executeProtobuf(ListWsResponse.class);
  119. }
  120. @Test
  121. public void actions_with_quality_gate_administer_permission() {
  122. OrganizationDto organization = db.organizations().insert();
  123. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_GATES, organization);
  124. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Default").setBuiltIn(false));
  125. QualityGateDto builtInQualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way").setBuiltIn(true));
  126. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way - Without Coverage").setBuiltIn(false));
  127. db.qualityGates().setDefaultQualityGate(organization, defaultQualityGate);
  128. ListWsResponse response = ws.newRequest()
  129. .setParam("organization", organization.getKey())
  130. .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. .containsExactlyInAnyOrder(
  139. tuple(defaultQualityGate.getName(), true, false, true, true, false, false),
  140. tuple(builtInQualityGate.getName(), false, false, false, true, true, true),
  141. tuple(otherQualityGate.getName(), true, true, true, true, true, true));
  142. }
  143. @Test
  144. public void actions_without_quality_gate_administer_permission() {
  145. OrganizationDto organization = db.organizations().insert();
  146. userSession.logIn("john").addPermission(ADMINISTER_QUALITY_PROFILES, organization);
  147. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way").setBuiltIn(true));
  148. QualityGateDto otherQualityGate = db.qualityGates().insertQualityGate(organization, qg -> qg.setName("Sonar way - Without Coverage").setBuiltIn(false));
  149. db.qualityGates().setDefaultQualityGate(organization, defaultQualityGate);
  150. ListWsResponse response = ws.newRequest()
  151. .setParam("organization", organization.getKey())
  152. .executeProtobuf(ListWsResponse.class);
  153. assertThat(response.getActions())
  154. .extracting(ListWsResponse.RootActions::getCreate)
  155. .isEqualTo(false);
  156. assertThat(response.getQualitygatesList())
  157. .extracting(QualityGate::getName,
  158. qg -> qg.getActions().getRename(), qg -> qg.getActions().getDelete(), qg -> qg.getActions().getManageConditions(),
  159. qp -> qp.getActions().getCopy(), qp -> qp.getActions().getSetAsDefault(), qp -> qp.getActions().getAssociateProjects())
  160. .containsExactlyInAnyOrder(
  161. tuple(defaultQualityGate.getName(), false, false, false, false, false, false),
  162. tuple(otherQualityGate.getName(), false, false, false, false, false, false));
  163. }
  164. @Test
  165. public void list_quality_gates_on_paid_organization() {
  166. OrganizationDto organization = db.organizations().insert(o -> o.setSubscription(PAID));
  167. QualityGateDto qualityGate = db.qualityGates().insertQualityGate(organization);
  168. db.qualityGates().setDefaultQualityGate(organization, qualityGate);
  169. UserDto user = db.users().insertUser();
  170. userSession.logIn(user).addMembership(organization);
  171. ListWsResponse response = ws.newRequest()
  172. .setParam("organization", organization.getKey())
  173. .executeProtobuf(ListWsResponse.class);
  174. assertThat(response.getQualitygatesList())
  175. .extracting(QualityGate::getName)
  176. .containsExactlyInAnyOrder(qualityGate.getName());
  177. }
  178. @Test
  179. public void fail_on_paid_organization_when_not_member() {
  180. OrganizationDto organization = db.organizations().insert(o -> o.setSubscription(PAID));
  181. QGateWithOrgDto qualityGate = db.qualityGates().insertQualityGate(organization);
  182. expectedException.expect(ForbiddenException.class);
  183. expectedException.expectMessage(format("You're not member of organization '%s'", organization.getKey()));
  184. ws.newRequest()
  185. .setParam("organization", organization.getKey())
  186. .execute();
  187. }
  188. @Test
  189. public void json_example() {
  190. OrganizationDto organization = db.organizations().insert();
  191. userSession.logIn("admin").addPermission(ADMINISTER_QUALITY_GATES, organization);
  192. QualityGateDto defaultQualityGate = db.qualityGates().insertQualityGate(organization, qualityGate -> qualityGate.setName("Sonar way").setBuiltIn(true));
  193. db.qualityGates().insertQualityGate(organization, qualityGate -> qualityGate.setName("Sonar way - Without Coverage").setBuiltIn(false));
  194. db.qualityGates().setDefaultQualityGate(organization, defaultQualityGate);
  195. String response = ws.newRequest()
  196. .setParam("organization", organization.getKey())
  197. .execute()
  198. .getInput();
  199. assertJson(response).ignoreFields("id", "default")
  200. .isSimilarTo(getClass().getResource("list-example.json"));
  201. }
  202. @Test
  203. public void verify_definition() {
  204. WebService.Action action = ws.getDef();
  205. assertThat(action.since()).isEqualTo("4.3");
  206. assertThat(action.key()).isEqualTo("list");
  207. assertThat(action.isPost()).isFalse();
  208. assertThat(action.isInternal()).isFalse();
  209. assertThat(action.changelog()).extracting(Change::getVersion, Change::getDescription)
  210. .containsExactlyInAnyOrder(
  211. tuple("7.0", "'isDefault' field is added on quality gate"),
  212. tuple("7.0", "'default' field on root level is deprecated"),
  213. tuple("7.0", "'isBuiltIn' field is added in the response"),
  214. tuple("7.0", "'actions' fields are added in the response"));
  215. assertThat(action.params()).extracting(WebService.Param::key, WebService.Param::isRequired)
  216. .containsExactlyInAnyOrder(tuple("organization", false));
  217. }
  218. }