diff options
author | Shinya Maeda <shinya@gitlab.com> | 2019-01-04 15:29:04 +0900 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2019-01-07 14:07:05 +0900 |
commit | 6bd7e1b8761bb837b7d1e81b392085a862bd1433 (patch) | |
tree | 3a8c6abb4f81ab2db6f06e7fae6fff6659cdf61c /spec | |
parent | 124905e23b6d23253aee461f9d89d434a7b5b44b (diff) | |
download | gitlab-ce-6bd7e1b8761bb837b7d1e81b392085a862bd1433.tar.gz |
Add tests for Release Link API
Add tests for the API and add a couple of tests
Add
revert
revert
Diffstat (limited to 'spec')
-rw-r--r-- | spec/fixtures/api/schemas/release.json | 10 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/release/link.json | 11 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/release/links.json | 4 | ||||
-rw-r--r-- | spec/requests/api/release/links_spec.rb | 417 |
4 files changed, 433 insertions, 9 deletions
diff --git a/spec/fixtures/api/schemas/release.json b/spec/fixtures/api/schemas/release.json index 45fa8b074d4..86f0f27606c 100644 --- a/spec/fixtures/api/schemas/release.json +++ b/spec/fixtures/api/schemas/release.json @@ -15,15 +15,7 @@ }, "assets": { "count": { "type": "integer" }, - "links": { - "type": "array", - "items": { - "id": "integer", - "name": "string", - "url": "string", - "external": "boolean" - } - }, + "links": { "$ref": "release/links.json" }, "sources": { "type": "array", "items": { diff --git a/spec/fixtures/api/schemas/release/link.json b/spec/fixtures/api/schemas/release/link.json new file mode 100644 index 00000000000..97347cb91cc --- /dev/null +++ b/spec/fixtures/api/schemas/release/link.json @@ -0,0 +1,11 @@ +{ + "type": "object", + "required": ["name", "url"], + "properties": { + "id": { "type": "integer" }, + "name": { "type": "string" }, + "url": { "type": "string" }, + "external": { "type": "boolean" } + }, + "additionalProperties": false +} diff --git a/spec/fixtures/api/schemas/release/links.json b/spec/fixtures/api/schemas/release/links.json new file mode 100644 index 00000000000..766bc7ce20a --- /dev/null +++ b/spec/fixtures/api/schemas/release/links.json @@ -0,0 +1,4 @@ +{ + "type": "array", + "items": { "$ref": "link.json" } +} diff --git a/spec/requests/api/release/links_spec.rb b/spec/requests/api/release/links_spec.rb new file mode 100644 index 00000000000..9d62257d470 --- /dev/null +++ b/spec/requests/api/release/links_spec.rb @@ -0,0 +1,417 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe API::Release::Links do + let(:project) { create(:project, :repository, :private) } + let(:maintainer) { create(:user) } + let(:reporter) { create(:user) } + let(:non_project_member) { create(:user) } + let(:commit) { create(:commit, project: project) } + + let!(:release) do + create(:release, + project: project, + tag: 'v0.1', + author: maintainer) + end + + before do + project.add_maintainer(maintainer) + project.add_reporter(reporter) + + project.repository.add_tag(maintainer, 'v0.1', commit.id) + end + + describe 'GET /projects/:id/releases/:tag_name/assets/links' do + context 'when there are two release links' do + let!(:release_link_1) { create(:release_link, release: release, created_at: 2.days.ago) } + let!(:release_link_2) { create(:release_link, release: release, created_at: 1.day.ago) } + + it 'returns 200 HTTP status' do + get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) + + expect(response).to have_gitlab_http_status(:ok) + end + + it 'returns release links ordered by created_at' do + get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) + + expect(json_response.count).to eq(2) + expect(json_response.first['name']).to eq(release_link_2.name) + expect(json_response.second['name']).to eq(release_link_1.name) + end + + it 'matches response schema' do + get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) + + expect(response).to match_response_schema('release/links') + end + end + + context 'when release does not exist' do + let!(:release) { } + + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) } + let(:message) { '404 Not found' } + end + end + + context 'when user is not a project member' do + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member) } + let(:message) { '404 Project Not Found' } + end + + context 'when project is public' do + let(:project) { create(:project, :repository, :public) } + + it 'allows the request' do + get api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member) + + expect(response).to have_gitlab_http_status(:ok) + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(releases_page: false) + end + + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer) } + end + end + end + + describe 'GET /projects/:id/releases/:tag_name/assets/links/:link_id' do + let!(:release_link) { create(:release_link, release: release) } + + it 'returns 200 HTTP status' do + get api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + + expect(response).to have_gitlab_http_status(:ok) + end + + it 'returns a link entry' do + get api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + + expect(json_response['name']).to eq(release_link.name) + expect(json_response['url']).to eq(release_link.url) + end + + it 'matches response schema' do + get api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + + expect(response).to match_response_schema('release/link') + end + + context 'when specified tag is not found in the project' do + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/non_existing_tag/assets/links/#{release_link.id}", maintainer) } + end + end + + context 'when user is not a project member' do + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/non_existing_tag/assets/links/#{release_link.id}", non_project_member) } + end + + context 'when project is public' do + let(:project) { create(:project, :repository, :public) } + + it 'allows the request' do + get api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", non_project_member) + + expect(response).to have_gitlab_http_status(:ok) + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(releases_page: false) + end + + it_behaves_like '404 response' do + let(:request) { get api("/projects/#{project.id}/releases/non_existing_tag/assets/links/#{release_link.id}", maintainer) } + end + end + end + + describe 'POST /projects/:id/releases/:tag_name/assets/links' do + let(:params) do + { + name: 'awesome-app.dmg', + url: 'https://example.com/download/awesome-app.dmg' + } + end + + it 'accepts the request' do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), params: params + + expect(response).to have_gitlab_http_status(:created) + end + + it 'creates a new release' do + expect do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), params: params + end.to change { Releases::Link.count }.by(1) + + release.reload + expect(release.links.last.name).to eq('awesome-app.dmg') + expect(release.links.last.url).to eq('https://example.com/download/awesome-app.dmg') + end + + it 'matches response schema' do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), params: params + + expect(response).to match_response_schema('release/link') + end + + context 'when name is empty' do + let(:params) do + { + name: '', + url: 'https://example.com/download/awesome-app.dmg' + } + end + + it_behaves_like '400 response' do + let(:request) do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), + params: params + end + end + end + + context 'when user is a reporter' do + it_behaves_like '403 response' do + let(:request) do + post api("/projects/#{project.id}/releases/v0.1/assets/links", reporter), + params: params + end + end + end + + context 'when user is not a project member' do + it 'forbids the request' do + post api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member), + params: params + + expect(response).to have_gitlab_http_status(:not_found) + end + + context 'when project is public' do + let(:project) { create(:project, :repository, :public) } + + it 'forbids the request' do + post api("/projects/#{project.id}/releases/v0.1/assets/links", non_project_member), + params: params + + expect(response).to have_gitlab_http_status(:forbidden) + end + end + end + + context 'when the same link already exists' do + before do + create(:release_link, + release: release, + name: 'awesome-app.dmg', + url: 'https://example.com/download/awesome-app.dmg') + end + + it_behaves_like '400 response' do + let(:request) do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), + params: params + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(releases_page: false) + end + + it_behaves_like '404 response' do + let(:request) do + post api("/projects/#{project.id}/releases/v0.1/assets/links", maintainer), + params: params + end + end + end + end + + describe 'PUT /projects/:id/releases/:tag_name/assets/links/:link_id' do + let(:params) { { name: 'awesome-app.msi' } } + let!(:release_link) { create(:release_link, release: release) } + + it 'accepts the request' do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + + expect(response).to have_gitlab_http_status(:ok) + end + + it 'updates the name' do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + + expect(json_response['name']).to eq('awesome-app.msi') + end + + it 'does not update the url' do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + + expect(json_response['url']).to eq(release_link.url) + end + + it 'matches response schema' do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + + expect(response).to match_response_schema('release/link') + end + + context 'when params is empty' do + let(:params) { {} } + + it 'does not allow the request' do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + + expect(response).to have_gitlab_http_status(:bad_request) + end + end + + context 'when there are no corresponding release link' do + let!(:release_link) { } + + it_behaves_like '404 response' do + let(:request) do + put api("/projects/#{project.id}/releases/v0.1/assets/links/1", maintainer), + params: params + end + end + end + + context 'when user is a reporter' do + it_behaves_like '403 response' do + let(:request) do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", reporter), + params: params + end + end + end + + context 'when user is not a project member' do + it_behaves_like '404 response' do + let(:request) do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", non_project_member), + params: params + end + end + + context 'when project is public' do + let(:project) { create(:project, :repository, :public) } + + it_behaves_like '403 response' do + let(:request) do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", non_project_member), + params: params + end + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(releases_page: false) + end + + it_behaves_like '404 response' do + let(:request) do + put api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer), + params: params + end + end + end + end + + describe 'DELETE /projects/:id/releases/:tag_name/assets/links/:link_id' do + let!(:release_link) do + create(:release_link, release: release) + end + + it 'accepts the request' do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + + expect(response).to have_gitlab_http_status(:ok) + end + + it 'destroys the release link' do + expect do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + end.to change { Releases::Link.count }.by(-1) + end + + it 'matches response schema' do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + + expect(response).to match_response_schema('release/link') + end + + context 'when there are no corresponding release link' do + let!(:release_link) { } + + it_behaves_like '404 response' do + let(:request) do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/1", maintainer) + end + end + end + + context 'when user is a reporter' do + it_behaves_like '403 response' do + let(:request) do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", reporter) + end + end + end + + context 'when user is not a project member' do + it_behaves_like '404 response' do + let(:request) do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", non_project_member) + end + end + + context 'when project is public' do + let(:project) { create(:project, :repository, :public) } + + it_behaves_like '403 response' do + let(:request) do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", non_project_member) + end + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(releases_page: false) + end + + it_behaves_like '404 response' do + let(:request) do + delete api("/projects/#{project.id}/releases/v0.1/assets/links/#{release_link.id}", maintainer) + end + end + end + end +end |