project_spec.rb 9.07 KB
Newer Older
1 2 3 4
# == Schema Information
#
# Table name: projects
#
5
#  id                     :integer          not null, primary key
6 7 8
#  name                   :string(255)
#  path                   :string(255)
#  description            :text
9 10
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
11
#  creator_id             :integer
12
#  default_branch         :string(255)
13 14 15 16
#  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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
17
#  namespace_id           :integer
18
#  public                 :boolean          default(FALSE), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
19 20
#  issues_tracker         :string(255)      default("gitlab"), not null
#  issues_tracker_id      :string(255)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
21
#  snippets_enabled       :boolean          default(TRUE), not null
22
#  last_activity_at       :datetime
23 24
#

gitlabhq's avatar
gitlabhq committed
25 26 27 28
require 'spec_helper'

describe Project do
  describe "Associations" do
29
    it { should belong_to(:group) }
30
    it { should belong_to(:namespace) }
31
    it { should belong_to(:creator).class_name('User') }
gitlabhq's avatar
gitlabhq committed
32
    it { should have_many(:users) }
33 34 35
    it { should have_many(:events).dependent(:destroy) }
    it { should have_many(:merge_requests).dependent(:destroy) }
    it { should have_many(:issues).dependent(:destroy) }
36 37
    it { should have_many(:milestones).dependent(:destroy) }
    it { should have_many(:users_projects).dependent(:destroy) }
38 39 40
    it { should have_many(:notes).dependent(:destroy) }
    it { should have_many(:snippets).dependent(:destroy) }
    it { should have_many(:deploy_keys).dependent(:destroy) }
41 42 43
    it { should have_many(:hooks).dependent(:destroy) }
    it { should have_many(:wikis).dependent(:destroy) }
    it { should have_many(:protected_branches).dependent(:destroy) }
gitlabhq's avatar
gitlabhq committed
44 45
  end

46
  describe "Mass assignment" do
47
    it { should_not allow_mass_assignment_of(:namespace_id) }
48
    it { should_not allow_mass_assignment_of(:creator_id) }
49 50
  end

gitlabhq's avatar
gitlabhq committed
51
  describe "Validation" do
52 53
    let!(:project) { create(:project) }

gitlabhq's avatar
gitlabhq committed
54
    it { should validate_presence_of(:name) }
55 56 57
    it { should validate_uniqueness_of(:name) }
    it { should ensure_length_of(:name).is_within(0..255) }

gitlabhq's avatar
gitlabhq committed
58
    it { should validate_presence_of(:path) }
59 60 61
    it { should validate_uniqueness_of(:path) }
    it { should ensure_length_of(:path).is_within(0..255) }
    it { should ensure_length_of(:description).is_within(0..2000) }
62
    it { should validate_presence_of(:creator) }
63 64 65 66
    it { should ensure_inclusion_of(:issues_enabled).in_array([true, false]) }
    it { should ensure_inclusion_of(:wall_enabled).in_array([true, false]) }
    it { should ensure_inclusion_of(:merge_requests_enabled).in_array([true, false]) }
    it { should ensure_inclusion_of(:wiki_enabled).in_array([true, false]) }
Andrew8xx8's avatar
Andrew8xx8 committed
67
    it { should ensure_length_of(:issues_tracker_id).is_within(0..255) }
68 69

    it "should not allow new projects beyond user limits" do
70
      project.stub(:creator).and_return(double(can_create_project?: false, projects_limit: 1))
71
      project.should_not be_valid
72
      project.errors[:limit_reached].first.should match(/Your own projects limit is 1/)
73
    end
gitlabhq's avatar
gitlabhq committed
74 75 76 77 78
  end

  describe "Respond to" do
    it { should respond_to(:url_to_repo) }
    it { should respond_to(:repo_exists?) }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
79 80 81
    it { should respond_to(:satellite) }
    it { should respond_to(:update_merge_requests) }
    it { should respond_to(:execute_hooks) }
82 83 84
    it { should respond_to(:transfer) }
    it { should respond_to(:name_with_namespace) }
    it { should respond_to(:namespace_owner) }
85
    it { should respond_to(:owner) }
86
    it { should respond_to(:path_with_namespace) }
gitlabhq's avatar
gitlabhq committed
87 88
  end

Nihad Abbasov's avatar
Nihad Abbasov committed
89
  it "should return valid url to repo" do
90
    project = Project.new(path: "somewhere")
91
    project.url_to_repo.should == Gitlab.config.gitlab_shell.ssh_path_prefix + "somewhere.git"
gitlabhq's avatar
gitlabhq committed
92 93
  end

94
  it "returns the full web URL for this repo" do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
95
    project = Project.new(path: "somewhere")
96
    project.web_url.should == "#{Gitlab.config.gitlab.url}/somewhere"
97 98
  end

99
  describe "last_activity methods" do
100
    let(:project)    { create(:project) }
101
    let(:last_event) { double(created_at: Time.now) }
gitlabhq's avatar
gitlabhq committed
102

103 104 105 106 107
    describe "last_activity" do
      it "should alias last_activity to last_event"do
        project.stub(last_event: last_event)
        project.last_activity.should == last_event
      end
gitlabhq's avatar
gitlabhq committed
108 109
    end

110 111 112 113 114
    describe 'last_activity_date' do
      it 'returns the creation date of the project\'s last event if present' do
        project.stub(last_event: last_event)
        project.last_activity_date.should == last_event.created_at
      end
115

116 117 118
      it 'returns the project\'s last update date if it has no events' do
        project.last_activity_date.should == project.updated_at
      end
119 120
    end
  end
121

122
  describe :update_merge_requests do
123
    let(:project) { create(:project_with_code) }
124 125

    before do
126
      @merge_request = create(:merge_request, project: project)
127
      @key = create(:key, user_id: project.owner.id)
128 129 130 131 132
    end

    it "should close merge request if last commit from source branch was pushed to target branch" do
      @merge_request.reloaded_commits
      @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
133
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/stable", @key.user)
134
      @merge_request.reload
135
      @merge_request.merged?.should be_true
136 137
    end

138
    it "should update merge request commits with new one if pushed to source branch" do
139
      @merge_request.last_commit.should == nil
140
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/master", @key.user)
141 142 143 144
      @merge_request.reload
      @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
    end
  end
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185


  describe :find_with_namespace do
    context 'with namespace' do
      before do
        @group = create :group, name: 'gitlab'
        @project = create(:project, name: 'gitlab-ci', namespace: @group)
      end

      it { Project.find_with_namespace('gitlab/gitlab-ci').should == @project }
      it { Project.find_with_namespace('gitlab-ci').should be_nil }
    end

    context 'w/o namespace' do
      before do
        @project = create(:project, name: 'gitlab-ci')
      end

      it { Project.find_with_namespace('gitlab-ci').should == @project }
      it { Project.find_with_namespace('gitlab/gitlab-ci').should be_nil }
    end
  end

  describe :to_param do
    context 'with namespace' do
      before do
        @group = create :group, name: 'gitlab'
        @project = create(:project, name: 'gitlab-ci', namespace: @group)
      end

      it { @project.to_param.should == "gitlab/gitlab-ci" }
    end

    context 'w/o namespace' do
      before do
        @project = create(:project, name: 'gitlab-ci')
      end

      it { @project.to_param.should == "gitlab-ci" }
    end
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
186

187
  describe :repository do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
188 189 190
    let(:project) { create(:project) }

    it "should return valid repo" do
191
      project.repository.should be_kind_of(Repository)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
192 193
    end
  end
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

  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
      project.issue_exists?(existed_issue.id).should be_true
    end

    it "should be false or if used internal tracker and issue not exists" do
      project.issue_exists?(not_existed_issue.id).should be_false
    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

Andrew8xx8's avatar
Andrew8xx8 committed
227 228 229 230 231 232
  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
233
    end
Andrew8xx8's avatar
Andrew8xx8 committed
234 235 236 237 238 239 240 241 242 243 244 245 246

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

    it "should be always false if issues disbled" do
      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
247 248

  describe :open_branches do
249
    let(:project) { create(:project_with_code) }
250 251 252 253 254 255 256 257

    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
gitlabhq's avatar
gitlabhq committed
258
end