travis-api/spec_core/model/build_spec.rb
2016-06-19 14:35:54 +02:00

336 lines
11 KiB
Ruby

describe Build do
before { DatabaseCleaner.clean_with :truncation }
let(:repository) { Factory(:repository) }
it 'caches matrix ids' do
build = Factory.create(:build, config: { rvm: ['1.9.3', '2.0.0'] })
build.cached_matrix_ids.should == build.matrix_ids
end
it 'returns nil if cached_matrix_ids are not set' do
build = Factory.create(:build)
build.update_column(:cached_matrix_ids, nil)
build.reload.cached_matrix_ids.should be_nil
end
it 'is cancelable if at least one job is cancelable' do
jobs = [Factory.build(:test), Factory.build(:test)]
jobs.first.stubs(:cancelable?).returns(true)
jobs.second.stubs(:cancelable?).returns(false)
build = Factory.build(:build, matrix: jobs)
build.should be_cancelable
end
it 'is not cancelable if none of the jobs are cancelable' do
jobs = [Factory.build(:test), Factory.build(:test)]
jobs.first.stubs(:cancelable?).returns(false)
jobs.second.stubs(:cancelable?).returns(false)
build = Factory.build(:build, matrix: jobs)
build.should_not be_cancelable
end
describe '#secure_env_enabled?' do
it 'returns true if we\'re not dealing with pull request' do
build = Factory.build(:build)
build.stubs(:pull_request?).returns(false)
build.secure_env_enabled?.should be true
end
it 'returns true if pull request is from the same repository' do
build = Factory.build(:build)
build.stubs(:pull_request?).returns(true)
build.stubs(:same_repo_pull_request?).returns(true)
build.secure_env_enabled?.should be true
end
it 'returns false if pull request is not from the same repository' do
build = Factory.build(:build)
build.stubs(:pull_request?).returns(true)
build.stubs(:same_repo_pull_request?).returns(false)
build.secure_env_enabled?.should be false
end
end
describe 'class methods' do
describe 'recent' do
it 'returns recent finished builds ordered by id descending' do
Factory(:build, state: 'passed')
Factory(:build, state: 'failed')
Factory(:build, state: 'created')
Build.recent.all.map(&:state).should == ['failed', 'passed']
end
end
describe 'was_started' do
it 'returns builds that are either started or finished' do
Factory(:build, state: 'passed')
Factory(:build, state: 'started')
Factory(:build, state: 'created')
Build.was_started.map(&:state).sort.should == ['passed', 'started']
end
end
describe 'on_branch' do
it 'returns builds that are on any of the given branches' do
Factory(:build, commit: Factory(:commit, branch: 'master'))
Factory(:build, commit: Factory(:commit, branch: 'develop'))
Factory(:build, commit: Factory(:commit, branch: 'feature'))
Build.on_branch('master,develop').map(&:commit).map(&:branch).sort.should == ['develop', 'master']
end
it 'does not include pull requests' do
Factory(:build, commit: Factory(:commit, branch: 'no-pull'), request: Factory(:request, event_type: 'pull_request'))
Factory(:build, commit: Factory(:commit, branch: 'no-pull'), request: Factory(:request, event_type: 'push'))
Build.on_branch('no-pull').count.should be == 1
end
end
describe 'older_than' do
before do
5.times { |i| Factory(:build, number: i) }
Build.stubs(:per_page).returns(2)
end
context "when a Build is passed in" do
subject { Build.older_than(Build.new(number: 3)) }
it "should limit the results" do
expect(subject.size).to eq(2)
end
it "should return older than the passed build" do
subject.map(&:number).should == ['2', '1']
end
end
context "when a number is passed in" do
subject { Build.older_than(3) }
it "should limit the results" do
expect(subject.size).to eq(2)
end
it "should return older than the passed build" do
subject.map(&:number).should == ['2', '1']
end
end
context "when not passing a build" do
subject { Build.older_than() }
it "should limit the results" do
expect(subject.size).to eq(2)
end
end
end
describe 'paged' do
it 'limits the results to the `per_page` value' do
3.times { Factory(:build) }
Build.stubs(:per_page).returns(1)
expect(Build.descending.paged({}).size).to eq(1)
end
it 'uses an offset' do
3.times { |i| Factory(:build) }
Build.stubs(:per_page).returns(1)
builds = Build.descending.paged({page: 2})
expect(builds.size).to eq(1)
builds.first.number.should == '2'
end
end
describe 'pushes' do
before do
Factory(:build)
Factory(:build, request: Factory(:request, event_type: 'pull_request'))
end
it "returns only builds which have Requests with an event_type of push" do
Build.pushes.all.count.should == 1
end
end
describe 'pull_requests' do
before do
Factory(:build)
Factory(:build, request: Factory(:request, event_type: 'pull_request'))
end
it "returns only builds which have Requests with an event_type of pull_request" do
Build.pull_requests.all.count.should == 1
end
end
end
describe 'creation' do
describe 'previous_state' do
it 'is set to the last finished build state on the same branch' do
Factory(:build, state: 'failed')
Factory(:build).reload.previous_state.should == 'failed'
end
it 'is set to the last finished build state on the same branch (disregards non-finished builds)' do
Factory(:build, state: 'failed')
Factory(:build, state: 'started')
Factory(:build).reload.previous_state.should == 'failed'
end
it 'is set to the last finished build state on the same branch (disregards other branches)' do
Factory(:build, state: 'failed')
Factory(:build, state: 'passed', commit: Factory(:commit, branch: 'something'))
Factory(:build).reload.previous_state.should == 'failed'
end
end
it "updates the last_build on the build's branch" do
build = FactoryGirl.create(:build)
branch = Branch.where(repository_id: build.repository_id, name: build.branch).first
branch.last_build.should == build
end
end
describe 'instance methods' do
it 'sets its number to the next build number on creation' do
1.upto(3) do |number|
Factory(:build).reload.number.should == number.to_s
end
end
it 'sets previous_state to nil if no last build exists on the same branch' do
build = Factory(:build, commit: Factory(:commit, branch: 'master'))
build.reload.previous_state.should == nil
end
it 'sets previous_state to the result of the last build on the same branch if exists' do
build = Factory(:build, state: :canceled, commit: Factory(:commit, branch: 'master'))
build = Factory(:build, commit: Factory(:commit, branch: 'master'))
build.reload.previous_state.should == 'canceled'
end
describe 'config' do
it 'defaults to a hash with language and os set' do
build = Build.new(repository: Repository.new(owner: User.new))
build.config.should == { language: 'ruby', group: 'stable', dist: 'precise', os: 'linux' }
end
it 'deep_symbolizes keys on write' do
build = Factory(:build, config: { 'foo' => { 'bar' => 'bar' } })
build.read_attribute(:config)[:foo].should == { bar: 'bar' }
end
it 'downcases the language on config' do
build = Factory.create(:build, config: { language: "PYTHON" })
Build.last.config[:language].should == "python"
end
it 'sets ruby as default language' do
build = Factory.create(:build, config: { 'foo' => { 'bar' => 'bar' } })
Build.last.config[:language].should == "ruby"
end
end
describe :pending? do
it 'returns true if the build is finished' do
build = Factory(:build, state: :finished)
build.pending?.should be false
end
it 'returns true if the build is not finished' do
build = Factory(:build, state: :started)
build.pending?.should be true
end
end
describe :passed? do
it 'passed? returns true if state equals :passed' do
build = Factory(:build, state: :passed)
build.passed?.should be true
end
it 'passed? returns true if result does not equal :passed' do
build = Factory(:build, state: :failed)
build.passed?.should be false
end
end
describe :color do
it 'returns "green" if the build has passed' do
build = Factory(:build, state: :passed)
build.color.should == 'green'
end
it 'returns "red" if the build has failed' do
build = Factory(:build, state: :failed)
build.color.should == 'red'
end
it 'returns "yellow" if the build is pending' do
build = Factory(:build, state: :started)
build.color.should == 'yellow'
end
end
it 'saves event_type before create' do
build = Factory(:build, request: Factory(:request, event_type: 'pull_request'))
build.event_type.should == 'pull_request'
build = Factory(:build, request: Factory(:request, event_type: 'push'))
build.event_type.should == 'push'
end
it 'saves pull_request_title before create' do
payload = { 'pull_request' => { 'title' => 'A pull request' } }
build = Factory(:build, request: Factory(:request, event_type: 'pull_request', payload: payload))
build.pull_request_title.should == 'A pull request'
end
it 'saves branch before create' do
build = Factory(:build, commit: Factory(:commit, branch: 'development'))
build.branch.should == 'development'
end
describe 'reset' do
let(:build) { Factory(:build, state: 'finished') }
before :each do
build.matrix.each { |job| job.stubs(:reset) }
end
it 'sets the state to :created' do
build.reset
build.state.should == :created
end
it 'resets related attributes' do
build.reset
build.duration.should be_nil
build.finished_at.should be_nil
end
it 'resets each job if :reset_matrix is given' do
build.matrix.each { |job| job.expects(:reset) }
build.reset(reset_matrix: true)
end
it 'does not reset jobs if :reset_matrix is not given' do
build.matrix.each { |job| job.expects(:reset).never }
build.reset
end
it 'notifies obsevers' do
Travis::Event.expects(:dispatch).with('build:created', build)
build.reset
end
end
end
end