summaryrefslogtreecommitdiff
path: root/spec/models/commit_spec.rb
diff options
context:
space:
mode:
authorKestred <kestred@riotcave.com>2014-08-23 22:27:52 -0700
committerKestred <kestred@riotcave.com>2014-08-23 22:27:52 -0700
commit18f954b31c242822b6c7430a50ca99a93adc6ea6 (patch)
treeb7ee4acac738d5b64b6fcfaf909756f784dd2d61 /spec/models/commit_spec.rb
parent2eb3d91e1a6e51d3ca0be2fe0a5df750708b366d (diff)
downloadgitlab-ci-18f954b31c242822b6c7430a50ca99a93adc6ea6.tar.gz
Separate Commit model and logic from Build model|etc...
This is an entirely non-user facing change which prepares GitLab CI for future support of Parallel Builds. See https://about.gitlab.com/2013/12/19/gitlab-ci-with-parallel-builds-and-deployments/. These changes specifically avoid changing the supported API or changing any of the website views. Changes to the website views will come in tandem with future features like "Multiple build scripts". The supported API won't change as part of any future changes on this vein, to maintain support for the unofficial GitLab CI runners. This closes the following implementation step: 1. A commit has many builds Signed-off-by: Kestred <kestred@riotcave.com>
Diffstat (limited to 'spec/models/commit_spec.rb')
-rw-r--r--spec/models/commit_spec.rb172
1 files changed, 172 insertions, 0 deletions
diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb
new file mode 100644
index 0000000..380a9b1
--- /dev/null
+++ b/spec/models/commit_spec.rb
@@ -0,0 +1,172 @@
+# == Schema Information
+#
+# Table name: commits
+#
+# id :integer not null, primary key
+# project_id :integer
+# ref :string(255)
+# sha :string(255)
+# before_sha :string(255)
+# push_data :text
+# created_at :datetime
+# updated_at :datetime
+#
+
+require 'spec_helper'
+
+describe Commit do
+ let(:project) { FactoryGirl.create :project }
+ let(:commit) { FactoryGirl.create :commit }
+ let(:commit_with_project) { FactoryGirl.create :commit, project: project }
+
+ it { should belong_to(:project) }
+ it { should have_many(:builds) }
+ it { should validate_presence_of :before_sha }
+ it { should validate_presence_of :sha }
+ it { should validate_presence_of :ref }
+ it { should validate_presence_of :push_data }
+
+ it { should respond_to :git_author_name }
+ it { should respond_to :git_author_email }
+ it { should respond_to :short_sha }
+
+ it { should allow_mass_assignment_of(:project_id) }
+ it { should allow_mass_assignment_of(:ref) }
+ it { should allow_mass_assignment_of(:sha) }
+ it { should allow_mass_assignment_of(:before_sha) }
+ it { should allow_mass_assignment_of(:push_data) }
+ it { should allow_mass_assignment_of(:status) }
+ it { should allow_mass_assignment_of(:project_name) }
+
+ describe :last_build do
+ subject { commit.last_build }
+ before do
+ @first = FactoryGirl.create :build, commit: commit, created_at: Date.yesterday
+ @second = FactoryGirl.create :build, commit: commit
+ end
+
+ it { should be_a(Build) }
+ it('returns with the most recently created build') { should eq(@second) }
+ end
+
+ describe :ci_skip? do
+ let(:project) { FactoryGirl.create(:project) }
+ let(:commit) { FactoryGirl.create(:commit, project: project) }
+
+ it 'true if commit message contains [ci skip]' do
+ commit.stub(:git_commit_message) { 'Small typo [ci skip]' }
+ commit.ci_skip?.should == true
+ end
+
+ it 'false if commit message does not contain [ci skip]' do
+ commit.ci_skip?.should == false
+ end
+ end
+
+ describe :project_recipients do
+
+ context 'always sending notification' do
+ it 'should return git_author_email as only recipient when no additional recipients are given' do
+ project = FactoryGirl.create :project,
+ email_add_committer: true,
+ email_recipients: ''
+ commit = FactoryGirl.create :commit, project: project
+ expected = 'git_author_email'
+ commit.stub(:git_author_email) { expected }
+ commit.project_recipients.should == [expected]
+ end
+
+ it 'should return git_author_email and additional recipients' do
+ project = FactoryGirl.create :project,
+ email_add_committer: true,
+ email_recipients: 'rec1 rec2'
+ commit = FactoryGirl.create :commit, project: project
+ expected = 'git_author_email'
+ commit.stub(:git_author_email) { expected }
+ commit.project_recipients.should == ['rec1', 'rec2', expected]
+ end
+
+ it 'should return recipients' do
+ project = FactoryGirl.create :project,
+ email_add_committer: false,
+ email_recipients: 'rec1 rec2'
+ commit = FactoryGirl.create :commit, project: project
+ expected = 'git_author_email'
+ commit.stub(:git_author_email) { expected }
+ commit.project_recipients.should == ['rec1', 'rec2']
+ end
+
+ it 'should return unique recipients only' do
+ project = FactoryGirl.create :project,
+ email_add_committer: true,
+ email_recipients: 'rec1 rec1 rec2'
+ commit = FactoryGirl.create :commit, project: project
+ expected = 'rec2'
+ commit.stub(:git_author_email) { expected }
+ commit.project_recipients.should == ['rec1', 'rec2']
+ end
+ end
+ end
+
+ describe :valid_commit_sha do
+ context 'commit.sha can not start with 00000000' do
+ before do
+ commit.sha = '0' * 32
+ commit.valid_commit_sha
+ end
+
+ it('commit errors should not be empty') { commit.errors.should_not be_empty }
+ end
+ end
+
+ describe :compare? do
+ subject { commit_with_project.compare? }
+
+ context 'if project.gitlab_url and commit.before_sha are not nil' do
+ it { should be_true }
+ end
+ end
+
+ describe :short_sha do
+ subject { commit.short_before_sha }
+
+ it { should have(9).items }
+ it { commit.before_sha.should start_with(subject) }
+ end
+
+ describe :short_sha do
+ subject { commit.short_sha }
+
+ it { should have(9).items }
+ it { commit.sha.should start_with(subject) }
+ end
+
+ describe :repo_url do
+ subject { commit_with_project.repo_url }
+
+ it { should be_a(String) }
+ it { should end_with(".git") }
+ it { should start_with(project.gitlab_url[0..6]) }
+ it { should include(project.token) }
+ it { should include('gitlab-ci-token') }
+ it { should include(project.gitlab_url[7..-1]) }
+ end
+
+ describe :gitlab? do
+ subject { commit_with_project.gitlab? }
+
+ it { should eq(project.gitlab?) }
+ end
+
+ describe :allow_git_fetch do
+ subject { commit_with_project.allow_git_fetch }
+
+ it { should eq(project.allow_git_fetch) }
+ end
+
+ describe :name do
+ subject { commit_with_project.project_name }
+
+ it { should eq(project.name) }
+ end
+end