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.

UsersActionTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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.server.ws.Change;
  25. import org.sonar.api.server.ws.WebService.Action;
  26. import org.sonar.api.server.ws.WebService.Param;
  27. import org.sonar.api.server.ws.WebService.SelectionMode;
  28. import org.sonar.api.utils.System2;
  29. import org.sonar.db.DbTester;
  30. import org.sonar.db.organization.OrganizationDto;
  31. import org.sonar.db.user.GroupDto;
  32. import org.sonar.db.user.UserDto;
  33. import org.sonar.server.exceptions.ForbiddenException;
  34. import org.sonar.server.exceptions.NotFoundException;
  35. import org.sonar.server.organization.TestDefaultOrganizationProvider;
  36. import org.sonar.server.tester.UserSessionRule;
  37. import org.sonar.server.usergroups.DefaultGroupFinder;
  38. import org.sonar.server.ws.TestRequest;
  39. import org.sonar.server.ws.WsActionTester;
  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.db.user.UserTesting.newUserDto;
  44. import static org.sonar.server.usergroups.ws.GroupWsSupport.PARAM_GROUP_ID;
  45. import static org.sonar.test.JsonAssert.assertJson;
  46. public class UsersActionTest {
  47. @Rule
  48. public ExpectedException expectedException = ExpectedException.none();
  49. @Rule
  50. public DbTester db = DbTester.create(System2.INSTANCE);
  51. @Rule
  52. public UserSessionRule userSession = UserSessionRule.standalone();
  53. private final WsActionTester ws = new WsActionTester(
  54. new UsersAction(db.getDbClient(), userSession, new GroupWsSupport(db.getDbClient(), new DefaultGroupFinder(db.getDbClient()))));
  55. @Test
  56. public void verify_definition() {
  57. Action wsDef = ws.getDef();
  58. assertThat(wsDef.isInternal()).isFalse();
  59. assertThat(wsDef.since()).isEqualTo("5.2");
  60. assertThat(wsDef.isPost()).isFalse();
  61. assertThat(wsDef.changelog()).extracting(Change::getVersion, Change::getDescription).containsOnly(
  62. tuple("8.4", "Parameter 'id' is deprecated. Format changes from integer to string. Use 'name' instead."));
  63. }
  64. @Test
  65. public void fail_if_unknown_group_uuid() {
  66. loginAsAdmin();
  67. expectedException.expect(NotFoundException.class);
  68. expectedException.expectMessage("No group with id '42'");
  69. newUsersRequest()
  70. .setParam("id", "42")
  71. .setParam("login", "john").execute();
  72. }
  73. @Test
  74. public void fail_if_not_admin() {
  75. GroupDto group = db.users().insertGroup();
  76. userSession.logIn("not-admin");
  77. expectedException.expect(ForbiddenException.class);
  78. newUsersRequest()
  79. .setParam("id", group.getUuid())
  80. .setParam("login", "john").execute();
  81. }
  82. @Test
  83. public void group_has_no_users() {
  84. GroupDto group = db.users().insertGroup();
  85. loginAsAdmin();
  86. String result = newUsersRequest()
  87. .setParam("login", "john")
  88. .setParam("id", group.getUuid())
  89. .execute()
  90. .getInput();
  91. assertJson(result).isSimilarTo("{\n" +
  92. " \"p\": 1,\n" +
  93. " \"total\": 0,\n" +
  94. " \"users\": []\n" +
  95. "}");
  96. }
  97. @Test
  98. public void return_members_by_group_uuid() {
  99. GroupDto group = db.users().insertGroup();
  100. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace"));
  101. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  102. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  103. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  104. db.users().insertMember(group, lovelace);
  105. loginAsAdmin();
  106. String result = newUsersRequest()
  107. .setParam("id", group.getUuid())
  108. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  109. .execute()
  110. .getInput();
  111. assertJson(result).isSimilarTo("{\n" +
  112. " \"users\": [\n" +
  113. " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
  114. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  115. " ]\n" +
  116. "}\n");
  117. }
  118. @Test
  119. public void references_group_by_its_name() {
  120. OrganizationDto org = db.organizations().insert();
  121. GroupDto group = db.users().insertGroup("the-group");
  122. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace"));
  123. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  124. db.users().insertMember(group, lovelace);
  125. db.organizations().addMember(org, lovelace);
  126. db.organizations().addMember(org, hopper);
  127. loginAsAdmin();
  128. String result = newUsersRequest()
  129. .setParam("organization", org.getKey())
  130. .setParam("name", group.getName())
  131. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  132. .execute()
  133. .getInput();
  134. assertJson(result).isSimilarTo("{\n" +
  135. " \"users\": [\n" +
  136. " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
  137. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  138. " ]\n" +
  139. "}\n");
  140. }
  141. @Test
  142. public void references_group_in_default_organization_by_its_name() {
  143. GroupDto group = db.users().insertGroup();
  144. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace"));
  145. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  146. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  147. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  148. db.users().insertMember(group, lovelace);
  149. loginAsAdmin();
  150. String result = newUsersRequest()
  151. .setParam("name", group.getName())
  152. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  153. .execute()
  154. .getInput();
  155. assertJson(result).isSimilarTo("{\n" +
  156. " \"users\": [\n" +
  157. " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
  158. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  159. " ]\n" +
  160. "}\n");
  161. }
  162. @Test
  163. public void filter_members_by_name() {
  164. GroupDto group = db.users().insertGroup("a group");
  165. UserDto adaLovelace = db.users().insertUser(newUserDto().setLogin("ada").setName("Ada Lovelace"));
  166. db.organizations().addMember(db.getDefaultOrganization(), adaLovelace);
  167. UserDto graceHopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  168. db.organizations().addMember(db.getDefaultOrganization(), graceHopper);
  169. db.users().insertMember(group, adaLovelace);
  170. db.users().insertMember(group, graceHopper);
  171. loginAsAdmin();
  172. String response = newUsersRequest().setParam(PARAM_GROUP_ID, group.getUuid()).execute().getInput();
  173. assertThat(response).contains("Ada Lovelace", "Grace Hopper");
  174. }
  175. @Test
  176. public void selected_users() {
  177. GroupDto group = db.users().insertGroup("a group");
  178. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada").setName("Ada Lovelace"));
  179. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  180. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  181. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  182. db.users().insertMember(group, lovelace);
  183. loginAsAdmin();
  184. assertJson(newUsersRequest()
  185. .setParam("id", group.getUuid())
  186. .execute()
  187. .getInput()).isSimilarTo("{\n" +
  188. " \"users\": [\n" +
  189. " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
  190. " ]\n" +
  191. "}");
  192. assertJson(newUsersRequest()
  193. .setParam("id", group.getUuid())
  194. .setParam(Param.SELECTED, SelectionMode.SELECTED.value())
  195. .execute()
  196. .getInput()).isSimilarTo("{\n" +
  197. " \"users\": [\n" +
  198. " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
  199. " ]\n" +
  200. "}");
  201. }
  202. @Test
  203. public void deselected_users() {
  204. GroupDto group = db.users().insertGroup();
  205. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada").setName("Ada Lovelace"));
  206. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  207. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  208. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  209. db.users().insertMember(group, lovelace);
  210. loginAsAdmin();
  211. String result = newUsersRequest()
  212. .setParam("id", group.getUuid())
  213. .setParam(Param.SELECTED, SelectionMode.DESELECTED.value())
  214. .execute()
  215. .getInput();
  216. assertJson(result).isSimilarTo("{\n" +
  217. " \"users\": [\n" +
  218. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  219. " ]\n" +
  220. "}");
  221. }
  222. @Test
  223. public void paging() {
  224. GroupDto group = db.users().insertGroup();
  225. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada").setName("Ada Lovelace"));
  226. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  227. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper"));
  228. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  229. db.users().insertMember(group, lovelace);
  230. loginAsAdmin();
  231. assertJson(newUsersRequest()
  232. .setParam("id", group.getUuid())
  233. .setParam("ps", "1")
  234. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  235. .execute()
  236. .getInput()).isSimilarTo("{\n" +
  237. " \"p\": 1,\n" +
  238. " \"ps\": 1,\n" +
  239. " \"total\": 2,\n" +
  240. " \"users\": [\n" +
  241. " {\"login\": \"ada\", \"name\": \"Ada Lovelace\", \"selected\": true}\n" +
  242. " ]\n" +
  243. "}");
  244. assertJson(newUsersRequest()
  245. .setParam("id", group.getUuid())
  246. .setParam("ps", "1")
  247. .setParam("p", "2")
  248. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  249. .execute()
  250. .getInput()).isSimilarTo("{\n" +
  251. " \"p\": 2,\n" +
  252. " \"ps\": 1,\n" +
  253. " \"total\": 2,\n" +
  254. " \"users\": [\n" +
  255. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  256. " ]\n" +
  257. "}");
  258. }
  259. @Test
  260. public void filtering_by_name_email_and_login() {
  261. GroupDto group = db.users().insertGroup();
  262. UserDto lovelace = db.users().insertUser(newUserDto().setLogin("ada.login").setName("Ada Lovelace").setEmail("ada@email.com"));
  263. db.organizations().addMember(db.getDefaultOrganization(), lovelace);
  264. UserDto hopper = db.users().insertUser(newUserDto().setLogin("grace").setName("Grace Hopper").setEmail("grace@hopper.com"));
  265. db.organizations().addMember(db.getDefaultOrganization(), hopper);
  266. db.users().insertMember(group, lovelace);
  267. loginAsAdmin();
  268. assertJson(newUsersRequest()
  269. .setParam("id", group.getUuid())
  270. .setParam("q", "ace")
  271. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  272. .execute()
  273. .getInput()).isSimilarTo("{\n" +
  274. " \"users\": [\n" +
  275. " {\"login\": \"ada.login\", \"name\": \"Ada Lovelace\", \"selected\": true},\n" +
  276. " {\"login\": \"grace\", \"name\": \"Grace Hopper\", \"selected\": false}\n" +
  277. " ]\n" +
  278. "}\n");
  279. assertJson(newUsersRequest().setParam("id", group.getUuid())
  280. .setParam("q", ".logi")
  281. .execute()
  282. .getInput()).isSimilarTo("{\n" +
  283. " \"users\": [\n" +
  284. " {\n" +
  285. " \"login\": \"ada.login\",\n" +
  286. " \"name\": \"Ada Lovelace\",\n" +
  287. " \"selected\": true\n" +
  288. " }\n" +
  289. " ]\n" +
  290. "}\n");
  291. assertJson(newUsersRequest().setParam("id", group.getUuid())
  292. .setParam("q", "OvE")
  293. .execute()
  294. .getInput()).isSimilarTo("{\n" +
  295. " \"users\": [\n" +
  296. " {\n" +
  297. " \"login\": \"ada.login\",\n" +
  298. " \"name\": \"Ada Lovelace\",\n" +
  299. " \"selected\": true\n" +
  300. " }\n" +
  301. " ]\n" +
  302. "}\n");
  303. assertJson(newUsersRequest().setParam("id", group.getUuid())
  304. .setParam("q", "mail")
  305. .execute()
  306. .getInput()).isSimilarTo("{\n" +
  307. " \"users\": [\n" +
  308. " {\n" +
  309. " \"login\": \"ada.login\",\n" +
  310. " \"name\": \"Ada Lovelace\",\n" +
  311. " \"selected\": true\n" +
  312. " }\n" +
  313. " ]\n" +
  314. "}\n");
  315. }
  316. @Test
  317. public void test_example() {
  318. GroupDto group = db.users().insertGroup();
  319. UserDto admin = db.users().insertUser(newUserDto().setLogin("admin").setName("Administrator"));
  320. db.users().insertMember(group, admin);
  321. db.organizations().addMember(db.getDefaultOrganization(), admin);
  322. UserDto george = db.users().insertUser(newUserDto().setLogin("george.orwell").setName("George Orwell"));
  323. db.users().insertMember(group, george);
  324. db.organizations().addMember(db.getDefaultOrganization(), george);
  325. loginAsAdmin();
  326. String result = newUsersRequest()
  327. .setParam("id", group.getUuid())
  328. .setParam(Param.SELECTED, SelectionMode.ALL.value())
  329. .execute()
  330. .getInput();
  331. assertJson(result).isSimilarTo(ws.getDef().responseExampleAsString());
  332. }
  333. private TestRequest newUsersRequest() {
  334. return ws.newRequest();
  335. }
  336. private void loginAsAdmin() {
  337. userSession.logIn().addPermission(ADMINISTER);
  338. }
  339. }