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.

MemberUpdaterTest.java 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  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.organization;
  21. import com.google.common.collect.ImmutableSet;
  22. import java.util.HashSet;
  23. import javax.annotation.Nullable;
  24. import org.assertj.core.groups.Tuple;
  25. import org.elasticsearch.action.search.SearchRequestBuilder;
  26. import org.junit.Rule;
  27. import org.junit.Test;
  28. import org.junit.rules.ExpectedException;
  29. import org.sonar.api.utils.System2;
  30. import org.sonar.db.DbClient;
  31. import org.sonar.db.DbTester;
  32. import org.sonar.db.alm.AlmAppInstallDto;
  33. import org.sonar.db.component.ComponentDto;
  34. import org.sonar.db.organization.OrganizationDto;
  35. import org.sonar.db.permission.OrganizationPermission;
  36. import org.sonar.db.permission.template.PermissionTemplateDto;
  37. import org.sonar.db.permission.template.PermissionTemplateUserDto;
  38. import org.sonar.db.property.PropertyDto;
  39. import org.sonar.db.property.PropertyQuery;
  40. import org.sonar.db.user.GroupDto;
  41. import org.sonar.db.user.UserDto;
  42. import org.sonar.server.es.EsTester;
  43. import org.sonar.server.es.SearchOptions;
  44. import org.sonar.server.user.index.UserDoc;
  45. import org.sonar.server.user.index.UserIndex;
  46. import org.sonar.server.user.index.UserIndexDefinition;
  47. import org.sonar.server.user.index.UserIndexer;
  48. import org.sonar.server.user.index.UserQuery;
  49. import org.sonar.server.usergroups.DefaultGroupFinder;
  50. import static java.lang.String.format;
  51. import static java.util.Arrays.asList;
  52. import static java.util.Collections.singletonList;
  53. import static org.assertj.core.api.Assertions.assertThat;
  54. import static org.assertj.core.api.Assertions.tuple;
  55. import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
  56. import static org.elasticsearch.index.query.QueryBuilders.termQuery;
  57. import static org.sonar.api.CoreProperties.DEFAULT_ISSUE_ASSIGNEE;
  58. import static org.sonar.api.web.UserRole.CODEVIEWER;
  59. import static org.sonar.api.web.UserRole.USER;
  60. import static org.sonar.db.alm.ALM.GITHUB;
  61. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  62. import static org.sonar.db.permission.OrganizationPermission.SCAN;
  63. import static org.sonar.server.user.index.UserIndexDefinition.FIELD_ORGANIZATION_UUIDS;
  64. import static org.sonar.server.user.index.UserIndexDefinition.FIELD_UUID;
  65. public class MemberUpdaterTest {
  66. @Rule
  67. public ExpectedException expectedException = ExpectedException.none();
  68. @Rule
  69. public EsTester es = EsTester.create();
  70. @Rule
  71. public DbTester db = DbTester.create();
  72. private DbClient dbClient = db.getDbClient();
  73. private UserIndex userIndex = new UserIndex(es.client(), System2.INSTANCE);
  74. private UserIndexer userIndexer = new UserIndexer(dbClient, es.client());
  75. private MemberUpdater underTest = new MemberUpdater(dbClient, new DefaultGroupFinder(dbClient), userIndexer);
  76. @Test
  77. public void add_member_in_db_and_user_index() {
  78. OrganizationDto organization = db.organizations().insert();
  79. db.users().insertDefaultGroup(organization, "Members");
  80. UserDto user = db.users().insertUser();
  81. underTest.addMember(db.getSession(), organization, user);
  82. db.organizations().assertUserIsMemberOfOrganization(organization, user);
  83. assertThat(userIndex.search(UserQuery.builder().build(), new SearchOptions()).getDocs())
  84. .extracting(UserDoc::login, UserDoc::organizationUuids)
  85. .containsExactlyInAnyOrder(tuple(user.getLogin(), singletonList(organization.getUuid())));
  86. }
  87. @Test
  88. public void does_not_fail_to_add_member_if_user_already_added_in_organization() {
  89. OrganizationDto organization = db.organizations().insert();
  90. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  91. UserDto user = db.users().insertUser();
  92. db.organizations().addMember(organization, user);
  93. db.users().insertMember(defaultGroup, user);
  94. db.organizations().assertUserIsMemberOfOrganization(organization, user);
  95. underTest.addMember(db.getSession(), organization, user);
  96. db.organizations().assertUserIsMemberOfOrganization(organization, user);
  97. }
  98. @Test
  99. public void add_member_fails_when_organization_has_no_default_group() {
  100. OrganizationDto organization = db.organizations().insert();
  101. UserDto user = db.users().insertUser();
  102. expectedException.expect(IllegalStateException.class);
  103. expectedException.expectMessage(format("Default group cannot be found on organization '%s'", organization.getUuid()));
  104. underTest.addMember(db.getSession(), organization, user);
  105. }
  106. @Test
  107. public void add_members_in_db_and_user_index() {
  108. OrganizationDto organization = db.organizations().insert();
  109. db.users().insertDefaultGroup(organization, "Members");
  110. UserDto user1 = db.users().insertUser();
  111. UserDto user2 = db.users().insertUser();
  112. UserDto disableUser = db.users().insertDisabledUser();
  113. underTest.addMembers(db.getSession(), organization, asList(user1, user2, disableUser));
  114. db.organizations().assertUserIsMemberOfOrganization(organization, user1);
  115. db.organizations().assertUserIsMemberOfOrganization(organization, user2);
  116. assertUserIsNotMember(organization, disableUser);
  117. assertThat(userIndex.search(UserQuery.builder().build(), new SearchOptions()).getDocs())
  118. .extracting(UserDoc::login, UserDoc::organizationUuids)
  119. .containsExactlyInAnyOrder(
  120. tuple(user1.getLogin(), singletonList(organization.getUuid())),
  121. tuple(user2.getLogin(), singletonList(organization.getUuid())));
  122. }
  123. @Test
  124. public void add_members_does_not_fail_when_one_user_is_already_member_of_organization() {
  125. OrganizationDto organization = db.organizations().insert();
  126. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  127. UserDto userAlreadyMember = db.users().insertUser();
  128. db.organizations().addMember(organization, userAlreadyMember);
  129. db.users().insertMember(defaultGroup, userAlreadyMember);
  130. UserDto userNotMember = db.users().insertUser();
  131. userIndexer.indexOnStartup(new HashSet<>());
  132. underTest.addMembers(db.getSession(), organization, asList(userAlreadyMember, userNotMember));
  133. db.organizations().assertUserIsMemberOfOrganization(organization, userAlreadyMember);
  134. db.organizations().assertUserIsMemberOfOrganization(organization, userNotMember);
  135. assertThat(userIndex.search(UserQuery.builder().build(), new SearchOptions()).getDocs())
  136. .extracting(UserDoc::login, UserDoc::organizationUuids)
  137. .containsExactlyInAnyOrder(
  138. tuple(userAlreadyMember.getLogin(), singletonList(organization.getUuid())),
  139. tuple(userNotMember.getLogin(), singletonList(organization.getUuid())));
  140. }
  141. @Test
  142. public void remove_member_from_db_and_user_index() {
  143. OrganizationDto organization = db.organizations().insert();
  144. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  145. UserDto user = db.users().insertUser();
  146. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  147. db.organizations().addMember(organization, user, adminUser);
  148. db.users().insertMember(defaultGroup, user);
  149. userIndexer.indexOnStartup(new HashSet<>());
  150. underTest.removeMember(db.getSession(), organization, user);
  151. assertUserIsNotMember(organization, user);
  152. }
  153. @Test
  154. public void remove_members_from_db_and_user_index() {
  155. OrganizationDto organization = db.organizations().insert();
  156. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  157. UserDto user1 = db.users().insertUser();
  158. UserDto user2 = db.users().insertUser();
  159. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  160. db.organizations().addMember(organization, user1, user2, adminUser);
  161. db.users().insertMember(defaultGroup, user1);
  162. db.users().insertMember(defaultGroup, user2);
  163. db.users().insertMember(defaultGroup, adminUser);
  164. userIndexer.indexOnStartup(new HashSet<>());
  165. underTest.removeMembers(db.getSession(), organization, asList(user1, user2));
  166. assertUserIsNotMember(organization, user1);
  167. assertUserIsNotMember(organization, user2);
  168. db.organizations().assertUserIsMemberOfOrganization(organization, adminUser);
  169. }
  170. @Test
  171. public void remove_member_removes_permissions() {
  172. OrganizationDto organization = db.organizations().insert();
  173. ComponentDto project = db.components().insertPrivateProject(organization);
  174. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  175. UserDto user = db.users().insertUser();
  176. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  177. db.organizations().addMember(organization, user, adminUser);
  178. db.users().insertMember(defaultGroup, user);
  179. UserDto anotherUser = db.users().insertUser();
  180. OrganizationDto anotherOrganization = db.organizations().insert();
  181. ComponentDto anotherProject = db.components().insertPrivateProject(anotherOrganization);
  182. userIndexer.indexOnStartup(new HashSet<>());
  183. db.users().insertPermissionOnUser(organization, user, ADMINISTER);
  184. db.users().insertPermissionOnUser(organization, user, SCAN);
  185. db.users().insertPermissionOnUser(anotherOrganization, user, ADMINISTER);
  186. db.users().insertPermissionOnUser(anotherOrganization, user, SCAN);
  187. db.users().insertPermissionOnUser(organization, anotherUser, ADMINISTER);
  188. db.users().insertPermissionOnUser(organization, anotherUser, SCAN);
  189. db.users().insertProjectPermissionOnUser(user, CODEVIEWER, project);
  190. db.users().insertProjectPermissionOnUser(user, USER, project);
  191. db.users().insertProjectPermissionOnUser(user, CODEVIEWER, anotherProject);
  192. db.users().insertProjectPermissionOnUser(user, USER, anotherProject);
  193. db.users().insertProjectPermissionOnUser(anotherUser, CODEVIEWER, project);
  194. db.users().insertProjectPermissionOnUser(anotherUser, USER, project);
  195. underTest.removeMember(db.getSession(), organization, user);
  196. assertUserIsNotMember(organization, user);
  197. assertOrgPermissionsOfUser(user, organization);
  198. assertOrgPermissionsOfUser(user, anotherOrganization, ADMINISTER, SCAN);
  199. assertOrgPermissionsOfUser(anotherUser, organization, ADMINISTER, SCAN);
  200. assertProjectPermissionsOfUser(user, project);
  201. assertProjectPermissionsOfUser(user, anotherProject, CODEVIEWER, USER);
  202. assertProjectPermissionsOfUser(anotherUser, project, CODEVIEWER, USER);
  203. }
  204. @Test
  205. public void remove_member_removes_template_permissions() {
  206. OrganizationDto organization = db.organizations().insert();
  207. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  208. UserDto user = db.users().insertUser();
  209. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  210. db.organizations().addMember(organization, user, adminUser);
  211. db.users().insertMember(defaultGroup, user);
  212. userIndexer.indexOnStartup(new HashSet<>());
  213. OrganizationDto anotherOrganization = db.organizations().insert();
  214. UserDto anotherUser = db.users().insertUser();
  215. PermissionTemplateDto template = db.permissionTemplates().insertTemplate(organization);
  216. PermissionTemplateDto anotherTemplate = db.permissionTemplates().insertTemplate(anotherOrganization);
  217. String permission = "browse";
  218. db.permissionTemplates().addUserToTemplate(template.getUuid(), user.getUuid(), permission);
  219. db.permissionTemplates().addUserToTemplate(template.getUuid(), anotherUser.getUuid(), permission);
  220. db.permissionTemplates().addUserToTemplate(anotherTemplate.getUuid(), user.getUuid(), permission);
  221. underTest.removeMember(db.getSession(), organization, user);
  222. assertThat(dbClient.permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), template.getUuid())).extracting(PermissionTemplateUserDto::getUserUuid)
  223. .containsOnly(anotherUser.getUuid());
  224. assertThat(dbClient.permissionTemplateDao().selectUserPermissionsByTemplateId(db.getSession(), anotherTemplate.getUuid())).extracting(PermissionTemplateUserDto::getUserUuid)
  225. .containsOnly(user.getUuid());
  226. }
  227. @Test
  228. public void remove_member_removes_user_from_organization_groups() {
  229. OrganizationDto organization = db.organizations().insert();
  230. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  231. UserDto user = db.users().insertUser();
  232. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  233. db.organizations().addMember(organization, user, adminUser);
  234. db.users().insertMember(defaultGroup, user);
  235. userIndexer.indexOnStartup(new HashSet<>());
  236. OrganizationDto anotherOrganization = db.organizations().insert();
  237. UserDto anotherUser = db.users().insertUser();
  238. GroupDto group = db.users().insertGroup(organization);
  239. GroupDto anotherGroup = db.users().insertGroup(anotherOrganization);
  240. db.users().insertMembers(group, user, anotherUser);
  241. db.users().insertMembers(anotherGroup, user, anotherUser);
  242. underTest.removeMember(db.getSession(), organization, user);
  243. assertThat(dbClient.groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), user.getUuid()))
  244. .containsOnly(anotherGroup.getUuid());
  245. assertThat(dbClient.groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), anotherUser.getUuid()))
  246. .containsOnly(group.getUuid(), anotherGroup.getUuid());
  247. }
  248. @Test
  249. public void remove_member_removes_user_from_default_organization_group() {
  250. OrganizationDto organization = db.organizations().insert();
  251. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  252. UserDto user = db.users().insertUser();
  253. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  254. db.organizations().addMember(organization, user, adminUser);
  255. db.users().insertMember(defaultGroup, user);
  256. userIndexer.indexOnStartup(new HashSet<>());
  257. underTest.removeMember(db.getSession(), organization, user);
  258. assertThat(dbClient.groupMembershipDao().selectGroupUuidsByUserUuid(db.getSession(), user.getUuid())).isEmpty();
  259. }
  260. @Test
  261. public void remove_member_removes_user_from_org_properties() {
  262. OrganizationDto organization = db.organizations().insert();
  263. ComponentDto project = db.components().insertPrivateProject(organization);
  264. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  265. UserDto user = db.users().insertUser();
  266. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  267. db.organizations().addMember(organization, user, adminUser);
  268. db.users().insertMember(defaultGroup, user);
  269. userIndexer.indexOnStartup(new HashSet<>());
  270. OrganizationDto anotherOrganization = db.organizations().insert();
  271. ComponentDto anotherProject = db.components().insertPrivateProject(anotherOrganization);
  272. UserDto anotherUser = db.users().insertUser();
  273. insertProperty("KEY_11", "VALUE", project.uuid(), user.getUuid());
  274. insertProperty("KEY_12", "VALUE", project.uuid(), user.getUuid());
  275. insertProperty("KEY_11", "VALUE", project.uuid(), anotherUser.getUuid());
  276. insertProperty("KEY_11", "VALUE", anotherProject.uuid(), user.getUuid());
  277. underTest.removeMember(db.getSession(), organization, user);
  278. assertThat(dbClient.propertiesDao().selectByQuery(PropertyQuery.builder().setComponentUuid(project.uuid()).build(), db.getSession()))
  279. .hasSize(1).extracting(PropertyDto::getUserUuid).containsOnly(anotherUser.getUuid());
  280. assertThat(dbClient.propertiesDao().selectByQuery(PropertyQuery.builder().setComponentUuid(anotherProject.uuid()).build(), db.getSession()))
  281. .extracting(PropertyDto::getUserUuid)
  282. .hasSize(1).containsOnly(user.getUuid());
  283. }
  284. @Test
  285. public void remove_member_removes_user_from_default_assignee_properties() {
  286. OrganizationDto organization = db.organizations().insert();
  287. ComponentDto project = db.components().insertPrivateProject(organization);
  288. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  289. UserDto user = db.users().insertUser();
  290. UserDto adminUser = db.users().insertAdminByUserPermission(organization);
  291. db.organizations().addMember(organization, user, adminUser);
  292. db.users().insertMember(defaultGroup, user);
  293. userIndexer.indexOnStartup(new HashSet<>());
  294. OrganizationDto anotherOrganization = db.organizations().insert();
  295. ComponentDto anotherProject = db.components().insertPrivateProject(anotherOrganization);
  296. UserDto anotherUser = db.users().insertUser();
  297. insertProperty(DEFAULT_ISSUE_ASSIGNEE, user.getLogin(), project.uuid(), null);
  298. insertProperty("ANOTHER_KEY", user.getLogin(), project.uuid(), null);
  299. insertProperty(DEFAULT_ISSUE_ASSIGNEE, anotherUser.getLogin(), project.uuid(), null);
  300. insertProperty(DEFAULT_ISSUE_ASSIGNEE, user.getLogin(), anotherProject.uuid(), null);
  301. underTest.removeMember(db.getSession(), organization, user);
  302. assertThat(dbClient.propertiesDao().selectByQuery(PropertyQuery.builder().setComponentUuid(project.uuid()).build(), db.getSession()))
  303. .hasSize(2).extracting(PropertyDto::getKey, PropertyDto::getValue)
  304. .containsOnly(Tuple.tuple("ANOTHER_KEY", user.getLogin()), Tuple.tuple(DEFAULT_ISSUE_ASSIGNEE, anotherUser.getLogin()));
  305. assertThat(dbClient.propertiesDao().selectByQuery(PropertyQuery.builder().setComponentUuid(anotherProject.uuid()).build(), db.getSession())).extracting(PropertyDto::getValue)
  306. .hasSize(1).containsOnly(user.getLogin());
  307. }
  308. @Test
  309. public void fail_to_remove_members_when_no_more_admin() {
  310. OrganizationDto organization = db.organizations().insert();
  311. GroupDto defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  312. GroupDto adminGroup = db.users().insertGroup(organization);
  313. db.users().insertPermissionOnGroup(adminGroup, ADMINISTER);
  314. UserDto user1 = db.users().insertUser();
  315. UserDto admin1 = db.users().insertAdminByUserPermission(organization);
  316. UserDto admin2 = db.users().insertUser();
  317. db.organizations().addMember(organization, user1, admin1, admin2);
  318. db.users().insertMember(defaultGroup, user1);
  319. db.users().insertMember(defaultGroup, admin1);
  320. db.users().insertMember(defaultGroup, admin2);
  321. db.users().insertMember(adminGroup, admin2);
  322. userIndexer.indexOnStartup(new HashSet<>());
  323. expectedException.expect(IllegalArgumentException.class);
  324. expectedException.expectMessage("The last administrator member cannot be removed");
  325. underTest.removeMembers(db.getSession(), organization, asList(admin1, admin2));
  326. }
  327. @Test
  328. public void synchronize_user_organization_membership() {
  329. OrganizationDto organization1 = db.organizations().insert();
  330. GroupDto org1defaultGroup = db.users().insertDefaultGroup(organization1, "Members");
  331. AlmAppInstallDto gitHubInstall1 = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  332. db.alm().insertOrganizationAlmBinding(organization1, gitHubInstall1, true);
  333. OrganizationDto organization2 = db.organizations().insert();
  334. db.users().insertDefaultGroup(organization2, "Members");
  335. AlmAppInstallDto gitHubInstall2 = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  336. db.alm().insertOrganizationAlmBinding(organization2, gitHubInstall2, true);
  337. OrganizationDto organization3 = db.organizations().insert();
  338. GroupDto org3defaultGroup = db.users().insertDefaultGroup(organization3, "Members");
  339. AlmAppInstallDto gitHubInstall3 = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  340. db.alm().insertOrganizationAlmBinding(organization3, gitHubInstall3, true);
  341. // User is member of organization1 and organization3, but organization3 membership will be removed and organization2 membership will be
  342. // added
  343. UserDto user = db.users().insertUser();
  344. db.organizations().addMember(organization1, user);
  345. db.users().insertMember(org1defaultGroup, user);
  346. db.organizations().addMember(organization3, user);
  347. db.users().insertMember(org3defaultGroup, user);
  348. underTest.synchronizeUserOrganizationMembership(db.getSession(), user, GITHUB, ImmutableSet.of(gitHubInstall1.getOrganizationAlmId(), gitHubInstall2.getOrganizationAlmId()));
  349. db.organizations().assertUserIsMemberOfOrganization(organization1, user);
  350. db.organizations().assertUserIsMemberOfOrganization(organization2, user);
  351. assertUserIsNotMember(organization3, user);
  352. }
  353. @Test
  354. public void synchronize_user_organization_membership_does_not_update_es_index() {
  355. OrganizationDto organization = db.organizations().insert();
  356. db.users().insertDefaultGroup(organization, "Members");
  357. AlmAppInstallDto gitHubInstall = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  358. db.alm().insertOrganizationAlmBinding(organization, gitHubInstall, true);
  359. UserDto user = db.users().insertUser();
  360. underTest.synchronizeUserOrganizationMembership(db.getSession(), user, GITHUB, ImmutableSet.of(gitHubInstall.getOrganizationAlmId()));
  361. assertThat(userIndex.search(UserQuery.builder().build(), new SearchOptions()).getDocs()).isEmpty();
  362. }
  363. @Test
  364. public void synchronize_user_organization_membership_ignores_organization_alm_ids_match_no_existing_organizations() {
  365. OrganizationDto organization = db.organizations().insert();
  366. db.users().insertDefaultGroup(organization, "Members");
  367. AlmAppInstallDto gitHubInstall = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  368. db.alm().insertOrganizationAlmBinding(organization, gitHubInstall, true);
  369. UserDto user = db.users().insertUser();
  370. underTest.synchronizeUserOrganizationMembership(db.getSession(), user, GITHUB, ImmutableSet.of("unknown"));
  371. // User is member of no organization
  372. assertThat(db.getDbClient().organizationMemberDao().selectOrganizationUuidsByUser(db.getSession(), user.getUuid())).isEmpty();
  373. }
  374. @Test
  375. public void synchronize_user_organization_membership_ignores_organization_with_member_sync_disabled() {
  376. OrganizationDto organization = db.organizations().insert();
  377. db.users().insertDefaultGroup(organization, "Members");
  378. AlmAppInstallDto gitHubInstall = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  379. db.alm().insertOrganizationAlmBinding(organization, gitHubInstall, false);
  380. UserDto user = db.users().insertUser();
  381. underTest.synchronizeUserOrganizationMembership(db.getSession(), user, GITHUB, ImmutableSet.of(gitHubInstall.getOrganizationAlmId()));
  382. db.organizations().assertUserIsNotMemberOfOrganization(organization, user);
  383. }
  384. @Test
  385. public void synchronize_user_organization_membership_does_not_remove_existing_membership_on_organization_with_member_sync_disabled() {
  386. OrganizationDto organization = db.organizations().insert();
  387. GroupDto org1defaultGroup = db.users().insertDefaultGroup(organization, "Members");
  388. AlmAppInstallDto gitHubInstall = db.alm().insertAlmAppInstall(a -> a.setAlm(GITHUB));
  389. db.alm().insertOrganizationAlmBinding(organization, gitHubInstall, false);
  390. UserDto user = db.users().insertUser();
  391. db.users().insertMember(org1defaultGroup, user);
  392. db.organizations().addMember(organization, user);
  393. // User is member of a organization on which member sync is disabled
  394. db.organizations().assertUserIsMemberOfOrganization(organization, user);
  395. // The organization is not in the list, but membership should not be removed
  396. underTest.synchronizeUserOrganizationMembership(db.getSession(), user, GITHUB, ImmutableSet.of("other"));
  397. db.organizations().assertUserIsMemberOfOrganization(organization, user);
  398. }
  399. private void assertUserIsNotMember(OrganizationDto organization, UserDto user) {
  400. db.organizations().assertUserIsNotMemberOfOrganization(organization, user);
  401. SearchRequestBuilder request = es.client().prepareSearch(UserIndexDefinition.TYPE_USER)
  402. .setQuery(boolQuery()
  403. .must(termQuery(FIELD_ORGANIZATION_UUIDS, organization.getUuid()))
  404. .must(termQuery(FIELD_UUID, user.getUuid())));
  405. assertThat(request.get().getHits().getHits()).isEmpty();
  406. }
  407. private void assertOrgPermissionsOfUser(UserDto user, OrganizationDto organization, OrganizationPermission... permissions) {
  408. assertThat(dbClient.userPermissionDao().selectGlobalPermissionsOfUser(db.getSession(), user.getUuid(), organization.getUuid()).stream()
  409. .map(OrganizationPermission::fromKey))
  410. .containsOnly(permissions);
  411. }
  412. private void assertProjectPermissionsOfUser(UserDto user, ComponentDto project, String... permissions) {
  413. assertThat(dbClient.userPermissionDao().selectProjectPermissionsOfUser(db.getSession(), user.getUuid(), project.uuid())).containsOnly(permissions);
  414. }
  415. private void insertProperty(String key, @Nullable String value, @Nullable String componentUuid, @Nullable String userUuid) {
  416. PropertyDto dto = new PropertyDto().setKey(key)
  417. .setComponentUuid(componentUuid)
  418. .setUserUuid(userUuid)
  419. .setValue(value);
  420. db.properties().insertProperty(dto);
  421. }
  422. }