fix specs. Stage 2
This commit is contained in:
parent
a399fe32e8
commit
910bf96ec3
5 changed files with 32 additions and 101 deletions
|
@ -148,15 +148,14 @@ module API
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def attributes_for_keys(keys)
|
def attributes_for_keys(keys, custom_params = nil)
|
||||||
|
params_hash = custom_params || params
|
||||||
attrs = {}
|
attrs = {}
|
||||||
|
|
||||||
keys.each do |key|
|
keys.each do |key|
|
||||||
if params[key].present? or (params.has_key?(key) and params[key] == false)
|
if params[key].present? or (params.has_key?(key) and params[key] == false)
|
||||||
attrs[key] = params[key]
|
attrs[key] = params[key]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ActionController::Parameters.new(attrs).permit!
|
ActionController::Parameters.new(attrs).permit!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ Dir["#{Rails.root}/lib/ci/api/*.rb"].each {|file| require file}
|
||||||
module Ci
|
module Ci
|
||||||
module API
|
module API
|
||||||
class API < Grape::API
|
class API < Grape::API
|
||||||
|
include APIGuard
|
||||||
version 'v1', using: :path
|
version 'v1', using: :path
|
||||||
|
|
||||||
rescue_from ActiveRecord::RecordNotFound do
|
rescue_from ActiveRecord::RecordNotFound do
|
||||||
|
@ -25,6 +26,7 @@ module Ci
|
||||||
format :json
|
format :json
|
||||||
|
|
||||||
helpers Helpers
|
helpers Helpers
|
||||||
|
helpers ::API::APIHelpers
|
||||||
|
|
||||||
mount Builds
|
mount Builds
|
||||||
mount Commits
|
mount Commits
|
||||||
|
|
|
@ -1,30 +1,6 @@
|
||||||
module Ci
|
module Ci
|
||||||
module API
|
module API
|
||||||
module Helpers
|
module Helpers
|
||||||
PRIVATE_TOKEN_PARAM = :private_token
|
|
||||||
PRIVATE_TOKEN_HEADER = "HTTP_PRIVATE_TOKEN"
|
|
||||||
ACCESS_TOKEN_PARAM = :access_token
|
|
||||||
ACCESS_TOKEN_HEADER = "HTTP_ACCESS_TOKEN"
|
|
||||||
UPDATE_RUNNER_EVERY = 60
|
|
||||||
|
|
||||||
def current_user
|
|
||||||
@current_user ||= begin
|
|
||||||
options = {
|
|
||||||
access_token: (params[ACCESS_TOKEN_PARAM] || env[ACCESS_TOKEN_HEADER]),
|
|
||||||
private_token: (params[PRIVATE_TOKEN_PARAM] || env[PRIVATE_TOKEN_HEADER]),
|
|
||||||
}
|
|
||||||
Ci::UserSession.new.authenticate(options.compact)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def current_runner
|
|
||||||
@runner ||= Ci::Runner.find_by_token(params[:token].to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def authenticate!
|
|
||||||
forbidden! unless current_user
|
|
||||||
end
|
|
||||||
|
|
||||||
def authenticate_runners!
|
def authenticate_runners!
|
||||||
forbidden! unless params[:token] == GitlabCi::REGISTRATION_TOKEN
|
forbidden! unless params[:token] == GitlabCi::REGISTRATION_TOKEN
|
||||||
end
|
end
|
||||||
|
@ -43,72 +19,15 @@ module Ci
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def current_runner
|
||||||
|
@runner ||= Runner.find_by_token(params[:token].to_s)
|
||||||
|
end
|
||||||
|
|
||||||
def update_runner_info
|
def update_runner_info
|
||||||
return unless params["info"].present?
|
return unless params["info"].present?
|
||||||
info = attributes_for_keys(["name", "version", "revision", "platform", "architecture"], params["info"])
|
info = attributes_for_keys(["name", "version", "revision", "platform", "architecture"], params["info"])
|
||||||
current_runner.update(info)
|
current_runner.update(info)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Checks the occurrences of required attributes, each attribute must be present in the params hash
|
|
||||||
# or a Bad Request error is invoked.
|
|
||||||
#
|
|
||||||
# Parameters:
|
|
||||||
# keys (required) - A hash consisting of keys that must be present
|
|
||||||
def required_attributes!(keys)
|
|
||||||
keys.each do |key|
|
|
||||||
bad_request!(key) unless params[key].present?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def attributes_for_keys(keys, custom_params = nil)
|
|
||||||
params_hash = custom_params || params
|
|
||||||
attrs = {}
|
|
||||||
keys.each do |key|
|
|
||||||
attrs[key] = params_hash[key] if params_hash[key].present?
|
|
||||||
end
|
|
||||||
attrs
|
|
||||||
end
|
|
||||||
|
|
||||||
# error helpers
|
|
||||||
|
|
||||||
def forbidden!
|
|
||||||
render_api_error!('403 Forbidden', 403)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bad_request!(attribute)
|
|
||||||
message = ["400 (Bad request)"]
|
|
||||||
message << "\"" + attribute.to_s + "\" not given"
|
|
||||||
render_api_error!(message.join(' '), 400)
|
|
||||||
end
|
|
||||||
|
|
||||||
def not_found!(resource = nil)
|
|
||||||
message = ["404"]
|
|
||||||
message << resource if resource
|
|
||||||
message << "Not Found"
|
|
||||||
render_api_error!(message.join(' '), 404)
|
|
||||||
end
|
|
||||||
|
|
||||||
def unauthorized!
|
|
||||||
render_api_error!('401 Unauthorized', 401)
|
|
||||||
end
|
|
||||||
|
|
||||||
def not_allowed!
|
|
||||||
render_api_error!('Method Not Allowed', 405)
|
|
||||||
end
|
|
||||||
|
|
||||||
def render_api_error!(message, status)
|
|
||||||
error!({ 'message' => message }, status)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def abilities
|
|
||||||
@abilities ||= begin
|
|
||||||
abilities = Six.new
|
|
||||||
abilities << Ability
|
|
||||||
abilities
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,8 +9,8 @@ describe Ci::API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /runners" do
|
describe "GET /runners" do
|
||||||
let(:gitlab_url) { GitlabCi.config.gitlab_server.url }
|
let(:gitlab_url) { GitlabCi.config.gitlab_ci.url }
|
||||||
let(:private_token) { Network.new.authenticate(access_token: "some_token")["private_token"] }
|
let(:private_token) { create(:user).private_token }
|
||||||
let(:options) do
|
let(:options) do
|
||||||
{
|
{
|
||||||
private_token: private_token,
|
private_token: private_token,
|
||||||
|
@ -23,7 +23,7 @@ describe Ci::API::API do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should retrieve a list of all runners" do
|
it "should retrieve a list of all runners" do
|
||||||
get api("/runners"), options
|
get ci_api("/runners", nil), options
|
||||||
expect(response.status).to eq(200)
|
expect(response.status).to eq(200)
|
||||||
expect(json_response.count).to eq(5)
|
expect(json_response.count).to eq(5)
|
||||||
expect(json_response.last).to have_key("id")
|
expect(json_response.last).to have_key("id")
|
||||||
|
@ -33,41 +33,41 @@ describe Ci::API::API do
|
||||||
|
|
||||||
describe "POST /runners/register" do
|
describe "POST /runners/register" do
|
||||||
describe "should create a runner if token provided" do
|
describe "should create a runner if token provided" do
|
||||||
before { post api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN }
|
before { post ci_api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN }
|
||||||
|
|
||||||
it { expect(response.status).to eq(201) }
|
it { expect(response.status).to eq(201) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "should create a runner with description" do
|
describe "should create a runner with description" do
|
||||||
before { post api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN, description: "server.hostname" }
|
before { post ci_api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN, description: "server.hostname" }
|
||||||
|
|
||||||
it { expect(response.status).to eq(201) }
|
it { expect(response.status).to eq(201) }
|
||||||
it { expect(Runner.first.description).to eq("server.hostname") }
|
it { expect(Ci::Runner.first.description).to eq("server.hostname") }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "should create a runner with tags" do
|
describe "should create a runner with tags" do
|
||||||
before { post api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN, tag_list: "tag1, tag2" }
|
before { post ci_api("/runners/register"), token: GitlabCi::REGISTRATION_TOKEN, tag_list: "tag1, tag2" }
|
||||||
|
|
||||||
it { expect(response.status).to eq(201) }
|
it { expect(response.status).to eq(201) }
|
||||||
it { expect(Runner.first.tag_list.sort).to eq(["tag1", "tag2"]) }
|
it { expect(Ci::Runner.first.tag_list.sort).to eq(["tag1", "tag2"]) }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "should create a runner if project token provided" do
|
describe "should create a runner if project token provided" do
|
||||||
let(:project) { FactoryGirl.create(:ci_project) }
|
let(:project) { FactoryGirl.create(:ci_project) }
|
||||||
before { post api("/runners/register"), token: project.token }
|
before { post ci_api("/runners/register"), token: project.token }
|
||||||
|
|
||||||
it { expect(response.status).to eq(201) }
|
it { expect(response.status).to eq(201) }
|
||||||
it { expect(project.runners.size).to eq(1) }
|
it { expect(project.runners.size).to eq(1) }
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 403 error if token is invalid" do
|
it "should return 403 error if token is invalid" do
|
||||||
post api("/runners/register"), token: 'invalid'
|
post ci_api("/runners/register"), token: 'invalid'
|
||||||
|
|
||||||
expect(response.status).to eq(403)
|
expect(response.status).to eq(403)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should return 400 error if no token" do
|
it "should return 400 error if no token" do
|
||||||
post api("/runners/register")
|
post ci_api("/runners/register")
|
||||||
|
|
||||||
expect(response.status).to eq(400)
|
expect(response.status).to eq(400)
|
||||||
end
|
end
|
||||||
|
@ -75,9 +75,9 @@ describe Ci::API::API do
|
||||||
|
|
||||||
describe "DELETE /runners/delete" do
|
describe "DELETE /runners/delete" do
|
||||||
let!(:runner) { FactoryGirl.create(:ci_runner) }
|
let!(:runner) { FactoryGirl.create(:ci_runner) }
|
||||||
before { delete api("/runners/delete"), token: runner.token }
|
before { delete ci_api("/runners/delete"), token: runner.token }
|
||||||
|
|
||||||
it { expect(response.status).to eq(200) }
|
it { expect(response.status).to eq(200) }
|
||||||
it { expect(Runner.count).to eq(0) }
|
it { expect(Ci::Runner.count).to eq(0) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,6 +28,17 @@ module ApiHelpers
|
||||||
"&private_token=#{user.private_token}" : "")
|
"&private_token=#{user.private_token}" : "")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ci_api(path, user = nil)
|
||||||
|
"/ci/api/v1/#{path}" +
|
||||||
|
|
||||||
|
# Normalize query string
|
||||||
|
(path.index('?') ? '' : '?') +
|
||||||
|
|
||||||
|
# Append private_token if given a User object
|
||||||
|
(user.respond_to?(:private_token) ?
|
||||||
|
"&private_token=#{user.private_token}" : "")
|
||||||
|
end
|
||||||
|
|
||||||
def json_response
|
def json_response
|
||||||
@_json_response ||= JSON.parse(response.body)
|
@_json_response ||= JSON.parse(response.body)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue