Move /projects/fork/:id to /projects/:id/fork
This commit is contained in:
parent
49e44d88b9
commit
c2102e6e3b
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Move /projects/fork/:id to /projects/:id/fork
|
||||||
|
merge_request: 8940
|
||||||
|
author:
|
|
@ -705,7 +705,7 @@ Parameters:
|
||||||
Forks a project into the user namespace of the authenticated user or the one provided.
|
Forks a project into the user namespace of the authenticated user or the one provided.
|
||||||
|
|
||||||
```
|
```
|
||||||
POST /projects/fork/:id
|
POST /projects/:id/fork
|
||||||
```
|
```
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
|
|
|
@ -22,4 +22,5 @@ changes are in V4:
|
||||||
- `/gitignores/:key`
|
- `/gitignores/:key`
|
||||||
- `/gitlab_ci_ymls/:key`
|
- `/gitlab_ci_ymls/:key`
|
||||||
- `/dockerfiles/:key`
|
- `/dockerfiles/:key`
|
||||||
|
- Moved `/projects/fork/:id` to `/projects/:id/fork`
|
||||||
|
|
||||||
|
|
|
@ -220,7 +220,7 @@ module API
|
||||||
params do
|
params do
|
||||||
optional :namespace, type: String, desc: 'The ID or name of the namespace that the project will be forked into'
|
optional :namespace, type: String, desc: 'The ID or name of the namespace that the project will be forked into'
|
||||||
end
|
end
|
||||||
post 'fork/:id' do
|
post ':id/fork' do
|
||||||
fork_params = declared_params(include_missing: false)
|
fork_params = declared_params(include_missing: false)
|
||||||
namespace_id = fork_params[:namespace]
|
namespace_id = fork_params[:namespace]
|
||||||
|
|
||||||
|
|
|
@ -1,134 +0,0 @@
|
||||||
require 'spec_helper'
|
|
||||||
|
|
||||||
describe API::Projects, api: true do
|
|
||||||
include ApiHelpers
|
|
||||||
let(:user) { create(:user) }
|
|
||||||
let(:user2) { create(:user) }
|
|
||||||
let(:admin) { create(:admin) }
|
|
||||||
let(:group) { create(:group) }
|
|
||||||
let(:group2) do
|
|
||||||
group = create(:group, name: 'group2_name')
|
|
||||||
group.add_owner(user2)
|
|
||||||
group
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'POST /projects/fork/:id' do
|
|
||||||
let(:project) do
|
|
||||||
create(:project, :repository, creator: user, namespace: user.namespace)
|
|
||||||
end
|
|
||||||
|
|
||||||
before do
|
|
||||||
project.add_reporter(user2)
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when authenticated' do
|
|
||||||
it 'forks if user has sufficient access to project' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['name']).to eq(project.name)
|
|
||||||
expect(json_response['path']).to eq(project.path)
|
|
||||||
expect(json_response['owner']['id']).to eq(user2.id)
|
|
||||||
expect(json_response['namespace']['id']).to eq(user2.namespace.id)
|
|
||||||
expect(json_response['forked_from_project']['id']).to eq(project.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks if user is admin' do
|
|
||||||
post api("/projects/fork/#{project.id}", admin)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['name']).to eq(project.name)
|
|
||||||
expect(json_response['path']).to eq(project.path)
|
|
||||||
expect(json_response['owner']['id']).to eq(admin.id)
|
|
||||||
expect(json_response['namespace']['id']).to eq(admin.namespace.id)
|
|
||||||
expect(json_response['forked_from_project']['id']).to eq(project.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails on missing project access for the project to fork' do
|
|
||||||
new_user = create(:user)
|
|
||||||
post api("/projects/fork/#{project.id}", new_user)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
|
||||||
expect(json_response['message']).to eq('404 Project Not Found')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails if forked project exists in the user namespace' do
|
|
||||||
post api("/projects/fork/#{project.id}", user)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(409)
|
|
||||||
expect(json_response['message']['name']).to eq(['has already been taken'])
|
|
||||||
expect(json_response['message']['path']).to eq(['has already been taken'])
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails if project to fork from does not exist' do
|
|
||||||
post api('/projects/fork/424242', user)
|
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
|
||||||
expect(json_response['message']).to eq('404 Project Not Found')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks with explicit own user namespace id' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: user2.namespace.id
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['owner']['id']).to eq(user2.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks with explicit own user name as namespace' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: user2.username
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['owner']['id']).to eq(user2.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks to another user when admin' do
|
|
||||||
post api("/projects/fork/#{project.id}", admin), namespace: user2.username
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['owner']['id']).to eq(user2.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails if trying to fork to another user when not admin' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: admin.namespace.id
|
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails if trying to fork to non-existent namespace' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: 42424242
|
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
|
||||||
expect(json_response['message']).to eq('404 Target Namespace Not Found')
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks to owned group' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: group2.name
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['namespace']['name']).to eq(group2.name)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'fails to fork to not owned group' do
|
|
||||||
post api("/projects/fork/#{project.id}", user2), namespace: group.name
|
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'forks to not owned group when admin' do
|
|
||||||
post api("/projects/fork/#{project.id}", admin), namespace: group.name
|
|
||||||
|
|
||||||
expect(response).to have_http_status(201)
|
|
||||||
expect(json_response['namespace']['name']).to eq(group.name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when unauthenticated' do
|
|
||||||
it 'returns authentication error' do
|
|
||||||
post api("/projects/fork/#{project.id}")
|
|
||||||
|
|
||||||
expect(response).to have_http_status(401)
|
|
||||||
expect(json_response['message']).to eq('401 Unauthorized')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1332,4 +1332,130 @@ describe API::Projects, api: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'POST /projects/:id/fork' do
|
||||||
|
let(:project) do
|
||||||
|
create(:project, :repository, creator: user, namespace: user.namespace)
|
||||||
|
end
|
||||||
|
let(:group) { create(:group) }
|
||||||
|
let(:group2) do
|
||||||
|
group = create(:group, name: 'group2_name')
|
||||||
|
group.add_owner(user2)
|
||||||
|
group
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
project.add_reporter(user2)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when authenticated' do
|
||||||
|
it 'forks if user has sufficient access to project' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2)
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(project.name)
|
||||||
|
expect(json_response['path']).to eq(project.path)
|
||||||
|
expect(json_response['owner']['id']).to eq(user2.id)
|
||||||
|
expect(json_response['namespace']['id']).to eq(user2.namespace.id)
|
||||||
|
expect(json_response['forked_from_project']['id']).to eq(project.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks if user is admin' do
|
||||||
|
post api("/projects/#{project.id}/fork", admin)
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['name']).to eq(project.name)
|
||||||
|
expect(json_response['path']).to eq(project.path)
|
||||||
|
expect(json_response['owner']['id']).to eq(admin.id)
|
||||||
|
expect(json_response['namespace']['id']).to eq(admin.namespace.id)
|
||||||
|
expect(json_response['forked_from_project']['id']).to eq(project.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails on missing project access for the project to fork' do
|
||||||
|
new_user = create(:user)
|
||||||
|
post api("/projects/#{project.id}/fork", new_user)
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
expect(json_response['message']).to eq('404 Project Not Found')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails if forked project exists in the user namespace' do
|
||||||
|
post api("/projects/#{project.id}/fork", user)
|
||||||
|
|
||||||
|
expect(response).to have_http_status(409)
|
||||||
|
expect(json_response['message']['name']).to eq(['has already been taken'])
|
||||||
|
expect(json_response['message']['path']).to eq(['has already been taken'])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails if project to fork from does not exist' do
|
||||||
|
post api('/projects/424242/fork', user)
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
expect(json_response['message']).to eq('404 Project Not Found')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks with explicit own user namespace id' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: user2.namespace.id
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['owner']['id']).to eq(user2.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks with explicit own user name as namespace' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: user2.username
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['owner']['id']).to eq(user2.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks to another user when admin' do
|
||||||
|
post api("/projects/#{project.id}/fork", admin), namespace: user2.username
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['owner']['id']).to eq(user2.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails if trying to fork to another user when not admin' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: admin.namespace.id
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails if trying to fork to non-existent namespace' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: 42424242
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
expect(json_response['message']).to eq('404 Target Namespace Not Found')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks to owned group' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: group2.name
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['namespace']['name']).to eq(group2.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'fails to fork to not owned group' do
|
||||||
|
post api("/projects/#{project.id}/fork", user2), namespace: group.name
|
||||||
|
|
||||||
|
expect(response).to have_http_status(404)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'forks to not owned group when admin' do
|
||||||
|
post api("/projects/#{project.id}/fork", admin), namespace: group.name
|
||||||
|
|
||||||
|
expect(response).to have_http_status(201)
|
||||||
|
expect(json_response['namespace']['name']).to eq(group.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when unauthenticated' do
|
||||||
|
it 'returns authentication error' do
|
||||||
|
post api("/projects/#{project.id}/fork")
|
||||||
|
|
||||||
|
expect(response).to have_http_status(401)
|
||||||
|
expect(json_response['message']).to eq('401 Unauthorized')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue