diff options
author | Steve Azzopardi <steveazz@outlook.com> | 2018-08-30 19:27:04 +0200 |
---|---|---|
committer | Steve Azzopardi <steveazz@outlook.com> | 2018-09-03 18:49:52 +0200 |
commit | 71433c5525c68bbf25f171e760e3817af7f217d4 (patch) | |
tree | bc2313d5fc916b43a9c7d5fd9020b07d88fd9764 | |
parent | 4ee2ae14f5bb4349ac4a42388321f49786501484 (diff) | |
download | gitlab-ce-71433c5525c68bbf25f171e760e3817af7f217d4.tar.gz |
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.
-rw-r--r-- | spec/controllers/projects/jobs_controller_spec.rb | 5 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/ci_detailed_status.json | 24 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/http_method.json | 5 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/job/artifact.json | 11 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/job/job.json (renamed from spec/fixtures/api/schemas/job.json) | 13 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/job/job_details.json | 7 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/pipeline_stage.json | 2 |
7 files changed, 61 insertions, 6 deletions
diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb index a0676ab7fda..d9499d7e207 100644 --- a/spec/controllers/projects/jobs_controller_spec.rb +++ b/spec/controllers/projects/jobs_controller_spec.rb @@ -149,6 +149,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do 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 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do 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 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do 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 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do 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) diff --git a/spec/fixtures/api/schemas/ci_detailed_status.json b/spec/fixtures/api/schemas/ci_detailed_status.json index 01e34249bf1..d74248eabef 100644 --- a/spec/fixtures/api/schemas/ci_detailed_status.json +++ b/spec/fixtures/api/schemas/ci_detailed_status.json @@ -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 } diff --git a/spec/fixtures/api/schemas/http_method.json b/spec/fixtures/api/schemas/http_method.json new file mode 100644 index 00000000000..c0f8acc5781 --- /dev/null +++ b/spec/fixtures/api/schemas/http_method.json @@ -0,0 +1,5 @@ +{ + "type": "string", + "description": "HTTP methods that the API can specify to send.", + "enum": [ "post", "get", "put", "patch" ] +} diff --git a/spec/fixtures/api/schemas/job/artifact.json b/spec/fixtures/api/schemas/job/artifact.json new file mode 100644 index 00000000000..1812e69fbd6 --- /dev/null +++ b/spec/fixtures/api/schemas/job/artifact.json @@ -0,0 +1,11 @@ +{ + "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 +} diff --git a/spec/fixtures/api/schemas/job.json b/spec/fixtures/api/schemas/job/job.json index 7b92ab25bc1..c793d93c0f6 100644 --- a/spec/fixtures/api/schemas/job.json +++ b/spec/fixtures/api/schemas/job/job.json @@ -1,4 +1,5 @@ { + "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 } diff --git a/spec/fixtures/api/schemas/job/job_details.json b/spec/fixtures/api/schemas/job/job_details.json new file mode 100644 index 00000000000..73eca83d788 --- /dev/null +++ b/spec/fixtures/api/schemas/job/job_details.json @@ -0,0 +1,7 @@ +{ + "allOf": [{ "$ref": "job.json" }], + "description": "An extension of job.json with more detailed information", + "properties": { + "artifact": { "$ref": "artifact.json" } + } +} diff --git a/spec/fixtures/api/schemas/pipeline_stage.json b/spec/fixtures/api/schemas/pipeline_stage.json index 55454200bb3..eb2667295f0 100644 --- a/spec/fixtures/api/schemas/pipeline_stage.json +++ b/spec/fixtures/api/schemas/pipeline_stage.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" }, |