選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

UserTester.java 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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.sonarqube.ws.tester;
  21. import com.google.common.collect.MoreCollectors;
  22. import java.util.List;
  23. import java.util.Optional;
  24. import java.util.concurrent.atomic.AtomicInteger;
  25. import java.util.function.Consumer;
  26. import java.util.function.Predicate;
  27. import javax.annotation.Nullable;
  28. import org.sonarqube.ws.UserTokens;
  29. import org.sonarqube.ws.Users;
  30. import org.sonarqube.ws.Users.CreateWsResponse.User;
  31. import org.sonarqube.ws.client.PostRequest;
  32. import org.sonarqube.ws.client.WsResponse;
  33. import org.sonarqube.ws.client.usergroups.AddUserRequest;
  34. import org.sonarqube.ws.client.users.ChangePasswordRequest;
  35. import org.sonarqube.ws.client.users.CreateRequest;
  36. import org.sonarqube.ws.client.users.SearchRequest;
  37. import org.sonarqube.ws.client.users.UpdateIdentityProviderRequest;
  38. import org.sonarqube.ws.client.users.UpdateRequest;
  39. import org.sonarqube.ws.client.users.UsersService;
  40. import org.sonarqube.ws.client.usertokens.GenerateRequest;
  41. import static java.util.Arrays.stream;
  42. public class UserTester {
  43. private static final AtomicInteger ID_GENERATOR = new AtomicInteger();
  44. private final TesterSession session;
  45. UserTester(TesterSession session) {
  46. this.session = session;
  47. }
  48. void deleteAll() {
  49. session.wsClient().users().search(new SearchRequest()).getUsersList()
  50. .stream()
  51. .filter(u -> !"admin".equals(u.getLogin()))
  52. .forEach(u -> {
  53. PostRequest request = new PostRequest("api/users/deactivate").setParam("login", u.getLogin());
  54. try (final WsResponse response = session.wsClient().wsConnector().call(request)) {
  55. response.failIfNotSuccessful();
  56. }
  57. });
  58. }
  59. public final String generateToken(String login) {
  60. int id = ID_GENERATOR.getAndIncrement();
  61. String name = "token" + id;
  62. session.wsClient().userTokens().generate(new GenerateRequest().setLogin(login).setName(name));
  63. return name;
  64. }
  65. public final String generateToken(String login, String type, @Nullable String projectKey) {
  66. int id = ID_GENERATOR.getAndIncrement();
  67. String name = "token" + id;
  68. UserTokens.GenerateWsResponse response = session.wsClient().userTokens()
  69. .generate(new GenerateRequest().setLogin(login).setName(name).setType(type).setProjectKey(projectKey));
  70. return response.getToken();
  71. }
  72. public final String generateToken(String login, Consumer<GenerateRequest>... populators) {
  73. int id = ID_GENERATOR.getAndIncrement();
  74. String name = "token" + id;
  75. GenerateRequest generateRequest = new GenerateRequest()
  76. .setName(name)
  77. .setLogin(login);
  78. stream(populators).forEach(p -> p.accept(generateRequest));
  79. UserTokens.GenerateWsResponse response = session.wsClient().userTokens()
  80. .generate(generateRequest);
  81. return response.getToken();
  82. }
  83. @SafeVarargs
  84. public final User generate(Consumer<CreateRequest>... populators) {
  85. int id = ID_GENERATOR.getAndIncrement();
  86. String login = "login" + id;
  87. CreateRequest request = new CreateRequest()
  88. .setLogin(login)
  89. .setPassword(login)
  90. .setName("name" + id)
  91. .setEmail(id + "@test.com");
  92. stream(populators).forEach(p -> p.accept(request));
  93. return service().create(request).getUser();
  94. }
  95. @SafeVarargs
  96. public final User generateApplicationCreator(Consumer<CreateRequest>... populators) {
  97. User u = generate(populators);
  98. session.wsClient().permissions().addUser(
  99. new org.sonarqube.ws.client.permissions.AddUserRequest()
  100. .setLogin(u.getLogin())
  101. .setPermission("applicationcreator"));
  102. return u;
  103. }
  104. @SafeVarargs
  105. public final User generatePortfolioCreator(Consumer<CreateRequest>... populators) {
  106. User u = generate(populators);
  107. session.wsClient().permissions().addUser(
  108. new org.sonarqube.ws.client.permissions.AddUserRequest()
  109. .setLogin(u.getLogin())
  110. .setPermission("portfoliocreator"));
  111. return u;
  112. }
  113. /**
  114. * For standalone mode only
  115. */
  116. @SafeVarargs
  117. public final User generateAdministrator(Consumer<CreateRequest>... populators) {
  118. User user = generate(populators);
  119. session.wsClient().permissions().addUser(new org.sonarqube.ws.client.permissions.AddUserRequest().setLogin(user.getLogin()).setPermission("admin"));
  120. session.wsClient().userGroups().addUser(new AddUserRequest().setLogin(user.getLogin()).setName("sonar-administrators"));
  121. return user;
  122. }
  123. public UsersService service() {
  124. return session.wsClient().users();
  125. }
  126. public Optional<Users.SearchWsResponse.User> getByExternalLogin(String externalLogin) {
  127. return getAllUsers().stream()
  128. .filter(user -> user.getExternalIdentity().equals(externalLogin))
  129. .collect(MoreCollectors.toOptional());
  130. }
  131. public List<Users.SearchWsResponse.User> getAllUsers() {
  132. return service().search(new SearchRequest()).getUsersList();
  133. }
  134. public Optional<Users.SearchWsResponse.User> getDeactivatedUserByExternalLogin(String externalLogin) {
  135. return getAllDeactivatedUsers().stream()
  136. .filter(user -> user.getExternalIdentity().equals(externalLogin))
  137. .collect(MoreCollectors.toOptional());
  138. }
  139. public List<Users.SearchWsResponse.User> getAllDeactivatedUsers() {
  140. return service().search(new SearchRequest().setDeactivated(true)).getUsersList();
  141. }
  142. public Optional<Users.SearchWsResponse.User> getByLogin(String login) {
  143. return queryForUser(login, t -> t.getLogin().equals(login));
  144. }
  145. public Optional<Users.SearchWsResponse.User> getByEmail(String email) {
  146. return queryForUser(email, t -> t.getEmail().equals(email));
  147. }
  148. public Optional<Users.SearchWsResponse.User> getByName(String name) {
  149. return queryForUser(name, t -> t.getName().equals(name));
  150. }
  151. public void changePassword(String login, String previousPassword, String newPassword) {
  152. service().changePassword(new ChangePasswordRequest().setLogin(login).setPreviousPassword(previousPassword).setPassword(newPassword));
  153. }
  154. private Optional<Users.SearchWsResponse.User> queryForUser(String login, Predicate<Users.SearchWsResponse.User> predicate) {
  155. List<Users.SearchWsResponse.User> users = session.wsClient().users().search(new SearchRequest().setQ(login)).getUsersList().stream()
  156. .filter(predicate).toList();
  157. if (users.size() == 1) {
  158. return Optional.of(users.get(0));
  159. }
  160. return Optional.empty();
  161. }
  162. public final String generateLogin() {
  163. int id = ID_GENERATOR.getAndIncrement();
  164. return "login" + id;
  165. }
  166. public final String generateProviderId() {
  167. int id = ID_GENERATOR.getAndIncrement();
  168. return "providerId" + id;
  169. }
  170. public final String generateEmail() {
  171. int id = ID_GENERATOR.getAndIncrement();
  172. return "email" + id + "@test.com";
  173. }
  174. public void updateIdentityProvider(String login, String externalProvider, @Nullable String externalIdentity) {
  175. session.wsClient().users().updateIdentityProvider(
  176. new UpdateIdentityProviderRequest()
  177. .setLogin(login)
  178. .setNewExternalProvider(externalProvider)
  179. .setNewExternalIdentity(externalIdentity));
  180. }
  181. public void update(String login, Consumer<UpdateRequest>... updaters) {
  182. UpdateRequest updateRequest = new UpdateRequest();
  183. updateRequest.setLogin(login);
  184. stream(updaters).forEach(p -> p.accept(updateRequest));
  185. session.wsClient().users().update(updateRequest);
  186. }
  187. }