users_spec.rb 27.6 KB
Newer Older
N
Nihad Abbasov 已提交
1 2
require 'spec_helper'

J
Jeroen van Baarsen 已提交
3
describe API::API, api: true  do
4 5
  include ApiHelpers

6 7 8
  let(:user)  { create(:user) }
  let(:admin) { create(:admin) }
  let(:key)   { create(:key, user: user) }
9
  let(:email)   { create(:email, user: user) }
10
  let(:omniauth_user) { create(:omniauth_user) }
11 12
  let(:ldap_user) { create(:omniauth_user, provider: 'ldapmain') }
  let(:ldap_blocked_user) { create(:omniauth_user, provider: 'ldapmain', state: 'ldap_blocked') }
N
Nihad Abbasov 已提交
13 14

  describe "GET /users" do
15 16 17
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/users")
18
        expect(response.status).to eq(401)
19
      end
N
Nihad Abbasov 已提交
20 21
    end

22
    context "when authenticated" do
N
Nihad Abbasov 已提交
23
      it "should return an array of users" do
R
Robert Speicher 已提交
24
        get api("/users", user)
25 26
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
M
Marin Jankovski 已提交
27
        username = user.username
28 29 30
        expect(json_response.detect do |user|
          user['username'] == username
        end['username']).to eq(username)
N
Nihad Abbasov 已提交
31
      end
32 33 34 35 36 37 38

      it "should return one user" do
        get api("/users?username=#{omniauth_user.username}", user)
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first['username']).to eq(omniauth_user.username)
      end
N
Nihad Abbasov 已提交
39
    end
40 41 42 43

    context "when admin" do
      it "should return an array of users" do
        get api("/users", admin)
44 45 46 47 48
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first.keys).to include 'email'
        expect(json_response.first.keys).to include 'identities'
        expect(json_response.first.keys).to include 'can_create_project'
S
Stan Hu 已提交
49
        expect(json_response.first.keys).to include 'two_factor_enabled'
50 51
        expect(json_response.first.keys).to include 'last_sign_in_at'
        expect(json_response.first.keys).to include 'confirmed_at'
52 53
      end
    end
N
Nihad Abbasov 已提交
54 55 56 57
  end

  describe "GET /users/:id" do
    it "should return a user by id" do
R
Robert Speicher 已提交
58
      get api("/users/#{user.id}", user)
59 60
      expect(response.status).to eq(200)
      expect(json_response['username']).to eq(user.username)
N
Nihad Abbasov 已提交
61 62
    end

63 64
    it "should return a 401 if unauthenticated" do
      get api("/users/9998")
65
      expect(response.status).to eq(401)
66
    end
V
Valeriy Sizov 已提交
67

68 69
    it "should return a 404 error if user id not found" do
      get api("/users/9999", user)
70 71
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
V
Valeriy Sizov 已提交
72
    end
73 74 75 76 77

    it "should return a 404 if invalid ID" do
      get api("/users/1ASDF", user)
      expect(response.status).to eq(404)
    end
78 79 80 81
  end

  describe "POST /users" do
    before{ admin }
V
Valeriy Sizov 已提交
82 83

    it "should create user" do
84
      expect do
85
        post api("/users", admin), attributes_for(:user, projects_limit: 3)
86
      end.to change { User.count }.by(1)
V
Valeriy Sizov 已提交
87 88
    end

89 90
    it "should create user with correct attributes" do
      post api('/users', admin), attributes_for(:user, admin: true, can_create_group: true)
91
      expect(response.status).to eq(201)
92 93
      user_id = json_response['id']
      new_user = User.find(user_id)
94 95 96
      expect(new_user).not_to eq(nil)
      expect(new_user.admin).to eq(true)
      expect(new_user.can_create_group).to eq(true)
97 98
    end

99 100
    it "should create non-admin user" do
      post api('/users', admin), attributes_for(:user, admin: false, can_create_group: false)
101
      expect(response.status).to eq(201)
102 103
      user_id = json_response['id']
      new_user = User.find(user_id)
104 105 106
      expect(new_user).not_to eq(nil)
      expect(new_user.admin).to eq(false)
      expect(new_user.can_create_group).to eq(false)
107 108 109 110
    end

    it "should create non-admin users by default" do
      post api('/users', admin), attributes_for(:user)
111
      expect(response.status).to eq(201)
112 113
      user_id = json_response['id']
      new_user = User.find(user_id)
114 115
      expect(new_user).not_to eq(nil)
      expect(new_user.admin).to eq(false)
116 117
    end

118 119
    it "should return 201 Created on success" do
      post api("/users", admin), attributes_for(:user, projects_limit: 3)
120
      expect(response.status).to eq(201)
121 122
    end

Z
Zeger-Jan van de Weg 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
    it 'creates non-external users by default' do
      post api("/users", admin), attributes_for(:user)
      expect(response.status).to eq(201)

      user_id = json_response['id']
      new_user = User.find(user_id)
      expect(new_user).not_to eq nil
      expect(new_user.external).to be_falsy
    end

    it 'should allow an external user to be created' do
      post api("/users", admin), attributes_for(:user, external: true)
      expect(response.status).to eq(201)

      user_id = json_response['id']
      new_user = User.find(user_id)
      expect(new_user).not_to eq nil
      expect(new_user.external).to be_truthy
    end

143
    it "should not create user with invalid email" do
J
jubianchi 已提交
144
      post api('/users', admin),
145 146 147
        email: 'invalid email',
        password: 'password',
        name: 'test'
148
      expect(response.status).to eq(400)
149 150
    end

J
jubianchi 已提交
151
    it 'should return 400 error if name not given' do
152
      post api('/users', admin), attributes_for(:user).except(:name)
153
      expect(response.status).to eq(400)
J
jubianchi 已提交
154 155 156
    end

    it 'should return 400 error if password not given' do
157
      post api('/users', admin), attributes_for(:user).except(:password)
158
      expect(response.status).to eq(400)
159 160
    end

161 162 163 164 165 166 167
    it 'should return 400 error if email not given' do
      post api('/users', admin), attributes_for(:user).except(:email)
      expect(response.status).to eq(400)
    end

    it 'should return 400 error if username not given' do
      post api('/users', admin), attributes_for(:user).except(:username)
168
      expect(response.status).to eq(400)
J
jubianchi 已提交
169 170 171 172
    end

    it 'should return 400 error if user does not validate' do
      post api('/users', admin),
173 174 175 176 177 178
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
179 180
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
181
        to eq(['is too short (minimum is 8 characters)'])
182
      expect(json_response['message']['bio']).
183
        to eq(['is too long (maximum is 255 characters)'])
184
      expect(json_response['message']['projects_limit']).
185
        to eq(['must be greater than or equal to 0'])
186
      expect(json_response['message']['username']).
R
Robert Speicher 已提交
187
        to eq([Gitlab::Regex.namespace_regex_message])
188 189
    end

V
Valeriy Sizov 已提交
190
    it "shouldn't available for non admin users" do
191
      post api("/users", user), attributes_for(:user)
192
      expect(response.status).to eq(403)
V
Valeriy Sizov 已提交
193
    end
194

J
jubianchi 已提交
195 196 197
    context 'with existing user' do
      before do
        post api('/users', admin),
198 199 200 201
          email: 'test@example.com',
          password: 'password',
          username: 'test',
          name: 'foo'
J
jubianchi 已提交
202
      end
203

J
jubianchi 已提交
204
      it 'should return 409 conflict error if user with same email exists' do
205
        expect do
J
jubianchi 已提交
206
          post api('/users', admin),
207 208 209 210 211
            name: 'foo',
            email: 'test@example.com',
            password: 'password',
            username: 'foo'
        end.to change { User.count }.by(0)
212 213
        expect(response.status).to eq(409)
        expect(json_response['message']).to eq('Email has already been taken')
214 215
      end

J
jubianchi 已提交
216 217 218
      it 'should return 409 conflict error if same username exists' do
        expect do
          post api('/users', admin),
219 220 221 222
            name: 'foo',
            email: 'foo@example.com',
            password: 'password',
            username: 'test'
J
jubianchi 已提交
223
        end.to change { User.count }.by(0)
224 225
        expect(response.status).to eq(409)
        expect(json_response['message']).to eq('Username has already been taken')
226 227
      end
    end
V
Valeriy Sizov 已提交
228 229
  end

M
Marin Jankovski 已提交
230
  describe "GET /users/sign_up" do
231

232 233
    it "should redirect to sign in page" do
      get "/users/sign_up"
234 235
      expect(response.status).to eq(302)
      expect(response).to redirect_to(new_user_session_path)
M
Marin Jankovski 已提交
236 237 238
    end
  end

239
  describe "PUT /users/:id" do
240 241
    let!(:admin_user) { create(:admin) }

242 243
    before { admin }

244
    it "should update user with new bio" do
245
      put api("/users/#{user.id}", admin), { bio: 'new test bio' }
246 247 248
      expect(response.status).to eq(200)
      expect(json_response['bio']).to eq('new test bio')
      expect(user.reload.bio).to eq('new test bio')
249 250
    end

J
jubianchi 已提交
251 252
    it 'should update user with his own email' do
      put api("/users/#{user.id}", admin), email: user.email
253 254 255
      expect(response.status).to eq(200)
      expect(json_response['email']).to eq(user.email)
      expect(user.reload.email).to eq(user.email)
J
jubianchi 已提交
256 257 258 259
    end

    it 'should update user with his own username' do
      put api("/users/#{user.id}", admin), username: user.username
260 261 262
      expect(response.status).to eq(200)
      expect(json_response['username']).to eq(user.username)
      expect(user.reload.username).to eq(user.username)
J
jubianchi 已提交
263 264
    end

265 266 267 268 269 270 271 272 273 274 275 276 277
    it "should update user's existing identity" do
      put api("/users/#{omniauth_user.id}", admin), provider: 'ldapmain', extern_uid: '654321'
      expect(response.status).to eq(200)
      expect(omniauth_user.reload.identities.first.extern_uid).to eq('654321')
    end

    it 'should update user with new identity' do
      put api("/users/#{user.id}", admin), provider: 'github', extern_uid: '67890'
      expect(response.status).to eq(200)
      expect(user.reload.identities.first.extern_uid).to eq('67890')
      expect(user.reload.identities.first.provider).to eq('github')
    end

278
    it "should update admin status" do
279
      put api("/users/#{user.id}", admin), { admin: true }
280 281 282
      expect(response.status).to eq(200)
      expect(json_response['is_admin']).to eq(true)
      expect(user.reload.admin).to eq(true)
283 284 285
    end

    it "should not update admin status" do
286
      put api("/users/#{admin_user.id}", admin), { can_create_group: false }
287 288 289 290
      expect(response.status).to eq(200)
      expect(json_response['is_admin']).to eq(true)
      expect(admin_user.reload.admin).to eq(true)
      expect(admin_user.can_create_group).to eq(false)
291 292
    end

293
    it "should not allow invalid update" do
294
      put api("/users/#{user.id}", admin), { email: 'invalid email' }
295 296
      expect(response.status).to eq(400)
      expect(user.reload.email).not_to eq('invalid email')
297 298 299 300
    end

    it "shouldn't available for non admin users" do
      put api("/users/#{user.id}", user), attributes_for(:user)
301
      expect(response.status).to eq(403)
302 303 304
    end

    it "should return 404 for non-existing user" do
305
      put api("/users/999999", admin), { bio: 'update should fail' }
306 307
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
J
jubianchi 已提交
308 309
    end

310 311 312 313
    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end

J
jubianchi 已提交
314 315
    it 'should return 400 error if user does not validate' do
      put api("/users/#{user.id}", admin),
316 317 318 319 320 321
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
322 323
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
324
        to eq(['is too short (minimum is 8 characters)'])
325
      expect(json_response['message']['bio']).
326
        to eq(['is too long (maximum is 255 characters)'])
327
      expect(json_response['message']['projects_limit']).
328
        to eq(['must be greater than or equal to 0'])
329
      expect(json_response['message']['username']).
R
Robert Speicher 已提交
330
        to eq([Gitlab::Regex.namespace_regex_message])
331
    end
332 333

    context "with existing user" do
334
      before do
335 336
        post api("/users", admin), { email: 'test@example.com', password: 'password', username: 'test', name: 'test' }
        post api("/users", admin), { email: 'foo@bar.com', password: 'password', username: 'john', name: 'john' }
J
jubianchi 已提交
337
        @user = User.all.last
338
      end
339

J
jubianchi 已提交
340 341
      it 'should return 409 conflict error if email address exists' do
        put api("/users/#{@user.id}", admin), email: 'test@example.com'
342 343
        expect(response.status).to eq(409)
        expect(@user.reload.email).to eq(@user.email)
J
jubianchi 已提交
344 345 346 347 348
      end

      it 'should return 409 conflict error if username taken' do
        @user_id = User.all.last.id
        put api("/users/#{@user.id}", admin), username: 'test'
349 350
        expect(response.status).to eq(409)
        expect(@user.reload.username).to eq(@user.username)
J
jubianchi 已提交
351
      end
352
    end
353 354
  end

A
Angus MacArthur 已提交
355 356 357 358 359
  describe "POST /users/:id/keys" do
    before { admin }

    it "should not create invalid ssh key" do
      post api("/users/#{user.id}/keys", admin), { title: "invalid key" }
360 361
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
362 363 364 365
    end

    it 'should not create key without title' do
      post api("/users/#{user.id}/keys", admin), key: 'some key'
366 367
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
A
Angus MacArthur 已提交
368 369 370 371
    end

    it "should create ssh key" do
      key_attrs = attributes_for :key
372
      expect do
A
Angus MacArthur 已提交
373
        post api("/users/#{user.id}/keys", admin), key_attrs
374
      end.to change{ user.keys.count }.by(1)
A
Angus MacArthur 已提交
375
    end
376

K
Kamil Trzcinski 已提交
377 378 379
    it "should return 405 for invalid ID" do
      post api("/users/ASDF/keys", admin)
      expect(response.status).to eq(405)
380
    end
A
Angus MacArthur 已提交
381 382
  end

383 384 385 386 387 388
  describe 'GET /user/:uid/keys' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        get api("/users/#{user.id}/keys")
389
        expect(response.status).to eq(401)
390 391 392 393 394 395
      end
    end

    context 'when authenticated' do
      it 'should return 404 for non-existing user' do
        get api('/users/999999/keys', admin)
396 397
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
398 399 400 401 402 403
      end

      it 'should return array of ssh keys' do
        user.keys << key
        user.save
        get api("/users/#{user.id}/keys", admin)
404 405 406
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first['title']).to eq(key.title)
407
      end
408

K
Kamil Trzcinski 已提交
409
      it "should return 405 for invalid ID" do
410
        get api("/users/ASDF/keys", admin)
K
Kamil Trzcinski 已提交
411
        expect(response.status).to eq(405)
412
      end
413 414 415 416 417 418 419 420 421
    end
  end

  describe 'DELETE /user/:uid/keys/:id' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        delete api("/users/#{user.id}/keys/42")
422
        expect(response.status).to eq(401)
423 424 425 426 427 428 429
      end
    end

    context 'when authenticated' do
      it 'should delete existing key' do
        user.keys << key
        user.save
430
        expect do
431
          delete api("/users/#{user.id}/keys/#{key.id}", admin)
432
        end.to change { user.keys.count }.by(-1)
433
        expect(response.status).to eq(200)
434 435 436 437 438 439
      end

      it 'should return 404 error if user not found' do
        user.keys << key
        user.save
        delete api("/users/999999/keys/#{key.id}", admin)
440 441
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
442 443 444 445
      end

      it 'should return 404 error if key not foud' do
        delete api("/users/#{user.id}/keys/42", admin)
446 447
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 Key Not Found')
448 449 450 451
      end
    end
  end

452 453 454 455
  describe "POST /users/:id/emails" do
    before { admin }

    it "should not create invalid email" do
D
Douwe Maan 已提交
456
      post api("/users/#{user.id}/emails", admin), {}
457 458 459 460 461 462 463 464 465 466
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "email" not given')
    end

    it "should create email" do
      email_attrs = attributes_for :email
      expect do
        post api("/users/#{user.id}/emails", admin), email_attrs
      end.to change{ user.emails.count }.by(1)
    end
467 468

    it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
469 470
      post api("/users/ASDF/emails", admin)
      expect(response.status).to eq(405)
471
    end
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
  end

  describe 'GET /user/:uid/emails' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        get api("/users/#{user.id}/emails")
        expect(response.status).to eq(401)
      end
    end

    context 'when authenticated' do
      it 'should return 404 for non-existing user' do
        get api('/users/999999/emails', admin)
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
      end

      it 'should return array of emails' do
        user.emails << email
        user.save
        get api("/users/#{user.id}/emails", admin)
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first['email']).to eq(email.email)
      end
499 500

      it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
501 502
        put api("/users/ASDF/emails", admin)
        expect(response.status).to eq(405)
503
      end
504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539
    end
  end

  describe 'DELETE /user/:uid/emails/:id' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        delete api("/users/#{user.id}/emails/42")
        expect(response.status).to eq(401)
      end
    end

    context 'when authenticated' do
      it 'should delete existing email' do
        user.emails << email
        user.save
        expect do
          delete api("/users/#{user.id}/emails/#{email.id}", admin)
        end.to change { user.emails.count }.by(-1)
        expect(response.status).to eq(200)
      end

      it 'should return 404 error if user not found' do
        user.emails << email
        user.save
        delete api("/users/999999/emails/#{email.id}", admin)
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
      end

      it 'should return 404 error if email not foud' do
        delete api("/users/#{user.id}/emails/42", admin)
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 Email Not Found')
      end
540 541 542 543

      it "should raise error for invalid ID" do
        expect{delete api("/users/ASDF/emails/bar", admin) }.to raise_error(ActionController::RoutingError)
      end
544 545 546
    end
  end

547 548 549 550 551
  describe "DELETE /users/:id" do
    before { admin }

    it "should delete user" do
      delete api("/users/#{user.id}", admin)
552
      expect(response.status).to eq(200)
553
      expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound
554
      expect(json_response['email']).to eq(user.email)
555 556
    end

557 558
    it "should not delete for unauthenticated user" do
      delete api("/users/#{user.id}")
559
      expect(response.status).to eq(401)
560 561
    end

562 563
    it "shouldn't available for non admin users" do
      delete api("/users/#{user.id}", user)
564
      expect(response.status).to eq(403)
565 566 567 568
    end

    it "should return 404 for non-existing user" do
      delete api("/users/999999", admin)
569 570
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
571
    end
572 573 574 575

    it "should raise error for invalid ID" do
      expect{delete api("/users/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
576 577
  end

N
Nihad Abbasov 已提交
578 579
  describe "GET /user" do
    it "should return current user" do
R
Robert Speicher 已提交
580
      get api("/user", user)
581 582 583 584 585 586
      expect(response.status).to eq(200)
      expect(json_response['email']).to eq(user.email)
      expect(json_response['is_admin']).to eq(user.is_admin?)
      expect(json_response['can_create_project']).to eq(user.can_create_project?)
      expect(json_response['can_create_group']).to eq(user.can_create_group?)
      expect(json_response['projects_limit']).to eq(user.projects_limit)
N
Nihad Abbasov 已提交
587
    end
588 589 590

    it "should return 401 error if user is unauthenticated" do
      get api("/user")
591
      expect(response.status).to eq(401)
592
    end
N
Nihad Abbasov 已提交
593
  end
594 595 596 597 598

  describe "GET /user/keys" do
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/user/keys")
599
        expect(response.status).to eq(401)
600 601
      end
    end
N
Nihad Abbasov 已提交
602

603 604 605 606 607
    context "when authenticated" do
      it "should return array of ssh keys" do
        user.keys << key
        user.save
        get api("/user/keys", user)
608 609 610
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first["title"]).to eq(key.title)
611 612 613 614 615
      end
    end
  end

  describe "GET /user/keys/:id" do
J
Johannes Schleifenbaum 已提交
616
    it "should return single key" do
617 618 619
      user.keys << key
      user.save
      get api("/user/keys/#{key.id}", user)
620 621
      expect(response.status).to eq(200)
      expect(json_response["title"]).to eq(key.title)
622
    end
N
Nihad Abbasov 已提交
623

624 625
    it "should return 404 Not Found within invalid ID" do
      get api("/user/keys/42", user)
626 627
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
628 629
    end

630 631 632 633 634
    it "should return 404 error if admin accesses user's ssh key" do
      user.keys << key
      user.save
      admin
      get api("/user/keys/#{key.id}", admin)
635 636
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
637
    end
638 639 640 641 642

    it "should return 404 for invalid ID" do
      get api("/users/keys/ASDF", admin)
      expect(response.status).to eq(404)
    end
643
  end
N
Nihad Abbasov 已提交
644

645
  describe "POST /user/keys" do
646
    it "should create ssh key" do
647
      key_attrs = attributes_for :key
648
      expect do
649
        post api("/user/keys", user), key_attrs
650
      end.to change{ user.keys.count }.by(1)
651
      expect(response.status).to eq(201)
652 653 654 655
    end

    it "should return a 401 error if unauthorized" do
      post api("/user/keys"), title: 'some title', key: 'some key'
656
      expect(response.status).to eq(401)
657 658 659 660
    end

    it "should not create ssh key without key" do
      post api("/user/keys", user), title: 'title'
661 662
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
663 664 665 666
    end

    it 'should not create ssh key without title' do
      post api('/user/keys', user), key: 'some key'
667 668
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
669 670 671 672
    end

    it "should not create ssh key without title" do
      post api("/user/keys", user), key: "somekey"
673
      expect(response.status).to eq(400)
674 675 676 677 678 679 680
    end
  end

  describe "DELETE /user/keys/:id" do
    it "should delete existed key" do
      user.keys << key
      user.save
681
      expect do
682
        delete api("/user/keys/#{key.id}", user)
683
      end.to change{user.keys.count}.by(-1)
684
      expect(response.status).to eq(200)
685
    end
N
Nihad Abbasov 已提交
686

K
Kevin Lyda 已提交
687
    it "should return success if key ID not found" do
688
      delete api("/user/keys/42", user)
689
      expect(response.status).to eq(200)
690 691 692 693 694 695
    end

    it "should return 401 error if unauthorized" do
      user.keys << key
      user.save
      delete api("/user/keys/#{key.id}")
696
      expect(response.status).to eq(401)
697
    end
698 699 700 701

    it "should raise error for invalid ID" do
      expect{delete api("/users/keys/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
702
  end
703

704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746
  describe "GET /user/emails" do
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/user/emails")
        expect(response.status).to eq(401)
      end
    end

    context "when authenticated" do
      it "should return array of emails" do
        user.emails << email
        user.save
        get api("/user/emails", user)
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first["email"]).to eq(email.email)
      end
    end
  end

  describe "GET /user/emails/:id" do
    it "should return single email" do
      user.emails << email
      user.save
      get api("/user/emails/#{email.id}", user)
      expect(response.status).to eq(200)
      expect(json_response["email"]).to eq(email.email)
    end

    it "should return 404 Not Found within invalid ID" do
      get api("/user/emails/42", user)
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
    end

    it "should return 404 error if admin accesses user's email" do
      user.emails << email
      user.save
      admin
      get api("/user/emails/#{email.id}", admin)
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
    end
747 748 749 750 751

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795
  end

  describe "POST /user/emails" do
    it "should create email" do
      email_attrs = attributes_for :email
      expect do
        post api("/user/emails", user), email_attrs
      end.to change{ user.emails.count }.by(1)
      expect(response.status).to eq(201)
    end

    it "should return a 401 error if unauthorized" do
      post api("/user/emails"), email: 'some email'
      expect(response.status).to eq(401)
    end

    it "should not create email with invalid email" do
      post api("/user/emails", user), {}
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "email" not given')
    end
  end

  describe "DELETE /user/emails/:id" do
    it "should delete existed email" do
      user.emails << email
      user.save
      expect do
        delete api("/user/emails/#{email.id}", user)
      end.to change{user.emails.count}.by(-1)
      expect(response.status).to eq(200)
    end

    it "should return success if email ID not found" do
      delete api("/user/emails/42", user)
      expect(response.status).to eq(200)
    end

    it "should return 401 error if unauthorized" do
      user.emails << email
      user.save
      delete api("/user/emails/#{email.id}")
      expect(response.status).to eq(401)
    end
796 797 798 799

    it "should raise error for invalid ID" do
      expect{delete api("/users/emails/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
800 801
  end

802 803 804 805 806 807 808 809
  describe 'PUT /user/:id/block' do
    before { admin }
    it 'should block existing user' do
      put api("/users/#{user.id}/block", admin)
      expect(response.status).to eq(200)
      expect(user.reload.state).to eq('blocked')
    end

810 811 812 813 814 815
    it 'should not re-block ldap blocked users' do
      put api("/users/#{ldap_blocked_user.id}/block", admin)
      expect(response.status).to eq(403)
      expect(ldap_blocked_user.reload.state).to eq('ldap_blocked')
    end

816 817 818 819 820 821 822 823 824 825 826 827 828 829
    it 'should not be available for non admin users' do
      put api("/users/#{user.id}/block", user)
      expect(response.status).to eq(403)
      expect(user.reload.state).to eq('active')
    end

    it 'should return a 404 error if user id not found' do
      put api('/users/9999/block', admin)
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
    end
  end

  describe 'PUT /user/:id/unblock' do
830
    let(:blocked_user)  { create(:user, state: 'blocked') }
831
    before { admin }
832

833 834 835 836 837 838 839
    it 'should unblock existing user' do
      put api("/users/#{user.id}/unblock", admin)
      expect(response.status).to eq(200)
      expect(user.reload.state).to eq('active')
    end

    it 'should unblock a blocked user' do
840
      put api("/users/#{blocked_user.id}/unblock", admin)
841
      expect(response.status).to eq(200)
842 843 844 845 846 847 848
      expect(blocked_user.reload.state).to eq('active')
    end

    it 'should not unblock ldap blocked users' do
      put api("/users/#{ldap_blocked_user.id}/unblock", admin)
      expect(response.status).to eq(403)
      expect(ldap_blocked_user.reload.state).to eq('ldap_blocked')
849 850 851 852 853 854 855 856 857 858 859 860 861
    end

    it 'should not be available for non admin users' do
      put api("/users/#{user.id}/unblock", user)
      expect(response.status).to eq(403)
      expect(user.reload.state).to eq('active')
    end

    it 'should return a 404 error if user id not found' do
      put api('/users/9999/block', admin)
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
    end
862 863 864 865

    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF/block", admin) }.to raise_error(ActionController::RoutingError)
    end
866
  end
N
Nihad Abbasov 已提交
867
end