create_service_spec.rb 4.0 KB
Newer Older
1 2
require 'spec_helper'

S
Semyon Pupkov 已提交
3 4 5 6 7 8 9 10
describe Projects::CreateService, '#execute', services: true do
  let(:user) { create :user }
  let(:opts) do
    {
      name: "GitLab",
      namespace: user.namespace
    }
  end
11

S
Semyon Pupkov 已提交
12 13 14
  it 'creates labels on Project creation if there are templates' do
    Label.create(title: "bug", template: true)
    project = create_project(user, opts)
V
Valery Sizov 已提交
15

S
Semyon Pupkov 已提交
16 17
    expect(project.labels).not_to be_empty
  end
V
Valery Sizov 已提交
18

S
Semyon Pupkov 已提交
19 20 21
  context 'user namespace' do
    it do
      project = create_project(user, opts)
22

S
Semyon Pupkov 已提交
23 24 25 26
      expect(project).to be_valid
      expect(project.owner).to eq(user)
      expect(project.team.masters).to include(user)
      expect(project.namespace).to eq(user.namespace)
27
    end
S
Semyon Pupkov 已提交
28
  end
29

S
Semyon Pupkov 已提交
30 31 32 33 34 35
  context 'group namespace' do
    let(:group) do
      create(:group).tap do |group|
        group.add_owner(user)
      end
    end
36

S
Semyon Pupkov 已提交
37 38 39
    before do
      user.refresh_authorized_projects # Ensure cache is warm
    end
40

S
Semyon Pupkov 已提交
41 42
    it do
      project = create_project(user, opts.merge!(namespace_id: group.id))
43

S
Semyon Pupkov 已提交
44 45 46 47
      expect(project).to be_valid
      expect(project.owner).to eq(group)
      expect(project.namespace).to eq(group)
      expect(user.authorized_projects).to include(project)
48
    end
S
Semyon Pupkov 已提交
49
  end
50

S
Semyon Pupkov 已提交
51 52
  context 'error handling' do
    it 'handles invalid options' do
D
Douwe Maan 已提交
53
      opts[:default_branch] = 'master'
S
Semyon Pupkov 已提交
54
      expect(create_project(user, opts)).to eq(nil)
55
    end
S
Semyon Pupkov 已提交
56
  end
57

S
Semyon Pupkov 已提交
58 59 60 61 62
  context 'wiki_enabled creates repository directory' do
    context 'wiki_enabled true creates wiki repository directory' do
      it do
        project = create_project(user, opts)
        path = ProjectWiki.new(project, user).send(:path_to_repo)
D
Dmitriy Zaporozhets 已提交
63

S
Semyon Pupkov 已提交
64
        expect(File.exist?(path)).to be_truthy
D
Dmitriy Zaporozhets 已提交
65
      end
S
Semyon Pupkov 已提交
66
    end
D
Dmitriy Zaporozhets 已提交
67

S
Semyon Pupkov 已提交
68 69
    context 'wiki_enabled false does not create wiki repository directory' do
      it do
D
Douwe Maan 已提交
70
        opts[:wiki_enabled] = false
S
Semyon Pupkov 已提交
71 72
        project = create_project(user, opts)
        path = ProjectWiki.new(project, user).send(:path_to_repo)
D
Dmitriy Zaporozhets 已提交
73

S
Semyon Pupkov 已提交
74
        expect(File.exist?(path)).to be_falsey
D
Dmitriy Zaporozhets 已提交
75 76
      end
    end
S
Semyon Pupkov 已提交
77
  end
78

S
Semyon Pupkov 已提交
79 80
  context 'builds_enabled global setting' do
    let(:project) { create_project(user, opts) }
81

S
Semyon Pupkov 已提交
82
    subject { project.builds_enabled? }
83

S
Semyon Pupkov 已提交
84 85 86
    context 'global builds_enabled false does not enable CI by default' do
      before do
        project.project_feature.update_attribute(:builds_access_level, ProjectFeature::DISABLED)
87 88
      end

S
Semyon Pupkov 已提交
89 90
      it { is_expected.to be_falsey }
    end
91

S
Semyon Pupkov 已提交
92 93
    context 'global builds_enabled true does enable CI by default' do
      it { is_expected.to be_truthy }
94
    end
S
Semyon Pupkov 已提交
95
  end
96

S
Semyon Pupkov 已提交
97 98 99
  context 'restricted visibility level' do
    before do
      stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
100

S
Semyon Pupkov 已提交
101 102 103 104
      opts.merge!(
        visibility_level: Gitlab::VisibilityLevel.options['Public']
      )
    end
105

S
Semyon Pupkov 已提交
106 107 108 109 110 111 112 113
    it 'does not allow a restricted visibility level for non-admins' do
      project = create_project(user, opts)
      expect(project).to respond_to(:errors)
      expect(project.errors.messages).to have_key(:visibility_level)
      expect(project.errors.messages[:visibility_level].first).to(
        match('restricted by your GitLab administrator')
      )
    end
114

S
Semyon Pupkov 已提交
115 116 117
    it 'allows a restricted visibility level for admins' do
      admin = create(:admin)
      project = create_project(admin, opts)
118

S
Semyon Pupkov 已提交
119 120
      expect(project.errors.any?).to be(false)
      expect(project.saved?).to be(true)
121
    end
S
Semyon Pupkov 已提交
122
  end
123

S
Semyon Pupkov 已提交
124 125 126
  context 'repository creation' do
    it 'synchronously creates the repository' do
      expect_any_instance_of(Project).to receive(:create_repository)
127

S
Semyon Pupkov 已提交
128 129 130 131
      project = create_project(user, opts)
      expect(project).to be_valid
      expect(project.owner).to eq(user)
      expect(project.namespace).to eq(user.namespace)
132
    end
S
Semyon Pupkov 已提交
133
  end
134

S
Semyon Pupkov 已提交
135 136 137 138
  context 'when there is an active service template' do
    before do
      create(:service, project: nil, template: true, active: true)
    end
139

S
Semyon Pupkov 已提交
140 141
    it 'creates a service from this template' do
      project = create_project(user, opts)
142

S
Semyon Pupkov 已提交
143
      expect(project.services.count).to eq 1
144
    end
145 146 147
  end

  def create_project(user, opts)
148
    Projects::CreateService.new(user, opts).execute
149 150
  end
end