users_spec.rb 27.9 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
    end

285 286 287 288 289 290 291
    it "should update external status" do
      put api("/users/#{user.id}", admin), { external: true }
      expect(response.status).to eq 200
      expect(json_response['external']).to eq(true)
      expect(user.reload.external?).to be_truthy
    end

292
    it "should not update admin status" do
293
      put api("/users/#{admin_user.id}", admin), { can_create_group: false }
294 295 296 297
      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)
298 299
    end

300
    it "should not allow invalid update" do
301
      put api("/users/#{user.id}", admin), { email: 'invalid email' }
302 303
      expect(response.status).to eq(400)
      expect(user.reload.email).not_to eq('invalid email')
304 305 306 307
    end

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

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

317 318 319 320
    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end

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

    context "with existing user" do
341
      before do
342 343
        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 已提交
344
        @user = User.all.last
345
      end
346

J
jubianchi 已提交
347 348
      it 'should return 409 conflict error if email address exists' do
        put api("/users/#{@user.id}", admin), email: 'test@example.com'
349 350
        expect(response.status).to eq(409)
        expect(@user.reload.email).to eq(@user.email)
J
jubianchi 已提交
351 352 353 354 355
      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'
356 357
        expect(response.status).to eq(409)
        expect(@user.reload.username).to eq(@user.username)
J
jubianchi 已提交
358
      end
359
    end
360 361
  end

A
Angus MacArthur 已提交
362 363 364 365 366
  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" }
367 368
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
369 370 371 372
    end

    it 'should not create key without title' do
      post api("/users/#{user.id}/keys", admin), key: 'some key'
373 374
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
A
Angus MacArthur 已提交
375 376 377 378
    end

    it "should create ssh key" do
      key_attrs = attributes_for :key
379
      expect do
A
Angus MacArthur 已提交
380
        post api("/users/#{user.id}/keys", admin), key_attrs
381
      end.to change{ user.keys.count }.by(1)
A
Angus MacArthur 已提交
382
    end
383

K
Kamil Trzcinski 已提交
384 385 386
    it "should return 405 for invalid ID" do
      post api("/users/ASDF/keys", admin)
      expect(response.status).to eq(405)
387
    end
A
Angus MacArthur 已提交
388 389
  end

390 391 392 393 394 395
  describe 'GET /user/:uid/keys' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        get api("/users/#{user.id}/keys")
396
        expect(response.status).to eq(401)
397 398 399 400 401 402
      end
    end

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

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

K
Kamil Trzcinski 已提交
416
      it "should return 405 for invalid ID" do
417
        get api("/users/ASDF/keys", admin)
K
Kamil Trzcinski 已提交
418
        expect(response.status).to eq(405)
419
      end
420 421 422 423 424 425 426 427 428
    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")
429
        expect(response.status).to eq(401)
430 431 432 433 434 435 436
      end
    end

    context 'when authenticated' do
      it 'should delete existing key' do
        user.keys << key
        user.save
437
        expect do
438
          delete api("/users/#{user.id}/keys/#{key.id}", admin)
439
        end.to change { user.keys.count }.by(-1)
440
        expect(response.status).to eq(200)
441 442 443 444 445 446
      end

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

      it 'should return 404 error if key not foud' do
        delete api("/users/#{user.id}/keys/42", admin)
453 454
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 Key Not Found')
455 456 457 458
      end
    end
  end

459 460 461 462
  describe "POST /users/:id/emails" do
    before { admin }

    it "should not create invalid email" do
D
Douwe Maan 已提交
463
      post api("/users/#{user.id}/emails", admin), {}
464 465 466 467 468 469 470 471 472 473
      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
474 475

    it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
476 477
      post api("/users/ASDF/emails", admin)
      expect(response.status).to eq(405)
478
    end
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
  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
506 507

      it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
508 509
        put api("/users/ASDF/emails", admin)
        expect(response.status).to eq(405)
510
      end
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 540 541 542 543 544 545 546
    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
547 548 549 550

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

554 555 556 557 558
  describe "DELETE /users/:id" do
    before { admin }

    it "should delete user" do
      delete api("/users/#{user.id}", admin)
559
      expect(response.status).to eq(200)
560
      expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound
561
      expect(json_response['email']).to eq(user.email)
562 563
    end

564 565
    it "should not delete for unauthenticated user" do
      delete api("/users/#{user.id}")
566
      expect(response.status).to eq(401)
567 568
    end

569 570
    it "shouldn't available for non admin users" do
      delete api("/users/#{user.id}", user)
571
      expect(response.status).to eq(403)
572 573 574 575
    end

    it "should return 404 for non-existing user" do
      delete api("/users/999999", admin)
576 577
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
578
    end
579 580 581 582

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

N
Nihad Abbasov 已提交
585 586
  describe "GET /user" do
    it "should return current user" do
R
Robert Speicher 已提交
587
      get api("/user", user)
588 589 590 591 592 593
      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 已提交
594
    end
595 596 597

    it "should return 401 error if user is unauthenticated" do
      get api("/user")
598
      expect(response.status).to eq(401)
599
    end
N
Nihad Abbasov 已提交
600
  end
601 602 603 604 605

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

610 611 612 613 614
    context "when authenticated" do
      it "should return array of ssh keys" do
        user.keys << key
        user.save
        get api("/user/keys", user)
615 616 617
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first["title"]).to eq(key.title)
618 619 620 621 622
      end
    end
  end

  describe "GET /user/keys/:id" do
J
Johannes Schleifenbaum 已提交
623
    it "should return single key" do
624 625 626
      user.keys << key
      user.save
      get api("/user/keys/#{key.id}", user)
627 628
      expect(response.status).to eq(200)
      expect(json_response["title"]).to eq(key.title)
629
    end
N
Nihad Abbasov 已提交
630

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

637 638 639 640 641
    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)
642 643
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
644
    end
645 646 647 648 649

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

652
  describe "POST /user/keys" do
653
    it "should create ssh key" do
654
      key_attrs = attributes_for :key
655
      expect do
656
        post api("/user/keys", user), key_attrs
657
      end.to change{ user.keys.count }.by(1)
658
      expect(response.status).to eq(201)
659 660 661 662
    end

    it "should return a 401 error if unauthorized" do
      post api("/user/keys"), title: 'some title', key: 'some key'
663
      expect(response.status).to eq(401)
664 665 666 667
    end

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

    it 'should not create ssh key without title' do
      post api('/user/keys', user), key: 'some key'
674 675
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
676 677 678 679
    end

    it "should not create ssh key without title" do
      post api("/user/keys", user), key: "somekey"
680
      expect(response.status).to eq(400)
681 682 683 684 685 686 687
    end
  end

  describe "DELETE /user/keys/:id" do
    it "should delete existed key" do
      user.keys << key
      user.save
688
      expect do
689
        delete api("/user/keys/#{key.id}", user)
690
      end.to change{user.keys.count}.by(-1)
691
      expect(response.status).to eq(200)
692
    end
N
Nihad Abbasov 已提交
693

K
Kevin Lyda 已提交
694
    it "should return success if key ID not found" do
695
      delete api("/user/keys/42", user)
696
      expect(response.status).to eq(200)
697 698 699 700 701 702
    end

    it "should return 401 error if unauthorized" do
      user.keys << key
      user.save
      delete api("/user/keys/#{key.id}")
703
      expect(response.status).to eq(401)
704
    end
705 706 707 708

    it "should raise error for invalid ID" do
      expect{delete api("/users/keys/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
709
  end
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 747 748 749 750 751 752 753
  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
754 755 756 757 758

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
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 796 797 798 799 800 801 802
  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
803 804 805 806

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

809 810 811 812 813 814 815 816
  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

817 818 819 820 821 822
    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

823 824 825 826 827 828 829 830 831 832 833 834 835 836
    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
837
    let(:blocked_user)  { create(:user, state: 'blocked') }
838
    before { admin }
839

840 841 842 843 844 845 846
    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
847
      put api("/users/#{blocked_user.id}/unblock", admin)
848
      expect(response.status).to eq(200)
849 850 851 852 853 854 855
      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')
856 857 858 859 860 861 862 863 864 865 866 867 868
    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
869 870 871 872

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