]> source.dussan.org Git - sonarqube.git/blob
1da75fdb76415ec5dd21b03dd5df1a209d8fd621
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2016 SonarSource SA
4  * mailto:contact 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
22 import java.util.List;
23 import javax.annotation.Nullable;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.sonar.core.permission.GlobalPermissions;
27 import org.sonar.db.permission.PermissionQuery;
28 import org.sonar.db.permission.template.PermissionTemplateDto;
29 import org.sonar.db.user.UserDto;
30 import org.sonar.server.exceptions.BadRequestException;
31 import org.sonar.server.exceptions.ForbiddenException;
32 import org.sonar.server.exceptions.NotFoundException;
33 import org.sonar.server.permission.ws.BasePermissionWsTest;
34 import org.sonar.server.ws.WsTester;
35
36 import static org.assertj.core.api.Assertions.assertThat;
37 import static org.sonar.api.web.UserRole.CODEVIEWER;
38 import static org.sonar.api.web.UserRole.ISSUE_ADMIN;
39 import static org.sonar.core.permission.GlobalPermissions.QUALITY_PROFILE_ADMIN;
40 import static org.sonarqube.ws.client.permission.PermissionsWsParameters.CONTROLLER;
41 import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_PERMISSION;
42 import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_NAME;
43 import static org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_USER_LOGIN;
44
45 public class AddUserToTemplateActionTest extends BasePermissionWsTest<AddUserToTemplateAction> {
46
47   private static final String ACTION = "add_user_to_template";
48
49   private UserDto user;
50   private PermissionTemplateDto permissionTemplate;
51
52   @Override
53   protected AddUserToTemplateAction buildWsAction() {
54     return new AddUserToTemplateAction(db.getDbClient(), newPermissionWsSupport(), userSession);
55   }
56
57   @Before
58   public void setUp() {
59     user = db.users().insertUser("user-login");
60     permissionTemplate = insertTemplate();
61   }
62
63   @Test
64   public void add_user_to_template() throws Exception {
65     loginAsAdminOnDefaultOrganization();
66
67     newRequest(user.getLogin(), permissionTemplate.getUuid(), CODEVIEWER);
68
69     assertThat(getLoginsInTemplateAndPermission(permissionTemplate.getId(), CODEVIEWER)).containsExactly(user.getLogin());
70   }
71
72   @Test
73   public void add_user_to_template_by_name() throws Exception {
74     loginAsAdminOnDefaultOrganization();
75
76     wsTester.newPostRequest(CONTROLLER, ACTION)
77       .setParam(PARAM_USER_LOGIN, user.getLogin())
78       .setParam(PARAM_PERMISSION, CODEVIEWER)
79       .setParam(PARAM_TEMPLATE_NAME, permissionTemplate.getName().toUpperCase())
80       .execute();
81
82     assertThat(getLoginsInTemplateAndPermission(permissionTemplate.getId(), CODEVIEWER)).containsExactly(user.getLogin());
83   }
84
85   @Test
86   public void does_not_add_a_user_twice() throws Exception {
87     loginAsAdminOnDefaultOrganization();
88
89     newRequest(user.getLogin(), permissionTemplate.getUuid(), ISSUE_ADMIN);
90     newRequest(user.getLogin(), permissionTemplate.getUuid(), ISSUE_ADMIN);
91
92     assertThat(getLoginsInTemplateAndPermission(permissionTemplate.getId(), ISSUE_ADMIN)).containsExactly(user.getLogin());
93   }
94
95   @Test
96   public void fail_if_not_a_project_permission() throws Exception {
97     loginAsAdminOnDefaultOrganization();
98
99     expectedException.expect(IllegalArgumentException.class);
100
101     newRequest(user.getLogin(), permissionTemplate.getUuid(), GlobalPermissions.PROVISIONING);
102   }
103
104   @Test
105   public void fail_if_not_admin_of_default_organization() throws Exception {
106     userSession.login().addOrganizationPermission(db.getDefaultOrganization().getUuid(), QUALITY_PROFILE_ADMIN);
107
108     expectedException.expect(ForbiddenException.class);
109
110     newRequest(user.getLogin(), permissionTemplate.getUuid(), CODEVIEWER);
111   }
112
113   @Test
114   public void fail_if_user_missing() throws Exception {
115     loginAsAdminOnDefaultOrganization();
116
117     expectedException.expect(IllegalArgumentException.class);
118
119     newRequest(null, permissionTemplate.getUuid(), CODEVIEWER);
120   }
121
122   @Test
123   public void fail_if_permission_missing() throws Exception {
124     loginAsAdminOnDefaultOrganization();
125
126     expectedException.expect(IllegalArgumentException.class);
127
128     newRequest(user.getLogin(), permissionTemplate.getUuid(), null);
129   }
130
131   @Test
132   public void fail_if_template_uuid_and_name_are_missing() throws Exception {
133     loginAsAdminOnDefaultOrganization();
134
135     expectedException.expect(BadRequestException.class);
136
137     newRequest(user.getLogin(), null, CODEVIEWER);
138   }
139
140   @Test
141   public void fail_if_user_does_not_exist() throws Exception {
142     loginAsAdminOnDefaultOrganization();
143
144     expectedException.expect(NotFoundException.class);
145     expectedException.expectMessage("User with login 'unknown-login' is not found");
146
147     newRequest("unknown-login", permissionTemplate.getUuid(), CODEVIEWER);
148   }
149
150   @Test
151   public void fail_if_template_key_does_not_exist() throws Exception {
152     loginAsAdminOnDefaultOrganization();
153
154     expectedException.expect(NotFoundException.class);
155     expectedException.expectMessage("Permission template with id 'unknown-key' is not found");
156
157     newRequest(user.getLogin(), "unknown-key", CODEVIEWER);
158   }
159
160   private void newRequest(@Nullable String userLogin, @Nullable String templateKey, @Nullable String permission) throws Exception {
161     WsTester.TestRequest request = wsTester.newPostRequest(CONTROLLER, ACTION);
162     if (userLogin != null) {
163       request.setParam(PARAM_USER_LOGIN, userLogin);
164     }
165     if (templateKey != null) {
166       request.setParam(org.sonarqube.ws.client.permission.PermissionsWsParameters.PARAM_TEMPLATE_ID, templateKey);
167     }
168     if (permission != null) {
169       request.setParam(PARAM_PERMISSION, permission);
170     }
171
172     request.execute();
173   }
174
175   private List<String> getLoginsInTemplateAndPermission(long templateId, String permission) {
176     PermissionQuery permissionQuery = PermissionQuery.builder().setPermission(permission).build();
177     return db.getDbClient().permissionTemplateDao()
178       .selectUserLoginsByQueryAndTemplate(db.getSession(), permissionQuery, templateId);
179   }
180 }