v3 update build cancel, access control, specs for build cancel

This commit is contained in:
carlad 2015-09-28 18:44:47 +02:00
parent c6cc6d1b96
commit d99c3c8c54
4 changed files with 40 additions and 56 deletions

View File

@ -51,6 +51,10 @@ module Travis::API::V3
visible? build.repository visible? build.repository
end end
def build_writable?(build)
writable? build.repository
end
def branch_visible?(branch) def branch_visible?(branch)
visible? branch.repository visible? branch.repository
end end

View File

@ -7,13 +7,9 @@ module Travis::API::V3
raise WrongParams, 'missing build.id'.freeze raise WrongParams, 'missing build.id'.freeze
end end
def cancel def cancel(user)
raise WrongParams, 'missing build.id'.freeze unless build.id payload = {build: {id: id, user_id: user.id, source: 'api'}}
payload = { perform_async(:build_cancellation, type: 'api'.freeze, payload: JSON.dump(payload))
build: { id: build.id }
}
perform_async(:build_cancellation, type: 'api'.freeze, credentials: { token: token }, payload: JSON.dump(payload))
payload payload
end end
end end

View File

@ -6,8 +6,8 @@ module Travis::API::V3
raise NotFound unless build = find(:build) raise NotFound unless build = find(:build)
access_control.permissions(build).cancel! access_control.permissions(build).cancel!
payload = query.cancel(build) query.cancel(access_control.user)
build accepted(build: build, state_change: :cancel)
end end
end end
end end

View File

@ -3,9 +3,8 @@ require 'spec_helper'
describe Travis::API::V3::Services::Build::Cancel do describe Travis::API::V3::Services::Build::Cancel do
let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first }
let(:build) { repo.builds.first } let(:build) { repo.builds.first }
let(:sidekiq_payload) { JSON.load(Sidekiq::Client.last['args'].last[:payload]).deep_symbolize_keys } let(:sidekiq_payload) { JSON.load(Sidekiq::Client.last['args'].last[:payload]) }
let(:sidekiq_params) { Sidekiq::Client.last['args'].last.deep_symbolize_keys } let(:sidekiq_params) { Sidekiq::Client.last['args'].last.deep_symbolize_keys }
# before { build.cancel.each(&:delete) }
before do before do
Travis::Features.stubs(:owner_active?).returns(true) Travis::Features.stubs(:owner_active?).returns(true)
@ -52,7 +51,7 @@ describe Travis::API::V3::Services::Build::Cancel do
example { expect(JSON.load(body).to_s).to include( example { expect(JSON.load(body).to_s).to include(
"@type", "@type",
"error_type", "error_type",
"insufficient access", "insufficient_access",
"error_message", "error_message",
"operation requires cancel access to build", "operation requires cancel access to build",
"resource_type", "resource_type",
@ -88,49 +87,46 @@ describe Travis::API::V3::Services::Build::Cancel do
example { expect(last_response.status).to be == 202 } example { expect(last_response.status).to be == 202 }
example { expect(JSON.load(body).to_s).to include( example { expect(JSON.load(body).to_s).to include(
"@type", "@type",
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"build", "build",
"@href", "@href",
"@representation", "@representation",
"minimal", "minimal",
"permission",
"cancel", "cancel",
"id", "id",
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") "state_change")
} }
example { expect(sidekiq_payload).to be == { example { expect(sidekiq_payload).to be == {
build: { id: build.id } "build" => {
"id" => "#{build.id}",
"user_id"=> repo.owner_id,
"source" => "api"}
}} }}
example { expect(Sidekiq::Client.last['queue']).to be == 'build_cancellations' } example { expect(Sidekiq::Client.last['queue']).to be == 'build_cancellations' }
example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Sidekiq::CancellationRequest' } example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Sidekiq::BuildCancellation' }
describe "setting id has no effect" do describe "setting id has no effect" do
let(:params) {{ id: 42 }} let(:params) {{ id: 42 }}
example { expect(sidekiq_payload).to be == { example { expect(sidekiq_payload).to be == {
build: { id: build.id } "build" => {
}} "id" => "#{build.id}",
end "user_id"=> repo.owner_id,
"source" => "api"}
describe "passing the token in params" do
let(:params) {{ request: { token: 'foo-bar' }}}
example { expect(sidekiq_params[:credentials]).to be == {
token: 'foo-bar'
}} }}
end end
end end
describe "existing repository, application with full access" do # describe "existing repository, application with full access" do
let(:app_name) { 'travis-example' } # let(:app_name) { 'travis-example' }
let(:app_secret) { '12345678' } # let(:app_secret) { '12345678' }
let(:sign_opts) { "a=#{app_name}" } # let(:sign_opts) { "a=#{app_name}" }
let(:signature) { OpenSSL::HMAC.hexdigest('sha256', app_secret, sign_opts) } # let(:signature) { OpenSSL::HMAC.hexdigest('sha256', app_secret, sign_opts) }
let(:headers) {{ 'HTTP_AUTHORIZATION' => "signature #{sign_opts}:#{signature}" }} # let(:headers) {{ 'HTTP_AUTHORIZATION' => "signature #{sign_opts}:#{signature}" }}
before { Travis.config.applications = { app_name => { full_access: true, secret: app_secret }}} # before { Travis.config.applications = { app_name => { full_access: true, secret: app_secret }}}
before { post("/v3/build/#{build.id}/cancel", params, headers) } # before { post("/v3/build/#{build.id}/cancel", params, headers) }
#
# describe 'without setting user' do # describe 'without setting user' do
# let(:params) {{}} # let(:params) {{}}
# example { expect(last_response.status).to be == 400 } # example { expect(last_response.status).to be == 400 }
@ -140,7 +136,7 @@ describe Travis::API::V3::Services::Build::Cancel do
# "error_message" => "missing user" # "error_message" => "missing user"
# }} # }}
# end # end
#
# describe 'setting user' do # describe 'setting user' do
# let(:params) {{ user: { id: repo.owner.id } }} # let(:params) {{ user: { id: repo.owner.id } }}
# example { expect(last_response.status).to be == 202 } # example { expect(last_response.status).to be == 202 }
@ -152,17 +148,5 @@ describe Travis::API::V3::Services::Build::Cancel do
# config: {} # config: {}
# }} # }}
# end # end
#
# describe 'setting branch' do
# let(:params) {{ user: { id: repo.owner.id }, branch: 'example' }}
# example { expect(last_response.status).to be == 202 }
# example { expect(sidekiq_payload).to be == {
# repository: { id: repo.id, owner_name: 'svenfuchs', name: 'minimal' },
# user: { id: repo.owner.id },
# message: nil,
# branch: 'example',
# config: {}
# }}
# end # end
end
end end