diff options
author | Kestred <kestred@riotcave.com> | 2014-08-23 22:27:52 -0700 |
---|---|---|
committer | Kestred <kestred@riotcave.com> | 2014-08-23 22:27:52 -0700 |
commit | 18f954b31c242822b6c7430a50ca99a93adc6ea6 (patch) | |
tree | b7ee4acac738d5b64b6fcfaf909756f784dd2d61 /spec/models | |
parent | 2eb3d91e1a6e51d3ca0be2fe0a5df750708b366d (diff) | |
download | gitlab-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.rb | 220 | ||||
-rw-r--r-- | spec/models/commit_spec.rb | 172 | ||||
-rw-r--r-- | spec/models/project_spec.rb | 9 |
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) } |