projects_spec.rb 25.8 KB
Newer Older
N
Nihad Abbasov 已提交
1 2
require 'spec_helper'

3
describe API::API do
4
  include ApiHelpers
5
  before(:each) { enable_observers }
I
Izaak Alpert 已提交
6
  after(:each) { disable_observers }
7

8 9 10
  let(:user) { create(:user) }
  let(:user2) { create(:user) }
  let(:user3) { create(:user) }
A
Angus MacArthur 已提交
11
  let(:admin) { create(:admin) }
12
  let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
13
  let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
A
Andrew8xx8 已提交
14
  let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
15 16
  let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
  let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
M
Matt Humphrey 已提交
17

18
  before { project.team << [user, :reporter] }
N
Nihad Abbasov 已提交
19 20

  describe "GET /projects" do
21 22 23 24 25
    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/projects")
        response.status.should == 401
      end
N
Nihad Abbasov 已提交
26 27
    end

28
    context "when authenticated" do
N
Nihad Abbasov 已提交
29
      it "should return an array of projects" do
R
Robert Speicher 已提交
30
        get api("/projects", user)
N
Nihad Abbasov 已提交
31
        response.status.should == 200
N
Nihad Abbasov 已提交
32 33 34
        json_response.should be_an Array
        json_response.first['name'].should == project.name
        json_response.first['owner']['email'].should == user.email
N
Nihad Abbasov 已提交
35 36 37 38
      end
    end
  end

39
  describe "POST /projects" do
40 41 42 43 44 45 46 47 48 49
    context "maximum number of projects reached" do
      before do
        (1..user2.projects_limit).each do |project|
          post api("/projects", user2), name: "foo#{project}"
        end
      end

      it "should not create new project" do
        expect {
          post api("/projects", user2), name: 'foo'
50
        }.to change {Project.count}.by(0)
51 52 53
      end
    end

54
    it "should create new project without path" do
55
      expect { post api("/projects", user), name: 'foo' }.to change {Project.count}.by(1)
56
    end
A
Alex Denisov 已提交
57 58

    it "should not create new project without name" do
59
      expect { post api("/projects", user) }.to_not change {Project.count}
A
Alex Denisov 已提交
60 61
    end

62 63 64 65 66
    it "should return a 400 error if name not given" do
      post api("/projects", user)
      response.status.should == 400
    end

67 68 69 70 71 72
    it "should create last project before reaching project limit" do
      (1..user2.projects_limit-1).each { |p| post api("/projects", user2), name: "foo#{p}" }
      post api("/projects", user2), name: "foo"
      response.status.should == 201
    end

A
Alex Denisov 已提交
73 74
    it "should respond with 201 on success" do
      post api("/projects", user), name: 'foo'
75
      response.status.should == 201
76
    end
A
Alex Denisov 已提交
77

78
    it "should respond with 400 if name is not given" do
A
Alex Denisov 已提交
79
      post api("/projects", user)
80
      response.status.should == 400
81
    end
A
Alex Denisov 已提交
82

83 84 85 86 87 88 89 90
    it "should return a 403 error if project limit reached" do
      (1..user.projects_limit).each do |p|
        post api("/projects", user), name: "foo#{p}"
      end
      post api("/projects", user), name: 'bar'
      response.status.should == 403
    end

A
Alex Denisov 已提交
91
    it "should assign attributes to project" do
92
      project = attributes_for(:project, {
93 94 95 96 97
        description: Faker::Lorem.sentence,
        issues_enabled: false,
        wall_enabled: false,
        merge_requests_enabled: false,
        wiki_enabled: false
A
Alex Denisov 已提交
98 99 100 101
      })

      post api("/projects", user), project

102
      project.each_pair do |k,v|
103
        next if k == :path
A
Alex Denisov 已提交
104 105
        json_response[k.to_s].should == v
      end
106
    end
107 108 109 110 111 112 113 114 115 116 117 118

    it "should set a project as public" do
      project = attributes_for(:project, { public: true })
      post api("/projects", user), project
      json_response['public'].should be_true
    end

    it "should set a project as private" do
      project = attributes_for(:project, { public: false })
      post api("/projects", user), project
      json_response['public'].should be_false
    end
119 120
  end

A
Angus MacArthur 已提交
121 122 123 124
  describe "POST /projects/user/:id" do
    before { admin }

    it "should create new project without path" do
125
      expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change {Project.count}.by(1)
A
Angus MacArthur 已提交
126 127 128
    end

    it "should not create new project without name" do
129
      expect { post api("/projects/user/#{user.id}", admin) }.to_not change {Project.count}
A
Angus MacArthur 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143
    end

    it "should respond with 201 on success" do
      post api("/projects/user/#{user.id}", admin), name: 'foo'
      response.status.should == 201
    end

    it "should respond with 404 on failure" do
      post api("/projects/user/#{user.id}", admin)
      response.status.should == 404
    end

    it "should assign attributes to project" do
      project = attributes_for(:project, {
144 145 146 147 148
        description: Faker::Lorem.sentence,
        issues_enabled: false,
        wall_enabled: false,
        merge_requests_enabled: false,
        wiki_enabled: false
A
Angus MacArthur 已提交
149 150 151 152
      })

      post api("/projects/user/#{user.id}", admin), project

153
      project.each_pair do |k,v|
A
Angus MacArthur 已提交
154 155 156 157
        next if k == :path
        json_response[k.to_s].should == v
      end
    end
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

    it "should set a project as public" do
      project = attributes_for(:project, { public: true })
      post api("/projects/user/#{user.id}", admin), project
      json_response['public'].should be_true

    end

    it "should set a project as private" do
      project = attributes_for(:project, { public: false })
      post api("/projects/user/#{user.id}", admin), project
      json_response['public'].should be_false

    end

A
Angus MacArthur 已提交
173 174
  end

N
Nihad Abbasov 已提交
175 176
  describe "GET /projects/:id" do
    it "should return a project by id" do
R
Robert Speicher 已提交
177
      get api("/projects/#{project.id}", user)
N
Nihad Abbasov 已提交
178
      response.status.should == 200
N
Nihad Abbasov 已提交
179 180
      json_response['name'].should == project.name
      json_response['owner']['email'].should == user.email
N
Nihad Abbasov 已提交
181
    end
182

183
    it "should return a project by path name" do
184
      get api("/projects/#{project.id}", user)
185 186 187
      response.status.should == 200
      json_response['name'].should == project.name
    end
N
Nihad Abbasov 已提交
188 189

    it "should return a 404 error if not found" do
R
Robert Speicher 已提交
190
      get api("/projects/42", user)
N
Nihad Abbasov 已提交
191
      response.status.should == 404
A
Alex Denisov 已提交
192
      json_response['message'].should == '404 Not Found'
N
Nihad Abbasov 已提交
193
    end
194 195 196 197 198 199

    it "should return a 404 error if user is not a member" do
      other_user = create(:user)
      get api("/projects/#{project.id}", other_user)
      response.status.should == 404
    end
N
Nihad Abbasov 已提交
200 201
  end

D
Dmitriy Zaporozhets 已提交
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
  describe "GET /projects/:id/events" do
    it "should return a project events" do
      get api("/projects/#{project.id}/events", user)
      response.status.should == 200
      json_event = json_response.first

      json_event['action_name'].should == 'joined'
      json_event['project_id'].to_i.should == project.id
    end

    it "should return a 404 error if not found" do
      get api("/projects/42/events", user)
      response.status.should == 404
      json_response['message'].should == '404 Not Found'
    end

    it "should return a 404 error if user is not a member" do
      other_user = create(:user)
      get api("/projects/#{project.id}/events", other_user)
      response.status.should == 404
    end
  end

N
Nihad Abbasov 已提交
225 226
  describe "GET /projects/:id/members" do
    it "should return project team members" do
227
      get api("/projects/#{project.id}/members", user)
M
miks 已提交
228 229
      response.status.should == 200
      json_response.should be_an Array
M
miks 已提交
230
      json_response.count.should == 2
D
Dmitriy Zaporozhets 已提交
231
      json_response.map { |u| u['email'] }.should include user.email
M
miks 已提交
232
    end
V
Valeriy Sizov 已提交
233 234

    it "finds team members with query string" do
235
      get api("/projects/#{project.id}/members", user), query: user.username
V
Valeriy Sizov 已提交
236 237 238 239 240
      response.status.should == 200
      json_response.should be_an Array
      json_response.count.should == 1
      json_response.first['email'].should == user.email
    end
241 242 243 244 245

    it "should return a 404 error if id not found" do
      get api("/projects/9999/members", user)
      response.status.should == 404
    end
M
miks 已提交
246 247
  end

N
Nihad Abbasov 已提交
248 249
  describe "GET /projects/:id/members/:user_id" do
    it "should return project team member" do
250
      get api("/projects/#{project.id}/members/#{user.id}", user)
N
Nihad Abbasov 已提交
251 252 253
      response.status.should == 200
      json_response['email'].should == user.email
      json_response['access_level'].should == UsersProject::MASTER
M
miks 已提交
254
    end
255 256 257 258 259

    it "should return a 404 error if user id not found" do
      get api("/projects/#{project.id}/members/1234", user)
      response.status.should == 404
    end
M
miks 已提交
260 261
  end

N
Nihad Abbasov 已提交
262 263
  describe "POST /projects/:id/members" do
    it "should add user to project team" do
M
miks 已提交
264
      expect {
265
        post api("/projects/#{project.id}/members", user), user_id: user2.id,
266
          access_level: UsersProject::DEVELOPER
N
Nihad Abbasov 已提交
267 268 269 270 271 272
      }.to change { UsersProject.count }.by(1)

      response.status.should == 201
      json_response['email'].should == user2.email
      json_response['access_level'].should == UsersProject::DEVELOPER
    end
273 274 275

    it "should return a 201 status if user is already project member" do
      post api("/projects/#{project.id}/members", user), user_id: user2.id,
276
        access_level: UsersProject::DEVELOPER
277 278
      expect {
        post api("/projects/#{project.id}/members", user), user_id: user2.id,
279
          access_level: UsersProject::DEVELOPER
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
      }.not_to change { UsersProject.count }.by(1)

      response.status.should == 201
      json_response['email'].should == user2.email
      json_response['access_level'].should == UsersProject::DEVELOPER
    end

    it "should return a 400 error when user id is not given" do
      post api("/projects/#{project.id}/members", user), access_level: UsersProject::MASTER
      response.status.should == 400
    end

    it "should return a 400 error when access level is not given" do
      post api("/projects/#{project.id}/members", user), user_id: user2.id
      response.status.should == 400
    end

    it "should return a 422 error when access level is not known" do
      post api("/projects/#{project.id}/members", user), user_id: user2.id, access_level: 1234
      response.status.should == 422
    end
N
Nihad Abbasov 已提交
301 302 303 304
  end

  describe "PUT /projects/:id/members/:user_id" do
    it "should update project team member" do
305
      put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
N
Nihad Abbasov 已提交
306 307 308
      response.status.should == 200
      json_response['email'].should == user3.email
      json_response['access_level'].should == UsersProject::MASTER
M
miks 已提交
309
    end
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324

    it "should return a 404 error if user_id is not found" do
      put api("/projects/#{project.id}/members/1234", user), access_level: UsersProject::MASTER
      response.status.should == 404
    end

    it "should return a 400 error when access level is not given" do
      put api("/projects/#{project.id}/members/#{user3.id}", user)
      response.status.should == 400
    end

    it "should return a 422 error when access level is not known" do
      put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: 123
      response.status.should == 422
    end
M
miks 已提交
325 326
  end

N
Nihad Abbasov 已提交
327 328
  describe "DELETE /projects/:id/members/:user_id" do
    it "should remove user from project team" do
M
miks 已提交
329
      expect {
330
        delete api("/projects/#{project.id}/members/#{user3.id}", user)
N
Nihad Abbasov 已提交
331
      }.to change { UsersProject.count }.by(-1)
M
miks 已提交
332
    end
333 334 335 336 337 338 339

    it "should return 200 if team member is not part of a project" do
      delete api("/projects/#{project.id}/members/#{user3.id}", user)
      expect {
        delete api("/projects/#{project.id}/members/#{user3.id}", user)
      }.to_not change { UsersProject.count }.by(1)
    end
340 341 342 343 344 345

    it "should return 200 if team member already removed" do
      delete api("/projects/#{project.id}/members/#{user3.id}", user)
      delete api("/projects/#{project.id}/members/#{user3.id}", user)
      response.status.should == 200
    end
M
miks 已提交
346 347
  end

348 349 350 351 352 353 354 355 356 357 358
  describe "DELETE /projects/:id/members/:user_id" do
    it "should return 200 OK when the user was not member" do
      expect {
        delete api("/projects/#{project.id}/members/1000000", user)
      }.to change { UsersProject.count }.by(0)
      response.status.should == 200
      json_response['message'].should == "Access revoked"
      json_response['id'].should == 1000000
    end
  end

M
miks 已提交
359
  describe "GET /projects/:id/hooks" do
360 361 362 363
    context "authorized user" do
      it "should return project hooks" do
        get api("/projects/#{project.id}/hooks", user)
        response.status.should == 200
M
miks 已提交
364

365 366 367 368 369
        json_response.should be_an Array
        json_response.count.should == 1
        json_response.first['url'].should == "http://example.com"
      end
    end
M
miks 已提交
370

371 372 373 374 375
    context "unauthorized user" do
      it "should not access project hooks" do
        get api("/projects/#{project.id}/hooks", user3)
        response.status.should == 403
      end
M
miks 已提交
376 377 378
    end
  end

379
  describe "GET /projects/:id/hooks/:hook_id" do
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
    context "authorized user" do
      it "should return a project hook" do
        get api("/projects/#{project.id}/hooks/#{hook.id}", user)
        response.status.should == 200
        json_response['url'].should == hook.url
      end

      it "should return a 404 error if hook id is not available" do
        get api("/projects/#{project.id}/hooks/1234", user)
        response.status.should == 404
      end
    end

    context "unauthorized user" do
      it "should not access an existing hook" do
        get api("/projects/#{project.id}/hooks/#{hook.id}", user3)
        response.status.should == 403
      end
398
    end
399 400 401 402 403

    it "should return a 404 error if hook id is not available" do
      get api("/projects/#{project.id}/hooks/1234", user)
      response.status.should == 404
    end
404 405 406
  end

  describe "POST /projects/:id/hooks" do
M
miks 已提交
407 408
    it "should add hook to project" do
      expect {
409
        post api("/projects/#{project.id}/hooks", user),
410 411
          url: "http://example.com"
      }.to change {project.hooks.count}.by(1)
412
      response.status.should == 201
M
miks 已提交
413
    end
414 415 416 417 418

    it "should return a 400 error if url not given" do
      post api("/projects/#{project.id}/hooks", user)
      response.status.should == 400
    end
419 420 421 422 423

    it "should return a 422 error if url not valid" do
      post api("/projects/#{project.id}/hooks", user), "url" => "ftp://example.com"
      response.status.should == 422
    end
M
miks 已提交
424
  end
N
Nihad Abbasov 已提交
425

426 427
  describe "PUT /projects/:id/hooks/:hook_id" do
    it "should update an existing project hook" do
428
      put api("/projects/#{project.id}/hooks/#{hook.id}", user),
429
        url: 'http://example.org'
430
      response.status.should == 200
N
Nihad Abbasov 已提交
431
      json_response['url'].should == 'http://example.org'
432
    end
N
Nihad Abbasov 已提交
433

434
    it "should return 404 error if hook id not found" do
435 436 437 438 439 440 441 442
      put api("/projects/#{project.id}/hooks/1234", user), url: 'http://example.org'
      response.status.should == 404
    end

    it "should return 400 error if url is not given" do
      put api("/projects/#{project.id}/hooks/#{hook.id}", user)
      response.status.should == 400
    end
443 444 445 446 447

    it "should return a 422 error if url is not valid" do
      put api("/projects/#{project.id}/hooks/#{hook.id}", user), url: 'ftp://example.com'
      response.status.should == 422
    end
448
  end
M
miks 已提交
449

450
  describe "DELETE /projects/:id/hooks/:hook_id" do
M
miks 已提交
451 452
    it "should delete hook from project" do
      expect {
453
        delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
454
      }.to change {project.hooks.count}.by(-1)
455
      response.status.should == 200
M
miks 已提交
456
    end
457 458

    it "should return success when deleting hook" do
459
      delete api("/projects/#{project.id}/hooks/#{hook.id}", user)
460 461 462 463
      response.status.should == 200
    end

    it "should return success when deleting non existent hook" do
464
      delete api("/projects/#{project.id}/hooks/42", user)
465 466
      response.status.should == 200
    end
467

D
Dmitriy Zaporozhets 已提交
468
    it "should return a 405 error if hook id not given" do
469
      delete api("/projects/#{project.id}/hooks", user)
D
Dmitriy Zaporozhets 已提交
470
      response.status.should == 405
471
    end
M
miks 已提交
472 473
  end

N
Nihad Abbasov 已提交
474
  describe "GET /projects/:id/snippets" do
N
Nihad Abbasov 已提交
475
    it "should return an array of project snippets" do
476
      get api("/projects/#{project.id}/snippets", user)
N
Nihad Abbasov 已提交
477 478 479 480 481 482
      response.status.should == 200
      json_response.should be_an Array
      json_response.first['title'].should == snippet.title
    end
  end

N
Nihad Abbasov 已提交
483 484
  describe "GET /projects/:id/snippets/:snippet_id" do
    it "should return a project snippet" do
485
      get api("/projects/#{project.id}/snippets/#{snippet.id}", user)
N
Nihad Abbasov 已提交
486
      response.status.should == 200
N
Nihad Abbasov 已提交
487
      json_response['title'].should == snippet.title
N
Nihad Abbasov 已提交
488
    end
489 490 491 492 493

    it "should return a 404 error if snippet id not found" do
      get api("/projects/#{project.id}/snippets/1234", user)
      response.status.should == 404
    end
N
Nihad Abbasov 已提交
494 495 496 497
  end

  describe "POST /projects/:id/snippets" do
    it "should create a new project snippet" do
498
      post api("/projects/#{project.id}/snippets", user),
499
        title: 'api test', file_name: 'sample.rb', code: 'test'
N
Nihad Abbasov 已提交
500
      response.status.should == 201
N
Nihad Abbasov 已提交
501
      json_response['title'].should == 'api test'
N
Nihad Abbasov 已提交
502
    end
503 504 505

    it "should return a 400 error if title is not given" do
      post api("/projects/#{project.id}/snippets", user),
506
        file_name: 'sample.rb', code: 'test'
507 508
      response.status.should == 400
    end
509 510 511

    it "should return a 400 error if file_name not given" do
      post api("/projects/#{project.id}/snippets", user),
512
        title: 'api test', code: 'test'
513 514 515 516 517
      response.status.should == 400
    end

    it "should return a 400 error if code not given" do
      post api("/projects/#{project.id}/snippets", user),
518
        title: 'api test', file_name: 'sample.rb'
519 520
      response.status.should == 400
    end
N
Nihad Abbasov 已提交
521 522
  end

523
  describe "PUT /projects/:id/snippets/:shippet_id" do
524
    it "should update an existing project snippet" do
525
      put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
526
        code: 'updated code'
527 528
      response.status.should == 200
      json_response['title'].should == 'example'
529
      snippet.reload.content.should == 'updated code'
530
    end
531 532 533

    it "should update an existing project snippet with new title" do
      put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
534
        title: 'other api test'
535 536 537
      response.status.should == 200
      json_response['title'].should == 'other api test'
    end
538 539
  end

N
Nihad Abbasov 已提交
540
  describe "DELETE /projects/:id/snippets/:snippet_id" do
M
m16a1 已提交
541
    it "should delete existing project snippet" do
N
Nihad Abbasov 已提交
542
      expect {
543
        delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
544
      }.to change { Snippet.count }.by(-1)
545 546 547 548 549 550
      response.status.should == 200
    end

    it "should return success when deleting unknown snippet id" do
      delete api("/projects/#{project.id}/snippets/1234", user)
      response.status.should == 200
N
Nihad Abbasov 已提交
551 552
    end
  end
553 554 555

  describe "GET /projects/:id/snippets/:snippet_id/raw" do
    it "should get a raw project snippet" do
556
      get api("/projects/#{project.id}/snippets/#{snippet.id}/raw", user)
557 558
      response.status.should == 200
    end
559 560 561 562 563

    it "should return a 404 error if raw project snippet not found" do
      get api("/projects/#{project.id}/snippets/5555/raw", user)
      response.status.should == 404
    end
564
  end
565

566 567 568
  describe :deploy_keys do
    let(:deploy_keys_project) { create(:deploy_keys_project, project: project) }
    let(:deploy_key) { deploy_keys_project.deploy_key }
M
Matt Humphrey 已提交
569

570 571
    describe "GET /projects/:id/keys" do
      before { deploy_key }
M
Matt Humphrey 已提交
572

573 574 575 576 577 578
      it "should return array of ssh keys" do
        get api("/projects/#{project.id}/keys", user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.first['title'].should == deploy_key.title
      end
M
Matt Humphrey 已提交
579 580
    end

581 582 583 584 585 586
    describe "GET /projects/:id/keys/:key_id" do
      it "should return a single key" do
        get api("/projects/#{project.id}/keys/#{deploy_key.id}", user)
        response.status.should == 200
        json_response['title'].should == deploy_key.title
      end
M
Matt Humphrey 已提交
587

588 589 590 591
      it "should return 404 Not Found with invalid ID" do
        get api("/projects/#{project.id}/keys/404", user)
        response.status.should == 404
      end
M
Matt Humphrey 已提交
592 593
    end

594 595
    describe "POST /projects/:id/keys" do
      it "should not create an invalid ssh key" do
596
        post api("/projects/#{project.id}/keys", user), { title: "invalid key" }
597 598 599 600 601 602 603
        response.status.should == 404
      end

      it "should create new ssh key" do
        key_attrs = attributes_for :key
        expect {
          post api("/projects/#{project.id}/keys", user), key_attrs
604
        }.to change{ project.deploy_keys.count }.by(1)
605
      end
M
Matt Humphrey 已提交
606 607
    end

608 609 610 611 612 613
    describe "DELETE /projects/:id/keys/:key_id" do
      before { deploy_key }

      it "should delete existing key" do
        expect {
          delete api("/projects/#{project.id}/keys/#{deploy_key.id}", user)
614
        }.to change{ project.deploy_keys.count }.by(-1)
615 616 617 618 619 620
      end

      it "should return 404 Not Found with invalid ID" do
        delete api("/projects/#{project.id}/keys/404", user)
        response.status.should == 404
      end
M
Matt Humphrey 已提交
621 622
    end
  end
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689

  describe :fork_admin do
    let(:project_fork_target) { create(:project) }
    let(:project_fork_source) { create(:project, public: true) }

    describe "POST /projects/:id/fork/:forked_from_id" do
      let(:new_project_fork_source) { create(:project, public: true) }

      it "shouldn't available for non admin users" do
        post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user)
        response.status.should == 403
      end

      it "should allow project to be forked from an existing project" do
        project_fork_target.forked?.should_not be_true
        post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
        response.status.should == 201
        project_fork_target.reload
        project_fork_target.forked_from_project.id.should == project_fork_source.id
        project_fork_target.forked_project_link.should_not be_nil
        project_fork_target.forked?.should be_true
      end

      it "should fail if forked_from project which does not exist" do
        post api("/projects/#{project_fork_target.id}/fork/9999", admin)
        response.status.should == 404
      end

      it "should fail with 409 if already forked" do
        post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
        project_fork_target.reload
        project_fork_target.forked_from_project.id.should == project_fork_source.id
        post api("/projects/#{project_fork_target.id}/fork/#{new_project_fork_source.id}", admin)
        response.status.should == 409
        project_fork_target.reload
        project_fork_target.forked_from_project.id.should == project_fork_source.id
        project_fork_target.forked?.should be_true
      end
    end

    describe "DELETE /projects/:id/fork" do

      it "shouldn't available for non admin users" do
        delete api("/projects/#{project_fork_target.id}/fork", user)
        response.status.should == 403
      end

      it "should make forked project unforked" do
        post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin)
        project_fork_target.reload
        project_fork_target.forked_from_project.should_not be_nil
        project_fork_target.forked?.should be_true
        delete api("/projects/#{project_fork_target.id}/fork", admin)
        response.status.should == 200
        project_fork_target.reload
        project_fork_target.forked_from_project.should be_nil
        project_fork_target.forked?.should_not be_true
      end

      it "should be idempotent if not forked" do
        project_fork_target.forked_from_project.should be_nil
        delete api("/projects/#{project_fork_target.id}/fork", admin)
        response.status.should == 200
        project_fork_target.reload.forked_from_project.should be_nil
      end
    end
  end
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 /projects/search/:query" do
    let!(:query) { 'query'}
    let!(:search) { create(:project, name: query, creator_id: user.id, namespace: user.namespace) }
    let!(:pre) { create(:project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
    let!(:post) { create(:project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
    let!(:pre_post) { create(:project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
    let!(:unfound) { create(:project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
    let!(:public) { create(:project, name: "another #{query}",public: true) }
    let!(:unfound_public) { create(:project, name: 'unfound public', public: true) }

    context "when unauthenticated" do
      it "should return authentication error" do
        get api("/projects/search/#{query}")
        response.status.should == 401
      end
    end

    context "when authenticated" do
      it "should return an array of projects" do
        get api("/projects/search/#{query}",user)
        response.status.should == 200
        json_response.should be_an Array
        json_response.size.should == 5
        json_response.each {|project| project['name'].should =~ /.*query.*/}
      end
    end

    context "when authenticated as a different user" do
      it "should return matching public projects" do
        get api("/projects/search/#{query}", user2)
        response.status.should == 200
        json_response.should be_an Array
        json_response.size.should == 1
        json_response.first['name'].should == "another #{query}"
      end
    end
  end
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 765

  describe "DELETE /projects/:id" do
    context "when authenticated as user" do
      it "should remove project" do
        delete api("/projects/#{project.id}", user)
        response.status.should == 200
      end

      it "should not remove a project if not an owner" do
        user3 = create(:user)
        project.team << [user3, :developer]
        delete api("/projects/#{project.id}", user3)
        response.status.should == 403
      end

      it "should not remove a non existing project" do
        delete api("/projects/1328", user)
        response.status.should == 404
      end

      it "should not remove a project not attached to user" do
        delete api("/projects/#{project.id}", user2)
        response.status.should == 404
      end
    end

    context "when authenticated as admin" do
      it "should remove any existing project" do
        delete api("/projects/#{project.id}", admin)
        response.status.should == 200
      end

      it "should not remove a non existing project" do
        delete api("/projects/1328", admin)
        response.status.should == 404
      end
    end
  end
N
Nihad Abbasov 已提交
766
end