Skip to content
Snippets Groups Projects
Commit 2c8b830f authored by Katarzyna Kobierska's avatar Katarzyna Kobierska
Browse files

Code refactoring

parent bbba62fa
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -7,13 +7,10 @@ module Ci
 
def create
@content = params[:content]
@error = Ci::GitlabCiYamlProcessor.validation_message(@content)
 
if @content.blank?
@status = false
@error = "Please provide content of .gitlab-ci.yml"
elsif !Ci::GitlabCiYamlProcessor.errors(@content).nil?
@status = false
@error = Ci::GitlabCiYamlProcessor.errors(@content)
unless @error.blank?
@status = @error.blank?
else
@config_processor = Ci::GitlabCiYamlProcessor.new(@content)
@stages = @config_processor.stages
Loading
Loading
Loading
Loading
@@ -81,9 +81,6 @@ Rails.application.routes.draw do
mount Sidekiq::Web, at: '/admin/sidekiq', as: :sidekiq
end
 
# Lint API
resources :lint, only: [:show, :create]
# Health check
get 'health_check(/:checks)' => 'health_check#index', as: :health_check
 
Loading
Loading
module API
class Lint < Grape::API
resource :lint do
params do
requires :content, type: String, desc: 'Content of .gitlab-ci.yml'
end
desc 'Validation of .gitlab-ci.yml content'
post do
response = {
status: '',
error: [],
jobs: []
}
if Ci::GitlabCiYamlProcessor.errors(params[:content]).nil?
config_processor = Ci::GitlabCiYamlProcessor.new(params[:content])
desc 'Validation of .gitlab-ci.yml content'
params do
requires :content, type: String, desc: 'Content of .gitlab-ci.yml'
end
 
config_processor.builds.each do |build|
response[:jobs].push("#{build[:name]}")
response[:status] = 'valid'
end
else
response[:error].push(Ci::GitlabCiYamlProcessor.errors(params[:content]))
response[:status] = 'invalid'
end
post 'ci/lint' do
error = Ci::GitlabCiYamlProcessor.validation_message(params[:content])
response = {
status: '',
error: ''
}
 
status 200
response
if error.blank?
response[:status] = 'valid'
else
response[:error] = error
response[:status] = 'invalid'
end
status 200
response
end
end
end
Loading
Loading
@@ -78,12 +78,16 @@ module Ci
}
end
 
def self.errors(content)
begin
Ci::GitlabCiYamlProcessor.new(content)
nil
rescue ValidationError, Psych::SyntaxError => e
e.message
def self.validation_message(content)
if content.blank?
'Please provide content of .gitlab-ci.yml'
else
begin
Ci::GitlabCiYamlProcessor.new(content)
nil
rescue ValidationError, Psych::SyntaxError => e
e.message
end
end
end
 
Loading
Loading
Loading
Loading
@@ -1252,20 +1252,33 @@ EOT
end
 
describe "#errors" do
describe "Error handling" do
it "returns an error if the YAML could not be parsed" do
context "when the YAML could not be parsed" do
it "returns an error about invalid configutaion" do
content = YAML.dump("invalid: yaml: test")
expect(GitlabCiYamlProcessor.errors(content)).to eq "Invalid configuration format"
expect(GitlabCiYamlProcessor.validation_message(content)).to eq "Invalid configuration format"
end
end
 
it "returns an error if the tags parameter is invalid" do
context "when the tags parameter is invalid" do
it "returns an error about invalid tags" do
content = YAML.dump({ rspec: { script: "test", tags: "mysql" } })
expect(GitlabCiYamlProcessor.errors(content)).to eq "jobs:rspec tags should be an array of strings"
expect(GitlabCiYamlProcessor.validation_message(content)).to eq "jobs:rspec tags should be an array of strings"
end
end
context "when YMAL content is empty" do
it "returns an error about missing content" do
expect(GitlabCiYamlProcessor.validation_message('')).to eq "Please provide content of .gitlab-ci.yml"
end
end
 
it "does not return any errors when the YAML is valid" do
context "when the YAML is valid" do
it "does not return any errors" do
content = File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
expect(GitlabCiYamlProcessor.errors(content)).to eq nil
expect(GitlabCiYamlProcessor.validation_message(content)).to be_nil
end
end
end
Loading
Loading
require 'spec_helper'
 
describe API::API do
describe API::Lint, api: true do
include ApiHelpers
 
let(:yaml_content) do
File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
end
describe 'POST /ci/lint' do
let(:yaml_content) do
File.read(Rails.root.join('spec/support/gitlab_stubs/gitlab_ci.yml'))
end
 
describe 'POST /lint' do
context 'with valid .gitlab-ci.yaml content' do
it 'validates the content' do
post api('/lint'), { content: yaml_content }
it 'passes validation' do
post api('/ci/lint'), { content: yaml_content }
 
expect(response).to have_http_status(200)
expect(json_response).to be_an Hash
expect(json_response['status']).to eq('valid')
expect(json_response['error']).to eq('')
end
end
 
context 'with an invalid .gitlab_ci.yml' do
it 'validates the content and shows an error message' do
post api('/lint'), { content: 'invalid content' }
it 'responds with errors about invalid syntax' do
post api('/ci/lint'), { content: 'invalid content' }
 
expect(response).to have_http_status(200)
expect(json_response['status']).to eq('invalid')
expect(json_response['error']).to eq(['Invalid configuration format'])
expect(json_response['error']).to eq('Invalid configuration format')
end
 
it "validates the content and shows a configuration error" do
post api('/lint'), { content: '{ image: "ruby:2.1", services: ["postgres"] }' }
it "responds with errors about invalid configuration" do
post api('/ci/lint'), { content: '{ image: "ruby:2.1", services: ["postgres"] }' }
 
expect(response).to have_http_status(200)
expect(json_response['status']).to eq('invalid')
expect(json_response['error']).to eq(['jobs config should contain at least one visible job'])
expect(json_response['error']).to eq('jobs config should contain at least one visible job')
end
end
 
context 'without the content parameter' do
it 'shows an error message' do
post api('/lint')
it 'responds with validation error about missing content' do
post api('/ci/lint')
 
expect(response).to have_http_status(400)
expect(json_response['error']).to eq('content is missing')
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment