debian-mirror-gitlab/spec/requests/api/project_templates_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

298 lines
11 KiB
Ruby
Raw Permalink Normal View History

2019-12-26 22:10:19 +05:30
# frozen_string_literal: true
2018-12-05 23:21:45 +05:30
require 'spec_helper'
2023-03-04 22:38:38 +05:30
RSpec.describe API::ProjectTemplates, feature_category: :source_code_management do
2020-10-24 23:57:45 +05:30
let_it_be(:public_project) { create(:project, :public, :repository, create_templates: :merge_request, path: 'path.with.dot') }
let_it_be(:private_project) { create(:project, :private, :repository, create_templates: :issue) }
2020-04-22 19:07:51 +05:30
let_it_be(:developer) { create(:user) }
2018-12-05 23:21:45 +05:30
2020-05-24 23:13:21 +05:30
let(:url_encoded_path) { "#{public_project.namespace.path}%2F#{public_project.path}" }
2018-12-05 23:21:45 +05:30
before do
2023-07-09 08:55:56 +05:30
stub_feature_flags(remove_monitor_metrics: false)
2018-12-05 23:21:45 +05:30
private_project.add_developer(developer)
end
2020-05-24 23:13:21 +05:30
shared_examples 'accepts project paths with dots' do
it do
subject
expect(response).to have_gitlab_http_status(:ok)
end
end
2018-12-05 23:21:45 +05:30
describe 'GET /projects/:id/templates/:type' do
2020-05-24 23:13:21 +05:30
it_behaves_like 'accepts project paths with dots' do
subject { get api("/projects/#{url_encoded_path}/templates/dockerfiles") }
end
2018-12-05 23:21:45 +05:30
it 'returns dockerfiles' do
get api("/projects/#{public_project.id}/templates/dockerfiles")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
expect(json_response).to satisfy_one { |template| template['key'] == 'Binary' }
end
it 'returns gitignores' do
get api("/projects/#{public_project.id}/templates/gitignores")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
expect(json_response).to satisfy_one { |template| template['key'] == 'Actionscript' }
end
it 'returns gitlab_ci_ymls' do
get api("/projects/#{public_project.id}/templates/gitlab_ci_ymls")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
expect(json_response).to satisfy_one { |template| template['key'] == 'Android' }
end
it 'returns licenses' do
get api("/projects/#{public_project.id}/templates/licenses")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
expect(json_response).to satisfy_one { |template| template['key'] == 'mit' }
end
2020-10-24 23:57:45 +05:30
it 'returns metrics_dashboard_ymls' do
get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls")
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
expect(json_response).to satisfy_one { |template| template['key'] == 'Default' }
end
2023-07-09 08:55:56 +05:30
context 'when metrics dashboard feature is unavailable' do
before do
stub_feature_flags(remove_monitor_metrics: true)
end
it 'returns 400 bad request like other unknown types' do
get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls")
expect(response).to have_gitlab_http_status(:bad_request)
end
end
2020-10-24 23:57:45 +05:30
it 'returns issue templates' do
get api("/projects/#{private_project.id}/templates/issues", developer)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
2022-08-27 11:52:29 +05:30
expect(json_response.map { |t| t['key'] }).to match_array(%w(bug feature_proposal template_test))
2020-10-24 23:57:45 +05:30
end
it 'returns merge request templates' do
get api("/projects/#{public_project.id}/templates/merge_requests")
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(response).to match_response_schema('public_api/v4/template_list')
2022-08-27 11:52:29 +05:30
expect(json_response.map { |t| t['key'] }).to match_array(%w(bug feature_proposal template_test))
2020-10-24 23:57:45 +05:30
end
2018-12-05 23:21:45 +05:30
it 'returns 400 for an unknown template type' do
get api("/projects/#{public_project.id}/templates/unknown")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:bad_request)
2018-12-05 23:21:45 +05:30
end
it 'denies access to an anonymous user on a private project' do
get api("/projects/#{private_project.id}/templates/licenses")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:not_found)
2018-12-05 23:21:45 +05:30
end
it 'permits access to a developer on a private project' do
get api("/projects/#{private_project.id}/templates/licenses", developer)
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/template_list')
end
end
describe 'GET /projects/:id/templates/licenses' do
it 'returns key and name for the listed licenses' do
get api("/projects/#{public_project.id}/templates/licenses")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/template_list')
end
2020-05-24 23:13:21 +05:30
it_behaves_like 'accepts project paths with dots' do
subject { get api("/projects/#{url_encoded_path}/templates/licenses") }
end
2018-12-05 23:21:45 +05:30
end
2021-03-11 19:13:27 +05:30
describe 'GET /projects/:id/templates/:type/:name' do
2018-12-05 23:21:45 +05:30
it 'returns a specific dockerfile' do
get api("/projects/#{public_project.id}/templates/dockerfiles/Binary")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('Binary')
end
it 'returns a specific gitignore' do
get api("/projects/#{public_project.id}/templates/gitignores/Actionscript")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('Actionscript')
end
2019-07-07 11:18:12 +05:30
it 'returns C++ gitignore' do
get api("/projects/#{public_project.id}/templates/gitignores/C++")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2019-07-07 11:18:12 +05:30
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('C++')
end
it 'returns C++ gitignore for URL-encoded names' do
get api("/projects/#{public_project.id}/templates/gitignores/C%2B%2B")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2019-07-07 11:18:12 +05:30
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('C++')
end
2018-12-05 23:21:45 +05:30
it 'returns a specific gitlab_ci_yml' do
get api("/projects/#{public_project.id}/templates/gitlab_ci_ymls/Android")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('Android')
end
2020-10-24 23:57:45 +05:30
it 'returns a specific metrics_dashboard_yml' do
get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls/Default")
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('Default')
end
2023-07-09 08:55:56 +05:30
context 'when metrics dashboard feature is unavailable' do
before do
stub_feature_flags(remove_monitor_metrics: true)
end
it 'returns 400 bad request like other unknown types' do
get api("/projects/#{public_project.id}/templates/metrics_dashboard_ymls/Default")
expect(response).to have_gitlab_http_status(:bad_request)
end
end
2018-12-05 23:21:45 +05:30
it 'returns a specific license' do
get api("/projects/#{public_project.id}/templates/licenses/mit")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/license')
end
2020-10-24 23:57:45 +05:30
it 'returns a specific issue template' do
get api("/projects/#{private_project.id}/templates/issues/bug", developer)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('bug')
expect(json_response['content']).to eq('something valid')
end
it 'returns a specific merge request template' do
get api("/projects/#{public_project.id}/templates/merge_requests/feature_proposal")
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('public_api/v4/template')
expect(json_response['name']).to eq('feature_proposal')
expect(json_response['content']).to eq('feature_proposal') # Content is identical to filename here
end
2018-12-05 23:21:45 +05:30
it 'returns 404 for an unknown specific template' do
get api("/projects/#{public_project.id}/templates/licenses/unknown")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:not_found)
2018-12-05 23:21:45 +05:30
end
2020-10-24 23:57:45 +05:30
it 'returns 404 for an unknown issue template' do
get api("/projects/#{public_project.id}/templates/issues/unknown")
expect(response).to have_gitlab_http_status(:not_found)
end
it 'returns 404 for an unknown merge request template' do
get api("/projects/#{public_project.id}/templates/merge_requests/unknown")
expect(response).to have_gitlab_http_status(:not_found)
end
2018-12-05 23:21:45 +05:30
it 'denies access to an anonymous user on a private project' do
get api("/projects/#{private_project.id}/templates/licenses/mit")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:not_found)
2018-12-05 23:21:45 +05:30
end
it 'permits access to a developer on a private project' do
get api("/projects/#{private_project.id}/templates/licenses/mit", developer)
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/license')
end
2019-07-07 11:18:12 +05:30
2020-05-24 23:13:21 +05:30
it_behaves_like 'accepts project paths with dots' do
subject { get api("/projects/#{url_encoded_path}/templates/gitlab_ci_ymls/Android") }
end
2020-10-24 23:57:45 +05:30
it_behaves_like 'accepts project paths with dots' do
subject { get api("/projects/#{url_encoded_path}/templates/metrics_dashboard_ymls/Default") }
end
2019-07-07 11:18:12 +05:30
shared_examples 'path traversal attempt' do |template_type|
it 'rejects invalid filenames' do
get api("/projects/#{public_project.id}/templates/#{template_type}/%2e%2e%2fPython%2ea")
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:internal_server_error)
2019-07-07 11:18:12 +05:30
end
end
TemplateFinder::VENDORED_TEMPLATES.each do |template_type, _|
it_behaves_like 'path traversal attempt', template_type
end
2018-12-05 23:21:45 +05:30
end
describe 'GET /projects/:id/templates/licenses/:key' do
it 'fills placeholders in the license' do
get api("/projects/#{public_project.id}/templates/licenses/agpl-3.0"),
2019-02-15 15:39:39 +05:30
params: {
project: 'Project Placeholder',
fullname: 'Fullname Placeholder'
}
2018-12-05 23:21:45 +05:30
2020-04-08 14:13:33 +05:30
expect(response).to have_gitlab_http_status(:ok)
2018-12-05 23:21:45 +05:30
expect(response).to match_response_schema('public_api/v4/license')
content = json_response['content']
expect(content).to include('Project Placeholder')
expect(content).to include("Copyright (C) #{Time.now.year} Fullname Placeholder")
end
2020-05-24 23:13:21 +05:30
it_behaves_like 'accepts project paths with dots' do
subject { get api("/projects/#{url_encoded_path}/templates/licenses/mit") }
end
2018-12-05 23:21:45 +05:30
end
end