users_spec.rb 26.1 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) }
N
Nihad Abbasov 已提交
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
N
Nihad Abbasov 已提交
18 19
    end

20
    context "when authenticated" do
N
Nihad Abbasov 已提交
21
      it "should return an array of users" do
R
Robert Speicher 已提交
22
        get api("/users", user)
23 24
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
M
Marin Jankovski 已提交
25
        username = user.username
26 27 28
        expect(json_response.detect do |user|
          user['username'] == username
        end['username']).to eq(username)
N
Nihad Abbasov 已提交
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'
S
Stan Hu 已提交
40
        expect(json_response.first.keys).to include 'two_factor_enabled'
41 42
      end
    end
N
Nihad Abbasov 已提交
43 44 45 46
  end

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

52 53
    it "should return a 401 if unauthenticated" do
      get api("/users/9998")
54
      expect(response.status).to eq(401)
55
    end
V
Valeriy Sizov 已提交
56

57 58
    it "should return a 404 error if user id not found" do
      get api("/users/9999", user)
59 60
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
V
Valeriy Sizov 已提交
61
    end
62 63 64 65 66

    it "should return a 404 if invalid ID" do
      get api("/users/1ASDF", user)
      expect(response.status).to eq(404)
    end
67 68 69 70
  end

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

    it "should create user" do
73
      expect do
74
        post api("/users", admin), attributes_for(:user, projects_limit: 3)
75
      end.to change { User.count }.by(1)
V
Valeriy Sizov 已提交
76 77
    end

78 79
    it "should create user with correct attributes" do
      post api('/users', admin), attributes_for(:user, admin: true, can_create_group: true)
80
      expect(response.status).to eq(201)
81 82
      user_id = json_response['id']
      new_user = User.find(user_id)
83 84 85
      expect(new_user).not_to eq(nil)
      expect(new_user.admin).to eq(true)
      expect(new_user.can_create_group).to eq(true)
86 87
    end

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

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

107 108
    it "should return 201 Created on success" do
      post api("/users", admin), attributes_for(:user, projects_limit: 3)
109
      expect(response.status).to eq(201)
110 111 112
    end

    it "should not create user with invalid email" do
J
jubianchi 已提交
113
      post api('/users', admin),
114 115 116
        email: 'invalid email',
        password: 'password',
        name: 'test'
117
      expect(response.status).to eq(400)
118 119
    end

J
jubianchi 已提交
120
    it 'should return 400 error if name not given' do
121
      post api('/users', admin), attributes_for(:user).except(:name)
122
      expect(response.status).to eq(400)
J
jubianchi 已提交
123 124 125
    end

    it 'should return 400 error if password not given' do
126
      post api('/users', admin), attributes_for(:user).except(:password)
127
      expect(response.status).to eq(400)
128 129
    end

130 131 132 133 134 135 136
    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)
137
      expect(response.status).to eq(400)
J
jubianchi 已提交
138 139 140 141
    end

    it 'should return 400 error if user does not validate' do
      post api('/users', admin),
142 143 144 145 146 147
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
148 149
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
150
        to eq(['is too short (minimum is 8 characters)'])
151
      expect(json_response['message']['bio']).
152
        to eq(['is too long (maximum is 255 characters)'])
153
      expect(json_response['message']['projects_limit']).
154
        to eq(['must be greater than or equal to 0'])
155
      expect(json_response['message']['username']).
156
        to eq([Gitlab::Regex.send(:namespace_regex_message)])
157 158
    end

V
Valeriy Sizov 已提交
159
    it "shouldn't available for non admin users" do
160
      post api("/users", user), attributes_for(:user)
161
      expect(response.status).to eq(403)
V
Valeriy Sizov 已提交
162
    end
163

J
jubianchi 已提交
164 165 166
    context 'with existing user' do
      before do
        post api('/users', admin),
167 168 169 170
          email: 'test@example.com',
          password: 'password',
          username: 'test',
          name: 'foo'
J
jubianchi 已提交
171
      end
172

J
jubianchi 已提交
173
      it 'should return 409 conflict error if user with same email exists' do
174
        expect do
J
jubianchi 已提交
175
          post api('/users', admin),
176 177 178 179 180
            name: 'foo',
            email: 'test@example.com',
            password: 'password',
            username: 'foo'
        end.to change { User.count }.by(0)
181 182
        expect(response.status).to eq(409)
        expect(json_response['message']).to eq('Email has already been taken')
183 184
      end

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

M
Marin Jankovski 已提交
199
  describe "GET /users/sign_up" do
200

201 202
    it "should redirect to sign in page" do
      get "/users/sign_up"
203 204
      expect(response.status).to eq(302)
      expect(response).to redirect_to(new_user_session_path)
M
Marin Jankovski 已提交
205 206 207
    end
  end

208
  describe "PUT /users/:id" do
209 210
    let!(:admin_user) { create(:admin) }

211 212
    before { admin }

213
    it "should update user with new bio" do
214
      put api("/users/#{user.id}", admin), { bio: 'new test bio' }
215 216 217
      expect(response.status).to eq(200)
      expect(json_response['bio']).to eq('new test bio')
      expect(user.reload.bio).to eq('new test bio')
218 219
    end

J
jubianchi 已提交
220 221
    it 'should update user with his own email' do
      put api("/users/#{user.id}", admin), email: user.email
222 223 224
      expect(response.status).to eq(200)
      expect(json_response['email']).to eq(user.email)
      expect(user.reload.email).to eq(user.email)
J
jubianchi 已提交
225 226 227 228
    end

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

234 235 236 237 238 239 240 241 242 243 244 245 246
    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

247
    it "should update admin status" do
248
      put api("/users/#{user.id}", admin), { admin: true }
249 250 251
      expect(response.status).to eq(200)
      expect(json_response['is_admin']).to eq(true)
      expect(user.reload.admin).to eq(true)
252 253 254
    end

    it "should not update admin status" do
255
      put api("/users/#{admin_user.id}", admin), { can_create_group: false }
256 257 258 259
      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)
260 261
    end

262
    it "should not allow invalid update" do
263
      put api("/users/#{user.id}", admin), { email: 'invalid email' }
264 265
      expect(response.status).to eq(400)
      expect(user.reload.email).not_to eq('invalid email')
266 267 268 269
    end

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

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

279 280 281 282
    it "should raise error for invalid ID" do
      expect{put api("/users/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end

J
jubianchi 已提交
283 284
    it 'should return 400 error if user does not validate' do
      put api("/users/#{user.id}", admin),
285 286 287 288 289 290
        password: 'pass',
        email: 'test@example.com',
        username: 'test!',
        name: 'test',
        bio: 'g' * 256,
        projects_limit: -1
291 292
      expect(response.status).to eq(400)
      expect(json_response['message']['password']).
293
        to eq(['is too short (minimum is 8 characters)'])
294
      expect(json_response['message']['bio']).
295
        to eq(['is too long (maximum is 255 characters)'])
296
      expect(json_response['message']['projects_limit']).
297
        to eq(['must be greater than or equal to 0'])
298
      expect(json_response['message']['username']).
299
        to eq([Gitlab::Regex.send(:namespace_regex_message)])
300
    end
301 302

    context "with existing user" do
303
      before do
304 305
        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 已提交
306
        @user = User.all.last
307
      end
308

J
jubianchi 已提交
309 310
      it 'should return 409 conflict error if email address exists' do
        put api("/users/#{@user.id}", admin), email: 'test@example.com'
311 312
        expect(response.status).to eq(409)
        expect(@user.reload.email).to eq(@user.email)
J
jubianchi 已提交
313 314 315 316 317
      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'
318 319
        expect(response.status).to eq(409)
        expect(@user.reload.username).to eq(@user.username)
J
jubianchi 已提交
320
      end
321
    end
322 323
  end

A
Angus MacArthur 已提交
324 325 326 327 328
  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" }
329 330
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
331 332 333 334
    end

    it 'should not create key without title' do
      post api("/users/#{user.id}/keys", admin), key: 'some key'
335 336
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
A
Angus MacArthur 已提交
337 338 339 340
    end

    it "should create ssh key" do
      key_attrs = attributes_for :key
341
      expect do
A
Angus MacArthur 已提交
342
        post api("/users/#{user.id}/keys", admin), key_attrs
343
      end.to change{ user.keys.count }.by(1)
A
Angus MacArthur 已提交
344
    end
345 346 347 348

    it "should raise error for invalid ID" do
      expect{post api("/users/ASDF/keys", admin) }.to raise_error(ActionController::RoutingError)
    end
A
Angus MacArthur 已提交
349 350
  end

351 352 353 354 355 356
  describe 'GET /user/:uid/keys' do
    before { admin }

    context 'when unauthenticated' do
      it 'should return authentication error' do
        get api("/users/#{user.id}/keys")
357
        expect(response.status).to eq(401)
358 359 360 361 362 363
      end
    end

    context 'when authenticated' do
      it 'should return 404 for non-existing user' do
        get api('/users/999999/keys', admin)
364 365
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 User Not Found')
366 367 368 369 370 371
      end

      it 'should return array of ssh keys' do
        user.keys << key
        user.save
        get api("/users/#{user.id}/keys", admin)
372 373 374
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first['title']).to eq(key.title)
375
      end
376 377 378 379 380

      it "should return 404 for invalid ID" do
        get api("/users/ASDF/keys", admin)
        expect(response.status).to eq(404)
      end
381 382 383 384 385 386 387 388 389
    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")
390
        expect(response.status).to eq(401)
391 392 393 394 395 396 397
      end
    end

    context 'when authenticated' do
      it 'should delete existing key' do
        user.keys << key
        user.save
398
        expect do
399
          delete api("/users/#{user.id}/keys/#{key.id}", admin)
400
        end.to change { user.keys.count }.by(-1)
401
        expect(response.status).to eq(200)
402 403 404 405 406 407
      end

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

      it 'should return 404 error if key not foud' do
        delete api("/users/#{user.id}/keys/42", admin)
414 415
        expect(response.status).to eq(404)
        expect(json_response['message']).to eq('404 Key Not Found')
416 417 418 419
      end
    end
  end

420 421 422 423
  describe "POST /users/:id/emails" do
    before { admin }

    it "should not create invalid email" do
D
Douwe Maan 已提交
424
      post api("/users/#{user.id}/emails", admin), {}
425 426 427 428 429 430 431 432 433 434
      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
435 436 437 438

    it "should raise error for invalid ID" do
      expect{post api("/users/ASDF/emails", admin) }.to raise_error(ActionController::RoutingError)
    end
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
  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
466 467 468 469

      it "should raise error for invalid ID" do
        expect{put api("/users/ASDF/emails", admin) }.to raise_error(ActionController::RoutingError)
      end
470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
    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
506 507 508 509

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

513 514 515 516 517
  describe "DELETE /users/:id" do
    before { admin }

    it "should delete user" do
      delete api("/users/#{user.id}", admin)
518
      expect(response.status).to eq(200)
519
      expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound
520
      expect(json_response['email']).to eq(user.email)
521 522
    end

523 524
    it "should not delete for unauthenticated user" do
      delete api("/users/#{user.id}")
525
      expect(response.status).to eq(401)
526 527
    end

528 529
    it "shouldn't available for non admin users" do
      delete api("/users/#{user.id}", user)
530
      expect(response.status).to eq(403)
531 532 533 534
    end

    it "should return 404 for non-existing user" do
      delete api("/users/999999", admin)
535 536
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 User Not Found')
537
    end
538 539 540 541

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

N
Nihad Abbasov 已提交
544 545
  describe "GET /user" do
    it "should return current user" do
R
Robert Speicher 已提交
546
      get api("/user", user)
547 548 549 550 551 552
      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 已提交
553
    end
554 555 556

    it "should return 401 error if user is unauthenticated" do
      get api("/user")
557
      expect(response.status).to eq(401)
558
    end
N
Nihad Abbasov 已提交
559
  end
560 561 562 563 564

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

569 570 571 572 573
    context "when authenticated" do
      it "should return array of ssh keys" do
        user.keys << key
        user.save
        get api("/user/keys", user)
574 575 576
        expect(response.status).to eq(200)
        expect(json_response).to be_an Array
        expect(json_response.first["title"]).to eq(key.title)
577 578 579 580 581
      end
    end
  end

  describe "GET /user/keys/:id" do
J
Johannes Schleifenbaum 已提交
582
    it "should return single key" do
583 584 585
      user.keys << key
      user.save
      get api("/user/keys/#{key.id}", user)
586 587
      expect(response.status).to eq(200)
      expect(json_response["title"]).to eq(key.title)
588
    end
N
Nihad Abbasov 已提交
589

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

596 597 598 599 600
    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)
601 602
      expect(response.status).to eq(404)
      expect(json_response['message']).to eq('404 Not found')
603
    end
604 605 606 607 608

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

611
  describe "POST /user/keys" do
612
    it "should create ssh key" do
613
      key_attrs = attributes_for :key
614
      expect do
615
        post api("/user/keys", user), key_attrs
616
      end.to change{ user.keys.count }.by(1)
617
      expect(response.status).to eq(201)
618 619 620 621
    end

    it "should return a 401 error if unauthorized" do
      post api("/user/keys"), title: 'some title', key: 'some key'
622
      expect(response.status).to eq(401)
623 624 625 626
    end

    it "should not create ssh key without key" do
      post api("/user/keys", user), title: 'title'
627 628
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "key" not given')
J
jubianchi 已提交
629 630 631 632
    end

    it 'should not create ssh key without title' do
      post api('/user/keys', user), key: 'some key'
633 634
      expect(response.status).to eq(400)
      expect(json_response['message']).to eq('400 (Bad request) "title" not given')
635 636 637 638
    end

    it "should not create ssh key without title" do
      post api("/user/keys", user), key: "somekey"
639
      expect(response.status).to eq(400)
640 641 642 643 644 645 646
    end
  end

  describe "DELETE /user/keys/:id" do
    it "should delete existed key" do
      user.keys << key
      user.save
647
      expect do
648
        delete api("/user/keys/#{key.id}", user)
649
      end.to change{user.keys.count}.by(-1)
650
      expect(response.status).to eq(200)
651
    end
N
Nihad Abbasov 已提交
652

K
Kevin Lyda 已提交
653
    it "should return success if key ID not found" do
654
      delete api("/user/keys/42", user)
655
      expect(response.status).to eq(200)
656 657 658 659 660 661
    end

    it "should return 401 error if unauthorized" do
      user.keys << key
      user.save
      delete api("/user/keys/#{key.id}")
662
      expect(response.status).to eq(401)
663
    end
664 665 666 667

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

670 671 672 673 674 675 676 677 678 679 680 681 682 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
  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
713 714 715 716 717

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
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 754 755 756 757 758 759 760 761
  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
762 763 764 765

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

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 803 804 805 806 807 808 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

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

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