Commit 71433c55 authored by Steve Azzopardi's avatar Steve Azzopardi

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 4ee2ae14
...@@ -149,6 +149,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -149,6 +149,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) 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['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['merge_request']['path']).to match(%r{merge_requests/\d+\z})
expect(json_response['new_issue_path']).to include('/issues/new') expect(json_response['new_issue_path']).to include('/issues/new')
...@@ -170,6 +171,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -170,6 +171,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) 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']['download_path']).to match(%r{artifacts/download})
expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse}) expect(json_response['artifact']['browse_path']).to match(%r{artifacts/browse})
expect(json_response['artifact']).not_to have_key(:expired) expect(json_response['artifact']).not_to have_key(:expired)
...@@ -178,7 +180,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -178,7 +180,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z}) expect(json_response.dig('merge_request', 'path')).to match(%r{merge_requests/\d+\z})
end 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(:merge_request) { create(:merge_request, source_project: project) }
let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) } let(:job) { create(:ci_build, :success, :artifacts, :expired, pipeline: pipeline) }
...@@ -193,6 +195,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do ...@@ -193,6 +195,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
it 'exposes needed information' do it 'exposes needed information' do
expect(response).to have_gitlab_http_status(:ok) 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(:download_path)
expect(json_response['artifact']).not_to have_key(:browse_path) expect(json_response['artifact']).not_to have_key(:browse_path)
expect(json_response['artifact']['expired']).to eq(true) expect(json_response['artifact']['expired']).to eq(true)
......
...@@ -18,7 +18,29 @@ ...@@ -18,7 +18,29 @@
"tooltip": { "type": "string" }, "tooltip": { "type": "string" },
"has_details": { "type": "boolean" }, "has_details": { "type": "boolean" },
"details_path": { "type": "string" }, "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 "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", "type": "object",
"required": [ "required": [
"id", "id",
...@@ -13,12 +14,18 @@ ...@@ -13,12 +14,18 @@
"properties": { "properties": {
"id": { "type": "integer" }, "id": { "type": "integer" },
"name": { "type": "string" }, "name": { "type": "string" },
"started": { "type": "boolean" } , "started": {
"oneOf": [
{ "type": "string", "format": "date-time" },
{ "type": "boolean" }
]
},
"build_path": { "type": "string" }, "build_path": { "type": "string" },
"retry_path": { "type": "string" },
"playable": { "type": "boolean" }, "playable": { "type": "boolean" },
"created_at": { "type": "string" }, "created_at": { "type": "string" },
"updated_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 @@ ...@@ -13,7 +13,7 @@
"groups": { "optional": true }, "groups": { "optional": true },
"latest_statuses": { "latest_statuses": {
"type": "array", "type": "array",
"items": { "$ref": "job.json" }, "items": { "$ref": "job/job.json" },
"optional": true "optional": true
}, },
"status": { "$ref": "ci_detailed_status.json" }, "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