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.

PermissionFinderTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /*
  2. * SonarQube, open source software quality management tool.
  3. * Copyright (C) 2008-2014 SonarSource
  4. * mailto:contact AT sonarsource DOT com
  5. *
  6. * SonarQube 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. * SonarQube 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.permission;
  21. import java.util.List;
  22. import org.junit.Before;
  23. import org.junit.Test;
  24. import org.junit.runner.RunWith;
  25. import org.mockito.ArgumentCaptor;
  26. import org.mockito.Mock;
  27. import org.mockito.runners.MockitoJUnitRunner;
  28. import org.sonar.core.permission.GroupWithPermission;
  29. import org.sonar.db.DbClient;
  30. import org.sonar.db.DbSession;
  31. import org.sonar.db.component.ResourceDao;
  32. import org.sonar.db.component.ResourceDto;
  33. import org.sonar.db.component.ResourceQuery;
  34. import org.sonar.db.permission.GroupWithPermissionDto;
  35. import org.sonar.db.permission.PermissionDao;
  36. import org.sonar.db.permission.PermissionQuery;
  37. import org.sonar.db.permission.PermissionTemplateDao;
  38. import org.sonar.db.permission.PermissionTemplateDto;
  39. import org.sonar.db.permission.UserWithPermissionDto;
  40. import org.sonar.server.exceptions.NotFoundException;
  41. import static com.google.common.collect.Lists.newArrayList;
  42. import static org.assertj.core.api.Assertions.assertThat;
  43. import static org.junit.Assert.fail;
  44. import static org.mockito.Matchers.any;
  45. import static org.mockito.Matchers.anyInt;
  46. import static org.mockito.Matchers.anyLong;
  47. import static org.mockito.Matchers.anyString;
  48. import static org.mockito.Mockito.mock;
  49. import static org.mockito.Mockito.verify;
  50. import static org.mockito.Mockito.when;
  51. @RunWith(MockitoJUnitRunner.class)
  52. public class PermissionFinderTest {
  53. @Mock
  54. PermissionDao permissionDao;
  55. @Mock
  56. ResourceDao resourceDao;
  57. @Mock
  58. PermissionTemplateDao permissionTemplateDao;
  59. PermissionFinder underTest;
  60. @Before
  61. public void setUp() {
  62. DbClient dbClient = mock(DbClient.class);
  63. when(dbClient.resourceDao()).thenReturn(resourceDao);
  64. when(dbClient.permissionDao()).thenReturn(permissionDao);
  65. when(dbClient.permissionTemplateDao()).thenReturn(permissionTemplateDao);
  66. when(resourceDao.selectResource(any(ResourceQuery.class))).thenReturn(new ResourceDto().setId(100L).setName("org.sample.Sample"));
  67. underTest = new PermissionFinder(dbClient);
  68. }
  69. @Test
  70. public void find_users() {
  71. when(permissionDao.selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), anyInt(), anyInt())).thenReturn(
  72. newArrayList(new UserWithPermissionDto().setName("user1").setPermission("user"))
  73. );
  74. when(permissionDao.countUsers(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(1);
  75. UserWithPermissionQueryResult result = underTest.findUsersWithPermission(PermissionQuery.builder().permission("user").build());
  76. assertThat(result.users()).hasSize(1);
  77. assertThat(result.total()).isEqualTo(1);
  78. }
  79. @Test
  80. public void fail_to_find_users_when_component_not_found() {
  81. when(resourceDao.selectResource(any(ResourceQuery.class))).thenReturn(null);
  82. try {
  83. underTest.findUsersWithPermission(PermissionQuery.builder().permission("user").component("Unknown").build());
  84. fail();
  85. } catch (Exception e) {
  86. assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Component 'Unknown' does not exist");
  87. }
  88. }
  89. @Test
  90. public void find_users_with_paging() {
  91. underTest.findUsersWithPermission(PermissionQuery.builder().permission("user").pageIndex(3).pageSize(10).build());
  92. ArgumentCaptor<Integer> argumentOffset = ArgumentCaptor.forClass(Integer.class);
  93. ArgumentCaptor<Integer> argumentLimit = ArgumentCaptor.forClass(Integer.class);
  94. verify(permissionDao).selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), argumentOffset.capture(), argumentLimit.capture());
  95. assertThat(argumentOffset.getValue()).isEqualTo(20);
  96. assertThat(argumentLimit.getValue()).isEqualTo(10);
  97. }
  98. @Test
  99. public void find_users_with_paging_having_more_results() {
  100. when(permissionDao.selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), anyInt(), anyInt())).thenReturn(newArrayList(
  101. new UserWithPermissionDto().setName("user1").setPermission("user"),
  102. new UserWithPermissionDto().setName("user2").setPermission("user"),
  103. new UserWithPermissionDto().setName("user3").setPermission("user"))
  104. );
  105. when(permissionDao.countUsers(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(3);
  106. UserWithPermissionQueryResult result = underTest.findUsersWithPermission(PermissionQuery.builder().permission("user").pageIndex(1).pageSize(2).build());
  107. ArgumentCaptor<Integer> argumentOffset = ArgumentCaptor.forClass(Integer.class);
  108. ArgumentCaptor<Integer> argumentLimit = ArgumentCaptor.forClass(Integer.class);
  109. verify(permissionDao).selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), argumentOffset.capture(), argumentLimit.capture());
  110. assertThat(argumentOffset.getValue()).isEqualTo(0);
  111. assertThat(argumentLimit.getValue()).isEqualTo(2);
  112. assertThat(result.total()).isEqualTo(3);
  113. }
  114. @Test
  115. public void find_users_with_paging_having_no_more_results() {
  116. when(permissionDao.selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), anyInt(), anyInt())).thenReturn(newArrayList(
  117. new UserWithPermissionDto().setName("user1").setPermission("user"),
  118. new UserWithPermissionDto().setName("user2").setPermission("user"),
  119. new UserWithPermissionDto().setName("user4").setPermission("user"),
  120. new UserWithPermissionDto().setName("user3").setPermission("user"))
  121. );
  122. when(permissionDao.countUsers(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(4);
  123. UserWithPermissionQueryResult result = underTest.findUsersWithPermission(PermissionQuery.builder().permission("user").pageIndex(1).pageSize(10).build());
  124. ArgumentCaptor<Integer> argumentOffset = ArgumentCaptor.forClass(Integer.class);
  125. ArgumentCaptor<Integer> argumentLimit = ArgumentCaptor.forClass(Integer.class);
  126. verify(permissionDao).selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), argumentOffset.capture(), argumentLimit.capture());
  127. assertThat(argumentOffset.getValue()).isEqualTo(0);
  128. assertThat(argumentLimit.getValue()).isEqualTo(10);
  129. assertThat(result.total()).isEqualTo(4);
  130. }
  131. @Test
  132. public void find_groups() {
  133. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  134. newArrayList(new GroupWithPermissionDto().setName("users").setPermission("user"))
  135. );
  136. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(
  137. PermissionQuery.builder().permission("user").membership(PermissionQuery.IN).build());
  138. assertThat(result.groups()).hasSize(1);
  139. assertThat(result.hasMoreResults()).isFalse();
  140. }
  141. @Test
  142. public void find_groups_should_be_paginated() {
  143. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(newArrayList(
  144. new GroupWithPermissionDto().setName("Anyone").setPermission("user"),
  145. new GroupWithPermissionDto().setName("Admin").setPermission("user"),
  146. new GroupWithPermissionDto().setName("Users").setPermission(null),
  147. new GroupWithPermissionDto().setName("Reviewers").setPermission(null),
  148. new GroupWithPermissionDto().setName("Other").setPermission(null)
  149. ));
  150. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(
  151. PermissionQuery.builder()
  152. .permission("user")
  153. .pageSize(2)
  154. .pageIndex(2)
  155. .build());
  156. assertThat(result.hasMoreResults()).isTrue();
  157. List<GroupWithPermission> groups = result.groups();
  158. assertThat(groups).hasSize(2);
  159. assertThat(groups.get(0).name()).isEqualTo("Users");
  160. assertThat(groups.get(1).name()).isEqualTo("Reviewers");
  161. assertThat(underTest.findGroupsWithPermission(
  162. PermissionQuery.builder()
  163. .permission("user")
  164. .pageSize(2)
  165. .pageIndex(3)
  166. .build()).hasMoreResults()).isTrue();
  167. }
  168. @Test
  169. public void find_groups_should_filter_membership() {
  170. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(newArrayList(
  171. new GroupWithPermissionDto().setName("Anyone").setPermission("user"),
  172. new GroupWithPermissionDto().setName("Admin").setPermission("user"),
  173. new GroupWithPermissionDto().setName("Users").setPermission(null),
  174. new GroupWithPermissionDto().setName("Reviewers").setPermission(null),
  175. new GroupWithPermissionDto().setName("Other").setPermission(null)
  176. ));
  177. assertThat(underTest.findGroupsWithPermission(
  178. PermissionQuery.builder().permission("user").membership(PermissionQuery.IN).build()).groups()).hasSize(2);
  179. assertThat(underTest.findGroupsWithPermission(
  180. PermissionQuery.builder().permission("user").membership(PermissionQuery.OUT).build()).groups()).hasSize(3);
  181. assertThat(underTest.findGroupsWithPermission(
  182. PermissionQuery.builder().permission("user").membership(PermissionQuery.ANY).build()).groups()).hasSize(5);
  183. }
  184. @Test
  185. public void find_groups_with_added_anyone_group() {
  186. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  187. newArrayList(new GroupWithPermissionDto().setName("users").setPermission("user"))
  188. );
  189. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(PermissionQuery.builder().permission("user")
  190. .pageIndex(1).membership(PermissionQuery.ANY).build());
  191. assertThat(result.groups()).hasSize(2);
  192. GroupWithPermission first = result.groups().get(0);
  193. assertThat(first.name()).isEqualTo("Anyone");
  194. assertThat(first.hasPermission()).isFalse();
  195. }
  196. @Test
  197. public void find_groups_without_adding_anyone_group_when_search_text_do_not_matched() {
  198. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  199. newArrayList(new GroupWithPermissionDto().setName("users").setPermission("user"))
  200. );
  201. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(PermissionQuery.builder().permission("user").search("other")
  202. .pageIndex(1).membership(PermissionQuery.ANY).build());
  203. // Anyone group should not be added
  204. assertThat(result.groups()).hasSize(1);
  205. }
  206. @Test
  207. public void find_groups_with_added_anyone_group_when_search_text_matched() {
  208. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  209. newArrayList(new GroupWithPermissionDto().setName("MyAnyGroup").setPermission("user"))
  210. );
  211. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(PermissionQuery.builder().permission("user").search("any")
  212. .pageIndex(1).membership(PermissionQuery.ANY).build());
  213. assertThat(result.groups()).hasSize(2);
  214. }
  215. @Test
  216. public void find_groups_without_adding_anyone_group_when_out_membership_selected() {
  217. when(permissionDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  218. newArrayList(new GroupWithPermissionDto().setName("users").setPermission("user"))
  219. );
  220. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermission(PermissionQuery.builder().permission("user")
  221. .pageIndex(1).membership(PermissionQuery.OUT).build());
  222. // Anyone group should not be added
  223. assertThat(result.groups()).hasSize(1);
  224. }
  225. @Test
  226. public void find_users_from_permission_template() {
  227. when(permissionTemplateDao.selectTemplateByKey(anyString())).thenReturn(new PermissionTemplateDto().setId(1L).setKee("my_template"));
  228. when(permissionTemplateDao.selectUsers(any(DbSession.class), any(PermissionQuery.class), anyLong(), anyInt(), anyInt())).thenReturn(
  229. newArrayList(new UserWithPermissionDto().setName("user1").setPermission("user"))
  230. );
  231. when(permissionTemplateDao.countUsers(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(1);
  232. UserWithPermissionQueryResult result = underTest.findUsersWithPermissionTemplate(PermissionQuery.builder().permission("user").template("my_template").build());
  233. assertThat(result.users()).hasSize(1);
  234. assertThat(result.total()).isEqualTo(1);
  235. }
  236. @Test
  237. public void fail_to_find_users_from_permission_template_when_template_not_found() {
  238. when(permissionTemplateDao.selectTemplateByKey(anyString())).thenReturn(null);
  239. try {
  240. underTest.findUsersWithPermissionTemplate(PermissionQuery.builder().permission("user").template("Unknown").build());
  241. fail();
  242. } catch (Exception e) {
  243. assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Template 'Unknown' does not exist");
  244. }
  245. }
  246. @Test
  247. public void find_groups_from_permission_template() {
  248. when(permissionTemplateDao.selectTemplateByKey(anyString())).thenReturn(new PermissionTemplateDto().setId(1L).setKee("my_template"));
  249. when(permissionTemplateDao.selectGroups(any(DbSession.class), any(PermissionQuery.class), anyLong())).thenReturn(
  250. newArrayList(new GroupWithPermissionDto().setName("users").setPermission("user"))
  251. );
  252. GroupWithPermissionQueryResult result = underTest.findGroupsWithPermissionTemplate(
  253. PermissionQuery.builder().permission("user").template("my_template").membership(PermissionQuery.OUT).build());
  254. assertThat(result.groups()).hasSize(1);
  255. assertThat(result.hasMoreResults()).isFalse();
  256. }
  257. @Test
  258. public void fail_to_find_groups_from_permission_template_when_template_not_found() {
  259. when(permissionTemplateDao.selectTemplateByKey(anyString())).thenReturn(null);
  260. try {
  261. underTest.findGroupsWithPermissionTemplate(PermissionQuery.builder().permission("user").template("Unknown").build());
  262. fail();
  263. } catch (Exception e) {
  264. assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("Template 'Unknown' does not exist");
  265. }
  266. }
  267. }