Add tests for Release Link API
Add tests for the API and add a couple of tests Add revert revert
This commit is contained in:
parent
124905e23b
commit
6bd7e1b876
5 changed files with 479 additions and 54 deletions
|
@ -14,6 +14,9 @@ module API
|
|||
requires :id, type: String, desc: 'The ID of a project'
|
||||
end
|
||||
resource 'projects/:id', requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
||||
params do
|
||||
requires :tag_name, type: String, desc: 'The name of the tag', as: :tag
|
||||
end
|
||||
resource 'releases/:tag_name', requirements: RELEASE_ENDPOINT_REQUIREMETS do
|
||||
resource :assets do
|
||||
desc 'Get a list of links of a release' do
|
||||
|
@ -26,20 +29,7 @@ module API
|
|||
get 'links' do
|
||||
authorize! :read_release, release
|
||||
|
||||
present paginate(release.links), with: Entities::Releases::Link
|
||||
end
|
||||
|
||||
desc 'Get a link detail of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
params do
|
||||
requires :link_id, type: String, desc: 'The id of the link'
|
||||
end
|
||||
get 'links/:link_id' do
|
||||
authorize! :read_release, release
|
||||
|
||||
present link, with: Entities::Releases::Link
|
||||
present paginate(release.links.sorted), with: Entities::Releases::Link
|
||||
end
|
||||
|
||||
desc 'Create a link of a release' do
|
||||
|
@ -58,44 +48,55 @@ module API
|
|||
if new_link.persisted?
|
||||
present new_link, with: Entities::Releases::Link
|
||||
else
|
||||
render_api_error!(result[:message], result[:http_status])
|
||||
render_api_error!(new_link.errors.messages, 400)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Update a link of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
params do
|
||||
requires :link_id, type: Integer, desc: 'The id of the link'
|
||||
optional :name, type: String, desc: 'The name of the link'
|
||||
optional :url, type: String, desc: 'The URL of the link'
|
||||
at_least_one_of :name, :url
|
||||
requires :link_id, type: String, desc: 'The id of the link'
|
||||
end
|
||||
put 'links/:link_id' do
|
||||
authorize! :update_release, release
|
||||
|
||||
if link.update(declared_params(include_missing: false))
|
||||
present link, with: Entities::Releases::Link
|
||||
else
|
||||
render_api_error!(result[:message], result[:http_status])
|
||||
resource 'links/:link_id' do
|
||||
desc 'Get a link detail of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
end
|
||||
get do
|
||||
authorize! :read_release, release
|
||||
|
||||
desc 'Delete a link of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
params do
|
||||
requires :link_id, type: Integer, desc: 'The id of the link'
|
||||
end
|
||||
put 'links/:link_id' do
|
||||
authorize! :destroy_release, release
|
||||
|
||||
if link.destroy
|
||||
present link, with: Entities::Releases::Link
|
||||
else
|
||||
render_api_error!(result[:message], result[:http_status])
|
||||
end
|
||||
|
||||
desc 'Update a link of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
params do
|
||||
optional :name, type: String, desc: 'The name of the link'
|
||||
optional :url, type: String, desc: 'The URL of the link'
|
||||
at_least_one_of :name, :url
|
||||
end
|
||||
put do
|
||||
authorize! :update_release, release
|
||||
|
||||
if link.update(declared_params(include_missing: false))
|
||||
present link, with: Entities::Releases::Link
|
||||
else
|
||||
render_api_error!(link.errors.messages, 400)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Delete a link of a release' do
|
||||
detail 'This feature was introduced in GitLab 11.7.'
|
||||
success Entities::Releases::Link
|
||||
end
|
||||
delete do
|
||||
authorize! :destroy_release, release
|
||||
|
||||
if link.destroy
|
||||
present link, with: Entities::Releases::Link
|
||||
else
|
||||
render_api_error!(link.errors.messages, 400)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -104,7 +105,7 @@ module API
|
|||
|
||||
helpers do
|
||||
def release
|
||||
@release ||= user_project.releases.find_by_tag(params[:tag_name])
|
||||
@release ||= user_project.releases.find_by_tag!(params[:tag])
|
||||
end
|
||||
|
||||
def link
|
10
spec/fixtures/api/schemas/release.json
vendored
10
spec/fixtures/api/schemas/release.json
vendored
|
@ -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": {
|
||||
|
|
11
spec/fixtures/api/schemas/release/link.json
vendored
Normal file
11
spec/fixtures/api/schemas/release/link.json
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"type": "object",
|
||||
"required": ["name", "url"],
|
||||
"properties": {
|
||||
"id": { "type": "integer" },
|
||||
"name": { "type": "string" },
|
||||
"url": { "type": "string" },
|
||||
"external": { "type": "boolean" }
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
4
spec/fixtures/api/schemas/release/links.json
vendored
Normal file
4
spec/fixtures/api/schemas/release/links.json
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"type": "array",
|
||||
"items": { "$ref": "link.json" }
|
||||
}
|
417
spec/requests/api/release/links_spec.rb
Normal file
417
spec/requests/api/release/links_spec.rb
Normal file
|
@ -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
|
Loading…
Reference in a new issue