summaryrefslogtreecommitdiff
path: root/spec/models
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
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')
-rw-r--r--spec/models/build_spec.rb220
-rw-r--r--spec/models/commit_spec.rb172
-rw-r--r--spec/models/project_spec.rb9
3 files changed, 243 insertions, 158 deletions
diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb
index 9e932ab..ae67c33 100644
--- a/spec/models/build_spec.rb
+++ b/spec/models/build_spec.rb
@@ -3,58 +3,43 @@
# Table name: builds
#
# id :integer not null, primary key
-# project_id :integer
-# ref :string(255)
# status :string(255)
# finished_at :datetime
# trace :text
# created_at :datetime
# updated_at :datetime
-# sha :string(255)
# started_at :datetime
# tmp_file :string(255)
-# before_sha :string(255)
-# push_data :text
# runner_id :integer
+# commit_id :integer
#
require 'spec_helper'
describe Build do
let(:project) { FactoryGirl.create :project }
- let(:build) { FactoryGirl.create :build }
- let(:build_with_project) { FactoryGirl.create :build, project: project }
+ let(:commit) { FactoryGirl.create :commit, project: project }
+ let(:build) { FactoryGirl.create :build, commit: commit }
- it { should belong_to(:project) }
- it { should validate_presence_of :before_sha }
- it { should validate_presence_of :sha }
- it { should validate_presence_of :ref }
+ it { should belong_to(:commit) }
it { should validate_presence_of :status }
it { should respond_to :success? }
it { should respond_to :failed? }
it { should respond_to :running? }
it { should respond_to :pending? }
- it { should respond_to :git_author_name }
- it { should respond_to :git_author_email }
- it { should respond_to :short_sha }
it { should respond_to :trace_html }
- 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(:commit_id) }
it { should allow_mass_assignment_of(:status) }
+ it { should allow_mass_assignment_of(:started_at) }
it { should allow_mass_assignment_of(:finished_at) }
it { should allow_mass_assignment_of(:trace) }
- it { should allow_mass_assignment_of(:started_at) }
- it { should allow_mass_assignment_of(:push_data) }
it { should allow_mass_assignment_of(:runner_id) }
- it { should allow_mass_assignment_of(:project_name) }
describe :first_pending do
- let(:first) { FactoryGirl.create :build, status: 'pending', created_at: Date.yesterday }
- let(:second) { FactoryGirl.create :build, status: 'pending' }
+ let(:first) { FactoryGirl.create :build, commit: commit, status: 'pending', created_at: Date.yesterday }
+ let(:second) { FactoryGirl.create :build, commit: commit, status: 'pending' }
before { first; second }
subject { Build.first_pending }
@@ -76,73 +61,6 @@ describe Build do
end
end
- describe :ci_skip? do
- let(:project) { FactoryGirl.create(:project) }
- let(:build) { FactoryGirl.create(:build, project: project) }
-
- it 'true if commit message contains [ci skip]' do
- build.stub(:git_commit_message) { 'Small typo [ci skip]' }
- build.ci_skip?.should == true
- end
-
- it 'false if commit message does not contain [ci skip]' do
- build.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: ''
- build = FactoryGirl.create :build,
- status: :success,
- project: project
- expected = 'git_author_email'
- build.stub(:git_author_email) { expected }
- build.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'
- build = FactoryGirl.create :build,
- status: :success,
- project: project
- expected = 'git_author_email'
- build.stub(:git_author_email) { expected }
- build.project_recipients.should == ['rec1', 'rec2', expected]
- end
-
- it 'should return recipients' do
- project = FactoryGirl.create :project,
- email_add_committer: false,
- email_recipients: 'rec1 rec2'
- build = FactoryGirl.create :build,
- status: :success,
- project: project
- expected = 'git_author_email'
- build.stub(:git_author_email) { expected }
- build.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'
- build = FactoryGirl.create :build,
- status: :success,
- project: project
- expected = 'rec2'
- build.stub(:git_author_email) { expected }
- build.project_recipients.should == ['rec1', 'rec2']
- end
- end
- end
-
describe :started? do
subject { build.started? }
@@ -209,17 +127,6 @@ describe Build do
end
end
- describe :valid_commit_sha do
- context 'build.sha can not start with 00000000' do
- before do
- build.sha = '0' * 32
- build.valid_commit_sha
- end
-
- it('build errors should not be empty') { build.errors.should_not be_empty }
- end
- end
-
describe :trace do
subject { build.trace_html }
@@ -234,91 +141,94 @@ describe Build do
end
end
- describe :compare? do
- subject { build_with_project.compare? }
+ describe :commands do
+ subject { build.commands }
- context 'if project.gitlab_url and build.before_sha are not nil' do
- it { should be_true }
- end
+ it { should eq(commit.project.scripts) }
end
- describe :short_sha do
- subject { build.short_before_sha }
+ describe :timeout do
+ subject { build.timeout }
- it { should have(9).items }
- it { build.before_sha.should start_with(subject) }
+ it { should eq(commit.project.timeout) }
end
- describe :short_sha do
- subject { build.short_sha }
+ describe :duration do
+ subject { build.duration }
+
+ it { should eq(120.0) }
+
+ context 'if the building process has not started yet' do
+ before do
+ build.started_at = nil
+ build.finished_at = nil
+ end
- it { should have(9).items }
- it { build.sha.should start_with(subject) }
+ it { should be_nil }
+ end
+
+ context 'if the building process has started' do
+ before do
+ build.started_at = Time.now - 1.minute
+ build.finished_at = nil
+ end
+
+ it { should be_a(Float) }
+ it { should > 0.0 }
+ end
end
- describe :repo_url do
- subject { build_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]) }
+ describe :ref do
+ subject { build.ref }
+
+ it { should eq(commit.ref) }
end
- describe :gitlab? do
- subject { build_with_project.gitlab? }
+ describe :sha do
+ subject { build.sha }
- it { should eq(project.gitlab?) }
+ it { should eq(commit.sha) }
end
- describe :commands do
- subject { build_with_project.commands }
+ describe :short_sha do
+ subject { build.short_sha }
- it { should eq(project.scripts) }
+ it { should eq(commit.short_sha) }
end
- describe :timeout do
- subject { build_with_project.timeout }
+ describe :before_sha do
+ subject { build.before_sha }
- it { should eq(project.timeout) }
+ it { should eq(commit.before_sha) }
end
describe :allow_git_fetch do
- subject { build_with_project.allow_git_fetch }
+ subject { build.allow_git_fetch }
- it { should eq(project.allow_git_fetch) }
+ it { should eq(commit.allow_git_fetch) }
end
- describe :name do
- subject { build_with_project.project_name }
+ describe :project do
+ subject { build.project }
- it { should eq(project.name) }
+ it { should eq(commit.project) }
end
- describe :duration do
- subject { build.duration }
+ describe :project_id do
+ subject { build.project_id }
- it { should eq(120.0) }
+ it { should eq(commit.project_id) }
+ end
- context 'if the building process has not started yet' do
- before do
- build.started_at = nil
- build.finished_at = nil
- end
+ describe :project_name do
+ subject { build.project_name }
- it { should be_nil }
- end
+ it { should eq(commit.project_name) }
+ end
- context 'if the building process has started' do
- before do
- build.started_at = Time.now - 1.minute
- build.finished_at = nil
- end
+ describe :repo_url do
+ subject { build.repo_url }
- it { should be_a(Float) }
- it { should > 0.0 }
- end
+ it { should eq(commit.repo_url) }
end
end
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
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index fc06414..0e29b5c 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -27,7 +27,7 @@ require 'spec_helper'
describe Project do
subject { FactoryGirl.build :project }
- it { should have_many(:builds) }
+ it { should have_many(:commits) }
it { should validate_presence_of :name }
it { should validate_presence_of :scripts }
@@ -49,8 +49,11 @@ describe Project do
context :valid_project do
let(:project) { FactoryGirl.create :project }
- context :project_with_build do
- before { FactoryGirl.create(:build, project: project) }
+ context :project_with_commit_and_builds do
+ before do
+ commit = FactoryGirl.create(:commit, project: project)
+ FactoryGirl.create(:build, commit: commit)
+ end
it { project.status.should == 'pending' }
it { project.last_build.should be_kind_of(Build) }