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

    it "should not create user with invalid email" do
J
jubianchi 已提交
124
      post api('/users', admin),
125 126 127
        email: 'invalid email',
        password: 'password',
        name: 'test'
128
      expect(response.status).to eq(400)
129 130
    end

J
jubianchi 已提交
131
    it 'should return 400 error if name not given' do
132
      post api('/users', admin), attributes_for(:user).except(:name)
133
      expect(response.status).to eq(400)
J
jubianchi 已提交
134 135 136
    end

    it 'should return 400 error if password not given' do
137
      post api('/users', admin), attributes_for(:user).except(:password)
138
      expect(response.status).to eq(400)
139 140
    end

141 142 143 144 145 146 147
    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)
148
      expect(response.status).to eq(400)
J
jubianchi 已提交
149 150 151 152
    end

    it 'should return 400 error if user does not validate' do
      post api('/users', admin),
153 154 155 156 157 158
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
159 160
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
161
        to eq(['is too short (minimum is 8 characters)'])
162
      expect(json_response['message']['bio']).
163
        to eq(['is too long (maximum is 255 characters)'])
164
      expect(json_response['message']['projects_limit']).
165
        to eq(['must be greater than or equal to 0'])
166
      expect(json_response['message']['username']).
R
Robert Speicher 已提交
167
        to eq([Gitlab::Regex.namespace_regex_message])
168 169
    end

V
Valeriy Sizov 已提交
170
    it "shouldn't available for non admin users" do
171
      post api("/users", user), attributes_for(:user)
172
      expect(response.status).to eq(403)
V
Valeriy Sizov 已提交
173
    end
174

J
jubianchi 已提交
175 176 177
    context 'with existing user' do
      before do
        post api('/users', admin),
178 179 180 181
          email: 'test@example.com',
          password: 'password',
          username: 'test',
          name: 'foo'
J
jubianchi 已提交
182
      end
183

J
jubianchi 已提交
184
      it 'should return 409 conflict error if user with same email exists' do
185
        expect do
J
jubianchi 已提交
186
          post api('/users', admin),
187 188 189 190 191
            name: 'foo',
            email: 'test@example.com',
            password: 'password',
            username: 'foo'
        end.to change { User.count }.by(0)
192 193
        expect(response.status).to eq(409)
        expect(json_response['message']).to eq('Email has already been taken')
194 195
      end

J
jubianchi 已提交
196 197 198
      it 'should return 409 conflict error if same username exists' do
        expect do
          post api('/users', admin),
199 200 201 202
            name: 'foo',
            email: 'foo@example.com',
            password: 'password',
            username: 'test'
J
jubianchi 已提交
203
        end.to change { User.count }.by(0)
204 205
        expect(response.status).to eq(409)
        expect(json_response['message']).to eq('Username has already been taken')
206 207
      end
    end
V
Valeriy Sizov 已提交
208 209
  end

M
Marin Jankovski 已提交
210
  describe "GET /users/sign_up" do
211

212 213
    it "should redirect to sign in page" do
      get "/users/sign_up"
214 215
      expect(response.status).to eq(302)
      expect(response).to redirect_to(new_user_session_path)
M
Marin Jankovski 已提交
216 217 218
    end
  end

219
  describe "PUT /users/:id" do
220 221
    let!(:admin_user) { create(:admin) }

222 223
    before { admin }

224
    it "should update user with new bio" do
225
      put api("/users/#{user.id}", admin), { bio: 'new test bio' }
226 227 228
      expect(response.status).to eq(200)
      expect(json_response['bio']).to eq('new test bio')
      expect(user.reload.bio).to eq('new test bio')
229 230
    end

J
jubianchi 已提交
231 232
    it 'should update user with his own email' do
      put api("/users/#{user.id}", admin), email: user.email
233 234 235
      expect(response.status).to eq(200)
      expect(json_response['email']).to eq(user.email)
      expect(user.reload.email).to eq(user.email)
J
jubianchi 已提交
236 237 238 239
    end

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

245 246 247 248 249 250 251 252 253 254 255 256 257
    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

258
    it "should update admin status" do
259
      put api("/users/#{user.id}", admin), { admin: true }
260 261 262
      expect(response.status).to eq(200)
      expect(json_response['is_admin']).to eq(true)
      expect(user.reload.admin).to eq(true)
263 264 265
    end

    it "should not update admin status" do
266
      put api("/users/#{admin_user.id}", admin), { can_create_group: false }
267 268 269 270
      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)
271 272
    end

273
    it "should not allow invalid update" do
274
      put api("/users/#{user.id}", admin), { email: 'invalid email' }
275 276
      expect(response.status).to eq(400)
      expect(user.reload.email).not_to eq('invalid email')
277 278 279 280
    end

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

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

290 291 292 293
    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end

J
jubianchi 已提交
294 295
    it 'should return 400 error if user does not validate' do
      put api("/users/#{user.id}", admin),
296 297 298 299 300 301
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
302 303
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
304
        to eq(['is too short (minimum is 8 characters)'])
305
      expect(json_response['message']['bio']).
306
        to eq(['is too long (maximum is 255 characters)'])
307
      expect(json_response['message']['projects_limit']).
308
        to eq(['must be greater than or equal to 0'])
309
      expect(json_response['message']['username']).
R
Robert Speicher 已提交
310
        to eq([Gitlab::Regex.namespace_regex_message])
311
    end
312 313

    context "with existing user" do
314
      before do
315 316
        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 已提交
317
        @user = User.all.last
318
      end
319

J
jubianchi 已提交
320 321
      it 'should return 409 conflict error if email address exists' do
        put api("/users/#{@user.id}", admin), email: 'test@example.com'
322 323
        expect(response.status).to eq(409)
        expect(@user.reload.email).to eq(@user.email)
J
jubianchi 已提交
324 325 326 327 328
      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'
329 330
        expect(response.status).to eq(409)
        expect(@user.reload.username).to eq(@user.username)
J
jubianchi 已提交
331
      end
332
    end
333 334
  end

A
Angus MacArthur 已提交
335 336 337 338 339
  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" }
340 341
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
342 343 344 345
    end

    it 'should not create key without title' do
      post api("/users/#{user.id}/keys", admin), key: 'some key'
346 347
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
A
Angus MacArthur 已提交
348 349 350 351
    end

    it "should create ssh key" do
      key_attrs = attributes_for :key
352
      expect do
A
Angus MacArthur 已提交
353
        post api("/users/#{user.id}/keys", admin), key_attrs
354
      end.to change{ user.keys.count }.by(1)
A
Angus MacArthur 已提交
355
    end
356

K
Kamil Trzcinski 已提交
357 358 359
    it "should return 405 for invalid ID" do
      post api("/users/ASDF/keys", admin)
      expect(response.status).to eq(405)
360
    end
A
Angus MacArthur 已提交
361 362
  end

363 364 365 366 367 368
  describe 'GET /user/:uid/keys' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        get api("/users/#{user.id}/keys")
369
        expect(response.status).to eq(401)
370 371 372 373 374 375
      end
    end

    context 'when authenticated' do
      it 'should return 404 for non-existing user' do
        get api('/users/999999/keys', admin)
376 377
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
378 379 380 381 382 383
      end

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

K
Kamil Trzcinski 已提交
389
      it "should return 405 for invalid ID" do
390
        get api("/users/ASDF/keys", admin)
K
Kamil Trzcinski 已提交
391
        expect(response.status).to eq(405)
392
      end
393 394 395 396 397 398 399 400 401
    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")
402
        expect(response.status).to eq(401)
403 404 405 406 407 408 409
      end
    end

    context 'when authenticated' do
      it 'should delete existing key' do
        user.keys << key
        user.save
410
        expect do
411
          delete api("/users/#{user.id}/keys/#{key.id}", admin)
412
        end.to change { user.keys.count }.by(-1)
413
        expect(response.status).to eq(200)
414 415 416 417 418 419
      end

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

      it 'should return 404 error if key not foud' do
        delete api("/users/#{user.id}/keys/42", admin)
426 427
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 Key Not Found')
428 429 430 431
      end
    end
  end

432 433 434 435
  describe "POST /users/:id/emails" do
    before { admin }

    it "should not create invalid email" do
D
Douwe Maan 已提交
436
      post api("/users/#{user.id}/emails", admin), {}
437 438 439 440 441 442 443 444 445 446
      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
447 448

    it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
449 450
      post api("/users/ASDF/emails", admin)
      expect(response.status).to eq(405)
451
    end
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
  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
479 480

      it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
481 482
        put api("/users/ASDF/emails", admin)
        expect(response.status).to eq(405)
483
      end
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
    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
520 521 522 523

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

527 528 529 530 531
  describe "DELETE /users/:id" do
    before { admin }

    it "should delete user" do
      delete api("/users/#{user.id}", admin)
532
      expect(response.status).to eq(200)
533
      expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound
534
      expect(json_response['email']).to eq(user.email)
535 536
    end

537 538
    it "should not delete for unauthenticated user" do
      delete api("/users/#{user.id}")
539
      expect(response.status).to eq(401)
540 541
    end

542 543
    it "shouldn't available for non admin users" do
      delete api("/users/#{user.id}", user)
544
      expect(response.status).to eq(403)
545 546 547 548
    end

    it "should return 404 for non-existing user" do
      delete api("/users/999999", admin)
549 550
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
551
    end
552 553 554 555

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

N
Nihad Abbasov 已提交
558 559
  describe "GET /user" do
    it "should return current user" do
R
Robert Speicher 已提交
560
      get api("/user", user)
561 562 563 564 565 566
      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 已提交
567
    end
568 569 570

    it "should return 401 error if user is unauthenticated" do
      get api("/user")
571
      expect(response.status).to eq(401)
572
    end
N
Nihad Abbasov 已提交
573
  end
574 575 576 577 578

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

583 584 585 586 587
    context "when authenticated" do
      it "should return array of ssh keys" do
        user.keys << key
        user.save
        get api("/user/keys", user)
588 589 590
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first["title"]).to eq(key.title)
591 592 593 594 595
      end
    end
  end

  describe "GET /user/keys/:id" do
J
Johannes Schleifenbaum 已提交
596
    it "should return single key" do
597 598 599
      user.keys << key
      user.save
      get api("/user/keys/#{key.id}", user)
600 601
      expect(response.status).to eq(200)
      expect(json_response["title"]).to eq(key.title)
602
    end
N
Nihad Abbasov 已提交
603

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

610 611 612 613 614
    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)
615 616
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
617
    end
618 619 620 621 622

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

625
  describe "POST /user/keys" do
626
    it "should create ssh key" do
627
      key_attrs = attributes_for :key
628
      expect do
629
        post api("/user/keys", user), key_attrs
630
      end.to change{ user.keys.count }.by(1)
631
      expect(response.status).to eq(201)
632 633 634 635
    end

    it "should return a 401 error if unauthorized" do
      post api("/user/keys"), title: 'some title', key: 'some key'
636
      expect(response.status).to eq(401)
637 638 639 640
    end

    it "should not create ssh key without key" do
      post api("/user/keys", user), title: 'title'
641 642
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
643 644 645 646
    end

    it 'should not create ssh key without title' do
      post api('/user/keys', user), key: 'some key'
647 648
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
649 650 651 652
    end

    it "should not create ssh key without title" do
      post api("/user/keys", user), key: "somekey"
653
      expect(response.status).to eq(400)
654 655 656 657 658 659 660
    end
  end

  describe "DELETE /user/keys/:id" do
    it "should delete existed key" do
      user.keys << key
      user.save
661
      expect do
662
        delete api("/user/keys/#{key.id}", user)
663
      end.to change{user.keys.count}.by(-1)
664
      expect(response.status).to eq(200)
665
    end
N
Nihad Abbasov 已提交
666

K
Kevin Lyda 已提交
667
    it "should return success if key ID not found" do
668
      delete api("/user/keys/42", user)
669
      expect(response.status).to eq(200)
670 671 672 673 674 675
    end

    it "should return 401 error if unauthorized" do
      user.keys << key
      user.save
      delete api("/user/keys/#{key.id}")
676
      expect(response.status).to eq(401)
677
    end
678 679 680 681

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

684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
  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
727 728 729 730 731

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775
  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
776 777 778 779

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

782 783 784 785 786 787 788 789
  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

790 791 792 793 794 795
    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

796 797 798 799 800 801 802 803 804 805 806 807 808 809
    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
810
    let(:blocked_user)  { create(:user, state: 'blocked') }
811
    before { admin }
812

813 814 815 816 817 818 819
    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
820
      put api("/users/#{blocked_user.id}/unblock", admin)
821
      expect(response.status).to eq(200)
822 823 824 825 826 827 828
      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')
829 830 831 832 833 834 835 836 837 838 839 840 841
    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
842 843 844 845

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