fork_service_spec.rb 4.16 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
        expect(@to_project.errors).not_to be_empty
30
        expect(@to_project.errors[:base]).to include("Failed to fork repository")
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
        expect(@existing_project.persisted?).to be_truthy
39
40
        expect(@to_project.errors[:name]).to eq(['has already been taken'])
        expect(@to_project.errors[:path]).to eq(['has already been taken'])
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(['is not valid'])
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
        expect(existing_project.persisted?).to be_truthy
        expect(to_project.errors[:name]).to eq(['has already been taken'])
        expect(to_project.errors[:path]).to eq(['has already been taken'])
96
97
98
99
100
      end
    end
  end

  def fork_project(from_project, user, fork_success = true, params = {})
101
102
    allow_any_instance_of(Gitlab::Shell).to receive(:fork_repository).and_return(fork_success)
    Projects::ForkService.new(from_project, user, params).execute
103
104
  end
end