Commit 03f72f0f authored by Shinya Maeda's avatar Shinya Maeda

Add spec (Halfway)

parent 278ac9ed
...@@ -819,7 +819,7 @@ module API ...@@ -819,7 +819,7 @@ module API
class Variable < Grape::Entity class Variable < Grape::Entity
expose :key, :value expose :key, :value
expose :protected?, as: :protected, if: -> (entity, options) { entity.respond_to?(protected?) } expose :protected?, as: :protected, if: -> (entity, options) { entity.respond_to?(:protected?) }
end end
class Pipeline < PipelineBasic class Pipeline < PipelineBasic
......
...@@ -120,74 +120,71 @@ module API ...@@ -120,74 +120,71 @@ module API
destroy_conditionally!(pipeline_schedule) destroy_conditionally!(pipeline_schedule)
end end
desc 'Create a new pipeline schedule variable' do
success Entities::Variable
end
params do params do
requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id' requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
requires :key, type: String, desc: 'The key of the variable'
requires :value, type: String, desc: 'The value of the variable'
end end
resource :variables, requirements: { pipeline_schedule_id: %r{[^/]+} } do post ':id/pipeline_schedules/:pipeline_schedule_id/variables' do
desc 'Create a new pipeline schedule variable' do authorize! :read_pipeline_schedule, user_project
success Entities::PipelineScheduleDetails
end
params do
requires :key, type: String, desc: 'The key of the variable'
requires :value, type: String, desc: 'The value of the variable'
end
post ':id/pipeline_schedules/:pipeline_schedule_id/variables' do
authorize! :read_pipeline_schedule, user_project
not_found!('PipelineSchedule') unless pipeline_schedule
authorize! :update_pipeline_schedule, pipeline_schedule
variable_params = declared_params(include_missing: false) not_found!('PipelineSchedule') unless pipeline_schedule
variable = pipeline_schedule.variables.create(variable_params) authorize! :update_pipeline_schedule, pipeline_schedule
if variable.persisted? variable_params = declared_params(include_missing: false)
present variable, with: Entities::Variable variable = pipeline_schedule.variables.create(variable_params)
else if variable.persisted?
render_validation_error!(variable) present variable, with: Entities::Variable
end else
render_validation_error!(variable)
end end
end
desc 'Edit a pipeline schedule variable' do desc 'Edit a pipeline schedule variable' do
success Entities::PipelineScheduleDetails success Entities::Variable
end end
params do params do
optional :key, type: String, desc: 'The key of the variable' requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
optional :value, type: String, desc: 'The value of the variable' requires :key, type: String, desc: 'The key of the variable'
end optional :value, type: String, desc: 'The value of the variable'
put ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do end
authorize! :read_pipeline_schedule, user_project put ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
authorize! :read_pipeline_schedule, user_project
not_found!('PipelineSchedule') unless pipeline_schedule not_found!('PipelineSchedule') unless pipeline_schedule
authorize! :update_pipeline_schedule, pipeline_schedule authorize! :update_pipeline_schedule, pipeline_schedule
variable = pipeline_schedule.variables.find_by(key: params[:key]) variable = pipeline_schedule.variables.find_by(key: params[:key])
not_found!('Variable') unless variable not_found!('Variable') unless variable
if variable.update(declared_params(include_missing: false)) if variable.update(declared_params(include_missing: false))
present variable, with: Entities::Variable present variable, with: Entities::Variable
else else
render_validation_error!(variable) render_validation_error!(variable)
end
end end
end
desc 'Delete a pipeline schedule variable' do desc 'Delete a pipeline schedule variable' do
success Entities::PipelineScheduleDetails success Entities::Variable
end end
params do params do
requires :key, type: String, desc: 'The key of the variable' requires :pipeline_schedule_id, type: Integer, desc: 'The pipeline schedule id'
end requires :key, type: String, desc: 'The key of the variable'
delete ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do end
authorize! :read_pipeline_schedule, user_project delete ':id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
authorize! :read_pipeline_schedule, user_project
not_found!('PipelineSchedule') unless pipeline_schedule not_found!('PipelineSchedule') unless pipeline_schedule
authorize! :admin_pipeline_schedule, pipeline_schedule authorize! :admin_pipeline_schedule, pipeline_schedule
variable = pipeline_schedule.variables.find_by(key: params[:key]) variable = pipeline_schedule.variables.find_by(key: params[:key])
not_found!('Variable') unless variable not_found!('Variable') unless variable
status :accepted status :accepted
present variable, with: Entities::Variable present variable, with: Entities::Variable
end
end end
end end
......
...@@ -34,14 +34,7 @@ ...@@ -34,14 +34,7 @@
}, },
"variables": { "variables": {
"type": ["array", "null"], "type": ["array", "null"],
"items": { "items": { "$ref": "pipeline_schedule_variable.json" }
"type": ["object", "null"],
"properties": {
"key": { "type": "string" },
"value": { "type": "string" }
},
"additionalProperties": false
}
} }
}, },
"required": [ "required": [
......
{
"type": ["object", "null"],
"properties": {
"key": { "type": "string" },
"value": { "type": "string" }
},
"additionalProperties": false
}
...@@ -299,4 +299,160 @@ describe API::PipelineSchedules do ...@@ -299,4 +299,160 @@ describe API::PipelineSchedules do
end end
end end
end end
describe 'POST /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables' do
let(:params) { attributes_for(:ci_pipeline_schedule_variable) }
let(:pipeline_schedule) do
create(:ci_pipeline_schedule, project: project, owner: developer)
end
context 'authenticated user with valid permissions' do
context 'with required parameters' do
it 'creates pipeline_schedule_variable' do
expect do
post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer),
params
end.to change { pipeline_schedule.variables.count }.by(1)
expect(response).to have_http_status(:created)
expect(response).to match_response_schema('pipeline_schedule_variable')
expect(json_response['key']).to eq(params[:key])
expect(json_response['value']).to eq(params[:value])
end
end
context 'without required parameters' do
it 'does not create pipeline_schedule_variable' do
post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer)
expect(response).to have_http_status(:bad_request)
end
end
context 'when cron has validation error' do
it 'does not create pipeline_schedule_variable' do
post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", developer),
params.merge('key' => '!?!?')
expect(response).to have_http_status(:bad_request)
expect(json_response['message']).to have_key('key')
end
end
end
context 'authenticated user with invalid permissions' do
it 'does not create pipeline_schedule_variable' do
post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables", user), params
expect(response).to have_http_status(:not_found)
end
end
context 'unauthenticated user' do
it 'does not create pipeline_schedule_variable' do
post api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables"), params
expect(response).to have_http_status(:unauthorized)
end
end
end
describe 'PUT /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
let(:pipeline_schedule) do
create(:ci_pipeline_schedule, project: project, owner: developer)
end
let(:pipeline_schedule_variable) do
create(:ci_pipeline_schedule_variable, pipeline_schedule: pipeline_schedule)
end
context 'authenticated user with valid permissions' do
it 'updates cron' do
put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", developer),
key: pipeline_schedule_variable.key, value: 'updated_value'
expect(response).to have_http_status(:ok)
expect(response).to match_response_schema('pipeline_schedule_variable')
expect(json_response['key']).to eq('updated_value')
end
context 'when cron has validation error' do
it 'does not update pipeline_schedule_variable' do
put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", developer),
key: '!?!?'
expect(response).to have_http_status(:bad_request)
expect(json_response['message']).to have_key('key')
end
end
end
context 'authenticated user with invalid permissions' do
it 'does not update pipeline_schedule_variable' do
put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", user)
expect(response).to have_http_status(:not_found)
end
end
context 'unauthenticated user' do
it 'does not update pipeline_schedule_variable' do
put api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}")
expect(response).to have_http_status(:unauthorized)
end
end
end
describe 'DELETE /projects/:id/pipeline_schedules/:pipeline_schedule_id/variables/:key' do
let(:master) { create(:user) }
let!(:pipeline_schedule) do
create(:ci_pipeline_schedule, project: project, owner: developer)
end
let(:pipeline_schedule_variable) do
create(:ci_pipeline_schedule_variable, pipeline_schedule: pipeline_schedule)
end
before do
project.add_master(master)
end
context 'authenticated user with valid permissions' do
it 'deletes pipeline_schedule_variable' do
expect do
delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", master)
end.to change { project.pipeline_schedules.count }.by(-1)
expect(response).to have_http_status(:accepted)
expect(response).to match_response_schema('pipeline_schedule_variable')
end
it 'responds with 404 Not Found if requesting non-existing pipeline_schedule_variable' do
delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/____", master)
expect(response).to have_http_status(:not_found)
end
end
context 'authenticated user with invalid permissions' do # TODO:
let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: master) }
it 'does not delete pipeline_schedule_variable' do
delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}", developer)
expect(response).to have_http_status(:forbidden)
end
end
context 'unauthenticated user' do
it 'does not delete pipeline_schedule_variable' do
delete api("/projects/#{project.id}/pipeline_schedules/#{pipeline_schedule.id}/variables/#{pipeline_schedule_variable.key}")
expect(response).to have_http_status(:unauthorized)
end
end
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment