summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2019-01-04 15:29:04 +0900
committerShinya Maeda <shinya@gitlab.com>2019-01-04 22:30:35 +0900
commit0d833ea294afc8a3fa582fe5e2585a4bf6d802c6 (patch)
treedbd77e14eebbeefe4438ca5d724d41fe2b9536b7
parent9d0fa597e5a04c2b0e0c3b530062f63a91b4c97a (diff)
downloadgitlab-ce-ac-releases-api-with-assets-update-delete-links.tar.gz
Add tests for the API and add a couple of tests Add revert revert
-rw-r--r--app/models/release.rb4
-rw-r--r--app/models/releases/source.rb11
-rw-r--r--app/services/releases/create_service.rb4
-rw-r--r--db/migrate/20181228175414_create_releases_link_table.rb7
-rw-r--r--db/schema.rb11
-rw-r--r--lib/api/release/links.rb (renamed from lib/api/release/link.rb)87
-rw-r--r--lib/api/releases.rb13
-rw-r--r--spec/factories/releases/link.rb8
-rw-r--r--spec/fixtures/api/schemas/release.json10
-rw-r--r--spec/fixtures/api/schemas/release/link.json11
-rw-r--r--spec/fixtures/api/schemas/release/links.json4
-rw-r--r--spec/requests/api/release/links_spec.rb417
-rw-r--r--spec/requests/api/releases_spec.rb124
13 files changed, 477 insertions, 234 deletions
diff --git a/app/models/release.rb b/app/models/release.rb
index 77d56fa6a79..0dae5c90394 100644
--- a/app/models/release.rb
+++ b/app/models/release.rb
@@ -31,11 +31,7 @@ class Release < ActiveRecord::Base
end
def assets_count
-<<<<<<< HEAD
links.count + sources.count
-=======
- links.size + sources.size
->>>>>>> Support CURD operation for release asset links
end
def sources
diff --git a/app/models/releases/source.rb b/app/models/releases/source.rb
index 625501bbe7a..4d3d54457af 100644
--- a/app/models/releases/source.rb
+++ b/app/models/releases/source.rb
@@ -3,10 +3,7 @@
module Releases
class Source
include ActiveModel::Model
-<<<<<<< HEAD
-=======
->>>>>>> Support CURD operation for release asset links
attr_accessor :project, :tag_name, :format
FORMATS = %w(zip tar.gz tar.bz2 tar).freeze
@@ -25,21 +22,13 @@ module Releases
Gitlab::Routing
.url_helpers
.project_archive_url(project,
-<<<<<<< HEAD
id: File.join(tag_name, archive_prefix),
-=======
- id: File.join(tag_name, archive_path),
->>>>>>> Support CURD operation for release asset links
format: format)
end
private
-<<<<<<< HEAD
def archive_prefix
-=======
- def archive_path
->>>>>>> Support CURD operation for release asset links
"#{project.path}-#{tag_name.tr('/', '-')}"
end
end
diff --git a/app/services/releases/create_service.rb b/app/services/releases/create_service.rb
index 7d9387a4106..c6e143d440d 100644
--- a/app/services/releases/create_service.rb
+++ b/app/services/releases/create_service.rb
@@ -44,11 +44,7 @@ module Releases
author: current_user,
tag: tag.name,
sha: tag.dereferenced_target.sha,
-<<<<<<< HEAD
links_attributes: params.dig(:assets, 'links') || []
-=======
- links_attributes: params[:links_attributes] || []
->>>>>>> Support CURD operation for release asset links
)
success(tag: tag, release: release)
diff --git a/db/migrate/20181228175414_create_releases_link_table.rb b/db/migrate/20181228175414_create_releases_link_table.rb
index dacb586aeb4..03558202137 100644
--- a/db/migrate/20181228175414_create_releases_link_table.rb
+++ b/db/migrate/20181228175414_create_releases_link_table.rb
@@ -6,20 +6,13 @@ class CreateReleasesLinkTable < ActiveRecord::Migration[5.0]
DOWNTIME = false
def change
-<<<<<<< HEAD
create_table :release_links, id: :bigserial do |t|
-=======
- create_table :release_links do |t|
->>>>>>> Support CURD operation for release asset links
t.references :release, null: false, index: false, foreign_key: { on_delete: :cascade }
t.string :url, null: false
t.string :name, null: false
t.timestamps_with_timezone null: false
-<<<<<<< HEAD
t.index [:release_id, :url], unique: true
-=======
->>>>>>> Support CURD operation for release asset links
t.index [:release_id, :name], unique: true
end
end
diff --git a/db/schema.rb b/db/schema.rb
index caa6d82f44e..97daf8ee617 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,11 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-<<<<<<< HEAD
ActiveRecord::Schema.define(version: 20190103140724) do
-=======
-ActiveRecord::Schema.define(version: 20181228175414) do
->>>>>>> Support CURD operation for release asset links
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -1802,21 +1798,14 @@ ActiveRecord::Schema.define(version: 20181228175414) do
t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id", using: :btree
end
-<<<<<<< HEAD
create_table "release_links", id: :bigserial, force: :cascade do |t|
-=======
- create_table "release_links", force: :cascade do |t|
->>>>>>> Support CURD operation for release asset links
t.integer "release_id", null: false
t.string "url", null: false
t.string "name", null: false
t.datetime_with_timezone "created_at", null: false
t.datetime_with_timezone "updated_at", null: false
t.index ["release_id", "name"], name: "index_release_links_on_release_id_and_name", unique: true, using: :btree
-<<<<<<< HEAD
t.index ["release_id", "url"], name: "index_release_links_on_release_id_and_url", unique: true, using: :btree
-=======
->>>>>>> Support CURD operation for release asset links
end
create_table "releases", force: :cascade do |t|
diff --git a/lib/api/release/link.rb b/lib/api/release/links.rb
index 72b67b8ce1b..91c3944b429 100644
--- a/lib/api/release/link.rb
+++ b/lib/api/release/links.rb
@@ -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, user_project
- 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
+ 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
+ get do
+ authorize! :read_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])
end
- end
- 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
+ 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
- if link.destroy
- present link, with: Entities::Releases::Link
- else
- render_api_error!(result[:message], result[:http_status])
+ 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
diff --git a/lib/api/releases.rb b/lib/api/releases.rb
index 2078261a8d9..c3d4101528c 100644
--- a/lib/api/releases.rb
+++ b/lib/api/releases.rb
@@ -49,17 +49,11 @@ module API
requires :name, type: String, desc: 'The name of the release'
requires :description, type: String, desc: 'The release notes'
optional :ref, type: String, desc: 'The commit sha or branch name'
-<<<<<<< HEAD
optional :assets, type: Hash do
optional :links, type: Array do
requires :name, type: String
requires :url, type: String
end
-=======
- optional :links_attributes, type: Array do
- requires :name, type: String
- requires :url, type: String
->>>>>>> Support CURD operation for release asset links
end
end
post ':id/releases' do
@@ -84,13 +78,6 @@ module API
requires :tag_name, type: String, desc: 'The name of the tag', as: :tag
optional :name, type: String, desc: 'The name of the release'
optional :description, type: String, desc: 'Release notes with markdown support'
- optional :links_attributes, type: Array do
- optional :id, type: Integer
- optional :name, type: String
- optional :url, type: String
- optional :_destroy, type: Integer
- at_least_one_of :name, :url, :_destroy
- end
end
put ':id/releases/:tag_name', requirements: RELEASE_ENDPOINT_REQUIREMETS do
authorize_update_release!
diff --git a/spec/factories/releases/link.rb b/spec/factories/releases/link.rb
index 8633fcf4977..d23db6d4bad 100644
--- a/spec/factories/releases/link.rb
+++ b/spec/factories/releases/link.rb
@@ -1,4 +1,3 @@
-<<<<<<< HEAD
# frozen_string_literal: true
FactoryBot.define do
@@ -6,12 +5,5 @@ FactoryBot.define do
release
sequence(:name) { |n| "release-18.#{n}.dmg" }
sequence(:url) { |n| "https://example.com/scrambled-url/app-#{n}.zip" }
-=======
-FactoryBot.define do
- factory :release_link, class: ::Releases::Link do
- release
- name "release-18.04.dmg"
- url 'https://my-external-hosting.example.com/scrambled-url/app.zip'
->>>>>>> Support CURD operation for release asset links
end
end
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
diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb
index ad5991729c3..978fa0142c2 100644
--- a/spec/requests/api/releases_spec.rb
+++ b/spec/requests/api/releases_spec.rb
@@ -153,10 +153,7 @@ describe API::Releases do
get api("/projects/#{project.id}/releases/v0.1", maintainer)
expect(json_response['assets']['links'].count).to eq(1)
-<<<<<<< HEAD
expect(json_response['assets']['links'].first['id']).to eq(link.id)
-=======
->>>>>>> Support CURD operation for release asset links
expect(json_response['assets']['links'].first['name'])
.to eq('release-18.04.dmg')
expect(json_response['assets']['links'].first['url'])
@@ -307,7 +304,6 @@ describe API::Releases do
end
context 'when create assets altogether' do
-<<<<<<< HEAD
let(:base_params) do
{
name: 'New release',
@@ -323,21 +319,6 @@ describe API::Releases do
links: [{ name: 'beta', url: 'https://dosuken.example.com/inspection.exe' }]
}
})
-=======
- context 'when create one asset' do
- let(:params) do
- {
- name: 'New release',
- tag_name: 'v0.1',
- description: 'Super nice release',
- links_attributes: [
- {
- name: 'beta',
- url: 'https://dosuken.example.com/inspection.exe'
- }
- ]
- }
->>>>>>> Support CURD operation for release asset links
end
it 'accepts the request' do
@@ -364,7 +345,6 @@ describe API::Releases do
context 'when create two assets' do
let(:params) do
-<<<<<<< HEAD
base_params.merge({
assets: {
links: [
@@ -373,23 +353,6 @@ describe API::Releases do
]
}
})
-=======
- {
- name: 'New release',
- tag_name: 'v0.1',
- description: 'Super nice release',
- links_attributes: [
- {
- name: 'alpha',
- url: 'https://dosuken.example.com/alpha.exe'
- },
- {
- name: 'beta',
- url: 'https://dosuken.example.com/beta.exe'
- }
- ]
- }
->>>>>>> Support CURD operation for release asset links
end
it 'creates two assets with specified parameters' do
@@ -402,7 +365,6 @@ describe API::Releases do
.to match_array(%w[https://dosuken.example.com/alpha.exe
https://dosuken.example.com/beta.exe])
end
-<<<<<<< HEAD
context 'when link names are duplicates' do
let(:params) do
@@ -422,8 +384,6 @@ describe API::Releases do
expect(response).to have_gitlab_http_status(:bad_request)
end
end
-=======
->>>>>>> Support CURD operation for release asset links
end
end
end
@@ -606,90 +566,6 @@ describe API::Releases do
end
end
- context 'when links_attributes param is specified' do
- context 'when the release does not have any link assets' do
- let(:params) do
- { links_attributes: [{ name: 'Beta release',
- url: 'http://dosuken.com/win.exe' }] }
- end
-
- it 'creates an asset' do
- put api("/projects/#{project.id}/releases/v0.1", maintainer),
- params: params
-
- expect(json_response['assets']['links'].count).to eq(1)
- expect(json_response['assets']['links'].first['name'])
- .to eq('Beta release')
- expect(json_response['assets']['links'].first['url'])
- .to eq('http://dosuken.com/win.exe')
- end
-
- context 'when url is invalid' do
- let(:params) do
- { links_attributes: [{ name: 'Beta release',
- url: 'SELECT 1 from ci_builds;' }] }
- end
-
- it 'returns an error' do
- put api("/projects/#{project.id}/releases/v0.1", maintainer),
- params: params
-
- expect(json_response['message']['links.url'].first)
- .to include('Only allowed protocols are http, https')
- end
- end
- end
-
- context 'when the release has asset links' do
- let!(:release_link_1) do
- create(:release_link,
- name: 'gcc',
- url: 'http://dosuken.com/executable-gcc',
- release: release,
- created_at: 1.day.ago)
- end
-
- let!(:release_link_2) do
- create(:release_link,
- name: 'llvm',
- url: 'http://dosuken.com/executable-llvm',
- release: release,
- created_at: 2.days.ago)
- end
-
- context 'when updates link names' do
- let(:params) do
- { links_attributes: [{ id: release_link_1.id, name: 'bin-gcc' },
- { id: release_link_2.id, name: 'bin-llvm' }] }
- end
-
- it 'updates the asset' do
- put api("/projects/#{project.id}/releases/v0.1", maintainer),
- params: params
-
- expect(json_response['assets']['links'].first['name'])
- .to eq('bin-gcc')
- expect(json_response['assets']['links'].second['name'])
- .to eq('bin-llvm')
- end
- end
-
- context 'when destroys an asset' do
- let(:params) do
- { links_attributes: [{ id: release_link_1.id, _destroy: '1' }] }
- end
-
- it 'updates the asset' do
- put api("/projects/#{project.id}/releases/v0.1", maintainer),
- params: params
-
- expect(json_response['assets']['links'].count).to eq(1)
- expect(json_response['assets']['links'].first['name']).to eq('llvm')
- end
- end
- end
- end
-
context 'when feature flag is disabled' do
before do
stub_feature_flags(releases_page: false)