project_spec.rb 7.3 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
19 20
#

G
gitlabhq 已提交
21 22 23 24
require 'spec_helper'

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

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

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

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

G
gitlabhq 已提交
54
    it { should validate_presence_of(:path) }
55 56 57
    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) }
58
    it { should validate_presence_of(:creator) }
59 60 61 62
    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]) }
63 64

    it "should not allow new projects beyond user limits" do
65
      project.stub(:creator).and_return(double(can_create_project?: false, projects_limit: 1))
66 67 68 69 70 71 72 73
      project.should_not be_valid
      project.errors[:base].first.should match(/Your own projects limit is 1/)
    end

    it "should not allow 'gitolite-admin' as repo name" do
      should allow_value("blah").for(:path)
      should_not allow_value("gitolite-admin").for(:path)
    end
G
gitlabhq 已提交
74 75 76 77 78
  end

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

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

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

102
  describe "last_activity methods" do
103
    let(:project)    { create(:project) }
104
    let(:last_event) { double(created_at: Time.now) }
G
gitlabhq 已提交
105

106 107 108 109 110
    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 已提交
111 112
    end

113 114 115 116 117
    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
118

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

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

    before do
129 130 131 132 133
      @merge_request = create(:merge_request,
                              project: project,
                              merged: false,
                              closed: false)
      @key = create(:key, user_id: project.owner.id)
134 135 136 137 138
    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"
139
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/stable", @key.user)
140 141 142 143 144
      @merge_request.reload
      @merge_request.merged.should be_true
      @merge_request.closed.should be_true
    end

145
    it "should update merge request commits with new one if pushed to source branch" do
146
      @merge_request.last_commit.should == nil
147
      project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a", "refs/heads/master", @key.user)
148 149 150 151
      @merge_request.reload
      @merge_request.last_commit.id.should == "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
    end
  end
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 186 187 188 189 190 191 192


  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 已提交
193

194
  describe :repository do
D
Dmitriy Zaporozhets 已提交
195 196 197 198 199 200 201
    let(:project) { create(:project) }

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

    it "should return nil" do
202
      Project.new(path: "empty").repository.should be_nil
D
Dmitriy Zaporozhets 已提交
203 204
    end
  end
G
gitlabhq 已提交
205
end