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.

UpdateActionTest.java 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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.user.ws;
  21. import java.util.Arrays;
  22. import org.junit.Before;
  23. import org.junit.Rule;
  24. import org.junit.Test;
  25. import org.junit.rules.ExpectedException;
  26. import org.sonar.api.config.internal.MapSettings;
  27. import org.sonar.api.server.ws.WebService;
  28. import org.sonar.api.utils.System2;
  29. import org.sonar.db.DbClient;
  30. import org.sonar.db.DbSession;
  31. import org.sonar.db.DbTester;
  32. import org.sonar.db.user.UserDto;
  33. import org.sonar.server.authentication.CredentialsLocalAuthentication;
  34. import org.sonar.server.es.EsTester;
  35. import org.sonar.server.exceptions.ForbiddenException;
  36. import org.sonar.server.exceptions.NotFoundException;
  37. import org.sonar.server.organization.DefaultOrganizationProvider;
  38. import org.sonar.server.organization.OrganizationUpdater;
  39. import org.sonar.server.organization.TestDefaultOrganizationProvider;
  40. import org.sonar.server.organization.TestOrganizationFlags;
  41. import org.sonar.server.tester.UserSessionRule;
  42. import org.sonar.server.user.NewUserNotifier;
  43. import org.sonar.server.user.UserUpdater;
  44. import org.sonar.server.user.index.UserIndexer;
  45. import org.sonar.server.usergroups.DefaultGroupFinder;
  46. import org.sonar.server.ws.WsActionTester;
  47. import static com.google.common.collect.Lists.newArrayList;
  48. import static java.util.Collections.singletonList;
  49. import static org.assertj.core.api.Assertions.assertThat;
  50. import static org.mockito.Mockito.mock;
  51. import static org.sonar.db.user.UserTesting.newUserDto;
  52. public class UpdateActionTest {
  53. private static final OrganizationUpdater ORGANIZATION_CREATION_NOT_USED_FOR_UPDATE = null;
  54. private MapSettings settings = new MapSettings();
  55. private System2 system2 = new System2();
  56. @Rule
  57. public DbTester db = DbTester.create(system2);
  58. @Rule
  59. public EsTester es = EsTester.create();
  60. @Rule
  61. public UserSessionRule userSession = UserSessionRule.standalone().logIn().setSystemAdministrator();
  62. @Rule
  63. public ExpectedException expectedException = ExpectedException.none();
  64. private DbClient dbClient = db.getDbClient();
  65. private DbSession dbSession = db.getSession();
  66. private UserIndexer userIndexer = new UserIndexer(dbClient, es.client());
  67. private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(db);
  68. private TestOrganizationFlags organizationFlags = TestOrganizationFlags.standalone();
  69. private CredentialsLocalAuthentication localAuthentication = new CredentialsLocalAuthentication(db.getDbClient());
  70. private WsActionTester ws = new WsActionTester(new UpdateAction(
  71. new UserUpdater(system2, mock(NewUserNotifier.class), dbClient, userIndexer, organizationFlags, defaultOrganizationProvider, ORGANIZATION_CREATION_NOT_USED_FOR_UPDATE,
  72. new DefaultGroupFinder(db.getDbClient()), settings.asConfig(), localAuthentication),
  73. userSession, new UserJsonWriter(userSession), dbClient));
  74. @Before
  75. public void setUp() {
  76. db.users().insertDefaultGroup(db.getDefaultOrganization(), "sonar-users");
  77. }
  78. @Test
  79. public void update_user() {
  80. createUser();
  81. ws.newRequest()
  82. .setParam("login", "john")
  83. .setParam("name", "Jon Snow")
  84. .setParam("email", "jon.snow@thegreatw.all")
  85. .setParam("scmAccounts", "jon.snow")
  86. .execute()
  87. .assertJson(getClass(), "update_user.json");
  88. }
  89. @Test
  90. public void update_only_name() {
  91. createUser();
  92. ws.newRequest()
  93. .setParam("login", "john")
  94. .setParam("name", "Jon Snow")
  95. .execute()
  96. .assertJson(getClass(), "update_name.json");
  97. }
  98. @Test
  99. public void update_only_email() {
  100. createUser();
  101. ws.newRequest()
  102. .setParam("login", "john")
  103. .setParam("email", "jon.snow@thegreatw.all")
  104. .execute()
  105. .assertJson(getClass(), "update_email.json");
  106. }
  107. @Test
  108. public void blank_email_is_updated_to_null() {
  109. createUser();
  110. ws.newRequest()
  111. .setParam("login", "john")
  112. .setParam("email", "")
  113. .execute()
  114. .assertJson(getClass(), "blank_email_is_updated_to_null.json");
  115. UserDto userDto = dbClient.userDao().selectByLogin(dbSession, "john");
  116. assertThat(userDto.getEmail()).isNull();
  117. }
  118. @Test
  119. public void remove_scm_accounts() {
  120. createUser();
  121. ws.newRequest()
  122. .setParam("login", "john")
  123. .setMultiParam("scmAccount", singletonList(""))
  124. .execute();
  125. UserDto userDto = dbClient.userDao().selectByLogin(dbSession, "john");
  126. assertThat(userDto.getScmAccounts()).isNull();
  127. }
  128. @Test
  129. public void update_only_scm_accounts() {
  130. createUser();
  131. ws.newRequest()
  132. .setParam("login", "john")
  133. .setMultiParam("scmAccount", singletonList("jon.snow"))
  134. .execute()
  135. .assertJson(getClass(), "update_scm_accounts.json");
  136. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  137. assertThat(user.getScmAccountsAsList()).containsOnly("jon.snow");
  138. }
  139. @Test
  140. public void update_scm_account_having_coma() {
  141. createUser();
  142. ws.newRequest()
  143. .setParam("login", "john")
  144. .setMultiParam("scmAccount", singletonList("jon,snow"))
  145. .execute();
  146. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  147. assertThat(user.getScmAccountsAsList()).containsOnly("jon,snow");
  148. }
  149. @Test
  150. public void update_scm_account_ignores_duplicates() {
  151. createUser();
  152. ws.newRequest()
  153. .setParam("login", "john")
  154. .setMultiParam("scmAccount", Arrays.asList("jon.snow", "jon.snow", "jon.jon", "jon.snow"))
  155. .execute();
  156. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  157. assertThat(user.getScmAccountsAsList()).containsExactlyInAnyOrder("jon.jon", "jon.snow");
  158. }
  159. @Test
  160. public void update_scm_account_ordered_case_insensitive() {
  161. createUser();
  162. ws.newRequest()
  163. .setParam("login", "john")
  164. .setMultiParam("scmAccount", Arrays.asList("jon.3", "Jon.1", "JON.2"))
  165. .execute();
  166. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  167. assertThat(user.getScmAccountsAsList()).containsExactly("Jon.1", "JON.2", "jon.3");
  168. }
  169. @Test
  170. public void update_only_scm_accounts_with_deprecated_scmAccounts_parameter() {
  171. createUser();
  172. ws.newRequest()
  173. .setParam("login", "john")
  174. .setParam("scmAccounts", "jon.snow")
  175. .execute()
  176. .assertJson(getClass(), "update_scm_accounts.json");
  177. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  178. assertThat(user.getScmAccountsAsList()).containsOnly("jon.snow");
  179. }
  180. @Test
  181. public void update_only_scm_accounts_with_deprecated_scm_accounts_parameter() {
  182. createUser();
  183. ws.newRequest()
  184. .setParam("login", "john")
  185. .setParam("scm_accounts", "jon.snow")
  186. .execute()
  187. .assertJson(getClass(), "update_scm_accounts.json");
  188. UserDto user = dbClient.userDao().selectByLogin(dbSession, "john");
  189. assertThat(user.getScmAccountsAsList()).containsOnly("jon.snow");
  190. }
  191. @Test
  192. public void fail_on_missing_permission() {
  193. createUser();
  194. userSession.logIn("polop");
  195. expectedException.expect(ForbiddenException.class);
  196. ws.newRequest()
  197. .setParam("login", "john")
  198. .execute();
  199. }
  200. @Test
  201. public void fail_on_unknown_user() {
  202. expectedException.expect(NotFoundException.class);
  203. expectedException.expectMessage("User 'john' doesn't exist");
  204. ws.newRequest()
  205. .setParam("login", "john")
  206. .execute();
  207. }
  208. @Test
  209. public void fail_on_disabled_user() {
  210. db.users().insertUser(u -> u.setLogin("john").setActive(false));
  211. expectedException.expect(NotFoundException.class);
  212. expectedException.expectMessage("User 'john' doesn't exist");
  213. ws.newRequest()
  214. .setParam("login", "john")
  215. .execute();
  216. }
  217. @Test
  218. public void fail_on_invalid_email() {
  219. createUser();
  220. expectedException.expect(IllegalArgumentException.class);
  221. expectedException.expectMessage("Email 'invalid-email' is not valid");
  222. ws.newRequest()
  223. .setParam("login", "john")
  224. .setParam("email", "invalid-email")
  225. .execute();
  226. }
  227. @Test
  228. public void test_definition() {
  229. WebService.Action action = ws.getDef();
  230. assertThat(action).isNotNull();
  231. assertThat(action.isPost()).isTrue();
  232. assertThat(action.params()).hasSize(5);
  233. }
  234. private void createUser() {
  235. UserDto userDto = newUserDto()
  236. .setEmail("john@email.com")
  237. .setLogin("john")
  238. .setName("John")
  239. .setScmAccounts(newArrayList("jn"))
  240. .setActive(true)
  241. .setLocal(true)
  242. .setExternalLogin("jo")
  243. .setExternalIdentityProvider("sonarqube");
  244. dbClient.userDao().insert(dbSession, userDto);
  245. userIndexer.commitAndIndex(dbSession, userDto);
  246. }
  247. }