Enqueue cancel message on build cancel v3 endpoint
This commit is contained in:
parent
75460b2427
commit
e097c8889e
|
@ -1,6 +1,25 @@
|
|||
module Travis::API::V3
|
||||
class Models::Permission < Model
|
||||
ROLES = %w(admin push pull)
|
||||
|
||||
belongs_to :user
|
||||
belongs_to :repository
|
||||
|
||||
class << self
|
||||
def by_roles(roles)
|
||||
roles = Array(roles).select { |role| ROLES.include?(role.to_s) }
|
||||
roles.empty? ? none : where(has_roles(roles))
|
||||
end
|
||||
|
||||
def has_roles(roles)
|
||||
roles.inject(has_role(roles.shift)) do |sql, role|
|
||||
sql.or(has_role(role))
|
||||
end
|
||||
end
|
||||
|
||||
def has_role(role)
|
||||
arel_table[role].eq(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,5 +22,13 @@ module Travis::API::V3
|
|||
def starred_repository_ids
|
||||
@starred_repository_ids ||= stars.map(&:repository_id)
|
||||
end
|
||||
|
||||
def permission?(roles, options = {})
|
||||
roles, options = nil, roles if roles.is_a?(Hash)
|
||||
scope = permissions.where(options)
|
||||
scope = scope.by_roles(roles) if roles
|
||||
scope.any?
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,6 +8,7 @@ describe Travis::API::V3::Services::Build::Cancel do
|
|||
|
||||
before do
|
||||
Travis::Features.stubs(:owner_active?).returns(true)
|
||||
Travis::Features.stubs(:owner_active?).with(:enqueue_to_hub, repo.owner).returns(false)
|
||||
@original_sidekiq = Sidekiq::Client
|
||||
Sidekiq.send(:remove_const, :Client) # to avoid a warning
|
||||
Sidekiq::Client = []
|
||||
|
@ -227,6 +228,111 @@ describe Travis::API::V3::Services::Build::Cancel do
|
|||
end
|
||||
end
|
||||
|
||||
describe "existing repository, push & pull access, cancelable, enqueues message for Hub" do
|
||||
let(:params) {{}}
|
||||
let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) }
|
||||
let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }}
|
||||
before do
|
||||
Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, push: true, pull: true)
|
||||
Travis::Features.stubs(:owner_active?).with(:enqueue_to_hub, repo.owner).returns(true)
|
||||
end
|
||||
|
||||
describe "started state" do
|
||||
before { build.update_attribute(:state, "started") }
|
||||
before { post("/v3/build/#{build.id}/cancel", params, headers) }
|
||||
|
||||
example { expect(last_response.status).to be == 202 }
|
||||
example { expect(JSON.load(body).to_s).to include(
|
||||
"@type",
|
||||
"build",
|
||||
"@href",
|
||||
"@representation",
|
||||
"minimal",
|
||||
"cancel",
|
||||
"id",
|
||||
"state_change")
|
||||
}
|
||||
|
||||
example { expect(sidekiq_payload).to be == {
|
||||
"id" => "#{build.id}",
|
||||
"user_id"=> repo.owner_id,
|
||||
"source" => "api",
|
||||
"type" => "build"}
|
||||
}
|
||||
|
||||
example { expect(Sidekiq::Client.last['queue']).to be == 'hub' }
|
||||
example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Hub::Sidekiq::Worker' }
|
||||
end
|
||||
|
||||
describe "queued state" do
|
||||
before { build.update_attribute(:state, "queued") }
|
||||
before { post("/v3/build/#{build.id}/cancel", params, headers) }
|
||||
|
||||
example { expect(last_response.status).to be == 202 }
|
||||
example { expect(JSON.load(body).to_s).to include(
|
||||
"@type",
|
||||
"build",
|
||||
"@href",
|
||||
"@representation",
|
||||
"minimal",
|
||||
"cancel",
|
||||
"id",
|
||||
"state_change")
|
||||
}
|
||||
|
||||
example { expect(sidekiq_payload).to be == {
|
||||
"id" => "#{build.id}",
|
||||
"user_id"=> repo.owner_id,
|
||||
"source" => "api",
|
||||
"type" => "build"}
|
||||
}
|
||||
|
||||
example { expect(Sidekiq::Client.last['queue']).to be == 'hub' }
|
||||
example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Hub::Sidekiq::Worker' }
|
||||
end
|
||||
|
||||
describe "received state" do
|
||||
before { build.update_attribute(:state, "received") }
|
||||
before { post("/v3/build/#{build.id}/cancel", params, headers) }
|
||||
|
||||
example { expect(last_response.status).to be == 202 }
|
||||
example { expect(JSON.load(body).to_s).to include(
|
||||
"@type",
|
||||
"build",
|
||||
"@href",
|
||||
"@representation",
|
||||
"minimal",
|
||||
"cancel",
|
||||
"id",
|
||||
"state_change")
|
||||
}
|
||||
|
||||
example { expect(sidekiq_payload).to be == {
|
||||
"id" => "#{build.id}",
|
||||
"user_id"=> repo.owner_id,
|
||||
"source" => "api",
|
||||
"type" => "build"}
|
||||
}
|
||||
|
||||
example { expect(Sidekiq::Client.last['queue']).to be == 'hub' }
|
||||
example { expect(Sidekiq::Client.last['class']).to be == 'Travis::Hub::Sidekiq::Worker' }
|
||||
end
|
||||
|
||||
describe "setting id has no effect" do
|
||||
let(:params) {{ id: 42 }}
|
||||
before { post("/v3/build/#{build.id}/cancel", params, headers) }
|
||||
example { expect(sidekiq_payload).to be == {
|
||||
"id" => "#{build.id}",
|
||||
"user_id"=> repo.owner_id,
|
||||
"source" => "api",
|
||||
"type" => "build"}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
# TODO decided to discuss further with rkh as this use case doesn't really exist at the moment
|
||||
# and 'fixing' the query requires modifying workers that v2 uses, thereby running the risk of breaking v2,
|
||||
# and also because in 6 months or so travis-hub will be able to cancel builds without using travis-core at all.
|
||||
|
|
Loading…
Reference in New Issue
Block a user