project_spec.rb 8.68 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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
9 10
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
11
#  creator_id             :integer
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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
16
#  namespace_id           :integer
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
17 18
#  issues_tracker         :string(255)      default("gitlab"), not null
#  issues_tracker_id      :string(255)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
19
#  snippets_enabled       :boolean          default(TRUE), not null
20
#  last_activity_at       :datetime
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
21
#  imported               :boolean          default(FALSE), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
22
#  import_url             :string(255)
23
#  visibility_level       :integer          default(0), not null
24 25
#

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

describe Project do
29 30
  before { enable_observers }
  after { disable_observers }
31

gitlabhq's avatar
gitlabhq committed
32
  describe "Associations" do
33
    it { should belong_to(:group) }
34
    it { should belong_to(:namespace) }
35
    it { should belong_to(:creator).class_name('User') }
gitlabhq's avatar
gitlabhq committed
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 41
    it { should have_many(:milestones).dependent(:destroy) }
    it { should have_many(:users_projects).dependent(:destroy) }
42
    it { should have_many(:notes).dependent(:destroy) }
Andrew8xx8's avatar
Andrew8xx8 committed
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) }
gitlabhq's avatar
gitlabhq committed
49 50
  end

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

gitlabhq's avatar
gitlabhq committed
56
  describe "Validation" do
57 58
    let!(:project) { create(:project) }

gitlabhq's avatar
gitlabhq committed
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) }

gitlabhq's avatar
gitlabhq committed
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) }
Andrew8xx8's avatar
Andrew8xx8 committed
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 73 74 75
      project2 = build(:project)
      project2.stub(:creator).and_return(double(can_create_project?: false, projects_limit: 0))
      project2.should_not be_valid
      project2.errors[:limit_reached].first.should match(/Your own projects limit is 0/)
76
    end
gitlabhq's avatar
gitlabhq committed
77 78 79 80 81
  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
82 83 84
    it { should respond_to(:satellite) }
    it { should respond_to(:update_merge_requests) }
    it { should respond_to(:execute_hooks) }
85 86
    it { should respond_to(:transfer) }
    it { should respond_to(:name_with_namespace) }
87
    it { should respond_to(:owner) }
88
    it { should respond_to(:path_with_namespace) }
gitlabhq's avatar
gitlabhq committed
89 90
  end

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

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

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

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

112 113
    describe 'last_activity_date' do
      it 'returns the creation date of the project\'s last event if present' do
Andrey Kumanyaev's avatar
Andrey Kumanyaev committed
114
        last_activity_event = create(:event, project: project)
115
        project.last_activity_at.to_i.should == last_event.created_at.to_i
116
      end
117

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

124
  describe :update_merge_requests do
125
    let(:project) { create(:project_with_code) }
126 127

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

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

140
    it "should update merge request commits with new one if pushed to source branch" do
141
      @merge_request.last_commit.should == nil
142
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
143
      @merge_request.reload
144
      @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
145 146
    end
  end
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170


  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
  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
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
171

172
  describe :repository do
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
173 174 175
    let(:project) { create(:project) }

    it "should return valid repo" do
176
      project.repository.should be_kind_of(Repository)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
177 178
    end
  end
179 180 181 182 183 184 185 186

  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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
187
      project.issue_exists?(existed_issue.iid).should be_true
188 189 190
    end

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

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

Johannes Schleifenbaum's avatar
Johannes Schleifenbaum committed
224
    it "should be always false if issues disabled" do
Andrew8xx8's avatar
Andrew8xx8 committed
225 226 227 228 229 230 231
      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
232 233

  describe :open_branches do
234
    let(:project) { create(:project_with_code) }
235 236 237 238 239 240 241 242

    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
243
end