project_spec.rb 8.8 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
12
#  default_branch         :string(255)
D
Dmitriy Zaporozhets 已提交
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
D
Dmitriy Zaporozhets 已提交
17
#  namespace_id           :integer
18
#  public                 :boolean          default(FALSE), not null
D
Dmitriy Zaporozhets 已提交
19 20
#  issues_tracker         :string(255)      default("gitlab"), not null
#  issues_tracker_id      :string(255)
21 22
#

G
gitlabhq 已提交
23 24 25 26
require 'spec_helper'

describe Project do
  describe "Associations" do
27
    it { should belong_to(:group) }
28
    it { should belong_to(:namespace) }
29
    it { should belong_to(:creator).class_name('User') }
G
gitlabhq 已提交
30
    it { should have_many(:users) }
31 32 33
    it { should have_many(:events).dependent(:destroy) }
    it { should have_many(:merge_requests).dependent(:destroy) }
    it { should have_many(:issues).dependent(:destroy) }
34 35
    it { should have_many(:milestones).dependent(:destroy) }
    it { should have_many(:users_projects).dependent(:destroy) }
36
    it { should have_many(:notes).dependent(:destroy) }
A
Andrew8xx8 已提交
37
    it { should have_many(:snippets).class_name('ProjectSnippet').dependent(:destroy) }
38
    it { should have_many(:deploy_keys).dependent(:destroy) }
39 40 41
    it { should have_many(:hooks).dependent(:destroy) }
    it { should have_many(:wikis).dependent(:destroy) }
    it { should have_many(:protected_branches).dependent(:destroy) }
G
gitlabhq 已提交
42 43
  end

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

G
gitlabhq 已提交
49
  describe "Validation" do
50 51
    let!(:project) { create(:project) }

G
gitlabhq 已提交
52
    it { should validate_presence_of(:name) }
53 54 55
    it { should validate_uniqueness_of(:name) }
    it { should ensure_length_of(:name).is_within(0..255) }

G
gitlabhq 已提交
56
    it { should validate_presence_of(:path) }
57 58 59
    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) }
60
    it { should validate_presence_of(:creator) }
61 62 63 64
    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]) }
A
Andrew8xx8 已提交
65
    it { should ensure_length_of(:issues_tracker_id).is_within(0..255) }
66 67

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

  describe "Respond to" do
    it { should respond_to(:url_to_repo) }
    it { should respond_to(:repo_exists?) }
D
Dmitriy Zaporozhets 已提交
77 78 79
    it { should respond_to(:satellite) }
    it { should respond_to(:update_merge_requests) }
    it { should respond_to(:execute_hooks) }
80 81 82
    it { should respond_to(:transfer) }
    it { should respond_to(:name_with_namespace) }
    it { should respond_to(:namespace_owner) }
83
    it { should respond_to(:owner) }
84
    it { should respond_to(:path_with_namespace) }
G
gitlabhq 已提交
85 86
  end

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

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

97
  describe "last_activity methods" do
98
    let(:project)    { create(:project) }
99
    let(:last_event) { double(created_at: Time.now) }
G
gitlabhq 已提交
100

101 102 103 104 105
    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
G
gitlabhq 已提交
106 107
    end

108 109 110 111 112
    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
113

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

120
  describe :update_merge_requests do
121
    let(:project) { create(:project) }
122 123

    before do
A
Andrew8xx8 已提交
124
      @merge_request = create(:merge_request, project: project)
125
      @key = create(:key, user_id: project.owner.id)
126 127 128 129 130
    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"
131
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/stable", @key.user)
132
      @merge_request.reload
A
Andrew8xx8 已提交
133
      @merge_request.merged?.should be_true
134 135
    end

136
    it "should update merge request commits with new one if pushed to source branch" do
137
      @merge_request.last_commit.should == nil
138
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/master", @key.user)
139 140 141 142
      @merge_request.reload
      @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
    end
  end
143 144 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


  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
D
Dmitriy Zaporozhets 已提交
184

185
  describe :repository do
D
Dmitriy Zaporozhets 已提交
186 187 188 189 190 191 192
    let(:project) { create(:project) }

    it "should return valid repo" do
      project.repository.should be_kind_of(Repository)
    end

    it "should return nil" do
193
      Project.new(path: "empty").repository.should be_nil
D
Dmitriy Zaporozhets 已提交
194 195
    end
  end
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 227 228

  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

A
Andrew8xx8 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
  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
    end 

    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
G
gitlabhq 已提交
249
end