fork_service_spec.rb 4.31 KB
Newer Older
1
2
require 'spec_helper'

3
describe Projects::ForkService do
4
5
  describe :fork_by_user do
    before do
6
7
      @from_namespace = create(:namespace)
      @from_user = create(:user, namespace: @from_namespace )
8
9
10
      @from_project = create(:project, creator_id: @from_user.id,
                             namespace: @from_namespace, star_count: 107,
                             description: 'wow such project')
11
12
      @to_namespace = create(:namespace)
      @to_user = create(:user, namespace: @to_namespace)
13
14
15
    end

    context 'fork project' do
16
17
      describe "successfully creates project in the user namespace" do
        let(:to_project) { fork_project(@from_project, @to_user) }
18

19
20
21
22
        it { expect(to_project.owner).to eq(@to_user) }
        it { expect(to_project.namespace).to eq(@to_user.namespace) }
        it { expect(to_project.star_count).to be_zero }
        it { expect(to_project.description).to eq(@from_project.description) }
23
      end
24
25
26
    end

    context 'fork project failure' do
27
      it "fails due to transaction failure" do
28
        @to_project = fork_project(@from_project, @to_user, false)
29
30
        expect(@to_project.errors).not_to be_empty
        expect(@to_project.errors[:base]).to include("Fork transaction failed.")
31
      end
32
33
34
35
36
37
    end

    context 'project already exists' do
      it "should fail due to validation, not transaction failure" do
        @existing_project = create(:project, creator_id: @to_user.id, name: @from_project.name, namespace: @to_namespace)
        @to_project = fork_project(@from_project, @to_user)
38
39
40
        expect(@existing_project.persisted?).to be_truthy
        expect(@to_project.errors[:base]).to include("Invalid fork destination")
        expect(@to_project.errors[:base]).not_to include("Fork transaction failed.")
41
      end
42
    end
Valery Sizov's avatar
Valery Sizov committed
43
44
45
46
47
48
49
50
51
52
53

    context 'GitLab CI is enabled' do
      it "calls fork registrator for CI" do
        @from_project.build_missing_services
        @from_project.gitlab_ci_service.update_attributes(active: true)

        expect(ForkRegistrationWorker).to receive(:perform_async)

        fork_project(@from_project, @to_user)
      end
    end
54
55
  end

56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  describe :fork_to_namespace do
    before do
      @group_owner = create(:user)
      @developer   = create(:user)
      @project     = create(:project, creator_id: @group_owner.id,
                                      star_count: 777,
                                      description: 'Wow, such a cool project!')
      @group = create(:group)
      @group.add_user(@group_owner, GroupMember::OWNER)
      @group.add_user(@developer,   GroupMember::DEVELOPER)
      @opts = { namespace: @group }
    end

    context 'fork project for group' do
      it 'group owner successfully forks project into the group' do
        to_project = fork_project(@project, @group_owner, true, @opts)
72
73
74
75
76
77
        expect(to_project.owner).to       eq(@group)
        expect(to_project.namespace).to   eq(@group)
        expect(to_project.name).to        eq(@project.name)
        expect(to_project.path).to        eq(@project.path)
        expect(to_project.description).to eq(@project.description)
        expect(to_project.star_count).to     be_zero
78
79
80
81
82
83
      end
    end

    context 'fork project for group when user not owner' do
      it 'group developer should fail to fork project into the group' do
        to_project = fork_project(@project, @developer, true, @opts)
84
        expect(to_project.errors[:namespace]).to eq(['insufficient access rights'])
85
86
87
88
89
90
91
92
      end
    end

    context 'project already exists in group' do
      it 'should fail due to validation, not transaction failure' do
        existing_project = create(:project, name: @project.name,
                                            namespace: @group)
        to_project = fork_project(@project, @group_owner, true, @opts)
93
94
95
96
        expect(existing_project.persisted?).to be_truthy
        expect(to_project.errors[:base]).to eq(['Invalid fork destination'])
        expect(to_project.errors[:name]).to eq(['has already been taken'])
        expect(to_project.errors[:path]).to eq(['has already been taken'])
97
98
99
100
101
102
      end
    end
  end

  def fork_project(from_project, user, fork_success = true, params = {})
    context = Projects::ForkService.new(from_project, user, params)
Valery Sizov's avatar
Valery Sizov committed
103
104
    shell = double('gitlab_shell')
    shell.stub(fork_repository: fork_success)
105
106
107
108
    context.stub(gitlab_shell: shell)
    context.execute
  end
end