##// END OF EJS Templates
Add login to /users/:id API for current user (#13155)....
Jean-Philippe Lang -
r11207:504116bfca00
parent child
Show More
@@ -1,35 +1,35
1 1 api.user do
2 2 api.id @user.id
3 api.login @user.login if User.current.admin?
3 api.login @user.login if User.current.admin? || (User.current == @user)
4 4 api.firstname @user.firstname
5 5 api.lastname @user.lastname
6 6 api.mail @user.mail if User.current.admin? || !@user.pref.hide_mail
7 7 api.created_on @user.created_on
8 8 api.last_login_on @user.last_login_on
9 9
10 10 render_api_custom_values @user.visible_custom_field_values, api
11 11
12 12 api.array :groups do |groups|
13 13 @user.groups.each do |group|
14 14 api.group :id => group.id, :name => group.name
15 15 end
16 16 end if User.current.admin? && include_in_api_response?('groups')
17 17
18 18 api.array :memberships do
19 19 @memberships.each do |membership|
20 20 api.membership do
21 21 api.id membership.id
22 22 api.project :id => membership.project.id, :name => membership.project.name
23 23 api.array :roles do
24 24 membership.member_roles.each do |member_role|
25 25 if member_role.role
26 26 attrs = {:id => member_role.role.id, :name => member_role.role.name}
27 27 attrs.merge!(:inherited => true) if member_role.inherited_from.present?
28 28 api.role attrs
29 29 end
30 30 end
31 31 end
32 32 end if membership.project
33 33 end
34 34 end if include_in_api_response?('memberships') && @memberships
35 35 end
@@ -1,347 +1,359
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2013 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../../test_helper', __FILE__)
19 19
20 20 class Redmine::ApiTest::UsersTest < Redmine::ApiTest::Base
21 21 fixtures :users, :members, :member_roles, :roles, :projects
22 22
23 23 def setup
24 24 Setting.rest_api_enabled = '1'
25 25 end
26 26
27 27 context "GET /users" do
28 28 should_allow_api_authentication(:get, "/users.xml")
29 29 should_allow_api_authentication(:get, "/users.json")
30 30 end
31 31
32 32 context "GET /users/2" do
33 33 context ".xml" do
34 34 should "return requested user" do
35 35 get '/users/2.xml'
36 36
37 37 assert_response :success
38 38 assert_tag :tag => 'user',
39 39 :child => {:tag => 'id', :content => '2'}
40 40 end
41 41
42 42 context "with include=memberships" do
43 43 should "include memberships" do
44 44 get '/users/2.xml?include=memberships'
45 45
46 46 assert_response :success
47 47 assert_tag :tag => 'memberships',
48 48 :parent => {:tag => 'user'},
49 49 :children => {:count => 1}
50 50 end
51 51 end
52 52 end
53 53
54 54 context ".json" do
55 55 should "return requested user" do
56 56 get '/users/2.json'
57 57
58 58 assert_response :success
59 59 json = ActiveSupport::JSON.decode(response.body)
60 60 assert_kind_of Hash, json
61 61 assert_kind_of Hash, json['user']
62 62 assert_equal 2, json['user']['id']
63 63 end
64 64
65 65 context "with include=memberships" do
66 66 should "include memberships" do
67 67 get '/users/2.json?include=memberships'
68 68
69 69 assert_response :success
70 70 json = ActiveSupport::JSON.decode(response.body)
71 71 assert_kind_of Array, json['user']['memberships']
72 72 assert_equal [{
73 73 "id"=>1,
74 74 "project"=>{"name"=>"eCookbook", "id"=>1},
75 75 "roles"=>[{"name"=>"Manager", "id"=>1}]
76 76 }], json['user']['memberships']
77 77 end
78 78 end
79 79 end
80 80 end
81 81
82 82 context "GET /users/current" do
83 83 context ".xml" do
84 84 should "require authentication" do
85 85 get '/users/current.xml'
86 86
87 87 assert_response 401
88 88 end
89 89
90 90 should "return current user" do
91 91 get '/users/current.xml', {}, credentials('jsmith')
92 92
93 93 assert_tag :tag => 'user',
94 94 :child => {:tag => 'id', :content => '2'}
95 95 end
96 96 end
97 97 end
98 98
99 test "GET /users/:id should not return login for other user" do
100 get '/users/3.xml', {}, credentials('jsmith')
101 assert_response :success
102 assert_no_tag 'user', :child => {:tag => 'login'}
103 end
104
105 test "GET /users/:id should return login for current user" do
106 get '/users/2.xml', {}, credentials('jsmith')
107 assert_response :success
108 assert_tag 'user', :child => {:tag => 'login', :content => 'jsmith'}
109 end
110
99 111 context "POST /users" do
100 112 context "with valid parameters" do
101 113 setup do
102 114 @parameters = {
103 115 :user => {
104 116 :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname',
105 117 :mail => 'foo@example.net', :password => 'secret123',
106 118 :mail_notification => 'only_assigned'
107 119 }
108 120 }
109 121 end
110 122
111 123 context ".xml" do
112 124 should_allow_api_authentication(:post,
113 125 '/users.xml',
114 126 {:user => {
115 127 :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname',
116 128 :mail => 'foo@example.net', :password => 'secret123'
117 129 }},
118 130 {:success_code => :created})
119 131
120 132 should "create a user with the attributes" do
121 133 assert_difference('User.count') do
122 134 post '/users.xml', @parameters, credentials('admin')
123 135 end
124 136
125 137 user = User.first(:order => 'id DESC')
126 138 assert_equal 'foo', user.login
127 139 assert_equal 'Firstname', user.firstname
128 140 assert_equal 'Lastname', user.lastname
129 141 assert_equal 'foo@example.net', user.mail
130 142 assert_equal 'only_assigned', user.mail_notification
131 143 assert !user.admin?
132 144 assert user.check_password?('secret123')
133 145
134 146 assert_response :created
135 147 assert_equal 'application/xml', @response.content_type
136 148 assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s}
137 149 end
138 150 end
139 151
140 152 context ".json" do
141 153 should_allow_api_authentication(:post,
142 154 '/users.json',
143 155 {:user => {
144 156 :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname',
145 157 :mail => 'foo@example.net'
146 158 }},
147 159 {:success_code => :created})
148 160
149 161 should "create a user with the attributes" do
150 162 assert_difference('User.count') do
151 163 post '/users.json', @parameters, credentials('admin')
152 164 end
153 165
154 166 user = User.first(:order => 'id DESC')
155 167 assert_equal 'foo', user.login
156 168 assert_equal 'Firstname', user.firstname
157 169 assert_equal 'Lastname', user.lastname
158 170 assert_equal 'foo@example.net', user.mail
159 171 assert !user.admin?
160 172
161 173 assert_response :created
162 174 assert_equal 'application/json', @response.content_type
163 175 json = ActiveSupport::JSON.decode(response.body)
164 176 assert_kind_of Hash, json
165 177 assert_kind_of Hash, json['user']
166 178 assert_equal user.id, json['user']['id']
167 179 end
168 180 end
169 181 end
170 182
171 183 context "with invalid parameters" do
172 184 setup do
173 185 @parameters = {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}}
174 186 end
175 187
176 188 context ".xml" do
177 189 should "return errors" do
178 190 assert_no_difference('User.count') do
179 191 post '/users.xml', @parameters, credentials('admin')
180 192 end
181 193
182 194 assert_response :unprocessable_entity
183 195 assert_equal 'application/xml', @response.content_type
184 196 assert_tag 'errors', :child => {
185 197 :tag => 'error',
186 198 :content => "First name can't be blank"
187 199 }
188 200 end
189 201 end
190 202
191 203 context ".json" do
192 204 should "return errors" do
193 205 assert_no_difference('User.count') do
194 206 post '/users.json', @parameters, credentials('admin')
195 207 end
196 208
197 209 assert_response :unprocessable_entity
198 210 assert_equal 'application/json', @response.content_type
199 211 json = ActiveSupport::JSON.decode(response.body)
200 212 assert_kind_of Hash, json
201 213 assert json.has_key?('errors')
202 214 assert_kind_of Array, json['errors']
203 215 end
204 216 end
205 217 end
206 218 end
207 219
208 220 context "PUT /users/2" do
209 221 context "with valid parameters" do
210 222 setup do
211 223 @parameters = {
212 224 :user => {
213 225 :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed',
214 226 :mail => 'jsmith@somenet.foo'
215 227 }
216 228 }
217 229 end
218 230
219 231 context ".xml" do
220 232 should_allow_api_authentication(:put,
221 233 '/users/2.xml',
222 234 {:user => {
223 235 :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed',
224 236 :mail => 'jsmith@somenet.foo'
225 237 }},
226 238 {:success_code => :ok})
227 239
228 240 should "update user with the attributes" do
229 241 assert_no_difference('User.count') do
230 242 put '/users/2.xml', @parameters, credentials('admin')
231 243 end
232 244
233 245 user = User.find(2)
234 246 assert_equal 'jsmith', user.login
235 247 assert_equal 'John', user.firstname
236 248 assert_equal 'Renamed', user.lastname
237 249 assert_equal 'jsmith@somenet.foo', user.mail
238 250 assert !user.admin?
239 251
240 252 assert_response :ok
241 253 assert_equal '', @response.body
242 254 end
243 255 end
244 256
245 257 context ".json" do
246 258 should_allow_api_authentication(:put,
247 259 '/users/2.json',
248 260 {:user => {
249 261 :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed',
250 262 :mail => 'jsmith@somenet.foo'
251 263 }},
252 264 {:success_code => :ok})
253 265
254 266 should "update user with the attributes" do
255 267 assert_no_difference('User.count') do
256 268 put '/users/2.json', @parameters, credentials('admin')
257 269 end
258 270
259 271 user = User.find(2)
260 272 assert_equal 'jsmith', user.login
261 273 assert_equal 'John', user.firstname
262 274 assert_equal 'Renamed', user.lastname
263 275 assert_equal 'jsmith@somenet.foo', user.mail
264 276 assert !user.admin?
265 277
266 278 assert_response :ok
267 279 assert_equal '', @response.body
268 280 end
269 281 end
270 282 end
271 283
272 284 context "with invalid parameters" do
273 285 setup do
274 286 @parameters = {
275 287 :user => {
276 288 :login => 'jsmith', :firstname => '', :lastname => 'Lastname',
277 289 :mail => 'foo'
278 290 }
279 291 }
280 292 end
281 293
282 294 context ".xml" do
283 295 should "return errors" do
284 296 assert_no_difference('User.count') do
285 297 put '/users/2.xml', @parameters, credentials('admin')
286 298 end
287 299
288 300 assert_response :unprocessable_entity
289 301 assert_equal 'application/xml', @response.content_type
290 302 assert_tag 'errors', :child => {
291 303 :tag => 'error',
292 304 :content => "First name can't be blank"
293 305 }
294 306 end
295 307 end
296 308
297 309 context ".json" do
298 310 should "return errors" do
299 311 assert_no_difference('User.count') do
300 312 put '/users/2.json', @parameters, credentials('admin')
301 313 end
302 314
303 315 assert_response :unprocessable_entity
304 316 assert_equal 'application/json', @response.content_type
305 317 json = ActiveSupport::JSON.decode(response.body)
306 318 assert_kind_of Hash, json
307 319 assert json.has_key?('errors')
308 320 assert_kind_of Array, json['errors']
309 321 end
310 322 end
311 323 end
312 324 end
313 325
314 326 context "DELETE /users/2" do
315 327 context ".xml" do
316 328 should_allow_api_authentication(:delete,
317 329 '/users/2.xml',
318 330 {},
319 331 {:success_code => :ok})
320 332
321 333 should "delete user" do
322 334 assert_difference('User.count', -1) do
323 335 delete '/users/2.xml', {}, credentials('admin')
324 336 end
325 337
326 338 assert_response :ok
327 339 assert_equal '', @response.body
328 340 end
329 341 end
330 342
331 343 context ".json" do
332 344 should_allow_api_authentication(:delete,
333 345 '/users/2.xml',
334 346 {},
335 347 {:success_code => :ok})
336 348
337 349 should "delete user" do
338 350 assert_difference('User.count', -1) do
339 351 delete '/users/2.json', {}, credentials('admin')
340 352 end
341 353
342 354 assert_response :ok
343 355 assert_equal '', @response.body
344 356 end
345 357 end
346 358 end
347 359 end
General Comments 0
You need to be logged in to leave comments. Login now