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
end
def build_writable?(build)
writable? build.repository
end
def branch_visible?(branch)
visible? branch.repository
end

View File

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

View File

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

View File

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