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.

ApplyTemplateActionTest.java 9.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2018 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.permission.ws.template;
  21. import java.util.List;
  22. import javax.annotation.Nullable;
  23. import org.junit.Before;
  24. import org.junit.Rule;
  25. import org.junit.Test;
  26. import org.sonar.api.web.UserRole;
  27. import org.sonar.db.component.ComponentDto;
  28. import org.sonar.db.permission.PermissionQuery;
  29. import org.sonar.db.permission.template.PermissionTemplateDto;
  30. import org.sonar.db.user.GroupDto;
  31. import org.sonar.db.user.UserDto;
  32. import org.sonar.server.es.TestProjectIndexers;
  33. import org.sonar.server.exceptions.BadRequestException;
  34. import org.sonar.server.exceptions.ForbiddenException;
  35. import org.sonar.server.exceptions.NotFoundException;
  36. import org.sonar.server.permission.PermissionTemplateService;
  37. import org.sonar.server.permission.ws.BasePermissionWsTest;
  38. import org.sonar.server.ws.TestRequest;
  39. import org.sonar.server.ws.TestResponse;
  40. import static org.assertj.core.api.Assertions.assertThat;
  41. import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
  42. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PROJECT_ID;
  43. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PROJECT_KEY;
  44. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID;
  45. import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME;
  46. public class ApplyTemplateActionTest extends BasePermissionWsTest<ApplyTemplateAction> {
  47. @Rule
  48. public DefaultTemplatesResolverRule defaultTemplatesResolver = DefaultTemplatesResolverRule.withoutGovernance();
  49. private UserDto user1;
  50. private UserDto user2;
  51. private GroupDto group1;
  52. private GroupDto group2;
  53. private ComponentDto project;
  54. private PermissionTemplateDto template1;
  55. private PermissionTemplateDto template2;
  56. private PermissionTemplateService permissionTemplateService = new PermissionTemplateService(db.getDbClient(),
  57. new TestProjectIndexers(), userSession, defaultTemplatesResolver);
  58. @Override
  59. protected ApplyTemplateAction buildWsAction() {
  60. return new ApplyTemplateAction(db.getDbClient(), userSession, permissionTemplateService, newPermissionWsSupport());
  61. }
  62. @Before
  63. public void setUp() {
  64. user1 = db.users().insertUser();
  65. db.organizations().addMember(db.getDefaultOrganization(), user1);
  66. user2 = db.users().insertUser();
  67. db.organizations().addMember(db.getDefaultOrganization(), user2);
  68. group1 = db.users().insertGroup();
  69. group2 = db.users().insertGroup();
  70. // template 1
  71. template1 = db.permissionTemplates().insertTemplate(db.getDefaultOrganization());
  72. addUserToTemplate(user1, template1, UserRole.CODEVIEWER);
  73. addUserToTemplate(user2, template1, UserRole.ISSUE_ADMIN);
  74. addGroupToTemplate(group1, template1, UserRole.ADMIN);
  75. addGroupToTemplate(group2, template1, UserRole.USER);
  76. // template 2
  77. template2 = db.permissionTemplates().insertTemplate(db.getDefaultOrganization());
  78. addUserToTemplate(user1, template2, UserRole.USER);
  79. addUserToTemplate(user2, template2, UserRole.USER);
  80. addGroupToTemplate(group1, template2, UserRole.USER);
  81. addGroupToTemplate(group2, template2, UserRole.USER);
  82. project = db.components().insertPrivateProject();
  83. db.users().insertProjectPermissionOnUser(user1, UserRole.ADMIN, project);
  84. db.users().insertProjectPermissionOnUser(user2, UserRole.ADMIN, project);
  85. db.users().insertProjectPermissionOnGroup(group1, UserRole.ADMIN, project);
  86. db.users().insertProjectPermissionOnGroup(group2, UserRole.ADMIN, project);
  87. }
  88. @Test
  89. public void apply_template_with_project_uuid() {
  90. loginAsAdmin(db.getDefaultOrganization());
  91. newRequest(template1.getUuid(), project.uuid(), null);
  92. assertTemplate1AppliedToProject();
  93. }
  94. @Test
  95. public void apply_template_with_project_uuid_by_template_name() {
  96. loginAsAdmin(db.getDefaultOrganization());
  97. newRequest()
  98. .setParam(PARAM_TEMPLATE_NAME, template1.getName().toUpperCase())
  99. .setParam(PARAM_PROJECT_ID, project.uuid())
  100. .execute();
  101. assertTemplate1AppliedToProject();
  102. }
  103. @Test
  104. public void apply_template_with_project_key() {
  105. loginAsAdmin(db.getDefaultOrganization());
  106. newRequest(template1.getUuid(), null, project.getDbKey());
  107. assertTemplate1AppliedToProject();
  108. }
  109. @Test
  110. public void fail_when_unknown_template() {
  111. loginAsAdmin(db.getDefaultOrganization());
  112. expectedException.expect(NotFoundException.class);
  113. expectedException.expectMessage("Permission template with id 'unknown-template-uuid' is not found");
  114. newRequest("unknown-template-uuid", project.uuid(), null);
  115. }
  116. @Test
  117. public void fail_when_unknown_project_uuid() {
  118. loginAsAdmin(db.getDefaultOrganization());
  119. expectedException.expect(NotFoundException.class);
  120. expectedException.expectMessage("Project id 'unknown-project-uuid' not found");
  121. newRequest(template1.getUuid(), "unknown-project-uuid", null);
  122. }
  123. @Test
  124. public void fail_when_unknown_project_key() {
  125. loginAsAdmin(db.getDefaultOrganization());
  126. expectedException.expect(NotFoundException.class);
  127. expectedException.expectMessage("Project key 'unknown-project-key' not found");
  128. newRequest(template1.getUuid(), null, "unknown-project-key");
  129. }
  130. @Test
  131. public void fail_when_template_is_not_provided() {
  132. loginAsAdmin(db.getDefaultOrganization());
  133. expectedException.expect(BadRequestException.class);
  134. newRequest(null, project.uuid(), null);
  135. }
  136. @Test
  137. public void fail_when_project_uuid_and_key_not_provided() {
  138. loginAsAdmin(db.getDefaultOrganization());
  139. expectedException.expect(BadRequestException.class);
  140. expectedException.expectMessage("Project id or project key can be provided, not both.");
  141. newRequest(template1.getUuid(), null, null);
  142. }
  143. @Test
  144. public void fail_when_not_admin_of_organization() {
  145. userSession.logIn().addPermission(ADMINISTER, "otherOrg");
  146. expectedException.expect(ForbiddenException.class);
  147. newRequest(template1.getUuid(), project.uuid(), null);
  148. }
  149. private void assertTemplate1AppliedToProject() {
  150. assertThat(selectProjectPermissionGroups(project, UserRole.ADMIN)).containsExactly(group1.getName());
  151. assertThat(selectProjectPermissionGroups(project, UserRole.USER)).containsExactly(group2.getName());
  152. assertThat(selectProjectPermissionUsers(project, UserRole.ADMIN)).isEmpty();
  153. assertThat(selectProjectPermissionUsers(project, UserRole.CODEVIEWER)).containsExactly(user1.getId());
  154. assertThat(selectProjectPermissionUsers(project, UserRole.ISSUE_ADMIN)).containsExactly(user2.getId());
  155. }
  156. private TestResponse newRequest(@Nullable String templateUuid, @Nullable String projectUuid, @Nullable String projectKey) {
  157. TestRequest request = newRequest();
  158. if (templateUuid != null) {
  159. request.setParam(PARAM_TEMPLATE_ID, templateUuid);
  160. }
  161. if (projectUuid != null) {
  162. request.setParam(PARAM_PROJECT_ID, projectUuid);
  163. }
  164. if (projectKey != null) {
  165. request.setParam(PARAM_PROJECT_KEY, projectKey);
  166. }
  167. return request.execute();
  168. }
  169. private void addUserToTemplate(UserDto user, PermissionTemplateDto permissionTemplate, String permission) {
  170. db.getDbClient().permissionTemplateDao().insertUserPermission(db.getSession(), permissionTemplate.getId(), user.getId(), permission);
  171. db.commit();
  172. }
  173. private void addGroupToTemplate(GroupDto group, PermissionTemplateDto permissionTemplate, String permission) {
  174. db.getDbClient().permissionTemplateDao().insertGroupPermission(db.getSession(), permissionTemplate.getId(), group.getId(), permission);
  175. db.commit();
  176. }
  177. private List<String> selectProjectPermissionGroups(ComponentDto project, String permission) {
  178. PermissionQuery query = PermissionQuery.builder().setOrganizationUuid(project.getOrganizationUuid()).setPermission(permission).setComponentUuid(project.uuid()).build();
  179. return db.getDbClient().groupPermissionDao().selectGroupNamesByQuery(db.getSession(), query);
  180. }
  181. private List<Integer> selectProjectPermissionUsers(ComponentDto project, String permission) {
  182. PermissionQuery query = PermissionQuery.builder().setOrganizationUuid(project.getOrganizationUuid()).setPermission(permission).setComponentUuid(project.uuid()).build();
  183. return db.getDbClient().userPermissionDao().selectUserIdsByQuery(db.getSession(), query);
  184. }
  185. }