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.

RemoveUserActionTest.java 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2020 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.usergroups.ws;
  21. import org.junit.Rule;
  22. import org.junit.Test;
  23. import org.junit.rules.ExpectedException;
  24. import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
  25. import org.sonar.api.server.ws.Change;
  26. import org.sonar.api.server.ws.WebService.Action;
  27. import org.sonar.core.permission.GlobalPermissions;
  28. import org.sonar.db.DbTester;
  29. import org.sonar.db.user.GroupDto;
  30. import org.sonar.db.user.UserDto;
  31. import org.sonar.server.exceptions.BadRequestException;
  32. import org.sonar.server.exceptions.ForbiddenException;
  33. import org.sonar.server.exceptions.NotFoundException;
  34. import org.sonar.server.tester.UserSessionRule;
  35. import org.sonar.server.usergroups.DefaultGroupFinder;
  36. import org.sonar.server.ws.TestRequest;
  37. import org.sonar.server.ws.TestResponse;
  38. import org.sonar.server.ws.WsActionTester;
  39. import static java.net.HttpURLConnection.HTTP_NO_CONTENT;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. import static org.assertj.core.api.Assertions.tuple;
  42. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  43. import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_NAME;
  44. import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_LOGIN;
  45. public class RemoveUserActionTest {
  46. @Rule
  47. public DbTester db = DbTester.create(new AlwaysIncreasingSystem2());
  48. @Rule
  49. public UserSessionRule userSession = UserSessionRule.standalone();
  50. @Rule
  51. public ExpectedException expectedException = ExpectedException.none();
  52. private final WsActionTester ws = new WsActionTester(
  53. new RemoveUserAction(db.getDbClient(), userSession, new GroupWsSupport(db.getDbClient(), new DefaultGroupFinder(db.getDbClient()))));
  54. @Test
  55. public void verify_definition() {
  56. Action wsDef = ws.getDef();
  57. assertThat(wsDef.isInternal()).isFalse();
  58. assertThat(wsDef.since()).isEqualTo("5.2");
  59. assertThat(wsDef.isPost()).isTrue();
  60. assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
  61. tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
  62. }
  63. @Test
  64. public void does_nothing_if_user_is_not_in_group() {
  65. // keep an administrator
  66. insertAnAdministrator();
  67. insertDefaultGroup();
  68. GroupDto group = db.users().insertGroup("admins");
  69. UserDto user = db.users().insertUser("my-admin");
  70. loginAsAdmin();
  71. newRequest()
  72. .setParam("id", group.getUuid())
  73. .setParam("login", user.getLogin())
  74. .execute();
  75. assertThat(db.users().selectGroupUuidsOfUser(user)).isEmpty();
  76. }
  77. @Test
  78. public void remove_user_by_group_id() {
  79. // keep an administrator
  80. insertAnAdministrator();
  81. insertDefaultGroup();
  82. GroupDto users = db.users().insertGroup("users");
  83. UserDto user = db.users().insertUser("my-admin");
  84. db.users().insertMember(users, user);
  85. loginAsAdmin();
  86. newRequest()
  87. .setParam("id", users.getUuid())
  88. .setParam("login", user.getLogin())
  89. .execute();
  90. assertThat(db.users().selectGroupUuidsOfUser(user)).isEmpty();
  91. }
  92. @Test
  93. public void remove_user_by_group_name() {
  94. insertAnAdministrator();
  95. insertDefaultGroup();
  96. GroupDto group = db.users().insertGroup("a_group");
  97. UserDto user = db.users().insertUser("a_user");
  98. db.users().insertMember(group, user);
  99. loginAsAdmin();
  100. newRequest()
  101. .setParam(PARAM_GROUP_NAME, group.getName())
  102. .setParam(PARAM_LOGIN, user.getLogin())
  103. .execute();
  104. assertThat(db.users().selectGroupUuidsOfUser(user)).isEmpty();
  105. }
  106. @Test
  107. public void remove_user_only_from_one_group() {
  108. // keep an administrator
  109. insertAnAdministrator();
  110. insertDefaultGroup();
  111. GroupDto users = db.users().insertGroup("user");
  112. GroupDto admins = db.users().insertGroup("admins");
  113. UserDto user = db.users().insertUser("user");
  114. db.users().insertMember(users, user);
  115. db.users().insertMember(admins, user);
  116. loginAsAdmin();
  117. newRequest()
  118. .setParam("id", admins.getUuid())
  119. .setParam("login", user.getLogin())
  120. .execute();
  121. assertThat(db.users().selectGroupUuidsOfUser(user)).containsOnly(users.getUuid());
  122. }
  123. @Test
  124. public void response_status_is_no_content() {
  125. // keep an administrator
  126. insertAnAdministrator();
  127. insertDefaultGroup();
  128. GroupDto users = db.users().insertGroup("users");
  129. UserDto user = db.users().insertUser("my-admin");
  130. db.users().insertMember(users, user);
  131. loginAsAdmin();
  132. TestResponse response = newRequest()
  133. .setParam("id", users.getUuid())
  134. .setParam("login", user.getLogin())
  135. .execute();
  136. assertThat(response.getStatus()).isEqualTo(HTTP_NO_CONTENT);
  137. }
  138. @Test
  139. public void fail_if_unknown_group() {
  140. UserDto user = db.users().insertUser("my-admin");
  141. expectedException.expect(NotFoundException.class);
  142. loginAsAdmin();
  143. newRequest()
  144. .setParam("id", "42")
  145. .setParam("login", user.getLogin())
  146. .execute();
  147. }
  148. @Test
  149. public void fail_if_unknown_user() {
  150. insertDefaultGroup();
  151. GroupDto group = db.users().insertGroup("admins");
  152. expectedException.expect(NotFoundException.class);
  153. loginAsAdmin();
  154. newRequest()
  155. .setParam("id", group.getUuid())
  156. .setParam("login", "my-admin")
  157. .execute();
  158. }
  159. @Test
  160. public void throw_ForbiddenException_if_not_administrator() {
  161. GroupDto group = db.users().insertGroup("a-group");
  162. UserDto user = db.users().insertUser();
  163. db.users().insertMember(group, user);
  164. userSession.logIn("admin");
  165. expectedException.expect(ForbiddenException.class);
  166. expectedException.expectMessage("Insufficient privileges");
  167. newRequest()
  168. .setParam("id", group.getUuid())
  169. .setParam("login", user.getLogin())
  170. .execute();
  171. }
  172. @Test
  173. public void fail_to_remove_the_last_administrator() {
  174. db.users().insertDefaultGroup();
  175. GroupDto adminGroup = db.users().insertGroup("sonar-admins");
  176. db.users().insertPermissionOnGroup(adminGroup, GlobalPermissions.SYSTEM_ADMIN);
  177. UserDto adminUser = db.users().insertUser("the-single-admin");
  178. db.users().insertMember(adminGroup, adminUser);
  179. loginAsAdmin();
  180. expectedException.expect(BadRequestException.class);
  181. expectedException.expectMessage("The last administrator user cannot be removed");
  182. newRequest()
  183. .setParam("id", adminGroup.getUuid())
  184. .setParam("login", adminUser.getLogin())
  185. .execute();
  186. }
  187. @Test
  188. public void fail_to_remove_user_from_default_group() {
  189. UserDto user = db.users().insertUser();
  190. GroupDto defaultGroup = db.users().insertDefaultGroup();
  191. db.users().insertMember(defaultGroup, user);
  192. loginAsAdmin();
  193. expectedException.expect(IllegalArgumentException.class);
  194. expectedException.expectMessage("Default group 'sonar-users' cannot be used to perform this action");
  195. newRequest()
  196. .setParam("id", defaultGroup.getUuid())
  197. .setParam(PARAM_LOGIN, user.getLogin())
  198. .execute();
  199. }
  200. private TestRequest newRequest() {
  201. return ws.newRequest();
  202. }
  203. private void loginAsAdmin() {
  204. userSession.logIn("admin").addPermission(ADMINISTER);
  205. }
  206. private void insertAnAdministrator() {
  207. db.users().insertAdminByUserPermission();
  208. }
  209. private void insertDefaultGroup() {
  210. db.users().insertDefaultGroup();
  211. }
  212. }