v3 update build cancel, access control, specs for build cancel
This commit is contained in:
parent
c6cc6d1b96
commit
d99c3c8c54
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user