project_spec.rb 10.5 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
#  updated_at             :datetime
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
#  import_url             :string(255)
22
#  visibility_level       :integer          default(0), not null
23
#  archived               :boolean          default(FALSE), not null
D
Dmitriy Zaporozhets 已提交
24
#  import_status          :string(255)
D
Dmitriy Zaporozhets 已提交
25 26
#  repository_size        :float            default(0.0)
#  star_count             :integer          default(0), not null
27 28
#

G
gitlabhq 已提交
29 30 31 32
require 'spec_helper'

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

53 54 55
  describe "Mass assignment" do
  end

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

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

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

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

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

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

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

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

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

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

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

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

128
  describe :update_merge_requests do
D
Dmitriy Zaporozhets 已提交
129
    let(:project) { create(:project) }
130 131 132 133
    let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
    let(:key) { create(:key, user_id: project.owner.id) }
    let(:prev_commit_id) { merge_request.commits.last.id }
    let(:commit_id) { merge_request.commits.first.id }
134 135

    it "should close merge request if last commit from source branch was pushed to target branch" do
136 137 138
      project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.target_branch}", key.user)
      merge_request.reload
      merge_request.merged?.should be_true
139 140
    end

141
    it "should update merge request commits with new one if pushed to source branch" do
142 143 144
      project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.source_branch}", key.user)
      merge_request.reload
      merge_request.last_commit.id.should == commit_id
145 146
    end
  end
147 148 149 150 151

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

D
Dmitriy Zaporozhets 已提交
155
      it { Project.find_with_namespace('gitlab/gitlabhq').should == @project }
156 157 158 159 160 161 162 163
      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 已提交
164
        @project = create(:project, name: 'gitlabhq', namespace: @group)
165 166
      end

D
Dmitriy Zaporozhets 已提交
167
      it { @project.to_param.should == "gitlab/gitlabhq" }
168 169
    end
  end
D
Dmitriy Zaporozhets 已提交
170

171
  describe :repository do
D
Dmitriy Zaporozhets 已提交
172 173 174
    let(:project) { create(:project) }

    it "should return valid repo" do
175
      project.repository.should be_kind_of(Repository)
D
Dmitriy Zaporozhets 已提交
176 177
    end
  end
178 179 180 181 182 183 184 185

  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 已提交
186
      project.issue_exists?(existed_issue.iid).should be_true
187 188 189
    end

    it "should be false or if used internal tracker and issue not exists" do
D
Dmitriy Zaporozhets 已提交
190
      project.issue_exists?(not_existed_issue.iid).should be_false
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
    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 已提交
211 212 213 214 215 216
  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
217
    end
A
Andrew8xx8 已提交
218 219 220 221 222

    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 已提交
223
    it "should be always false if issues disabled" do
A
Andrew8xx8 已提交
224 225 226 227 228 229 230
      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
231 232

  describe :open_branches do
D
Dmitriy Zaporozhets 已提交
233
    let(:project) { create(:project) }
234 235 236 237 238

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

239
    it { project.open_branches.map(&:name).should include('feature') }
240 241
    it { project.open_branches.map(&:name).should_not include('master') }
  end
C
Ciro Santilli 已提交
242

243 244
  describe '#star_count' do
    it 'counts stars from multiple users' do
C
Ciro Santilli 已提交
245 246 247 248 249
      user1 = create :user
      user2 = create :user
      project = create :project, :public

      expect(project.star_count).to eq(0)
250

C
Ciro Santilli 已提交
251
      user1.toggle_star(project)
252 253
      expect(project.reload.star_count).to eq(1)

C
Ciro Santilli 已提交
254
      user2.toggle_star(project)
255 256 257
      project.reload
      expect(project.reload.star_count).to eq(2)

C
Ciro Santilli 已提交
258
      user1.toggle_star(project)
259 260 261
      project.reload
      expect(project.reload.star_count).to eq(1)

C
Ciro Santilli 已提交
262
      user2.toggle_star(project)
263 264 265 266
      project.reload
      expect(project.reload.star_count).to eq(0)
    end

267
    it 'counts stars on the right project' do
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

      expect(project1.star_count).to eq(0)
      expect(project2.star_count).to eq(0)

      user.toggle_star(project1)
      project1.reload
      project2.reload
      expect(project1.star_count).to eq(1)
      expect(project2.star_count).to eq(0)

      user.toggle_star(project1)
      project1.reload
      project2.reload
      expect(project1.star_count).to eq(0)
      expect(project2.star_count).to eq(0)

      user.toggle_star(project2)
      project1.reload
      project2.reload
      expect(project1.star_count).to eq(0)
      expect(project2.star_count).to eq(1)

      user.toggle_star(project2)
      project1.reload
      project2.reload
      expect(project1.star_count).to eq(0)
      expect(project2.star_count).to eq(0)
C
Ciro Santilli 已提交
298
    end
299 300 301 302 303 304 305 306 307 308 309

    it 'is decremented when an upvoter account is deleted' do
      user = create :user
      project = create :project, :public
      user.toggle_star(project)
      project.reload
      expect(project.star_count).to eq(1)
      user.destroy
      project.reload
      expect(project.star_count).to eq(0)
    end
C
Ciro Santilli 已提交
310
  end
G
gitlabhq 已提交
311
end