project_spec.rb 9.0 KB
Newer Older
1 2 3 4
# == Schema Information
#
# Table name: projects
#
D
Dmitriy Zaporozhets 已提交
5
#  id                     :integer          not null, primary key
6 7 8
#  name                   :string(255)
#  path                   :string(255)
#  description            :text
D
Dmitriy Zaporozhets 已提交
9 10
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
D
Dmitriy Zaporozhets 已提交
11
#  creator_id             :integer
D
Dmitriy Zaporozhets 已提交
12 13 14 15
#  issues_enabled         :boolean          default(TRUE), not null
#  wall_enabled           :boolean          default(TRUE), not null
#  merge_requests_enabled :boolean          default(TRUE), not null
#  wiki_enabled           :boolean          default(TRUE), not null
D
Dmitriy Zaporozhets 已提交
16
#  namespace_id           :integer
D
Dmitriy Zaporozhets 已提交
17 18
#  issues_tracker         :string(255)      default("gitlab"), not null
#  issues_tracker_id      :string(255)
D
Dmitriy Zaporozhets 已提交
19
#  snippets_enabled       :boolean          default(TRUE), not null
20
#  last_activity_at       :datetime
D
Dmitriy Zaporozhets 已提交
21
#  imported               :boolean          default(FALSE), not null
D
Dmitriy Zaporozhets 已提交
22
#  import_url             :string(255)
23
#  visibility_level       :integer          default(0), not null
24
#  archived               :boolean          default(FALSE), not null
25 26
#

G
gitlabhq 已提交
27 28 29
require 'spec_helper'

describe Project do
30 31
  before { enable_observers }
  after { disable_observers }
I
Izaak Alpert 已提交
32

G
gitlabhq 已提交
33
  describe "Associations" do
34
    it { should belong_to(:group) }
35
    it { should belong_to(:namespace) }
36
    it { should belong_to(:creator).class_name('User') }
G
gitlabhq 已提交
37
    it { should have_many(:users) }
38 39 40
    it { should have_many(:events).dependent(:destroy) }
    it { should have_many(:merge_requests).dependent(:destroy) }
    it { should have_many(:issues).dependent(:destroy) }
41 42
    it { should have_many(:milestones).dependent(:destroy) }
    it { should have_many(:users_projects).dependent(:destroy) }
43
    it { should have_many(:notes).dependent(:destroy) }
A
Andrew8xx8 已提交
44
    it { should have_many(:snippets).class_name('ProjectSnippet').dependent(:destroy) }
45 46
    it { should have_many(:deploy_keys_projects).dependent(:destroy) }
    it { should have_many(:deploy_keys) }
47 48
    it { should have_many(:hooks).dependent(:destroy) }
    it { should have_many(:protected_branches).dependent(:destroy) }
49
    it { should have_one(:forked_project_link).dependent(:destroy) }
50
    it { should have_one(:slack_service).dependent(:destroy) }
G
gitlabhq 已提交
51 52
  end

53
  describe "Mass assignment" do
54
    it { should_not allow_mass_assignment_of(:namespace_id) }
55
    it { should_not allow_mass_assignment_of(:creator_id) }
56 57
  end

G
gitlabhq 已提交
58
  describe "Validation" do
59 60
    let!(:project) { create(:project) }

G
gitlabhq 已提交
61
    it { should validate_presence_of(:name) }
62
    it { should validate_uniqueness_of(:name).scoped_to(:namespace_id) }
63 64
    it { should ensure_length_of(:name).is_within(0..255) }

G
gitlabhq 已提交
65
    it { should validate_presence_of(:path) }
66
    it { should validate_uniqueness_of(:path).scoped_to(:namespace_id) }
67 68
    it { should ensure_length_of(:path).is_within(0..255) }
    it { should ensure_length_of(:description).is_within(0..2000) }
69
    it { should validate_presence_of(:creator) }
A
Andrew8xx8 已提交
70
    it { should ensure_length_of(:issues_tracker_id).is_within(0..255) }
71
    it { should validate_presence_of(:namespace) }
72 73

    it "should not allow new projects beyond user limits" do
74
      project2 = build(:project)
D
Dmitriy Zaporozhets 已提交
75
      project2.stub(:creator).and_return(double(can_create_project?: false, projects_limit: 0).as_null_object)
76 77
      project2.should_not be_valid
      project2.errors[:limit_reached].first.should match(/Your own projects limit is 0/)
78
    end
G
gitlabhq 已提交
79 80 81 82 83
  end

  describe "Respond to" do
    it { should respond_to(:url_to_repo) }
    it { should respond_to(:repo_exists?) }
D
Dmitriy Zaporozhets 已提交
84 85 86
    it { should respond_to(:satellite) }
    it { should respond_to(:update_merge_requests) }
    it { should respond_to(:execute_hooks) }
87 88
    it { should respond_to(:transfer) }
    it { should respond_to(:name_with_namespace) }
89
    it { should respond_to(:owner) }
90
    it { should respond_to(:path_with_namespace) }
G
gitlabhq 已提交
91 92
  end

N
Nihad Abbasov 已提交
93
  it "should return valid url to repo" do
94
    project = Project.new(path: "somewhere")
95
    project.url_to_repo.should == Gitlab.config.gitlab_shell.ssh_path_prefix + "somewhere.git"
G
gitlabhq 已提交
96 97
  end

A
Ariejan de Vroom 已提交
98
  it "returns the full web URL for this repo" do
D
Dmitriy Zaporozhets 已提交
99
    project = Project.new(path: "somewhere")
100
    project.web_url.should == "#{Gitlab.config.gitlab.url}/somewhere"
A
Ariejan de Vroom 已提交
101 102
  end

103 104
  it "returns the web URL without the protocol for this repo" do
    project = Project.new(path: "somewhere")
105
    project.web_url_without_protocol.should == "#{Gitlab.config.gitlab.url.split("://")[1]}/somewhere"
106 107
  end

108
  describe "last_activity methods" do
I
Izaak Alpert 已提交
109
    let(:project) { create(:project) }
110
    let(:last_event) { double(created_at: Time.now) }
G
gitlabhq 已提交
111

112
    describe "last_activity" do
I
Izaak Alpert 已提交
113
      it "should alias last_activity to last_event" do
114 115 116
        project.stub(last_event: last_event)
        project.last_activity.should == last_event
      end
G
gitlabhq 已提交
117 118
    end

119 120
    describe 'last_activity_date' do
      it 'returns the creation date of the project\'s last event if present' do
A
Andrey Kumanyaev 已提交
121
        last_activity_event = create(:event, project: project)
D
Dmitriy Zaporozhets 已提交
122
        project.last_activity_at.to_i.should == last_event.created_at.to_i
123
      end
124

125 126 127
      it 'returns the project\'s last update date if it has no events' do
        project.last_activity_date.should == project.updated_at
      end
128 129
    end
  end
130

131
  describe :update_merge_requests do
D
Dmitriy Zaporozhets 已提交
132
    let(:project) { create(:project) }
133 134

    before do
I
Izaak Alpert 已提交
135
      @merge_request = create(:merge_request, source_project: project, target_project: project)
136
      @key = create(:key, user_id: project.owner.id)
137 138 139
    end

    it "should close merge request if last commit from source branch was pushed to target branch" do
D
Dmitriy Zaporozhets 已提交
140
      @merge_request.reload_code
141 142
      @merge_request.last_commit.id.should == "69b34b7e9ad9f496f0ad10250be37d6265a03bba"
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "69b34b7e9ad9f496f0ad10250be37d6265a03bba", "refs/heads/stable", @key.user)
143
      @merge_request.reload
A
Andrew8xx8 已提交
144
      @merge_request.merged?.should be_true
145 146
    end

147
    it "should update merge request commits with new one if pushed to source branch" do
148
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "69b34b7e9ad9f496f0ad10250be37d6265a03bba", "refs/heads/master", @key.user)
149
      @merge_request.reload
150
      @merge_request.last_commit.id.should == "69b34b7e9ad9f496f0ad10250be37d6265a03bba"
151 152
    end
  end
153 154 155 156 157 158


  describe :find_with_namespace do
    context 'with namespace' do
      before do
        @group = create :group, name: 'gitlab'
D
Dmitriy Zaporozhets 已提交
159
        @project = create(:project, name: 'gitlabhq', namespace: @group)
160 161
      end

D
Dmitriy Zaporozhets 已提交
162
      it { Project.find_with_namespace('gitlab/gitlabhq').should == @project }
163 164 165 166 167 168 169 170
      it { Project.find_with_namespace('gitlab-ci').should be_nil }
    end
  end

  describe :to_param do
    context 'with namespace' do
      before do
        @group = create :group, name: 'gitlab'
D
Dmitriy Zaporozhets 已提交
171
        @project = create(:project, name: 'gitlabhq', namespace: @group)
172 173
      end

D
Dmitriy Zaporozhets 已提交
174
      it { @project.to_param.should == "gitlab/gitlabhq" }
175 176
    end
  end
D
Dmitriy Zaporozhets 已提交
177

178
  describe :repository do
D
Dmitriy Zaporozhets 已提交
179 180 181
    let(:project) { create(:project) }

    it "should return valid repo" do
182
      project.repository.should be_kind_of(Repository)
D
Dmitriy Zaporozhets 已提交
183 184
    end
  end
185 186 187 188 189 190 191 192

  describe :issue_exists? do
    let(:project) { create(:project) }
    let(:existed_issue) { create(:issue, project: project) }
    let(:not_existed_issue) { create(:issue) }
    let(:ext_project) { create(:redmine_project) }

    it "should be true or if used internal tracker and issue exists" do
D
Dmitriy Zaporozhets 已提交
193
      project.issue_exists?(existed_issue.iid).should be_true
194 195 196
    end

    it "should be false or if used internal tracker and issue not exists" do
D
Dmitriy Zaporozhets 已提交
197
      project.issue_exists?(not_existed_issue.iid).should be_false
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
    end

    it "should always be true if used other tracker" do
      ext_project.issue_exists?(rand(100)).should be_true
    end
  end

  describe :used_default_issues_tracker? do
    let(:project) { create(:project) }
    let(:ext_project) { create(:redmine_project) }

    it "should be true if used internal tracker" do
      project.used_default_issues_tracker?.should be_true
    end

    it "should be false if used other tracker" do
      ext_project.used_default_issues_tracker?.should be_false
    end
  end

A
Andrew8xx8 已提交
218 219 220 221 222 223
  describe :can_have_issues_tracker_id? do
    let(:project) { create(:project) }
    let(:ext_project) { create(:redmine_project) }

    it "should be true for projects with external issues tracker if issues enabled" do
      ext_project.can_have_issues_tracker_id?.should be_true
224
    end
A
Andrew8xx8 已提交
225 226 227 228 229

    it "should be false for projects with internal issue tracker if issues enabled" do
      project.can_have_issues_tracker_id?.should be_false
    end

J
Johannes Schleifenbaum 已提交
230
    it "should be always false if issues disabled" do
A
Andrew8xx8 已提交
231 232 233 234 235 236 237
      project.issues_enabled = false
      ext_project.issues_enabled = false

      project.can_have_issues_tracker_id?.should be_false
      ext_project.can_have_issues_tracker_id?.should be_false
    end
  end
238 239

  describe :open_branches do
D
Dmitriy Zaporozhets 已提交
240
    let(:project) { create(:project) }
241 242 243 244 245 246 247 248

    before do
      project.protected_branches.create(name: 'master')
    end

    it { project.open_branches.map(&:name).should include('bootstrap') }
    it { project.open_branches.map(&:name).should_not include('master') }
  end
G
gitlabhq 已提交
249
end