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.

GroupMembershipDaoTest.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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.db.user;
  21. import com.google.common.collect.Multimap;
  22. import java.util.List;
  23. import org.junit.Before;
  24. import org.junit.Rule;
  25. import org.junit.Test;
  26. import org.sonar.db.DbTester;
  27. import org.sonar.db.organization.OrganizationDto;
  28. import static java.util.Arrays.asList;
  29. import static java.util.Collections.emptyList;
  30. import static org.assertj.core.api.Assertions.assertThat;
  31. import static org.assertj.core.data.MapEntry.entry;
  32. import static org.sonar.db.user.GroupMembershipQuery.IN;
  33. import static org.sonar.db.user.GroupMembershipQuery.OUT;
  34. import static org.sonar.db.user.GroupMembershipQuery.builder;
  35. public class GroupMembershipDaoTest {
  36. @Rule
  37. public DbTester db = DbTester.create();
  38. private OrganizationDto organizationDto;
  39. private UserDto user1;
  40. private UserDto user2;
  41. private UserDto user3;
  42. private GroupDto group1;
  43. private GroupDto group2;
  44. private GroupDto group3;
  45. private GroupMembershipDao underTest = db.getDbClient().groupMembershipDao();
  46. @Before
  47. public void setUp() {
  48. organizationDto = db.organizations().insert();
  49. user1 = db.users().insertUser(u -> u.setLogin("admin login").setName("Admin name").setEmail("admin@email.com"));
  50. user2 = db.users().insertUser(u -> u.setLogin("not.admin").setName("Not Admin").setEmail("Not Admin"));
  51. user3 = db.users().insertUser(u -> u.setLogin("inactive").setActive(false));
  52. group1 = db.users().insertGroup(organizationDto, "sonar-administrators");
  53. group2 = db.users().insertGroup(organizationDto, "sonar-users");
  54. group3 = db.users().insertGroup(organizationDto, "sonar-reviewers");
  55. db.organizations().addMember(organizationDto, user1);
  56. db.organizations().addMember(organizationDto, user2);
  57. }
  58. @Test
  59. public void count_groups() {
  60. db.users().insertMember(group1, user1);
  61. db.users().insertMember(group2, user1);
  62. db.users().insertMember(group3, user1);
  63. db.users().insertMember(group2, user2);
  64. // user1 is member of 3 groups
  65. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId())).isEqualTo(3);
  66. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user1.getId())).isZero();
  67. // user2 is member of 1 group on 3
  68. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user2.getId())).isEqualTo(1);
  69. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user2.getId())).isEqualTo(2);
  70. // user3 is member of 0 group
  71. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user3.getId())).isZero();
  72. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user3.getId())).isEqualTo(3);
  73. // unknown user is member of 0 group
  74. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), 999)).isZero();
  75. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), 999)).isEqualTo(3);
  76. }
  77. @Test
  78. public void count_groups_only_from_given_organization() {
  79. OrganizationDto otherOrganization = db.organizations().insert();
  80. GroupDto otherGroup = db.users().insertGroup(otherOrganization, "sonar-administrators-other_orga");
  81. db.users().insertMember(group1, user1);
  82. db.users().insertMember(otherGroup, user1);
  83. assertThat(underTest.countGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId())).isEqualTo(1);
  84. }
  85. @Test
  86. public void select_groups() {
  87. db.users().insertMember(group1, user1);
  88. db.users().insertMember(group2, user1);
  89. db.users().insertMember(group3, user1);
  90. db.users().insertMember(group2, user2);
  91. // user1 is member of 3 groups
  92. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId(), 0, 10)).hasSize(3);
  93. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user1.getId(), 0, 10)).isEmpty();
  94. // user2 is member of 1 group on 3
  95. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user2.getId(), 0, 10)).hasSize(1);
  96. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user2.getId(), 0, 10)).hasSize(2);
  97. // user3 is member of 0 group
  98. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user3.getId(), 0, 10)).isEmpty();
  99. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), user3.getId(), 0, 10)).hasSize(3);
  100. // unknown user is member of 0 group
  101. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), 999, 0, 10)).isEmpty();
  102. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(OUT).build(), 999, 0, 10)).hasSize(3);
  103. }
  104. @Test
  105. public void select_groups_only_from_given_organization() {
  106. OrganizationDto otherOrganization = db.organizations().insert();
  107. GroupDto otherGroup = db.users().insertGroup(otherOrganization, "sonar-administrators-other_orga");
  108. db.users().insertMember(group1, user1);
  109. db.users().insertMember(otherGroup, user1);
  110. assertThat(underTest.selectGroups(db.getSession(), builder().organizationUuid(organizationDto.getUuid()).membership(IN).build(), user1.getId(), 0, 10)).hasSize(1);
  111. }
  112. @Test
  113. public void count_users_by_group() {
  114. GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody");
  115. db.users().insertMember(group1, user1);
  116. db.users().insertMember(group2, user1);
  117. db.users().insertMember(group3, user1);
  118. db.users().insertMember(group2, user2);
  119. assertThat(underTest.countUsersByGroups(db.getSession(), asList(group1.getId(), group2.getId(), group3.getId(), emptyGroup.getId())))
  120. .containsOnly(entry(group1.getName(), 1), entry(group2.getName(), 2), entry(group3.getName(), 1), entry(emptyGroup.getName(), 0));
  121. assertThat(underTest.countUsersByGroups(db.getSession(), asList(group1.getId(), emptyGroup.getId())))
  122. .containsOnly(entry(group1.getName(), 1), entry(emptyGroup.getName(), 0));
  123. }
  124. @Test
  125. public void count_groups_by_logins() {
  126. db.users().insertMember(group1, user1);
  127. db.users().insertMember(group2, user1);
  128. db.users().insertMember(group3, user1);
  129. db.users().insertMember(group2, user2);
  130. assertThat(underTest.selectGroupsByLogins(db.getSession(), emptyList()).keys()).isEmpty();
  131. Multimap<String, String> groupsByLogin = underTest.selectGroupsByLogins(db.getSession(), asList(user1.getLogin(), user2.getLogin(), user3.getLogin()));
  132. assertThat(groupsByLogin.get(user1.getLogin())).containsOnly(group1.getName(), group2.getName(), group3.getName());
  133. assertThat(groupsByLogin.get(user2.getLogin())).containsOnly(group2.getName());
  134. assertThat(groupsByLogin.get(user3.getLogin())).isEmpty();
  135. }
  136. @Test
  137. public void count_members() {
  138. GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody");
  139. db.users().insertMember(group1, user1);
  140. db.users().insertMember(group2, user1);
  141. db.users().insertMember(group3, user1);
  142. db.users().insertMember(group2, user2);
  143. // 100 has 1 member and 1 non member
  144. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(1);
  145. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(1);
  146. // 101 has 2 members
  147. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(2);
  148. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.OUT).build())).isZero();
  149. // 102 has 1 member and 1 non member
  150. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.IN).build())).isEqualTo(1);
  151. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(1);
  152. // 103 has no member
  153. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.IN).build())).isZero();
  154. assertThat(underTest.countMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.OUT).build())).isEqualTo(2);
  155. }
  156. @Test
  157. public void select_group_members_by_query() {
  158. GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody");
  159. db.users().insertMember(group1, user1);
  160. db.users().insertMember(group2, user1);
  161. db.users().insertMember(group3, user1);
  162. db.users().insertMember(group2, user2);
  163. // 100 has 1 member
  164. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.IN).build(), 0, 10)).hasSize(1);
  165. // 101 has 2 members
  166. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.IN).build(), 0, 10)).hasSize(2);
  167. // 102 has 1 member
  168. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.IN).build(), 0, 10)).hasSize(1);
  169. // 103 has no member
  170. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.IN).build(), 0, 10)).isEmpty();
  171. }
  172. @Test
  173. public void select_users_not_affected_to_a_group_by_query() {
  174. GroupDto emptyGroup = db.users().insertGroup(organizationDto, "sonar-nobody");
  175. db.users().insertMember(group1, user1);
  176. db.users().insertMember(group2, user1);
  177. db.users().insertMember(group3, user1);
  178. db.users().insertMember(group2, user2);
  179. // 100 has 1 member
  180. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).membership(UserMembershipQuery.OUT).build(), 0, 10)).hasSize(1);
  181. // 101 has 2 members
  182. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group2.getId()).membership(UserMembershipQuery.OUT).build(), 0, 10)).isEmpty();
  183. // 102 has 1 member
  184. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(group3.getId()).membership(UserMembershipQuery.OUT).build(), 0, 10)).hasSize(1);
  185. // 103 has no member
  186. assertThat(underTest.selectMembers(db.getSession(), newQuery().groupId(emptyGroup.getId()).membership(UserMembershipQuery.OUT).build(), 0, 10)).hasSize(2);
  187. }
  188. @Test
  189. public void search_by_user_name_or_login() {
  190. db.users().insertMember(group1, user1);
  191. db.users().insertMember(group2, user1);
  192. db.users().insertMember(group3, user1);
  193. db.users().insertMember(group2, user2);
  194. List<UserMembershipDto> result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).memberSearch("admin").build(), 0, 10);
  195. assertThat(result).hasSize(2);
  196. assertThat(result.get(0).getName()).isEqualTo("Admin name");
  197. assertThat(result.get(1).getName()).isEqualTo("Not Admin");
  198. result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).memberSearch("not").build(), 0, 10);
  199. assertThat(result).hasSize(1);
  200. }
  201. @Test
  202. public void search_by_login_name_or_email() {
  203. db.users().insertMember(group1, user1);
  204. db.users().insertMember(group2, user1);
  205. db.users().insertMember(group3, user1);
  206. db.users().insertMember(group2, user2);
  207. // search is case insensitive only on name
  208. List<UserMembershipDto> result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).memberSearch("NaMe").build(), 0, 10);
  209. assertThat(result).hasSize(1);
  210. result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).memberSearch("login").build(), 0, 10);
  211. assertThat(result).hasSize(1);
  212. result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).memberSearch("email").build(), 0, 10);
  213. assertThat(result).hasSize(1);
  214. }
  215. @Test
  216. public void should_be_sorted_by_user_name() {
  217. db.users().insertMember(group1, user1);
  218. db.users().insertMember(group2, user1);
  219. db.users().insertMember(group3, user1);
  220. db.users().insertMember(group2, user2);
  221. List<UserMembershipDto> result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).build(), 0, 10);
  222. assertThat(result).hasSize(2);
  223. assertThat(result.get(0).getName()).isEqualTo("Admin name");
  224. assertThat(result.get(1).getName()).isEqualTo("Not Admin");
  225. }
  226. @Test
  227. public void members_should_be_paginated() {
  228. db.users().insertMember(group1, user1);
  229. db.users().insertMember(group2, user1);
  230. db.users().insertMember(group3, user1);
  231. db.users().insertMember(group2, user2);
  232. List<UserMembershipDto> result = underTest.selectMembers(db.getSession(), newQuery().groupId(group1.getId()).build(), 0, 2);
  233. assertThat(result).hasSize(2);
  234. assertThat(result.get(0).getName()).isEqualTo("Admin name");
  235. assertThat(result.get(1).getName()).isEqualTo("Not Admin");
  236. result = underTest.selectMembers(db.getSession(), newQuery().groupId(100).build(), 1, 2);
  237. assertThat(result).hasSize(1);
  238. assertThat(result.get(0).getName()).isEqualTo("Not Admin");
  239. result = underTest.selectMembers(db.getSession(), newQuery().groupId(100).build(), 2, 1);
  240. assertThat(result).isEmpty();
  241. }
  242. private UserMembershipQuery.Builder newQuery() {
  243. return UserMembershipQuery.builder().organizationUuid(organizationDto.getUuid());
  244. }
  245. }