users_spec.rb 26.5 KB
Newer Older
Nihad Abbasov's avatar
Nihad Abbasov committed
1 2
require 'spec_helper'

Jeroen van Baarsen's avatar
Jeroen van Baarsen committed
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) }
Nihad Abbasov's avatar
Nihad Abbasov committed
11 12

  describe "GET /users" do
13 14 15
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/users")
16
        expect(response.status).to eq(401)
17
      end
Nihad Abbasov's avatar
Nihad Abbasov committed
18 19
    end

20
    context "when authenticated" do
Nihad Abbasov's avatar
Nihad Abbasov committed
21
      it "should return an array of users" do
Robert Speicher's avatar
Robert Speicher committed
22
        get api("/users", user)
23 24
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
Marin Jankovski's avatar
Marin Jankovski committed
25
        username = user.username
26 27 28
        expect(json_response.detect do |user|
          user['username'] == username
        end['username']).to eq(username)
Nihad Abbasov's avatar
Nihad Abbasov committed
29 30
      end
    end
31 32 33 34

    context "when admin" do
      it "should return an array of users" do
        get api("/users", admin)
35 36 37 38 39
        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'
Stan Hu's avatar
Stan Hu committed
40
        expect(json_response.first.keys).to include 'two_factor_enabled'
41 42
      end
    end
43 44 45

    context "when authenticated and ldap is enabled" do
      it "should return non-ldap user" do
46
        User.delete_all
47 48
        create :omniauth_user, provider: "ldapserver1"
        get api("/users", user), skip_ldap: "true"
Robert Speicher's avatar
Robert Speicher committed
49 50
        expect(response.status).to eq 200
        expect(json_response).to be_an Array
51
        username = user.username
Robert Speicher's avatar
Robert Speicher committed
52
        expect(json_response.first["username"]).to eq username
53 54
      end
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
55 56 57 58
  end

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

64 65
    it "should return a 401 if unauthenticated" do
      get api("/users/9998")
66
      expect(response.status).to eq(401)
67
    end
68

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

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

  describe "POST /users" do
    before{ admin }
83 84

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Marin Jankovski's avatar
Marin Jankovski committed
211
  describe "GET /users/sign_up" do
212

213 214
    it "should redirect to sign in page" do
      get "/users/sign_up"
215 216
      expect(response.status).to eq(302)
      expect(response).to redirect_to(new_user_session_path)
Marin Jankovski's avatar
Marin Jankovski committed
217 218 219
    end
  end

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

223 224
    before { admin }

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

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

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

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

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

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

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

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

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

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

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

    context "with existing user" do
315
      before do
316 317
        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' }
318
        @user = User.all.last
319
      end
320

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

Angus MacArthur's avatar
Angus MacArthur committed
336 337 338 339 340
  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" }
341 342
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
343 344 345 346
    end

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

    it "should create ssh key" do
      key_attrs = attributes_for :key
353
      expect do
Angus MacArthur's avatar
Angus MacArthur committed
354
        post api("/users/#{user.id}/keys", admin), key_attrs
355
      end.to change{ user.keys.count }.by(1)
Angus MacArthur's avatar
Angus MacArthur committed
356
    end
357

358 359 360
    it "should return 405 for invalid ID" do
      post api("/users/ASDF/keys", admin)
      expect(response.status).to eq(405)
361
    end
Angus MacArthur's avatar
Angus MacArthur committed
362 363
  end

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

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

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

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

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

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

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

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

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

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

    it "should raise error for invalid ID" do
450 451
      post api("/users/ASDF/emails", admin)
      expect(response.status).to eq(405)
452
    end
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 479
  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
480 481

      it "should raise error for invalid ID" do
482 483
        put api("/users/ASDF/emails", admin)
        expect(response.status).to eq(405)
484
      end
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 520
    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
521 522 523 524

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

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

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

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

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

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

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

Nihad Abbasov's avatar
Nihad Abbasov committed
559 560
  describe "GET /user" do
    it "should return current user" do
Robert Speicher's avatar
Robert Speicher committed
561
      get api("/user", user)
562 563 564 565 566 567
      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)
Nihad Abbasov's avatar
Nihad Abbasov committed
568
    end
569 570 571

    it "should return 401 error if user is unauthenticated" do
      get api("/user")
572
      expect(response.status).to eq(401)
573
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
574
  end
575 576 577 578 579

  describe "GET /user/keys" do
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/user/keys")
580
        expect(response.status).to eq(401)
581 582
      end
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
583

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

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

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

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

    it "should return 404 for invalid ID" do
      get api("/users/keys/ASDF", admin)
      expect(response.status).to eq(404)
    end
624
  end
Nihad Abbasov's avatar
Nihad Abbasov committed
625

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

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

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

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

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

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

Kevin Lyda's avatar
Kevin Lyda committed
668
    it "should return success if key ID not found" do
669
      delete api("/user/keys/42", user)
670
      expect(response.status).to eq(200)
671 672 673 674 675 676
    end

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

    it "should raise error for invalid ID" do
      expect{delete api("/users/keys/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
683
  end
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 727
  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
728 729 730 731 732

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
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 776
  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
777 778 779 780

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

783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
  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

    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
    before { admin }
    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
      put api("/users/#{user.id}/block", admin)
      expect(response.status).to eq(200)
      expect(user.reload.state).to eq('blocked')
      put api("/users/#{user.id}/unblock", admin)
      expect(response.status).to eq(200)
      expect(user.reload.state).to eq('active')
    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
832 833 834 835

    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF/block", admin) }.to raise_error(ActionController::RoutingError)
    end
836
  end
Nihad Abbasov's avatar
Nihad Abbasov committed
837
end