Read about our upcoming Code of Conduct on this issue

Commit 628141f6 authored by Steve Azzopardi's avatar Steve Azzopardi
Browse files

Add JSON schema validation for job API

Start validating against the exciting JSON schema for the job controller JSON
response.

The JSON schema is not complete since there is quite a lot missing, this will
be done in a separate issue.
parent ffca7124a7ae
......@@ -149,6 +149,7 @@ def get_index(**extra_params)
it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['raw_path']).to match(%r{jobs/\d+/raw\z})
expect(json_response['merge_request']['path']).to match(%r{merge_requests/\d+\z})
expect(json_response['new_issue_path']).to include('/issues/new')
......@@ -170,6 +171,7 @@ def get_index(**extra_params)
it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['artifact']['download_path']).to match(%r{artifacts/download})
expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse})
expect(json_response['artifact']).not_to have_key(:expired)
......@@ -178,7 +180,7 @@ def get_index(**extra_params)
expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z})
end
context 'when request JSON for successful job and expired artifacts' do
context 'when request JSON for successful job with expired artifacts' do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) }
......@@ -193,6 +195,7 @@ def get_index(**extra_params)
it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('job/job_details')
expect(json_response['artifact']).not_to have_key(:download_path)
expect(json_response['artifact']).not_to have_key(:browse_path)
expect(json_response['artifact']['expired']).to eq(true)
......
......@@ -18,7 +18,29 @@
"tooltip": { "type": "string" },
"has_details": { "type": "boolean" },
"details_path": { "type": "string" },
"favicon": { "type": "string" }
"favicon": { "type": "string" },
"action": {
"type": "object",
"required": [
"icon",
"title",
"path",
"method"
],
"properties": {
"icon": {
"type": "string",
"enum": [
"retry",
"play",
"cancel"
]
},
"title": { "type": "string" },
"path": { "type": "string" },
"method": { "$ref": "http_method.json" }
}
}
},
"additionalProperties": false
}
{
"type": "string",
"description": "HTTP methods that the API can specify to send.",
"enum": [ "post", "get", "put", "patch" ]
}
{
"type": "object",
"properties": {
"download_path": { "type": "string"},
"browse_path": { "type": "string"},
"keep_path": { "type": "string"},
"expired": { "type": "boolean" },
"expire_at": { "type": "string", "format": "date-time" }
},
"additionalProperties": false
}
{
"description": "Basic job information",
"type": "object",
"required": [
"id",
......@@ -13,12 +14,18 @@
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"started": { "type": "boolean" } ,
"started": {
"oneOf": [
{ "type": "string", "format": "date-time" },
{ "type": "boolean" }
]
},
"build_path": { "type": "string" },
"retry_path": { "type": "string" },
"playable": { "type": "boolean" },
"created_at": { "type": "string" },
"updated_at": { "type": "string" },
"status": { "$ref": "ci_detailed_status.json" }
"status": { "$ref": "../ci_detailed_status.json" }
},
"additionalProperties": false
"additionalProperties": true
}
{
"allOf": [{ "$ref": "job.json" }],
"description": "An extension of job.json with more detailed information",
"properties": {
"artifact": { "$ref": "artifact.json" }
}
}
......@@ -13,7 +13,7 @@
"groups": { "optional": true },
"latest_statuses": {
"type": "array",
"items": { "$ref": "job.json" },
"items": { "$ref": "job/job.json" },
"optional": true
},
"status": { "$ref": "ci_detailed_status.json" },
......
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