users_spec.rb 26.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) }
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']).
R
Robert Speicher 已提交
156
        to eq([Gitlab::Regex.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']).
R
Robert Speicher 已提交
299
        to eq([Gitlab::Regex.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

K
Kamil Trzcinski 已提交
346 347 348
    it "should return 405 for invalid ID" do
      post api("/users/ASDF/keys", admin)
      expect(response.status).to eq(405)
349
    end
A
Angus MacArthur 已提交
350 351
  end

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

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

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

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

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

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

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

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

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

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

    it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
438 439
      post api("/users/ASDF/emails", admin)
      expect(response.status).to eq(405)
440
    end
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 466 467
  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
468 469

      it "should raise error for invalid ID" do
K
Kamil Trzcinski 已提交
470 471
        put api("/users/ASDF/emails", admin)
        expect(response.status).to eq(405)
472
      end
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 506 507 508
    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
509 510 511 512

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

516 517 518 519 520
  describe "DELETE /users/:id" do
    before { admin }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    it "should raise error for invalid ID" do
      expect{delete api("/users/keys/ASDF", admin) }.to raise_error(ActionController::RoutingError)
    end
671
  end
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 713 714 715
  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
716 717 718 719 720

    it "should return 404 for invalid ID" do
      get api("/users/emails/ASDF", admin)
      expect(response.status).to eq(404)
    end
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 762 763 764
  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
765 766 767 768

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

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

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