Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-07-19 17:16:28 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-07-19 17:16:28 +0300
commite4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch)
tree2fcdfa7dcdb9db8f5208b2562f4b4e803d671243 /spec/controllers/projects
parentffda4e7bcac36987f936b4ba515995a6698698f0 (diff)
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
Diffstat (limited to 'spec/controllers/projects')
-rw-r--r--spec/controllers/projects/alert_management_controller_spec.rb59
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb8
-rw-r--r--spec/controllers/projects/autocomplete_sources_controller_spec.rb34
-rw-r--r--spec/controllers/projects/blob_controller_spec.rb78
-rw-r--r--spec/controllers/projects/clusters_controller_spec.rb12
-rw-r--r--spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb2
-rw-r--r--spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb4
-rw-r--r--spec/controllers/projects/grafana_api_controller_spec.rb268
-rw-r--r--spec/controllers/projects/incidents_controller_spec.rb122
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb2
-rw-r--r--spec/controllers/projects/merge_requests/drafts_controller_spec.rb53
-rw-r--r--spec/controllers/projects/notes_controller_spec.rb104
-rw-r--r--spec/controllers/projects/pipeline_schedules_controller_spec.rb13
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb2
-rw-r--r--spec/controllers/projects/project_members_controller_spec.rb2
-rw-r--r--spec/controllers/projects/runners_controller_spec.rb106
-rw-r--r--spec/controllers/projects/service_desk_controller_spec.rb112
-rw-r--r--spec/controllers/projects/settings/ci_cd_controller_spec.rb5
-rw-r--r--spec/controllers/projects/tree_controller_spec.rb171
19 files changed, 431 insertions, 726 deletions
diff --git a/spec/controllers/projects/alert_management_controller_spec.rb b/spec/controllers/projects/alert_management_controller_spec.rb
deleted file mode 100644
index d80147b5c59..00000000000
--- a/spec/controllers/projects/alert_management_controller_spec.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::AlertManagementController do
- let_it_be(:project) { create(:project) }
- let_it_be(:role) { :developer }
- let_it_be(:user) { create(:user) }
- let_it_be(:id) { 1 }
-
- before do
- project.add_role(user, role)
- sign_in(user)
- end
-
- describe 'GET #index' do
- it 'shows the page' do
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is unauthorized' do
- let(:role) { :reporter }
-
- it 'shows 404' do
- get :index, params: { namespace_id: project.namespace, project_id: project }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'GET #details' do
- it 'shows the page' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is unauthorized' do
- let(:role) { :reporter }
-
- it 'shows 404' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-
- describe 'set_alert_id' do
- it 'sets alert id from the route' do
- get :details, params: { namespace_id: project.namespace, project_id: project, id: id }
-
- expect(assigns(:alert_id)).to eq(id.to_s)
- end
- end
-end
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index c7b74b5cf68..44615506e5d 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -104,7 +104,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
@@ -135,7 +135,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact(file_type: 'archive')
expect(response).to have_gitlab_http_status(:ok)
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
end
@@ -168,7 +168,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
download_artifact(file_type: file_type)
- expect(response.headers['Content-Disposition']).to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ expect(response.headers['Content-Disposition']).to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
@@ -264,7 +264,7 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
expect(response).to have_gitlab_http_status(:ok)
expect(response.headers['Content-Disposition'])
- .to eq(%Q(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
+ .to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename}))
end
end
end
diff --git a/spec/controllers/projects/autocomplete_sources_controller_spec.rb b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
index 70178083e71..d0bfbeae78f 100644
--- a/spec/controllers/projects/autocomplete_sources_controller_spec.rb
+++ b/spec/controllers/projects/autocomplete_sources_controller_spec.rb
@@ -131,6 +131,10 @@ RSpec.describe Projects::AutocompleteSourcesController do
end
shared_examples 'all members are returned' do
+ before do
+ stub_feature_flags(disable_all_mention: false)
+ end
+
it 'returns an array of member object' do
get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
@@ -155,6 +159,19 @@ RSpec.describe Projects::AutocompleteSourcesController do
name: invited_private_member.name,
avatar_url: invited_private_member.avatar_url)
end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not return the all mention user' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
+
+ expect(json_response).not_to include(a_hash_including(
+ { username: 'all', name: 'All Project and Group Members' }))
+ end
+ end
end
context 'with issue' do
@@ -180,6 +197,10 @@ RSpec.describe Projects::AutocompleteSourcesController do
end
shared_examples 'only public members are returned for public project' do
+ before do
+ stub_feature_flags(disable_all_mention: false)
+ end
+
it 'only returns public members' do
get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
@@ -193,6 +214,19 @@ RSpec.describe Projects::AutocompleteSourcesController do
name: user.name,
avatar_url: user.avatar_url)
end
+
+ context 'when `disable_all_mention` FF is enabled' do
+ before do
+ stub_feature_flags(disable_all_mention: true)
+ end
+
+ it 'does not return the all mention user' do
+ get :members, format: :json, params: { namespace_id: group.path, project_id: public_project.path, type: issuable_type }
+
+ expect(json_response).not_to include(a_hash_including(
+ { username: 'all', name: 'All Project and Group Members' }))
+ end
+ end
end
context 'with issue' do
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index b07cb7a228d..49c1935c4a3 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -5,15 +5,21 @@ require 'spec_helper'
RSpec.describe Projects::BlobController, feature_category: :source_code_management do
include ProjectForksHelper
- let(:project) { create(:project, :public, :repository, previous_default_branch: previous_default_branch) }
- let(:previous_default_branch) { nil }
+ let_it_be(:project) { create(:project, :public, :repository) }
describe "GET show" do
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id } }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
+ let(:ref_type) { nil }
let(:request) do
get(:show, params: params)
end
+ let(:redirect_with_ref_type) { true }
+
+ before do
+ stub_feature_flags(redirect_with_ref_type: redirect_with_ref_type)
+ end
+
render_views
context 'with file path' do
@@ -24,25 +30,43 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
request
end
+ after do
+ project.repository.rm_tag(project.creator, 'ambiguous_ref')
+ project.repository.rm_branch(project.creator, 'ambiguous_ref')
+ end
+
context 'when the ref is ambiguous' do
let(:ref) { 'ambiguous_ref' }
let(:path) { 'README.md' }
let(:id) { "#{ref}/#{path}" }
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- context 'and explicitly requesting a branch' do
- let(:ref_type) { 'heads' }
+ context 'and the redirect_with_ref_type flag is disabled' do
+ let(:redirect_with_ref_type) { false }
+
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'redirects to blob#show with sha for the branch' do
+ expect(response).to redirect_to(project_blob_path(project, "#{RepoHelpers.another_sample_commit.id}/#{path}"))
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
- it 'redirects to blob#show with sha for the branch' do
- expect(response).to redirect_to(project_blob_path(project, "#{RepoHelpers.another_sample_commit.id}/#{path}"))
+ it 'responds with success' do
+ expect(response).to be_ok
+ end
end
end
- context 'and explicitly requesting a tag' do
- let(:ref_type) { 'tags' }
+ context 'and the redirect_with_ref_type flag is enabled' do
+ context 'when the ref_type is nil' do
+ let(:ref_type) { nil }
- it 'responds with success' do
- expect(response).to be_ok
+ it 'redirects to the tag' do
+ expect(response).to redirect_to(project_blob_path(project, id, ref_type: 'tags'))
+ end
end
end
end
@@ -68,18 +92,20 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
it { is_expected.to respond_with(:not_found) }
end
- context "renamed default branch, valid file" do
- let(:id) { 'old-default-branch/README.md' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context 'when default branch was renamed' do
+ let_it_be_with_reload(:project) { create(:project, :public, :repository, previous_default_branch: 'old-default-branch') }
- it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/README.md") }
- end
+ context "renamed default branch, valid file" do
+ let(:id) { 'old-default-branch/README.md' }
+
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/README.md") }
+ end
- context "renamed default branch, invalid file" do
- let(:id) { 'old-default-branch/invalid-path.rb' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context "renamed default branch, invalid file" do
+ let(:id) { 'old-default-branch/invalid-path.rb' }
- it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/invalid-path.rb") }
+ it { is_expected.to redirect_to("/#{project.full_path}/-/blob/#{project.default_branch}/invalid-path.rb") }
+ end
end
context "binary file" do
@@ -100,7 +126,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id }, format: :json
+ get :show, params: params, format: :json
end
it do
@@ -114,7 +140,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id, viewer: 'none' }, format: :json
+ get :show, params: { namespace_id: project.namespace, project_id: project, id: id, ref_type: 'heads', viewer: 'none' }, format: :json
end
it do
@@ -127,7 +153,7 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
context 'with tree path' do
before do
- get :show, params: { namespace_id: project.namespace, project_id: project, id: id }
+ get :show, params: params
controller.instance_variable_set(:@blob, nil)
end
@@ -414,6 +440,10 @@ RSpec.describe Projects::BlobController, feature_category: :source_code_manageme
let(:after_delete_path) { project_tree_path(project, 'master/files') }
it 'redirects to the sub directory' do
+ expect_next_instance_of(Files::DeleteService) do |instance|
+ expect(instance).to receive(:execute).and_return({ status: :success })
+ end
+
delete :destroy, params: default_params
expect(response).to redirect_to(after_delete_path)
diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb
index bface886674..15b7ddd85ea 100644
--- a/spec/controllers/projects/clusters_controller_spec.rb
+++ b/spec/controllers/projects/clusters_controller_spec.rb
@@ -113,18 +113,6 @@ RSpec.describe Projects::ClustersController, feature_category: :deployment_manag
end
end
- it_behaves_like 'GET #metrics_dashboard for dashboard', 'Cluster health' do
- let(:cluster) { create(:cluster, :provided_by_gcp, projects: [project]) }
-
- let(:metrics_dashboard_req_params) do
- {
- id: cluster.id,
- namespace_id: project.namespace.full_path,
- project_id: project.path
- }
- end
- end
-
describe 'POST create for existing cluster' do
let(:params) do
{
diff --git a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
index a7f3212a6f9..eaef455837f 100644
--- a/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
@@ -129,7 +129,7 @@ RSpec.describe Projects::DesignManagement::Designs::RawImagesController do
it 'serves files with `Content-Disposition: attachment`' do
subject
- expect(response.header['Content-Disposition']).to eq(%Q(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
+ expect(response.header['Content-Disposition']).to eq(%(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
end
it 'sets appropriate caching headers' do
diff --git a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
index 1bb5112681c..b4667b4568f 100644
--- a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
+++ b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feat
it 'sets Content-Disposition as attachment' do
filename = design.filename
- expect(response.header['Content-Disposition']).to eq(%Q(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
+ expect(response.header['Content-Disposition']).to eq(%(attachment; filename=\"#{filename}\"; filename*=UTF-8''#{filename}))
end
it 'serves files with Workhorse' do
@@ -59,7 +59,7 @@ RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feat
end
it 'sets appropriate caching headers' do
- expect(response.header['Cache-Control']).to eq('private')
+ expect(response.header['Cache-Control']).to eq('max-age=0, private, must-revalidate')
expect(response.header['ETag']).to be_present
end
end
diff --git a/spec/controllers/projects/grafana_api_controller_spec.rb b/spec/controllers/projects/grafana_api_controller_spec.rb
deleted file mode 100644
index 9bc4a83030e..00000000000
--- a/spec/controllers/projects/grafana_api_controller_spec.rb
+++ /dev/null
@@ -1,268 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::GrafanaApiController, feature_category: :metrics do
- let_it_be(:project) { create(:project, :public) }
- let_it_be(:reporter) { create(:user) }
- let_it_be(:guest) { create(:user) }
- let(:anonymous) { nil }
- let(:user) { reporter }
-
- before_all do
- project.add_reporter(reporter)
- project.add_guest(guest)
- end
-
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- sign_in(user) if user
- end
-
- describe 'GET #proxy' do
- let(:proxy_service) { instance_double(Grafana::ProxyService) }
- let(:params) do
- {
- namespace_id: project.namespace.full_path,
- project_id: project.path,
- proxy_path: 'api/v1/query_range',
- datasource_id: '1',
- query: 'rate(relevant_metric)',
- start_time: '1570441248',
- end_time: '1570444848',
- step: '900'
- }
- end
-
- before do
- allow(Grafana::ProxyService).to receive(:new).and_return(proxy_service)
- allow(proxy_service).to receive(:execute).and_return(service_result)
- end
-
- shared_examples_for 'error response' do |http_status|
- it "returns #{http_status}" do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(http_status)
- expect(json_response['status']).to eq('error')
- expect(json_response['message']).to eq('error message')
- end
- end
-
- shared_examples_for 'accessible' do
- let(:service_result) { nil }
-
- it 'returns non erroneous response' do
- get :proxy, params: params
-
- # We don't care about the specific code as long it's not an error.
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- shared_examples_for 'not accessible' do
- let(:service_result) { nil }
-
- it 'returns 404 Not found' do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(Grafana::ProxyService).not_to have_received(:new)
- end
- end
-
- shared_examples_for 'login required' do
- let(:service_result) { nil }
-
- it 'redirects to login page' do
- get :proxy, params: params
-
- expect(response).to redirect_to(new_user_session_path)
- expect(Grafana::ProxyService).not_to have_received(:new)
- end
- end
-
- context 'with a successful result' do
- let(:service_result) { { status: :success, body: '{}' } }
-
- it 'returns a grafana datasource response' do
- get :proxy, params: params
-
- expect(Grafana::ProxyService).to have_received(:new).with(
- project, '1', 'api/v1/query_range',
- {
- 'query' => params[:query],
- 'start' => params[:start_time],
- 'end' => params[:end_time],
- 'step' => params[:step]
- }
- )
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to eq({})
- end
- end
-
- context 'when the request is still unavailable' do
- let(:service_result) { nil }
-
- it 'returns 204 no content' do
- get :proxy, params: params
-
- expect(response).to have_gitlab_http_status(:no_content)
- expect(json_response['status']).to eq('processing')
- expect(json_response['message']).to eq('Not ready yet. Try again later.')
- end
- end
-
- context 'when an error has occurred' do
- context 'with an error accessing grafana' do
- let(:service_result) do
- {
- http_status: :service_unavailable,
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :service_unavailable
- end
-
- context 'with a processing error' do
- let(:service_result) do
- {
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :bad_request
- end
- end
-
- context 'as guest' do
- let(:user) { guest }
-
- it_behaves_like 'not accessible'
- end
-
- context 'as anonymous' do
- let(:user) { anonymous }
-
- it_behaves_like 'not accessible'
- end
-
- context 'on a private project' do
- let_it_be(:project) { create(:project, :private) }
-
- before_all do
- project.add_guest(guest)
- end
-
- context 'as anonymous' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
-
- context 'as guest' do
- let(:user) { guest }
-
- it_behaves_like 'accessible'
- end
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it_behaves_like 'not accessible'
- end
- end
-
- describe 'GET #metrics_dashboard' do
- let(:service_result) { { status: :success, dashboard: '{}' } }
- let(:params) do
- {
- format: :json,
- embedded: true,
- grafana_url: 'https://grafana.example.com',
- namespace_id: project.namespace.full_path,
- project_id: project.path
- }
- end
-
- before do
- allow(Gitlab::Metrics::Dashboard::Finder)
- .to receive(:find)
- .and_return(service_result)
- end
-
- context 'when the result is still processing' do
- let(:service_result) { nil }
-
- it 'returns 204 no content' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:no_content)
- end
- end
-
- context 'when the result was successful' do
- it 'returns the dashboard response' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response).to include({
- 'dashboard' => '{}',
- 'status' => 'success'
- })
- expect(json_response).to include('metrics_data')
- end
- end
-
- context 'when an error has occurred' do
- shared_examples_for 'error response' do |http_status|
- it "returns #{http_status}" do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(http_status)
- expect(json_response['status']).to eq('error')
- expect(json_response['message']).to eq('error message')
- end
- end
-
- context 'with an error accessing grafana' do
- let(:service_result) do
- {
- http_status: :service_unavailable,
- status: :error,
- message: 'error message'
- }
- end
-
- it_behaves_like 'error response', :service_unavailable
- end
-
- context 'with a processing error' do
- let(:service_result) { { status: :error, message: 'error message' } }
-
- it_behaves_like 'error response', :bad_request
- end
-
- context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
- it 'returns 404 Not found' do
- get :metrics_dashboard, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- expect(response.body).to be_empty
- end
- end
- end
- end
-end
diff --git a/spec/controllers/projects/incidents_controller_spec.rb b/spec/controllers/projects/incidents_controller_spec.rb
deleted file mode 100644
index 460821634b0..00000000000
--- a/spec/controllers/projects/incidents_controller_spec.rb
+++ /dev/null
@@ -1,122 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::IncidentsController do
- let_it_be_with_refind(:project) { create(:project) }
- let_it_be(:developer) { create(:user) }
- let_it_be(:guest) { create(:user) }
- let_it_be(:anonymous) { nil }
-
- before_all do
- project.add_guest(guest)
- project.add_developer(developer)
- end
-
- before do
- sign_in(user) if user
- end
-
- subject { make_request }
-
- shared_examples 'not found' do
- include_examples 'returning response status', :not_found
- end
-
- shared_examples 'login required' do
- it 'redirects to the login page' do
- subject
-
- expect(response).to redirect_to(new_user_session_path)
- end
- end
-
- describe 'GET #index' do
- def make_request
- get :index, params: project_params
- end
-
- let(:user) { developer }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
-
- context 'when user is unauthorized' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
-
- context 'when user is a guest' do
- let(:user) { guest }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:index)
- end
- end
- end
-
- describe 'GET #show' do
- def make_request
- get :show, params: project_params(id: resource)
- end
-
- let_it_be(:resource) { create(:incident, project: project) }
-
- let(:user) { developer }
-
- it 'renders incident page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
-
- expect(assigns(:incident)).to be_present
- expect(assigns(:incident).author.association(:status)).to be_loaded
- expect(assigns(:issue)).to be_present
- expect(assigns(:noteable)).to eq(assigns(:incident))
- end
-
- context 'with non existing id' do
- let(:resource) { non_existing_record_id }
-
- it_behaves_like 'not found'
- end
-
- context 'for issue' do
- let_it_be(:resource) { create(:issue, project: project) }
-
- it_behaves_like 'not found'
- end
-
- context 'when user is a guest' do
- let(:user) { guest }
-
- it 'shows the page' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:show)
- end
- end
-
- context 'when unauthorized' do
- let(:user) { anonymous }
-
- it_behaves_like 'login required'
- end
- end
-
- private
-
- def project_params(opts = {})
- opts.reverse_merge(namespace_id: project.namespace, project_id: project)
- end
-end
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index 5e9135c00e3..f9ce77a44ba 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -1809,7 +1809,7 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
create(:user_status, user: second_discussion.author)
expect { get :discussions, params: { namespace_id: project.namespace, project_id: project, id: issue.iid } }
- .not_to exceed_query_limit(control)
+ .not_to exceed_query_limit(control).with_threshold(9)
end
context 'when user is setting notes filters' do
diff --git a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
index c3a5255b584..68fbeb00b67 100644
--- a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb
@@ -54,7 +54,7 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
end
it 'does not allow draft note creation' do
- expect { create_draft_note }.to change { DraftNote.count }.by(0)
+ expect { create_draft_note }.not_to change { DraftNote.count }
expect(response).to have_gitlab_http_status(:not_found)
end
end
@@ -172,6 +172,33 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
end
end
end
+
+ context 'when the draft note is invalid' do
+ let_it_be(:draft_note) { DraftNote.new }
+
+ before do
+ errors = ActiveModel::Errors.new(draft_note)
+ errors.add(:base, 'Error 1')
+ errors.add(:base, 'Error 2')
+
+ allow(draft_note).to receive(:errors).and_return(errors)
+
+ allow_next_instance_of(DraftNotes::CreateService) do |service|
+ allow(service).to receive(:execute).and_return(draft_note)
+ end
+ end
+
+ it 'does not allow draft note creation' do
+ expect { create_draft_note }.not_to change { DraftNote.count }
+ end
+
+ it "returns status 422", :aggregate_failures do
+ create_draft_note
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(response.body).to eq('{"errors":"Error 1 and Error 2"}')
+ end
+ end
end
describe 'PUT #update' do
@@ -212,6 +239,30 @@ RSpec.describe Projects::MergeRequests::DraftsController, feature_category: :cod
expect(draft.note).to eq('This is an updated unpublished comment')
expect(json_response['note_html']).not_to be_empty
end
+
+ context 'when the draft note is invalid' do
+ before do
+ errors = ActiveModel::Errors.new(draft)
+ errors.add(:base, 'Error 1')
+ errors.add(:base, 'Error 2')
+
+ allow_next_found_instance_of(DraftNote) do |instance|
+ allow(instance).to receive(:update).and_return(false)
+ allow(instance).to receive(:errors).and_return(errors)
+ end
+ end
+
+ it 'does not update the draft' do
+ expect { update_draft_note }.not_to change { draft.reload.note }
+ end
+
+ it 'returns status 422', :aggregate_failures do
+ update_draft_note
+
+ expect(response).to have_gitlab_http_status(:unprocessable_entity)
+ expect(response.body).to eq('{"errors":"Error 1 and Error 2"}')
+ end
+ end
end
describe 'POST #publish' do
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 4a5283f1127..940f6fed906 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -39,6 +39,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
specify { expect(get(:index, params: request_params)).to have_request_urgency(:medium) }
+ it 'sets the correct feature category' do
+ get :index, params: request_params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('team_planning')
+ end
+
it 'passes last_fetched_at from headers to NotesFinder and MergeIntoNotesService' do
last_fetched_at = Time.zone.at(3.hours.ago.to_i) # remove nanoseconds
@@ -149,6 +155,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
expect(note_json[:discussion_line_code]).to be_nil
end
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+
context 'when user cannot read commit' do
before do
allow(Ability).to receive(:allowed?).and_call_original
@@ -164,7 +176,29 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
end
end
- context 'for a regular note' do
+ context 'for a snippet note' do
+ let(:project_snippet) { create(:project_snippet, project: project) }
+ let!(:note) { create(:note_on_project_snippet, project: project, noteable: project_snippet) }
+
+ let(:params) { request_params.merge(target_type: 'project_snippet', target_id: project_snippet.id, html: true) }
+
+ it 'responds with the expected attributes' do
+ get :index, params: params
+
+ expect(note_json[:id]).to eq(note.id)
+ expect(note_json[:discussion_html]).to be_nil
+ expect(note_json[:diff_discussion_html]).to be_nil
+ expect(note_json[:discussion_line_code]).to be_nil
+ end
+
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
+ context 'for a merge request note' do
let!(:note) { create(:note_on_merge_request, project: project) }
let(:params) { request_params.merge(target_type: 'merge_request', target_id: note.noteable_id, html: true) }
@@ -178,6 +212,12 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
expect(note_json[:diff_discussion_html]).to be_nil
expect(note_json[:discussion_line_code]).to be_nil
end
+
+ it 'sets the correct feature category' do
+ get :index, params: params
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('code_review_workflow')
+ end
end
context 'with cross-reference system note', :request_store do
@@ -253,6 +293,68 @@ RSpec.describe Projects::NotesController, type: :controller, feature_category: :
create!
end
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('code_review_workflow')
+ end
+
+ context 'on an issue' do
+ let(:request_params) do
+ {
+ note: { note: note_text, noteable_id: issue.id, noteable_type: 'Issue' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'issue',
+ target_id: issue.id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('team_planning')
+ end
+ end
+
+ context 'on a commit' do
+ let(:commit_id) { RepoHelpers.sample_commit.id }
+ let(:request_params) do
+ {
+ note: { note: note_text, commit_id: commit_id, noteable_type: 'Commit' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'commit',
+ target_id: commit_id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
+ context 'on a project snippet' do
+ let(:project_snippet) { create(:project_snippet, project: project) }
+ let(:request_params) do
+ {
+ note: { note: note_text, noteable_id: project_snippet.id, noteable_type: 'ProjectSnippet' },
+ namespace_id: project.namespace,
+ project_id: project,
+ target_type: 'project_snippet',
+ target_id: project_snippet.id
+ }
+ end
+
+ it 'sets the correct feature category' do
+ create!
+
+ expect(::Gitlab::ApplicationContext.current_context_attribute(:feature_category)).to eq('source_code_management')
+ end
+ end
+
context 'the project is publically available' do
context 'for HTML' do
it "returns status 302" do
diff --git a/spec/controllers/projects/pipeline_schedules_controller_spec.rb b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
index 6d810fdcd51..486062fe52b 100644
--- a/spec/controllers/projects/pipeline_schedules_controller_spec.rb
+++ b/spec/controllers/projects/pipeline_schedules_controller_spec.rb
@@ -106,7 +106,8 @@ RSpec.describe Projects::PipelineSchedulesController, feature_category: :continu
end
end
- describe 'POST #create' do
+ # Move this from `shared_context` to `describe` when `ci_refactoring_pipeline_schedule_create_service` is removed.
+ shared_context 'POST #create' do # rubocop:disable RSpec/ContextWording
describe 'functionality' do
before do
project.add_developer(user)
@@ -184,6 +185,16 @@ RSpec.describe Projects::PipelineSchedulesController, feature_category: :continu
end
end
+ it_behaves_like 'POST #create'
+
+ context 'when the FF ci_refactoring_pipeline_schedule_create_service is disabled' do
+ before do
+ stub_feature_flags(ci_refactoring_pipeline_schedule_create_service: false)
+ end
+
+ it_behaves_like 'POST #create'
+ end
+
describe 'PUT #update' do
describe 'functionality' do
let!(:pipeline_schedule) { create(:ci_pipeline_schedule, project: project, owner: user) }
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 8c5f8fc6259..a5542a2b825 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -328,7 +328,7 @@ RSpec.describe Projects::PipelinesController, feature_category: :continuous_inte
expect do
get_pipeline_html
expect(response).to have_gitlab_http_status(:ok)
- end.not_to exceed_all_query_limit(control)
+ end.not_to exceed_all_query_limit(control).with_threshold(3)
end
end
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb
index ad49529b426..9657cf33afd 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/spec/controllers/projects/project_members_controller_spec.rb
@@ -320,7 +320,7 @@ RSpec.describe Projects::ProjectMembersController do
it 'returns correct json response' do
expect(json_response).to eq({
"expires_soon" => false,
- "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_s(:medium)
+ "expires_at_formatted" => expiry_date.to_time.in_time_zone.to_fs(:medium)
})
end
end
diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb
index e0e4d0f7bc5..d6816bd49af 100644
--- a/spec/controllers/projects/runners_controller_spec.rb
+++ b/spec/controllers/projects/runners_controller_spec.rb
@@ -28,52 +28,28 @@ RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do
}
end
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
+ project.add_maintainer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- it 'renders new with 200 status code' do
- get :new, params: params
+ it 'renders new with 200 status code' do
+ get :new, params: params
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:new)
- end
- end
-
- context 'when user is not maintainer' do
- before do
- project.add_developer(user)
- end
-
- it 'renders a 404' do
- get :new, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:new)
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
+ context 'when user is not maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ project.add_developer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
+ it 'renders a 404' do
+ get :new, params: params
- it 'renders a 404' do
- get :new, params: params
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
@@ -81,66 +57,40 @@ RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do
describe '#register' do
subject(:register) { get :register, params: { namespace_id: project.namespace, project_id: project, id: new_runner } }
- context 'when create_runner_workflow_for_namespace is enabled' do
+ context 'when user is maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: [project.namespace])
+ project.add_maintainer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
-
- it 'renders a :register template' do
- register
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template(:register)
- end
- end
-
- context 'when runner cannot be registered after creation' do
- let_it_be(:new_runner) { runner }
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
- it 'returns :not_found' do
- register
+ it 'renders a :register template' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:register)
end
end
- context 'when user is not maintainer' do
- before do
- project.add_developer(user)
- end
-
- context 'when runner can be registered after creation' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
+ context 'when runner cannot be registered after creation' do
+ let_it_be(:new_runner) { runner }
- it 'returns :not_found' do
- register
+ it 'returns :not_found' do
+ register
- expect(response).to have_gitlab_http_status(:not_found)
- end
+ expect(response).to have_gitlab_http_status(:not_found)
end
end
end
- context 'when create_runner_workflow_for_namespace is disabled' do
- let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
-
+ context 'when user is not maintainer' do
before do
- stub_feature_flags(create_runner_workflow_for_namespace: false)
+ project.add_developer(user)
end
- context 'when user is maintainer' do
- before do
- project.add_maintainer(user)
- end
+ context 'when runner can be registered after creation' do
+ let_it_be(:new_runner) { create(:ci_runner, :project, projects: [project], registration_type: :authenticated_user) }
it 'returns :not_found' do
register
diff --git a/spec/controllers/projects/service_desk_controller_spec.rb b/spec/controllers/projects/service_desk_controller_spec.rb
deleted file mode 100644
index 6b914ac8f19..00000000000
--- a/spec/controllers/projects/service_desk_controller_spec.rb
+++ /dev/null
@@ -1,112 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::ServiceDeskController do
- let_it_be(:project) do
- create(:project, :private, :custom_repo,
- service_desk_enabled: true,
- files: { '.gitlab/issue_templates/service_desk.md' => 'template' })
- end
-
- let_it_be(:user) { create(:user) }
-
- before do
- allow(Gitlab::Email::IncomingEmail).to receive(:enabled?) { true }
- allow(Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?) { true }
-
- project.add_maintainer(user)
- sign_in(user)
- end
-
- describe 'GET service desk properties' do
- it 'returns service_desk JSON data' do
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(json_response["service_desk_address"]).to match(/\A[^@]+@[^@]+\z/)
- expect(json_response["service_desk_enabled"]).to be_truthy
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- context 'when user is not project maintainer' do
- let(:guest) { create(:user) }
-
- it 'renders 404' do
- project.add_guest(guest)
- sign_in(guest)
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
-
- context 'when issue template is present' do
- it 'returns template_file_missing as false' do
- create(:service_desk_setting, project: project, issue_template_key: 'service_desk')
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- response_hash = Gitlab::Json.parse(response.body)
- expect(response_hash['template_file_missing']).to eq(false)
- end
- end
-
- context 'when issue template file becomes outdated' do
- it 'returns template_file_missing as true' do
- service = ServiceDeskSetting.new(project_id: project.id, issue_template_key: 'deleted')
- service.save!(validate: false)
-
- get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
-
- expect(json_response['template_file_missing']).to eq(true)
- end
- end
- end
-
- describe 'PUT service desk properties' do
- it 'toggles services desk incoming email' do
- project.update!(service_desk_enabled: false)
-
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- service_desk_enabled: true }, format: :json
-
- expect(json_response["service_desk_address"]).to be_present
- expect(json_response["service_desk_enabled"]).to be_truthy
- expect(response).to have_gitlab_http_status(:ok)
- end
-
- it 'sets issue_template_key' do
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- issue_template_key: 'service_desk' }, format: :json
-
- settings = project.service_desk_setting
- expect(settings).to be_present
- expect(settings.issue_template_key).to eq('service_desk')
- expect(json_response['template_file_missing']).to eq(false)
- expect(json_response['issue_template_key']).to eq('service_desk')
- end
-
- it 'returns an error when update of service desk settings fails' do
- put :update, params: { namespace_id: project.namespace.to_param,
- project_id: project,
- issue_template_key: 'invalid key' }, format: :json
-
- expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(json_response['message']).to eq('Issue template key is empty or does not exist')
- end
-
- context 'when user cannot admin the project' do
- let(:other_user) { create(:user) }
-
- it 'renders 404' do
- sign_in(other_user)
- put :update, params: { namespace_id: project.namespace.to_param, project_id: project, service_desk_enabled: true }, format: :json
-
- expect(response).to have_gitlab_http_status(:not_found)
- end
- end
- end
-end
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
index 1c332eadc42..a1dbd27f49a 100644
--- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb
+++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb
@@ -65,9 +65,8 @@ RSpec.describe Projects::Settings::CiCdController, feature_category: :continuous
end
context 'with group runners' do
- let_it_be(:group) { create :group }
- let_it_be(:project) { create :project, group: group }
- let_it_be(:group_runner) { create(:ci_runner, :group, groups: [group]) }
+ let(:project) { other_project }
+ let!(:group_runner) { create(:ci_runner, :group, groups: [group]) }
it 'sets group runners' do
subject
diff --git a/spec/controllers/projects/tree_controller_spec.rb b/spec/controllers/projects/tree_controller_spec.rb
index 61998d516e8..ffec670e97d 100644
--- a/spec/controllers/projects/tree_controller_spec.rb
+++ b/spec/controllers/projects/tree_controller_spec.rb
@@ -3,9 +3,9 @@
require 'spec_helper'
RSpec.describe Projects::TreeController, feature_category: :source_code_management do
- let(:project) { create(:project, :repository, previous_default_branch: previous_default_branch) }
- let(:previous_default_branch) { nil }
+ let_it_be(:project) { create(:project, :repository) }
let(:user) { create(:user) }
+ let(:redirect_with_ref_type) { true }
before do
sign_in(user)
@@ -17,10 +17,14 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
describe "GET show" do
let(:params) do
{
- namespace_id: project.namespace.to_param, project_id: project, id: id
+ namespace_id: project.namespace.to_param, project_id: project, id: id, ref_type: ref_type
}
end
+ let(:request) { get :show, params: params }
+
+ let(:ref_type) { nil }
+
# Make sure any errors accessing the tree in our views bubble up to this spec
render_views
@@ -28,26 +32,79 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
expect(::Gitlab::GitalyClient).to receive(:allow_ref_name_caching).and_call_original
project.repository.add_tag(project.creator, 'ambiguous_ref', RepoHelpers.sample_commit.id)
project.repository.add_branch(project.creator, 'ambiguous_ref', RepoHelpers.another_sample_commit.id)
- get :show, params: params
+
+ stub_feature_flags(redirect_with_ref_type: redirect_with_ref_type)
+ end
+
+ after do
+ project.repository.rm_tag(project.creator, 'ambiguous_ref')
+ project.repository.rm_branch(project.creator, 'ambiguous_ref')
end
- context 'when the ref is ambiguous' do
- let(:id) { 'ambiguous_ref' }
- let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
+ context 'when the redirect_with_ref_type flag is disabled' do
+ let(:redirect_with_ref_type) { false }
- context 'and explicitly requesting a branch' do
- let(:ref_type) { 'heads' }
+ context 'when there is a ref and tag with the same name' do
+ let(:id) { 'ambiguous_ref' }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- it 'redirects to blob#show with sha for the branch' do
- expect(response).to redirect_to(project_tree_path(project, RepoHelpers.another_sample_commit.id))
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'redirects to blob#show with sha for the branch' do
+ request
+ expect(response).to redirect_to(project_tree_path(project, RepoHelpers.another_sample_commit.id))
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
+
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
end
+ end
- context 'and explicitly requesting a tag' do
- let(:ref_type) { 'tags' }
+ describe 'delegating to ExtractsRef::RequestedRef' do
+ context 'when there is a ref and tag with the same name' do
+ let(:id) { 'ambiguous_ref' }
+ let(:params) { { namespace_id: project.namespace, project_id: project, id: id, ref_type: ref_type } }
- it 'responds with success' do
- expect(response).to be_ok
+ let(:requested_ref_double) { ExtractsRef::RequestedRef.new(project.repository, ref_type: ref_type, ref: id) }
+
+ before do
+ allow(ExtractsRef::RequestedRef).to receive(:new).with(kind_of(Repository), ref_type: ref_type, ref: id).and_return(requested_ref_double)
+ end
+
+ context 'and not specifying a ref_type' do
+ it 'finds the tags and redirects' do
+ expect(requested_ref_double).to receive(:find).and_call_original
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{id}/?ref_type=tags")
+ end
+ end
+
+ context 'and explicitly requesting a branch' do
+ let(:ref_type) { 'heads' }
+
+ it 'finds the branch' do
+ expect(requested_ref_double).not_to receive(:find)
+ request
+ expect(response).to be_ok
+ end
+ end
+
+ context 'and explicitly requesting a tag' do
+ let(:ref_type) { 'tags' }
+
+ it 'finds the tag' do
+ expect(requested_ref_double).not_to receive(:find)
+ request
+ expect(response).to be_ok
+ end
end
end
end
@@ -55,19 +112,26 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
context "valid branch, no path" do
let(:id) { 'master' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "valid branch, valid path" do
let(:id) { 'master/encoding/' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "valid branch, invalid path" do
let(:id) { 'master/invalid-path/' }
it 'redirects' do
+ request
expect(subject)
.to redirect_to("/#{project.full_path}/-/tree/master")
end
@@ -76,54 +140,91 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
context "invalid branch, valid path" do
let(:id) { 'invalid-branch/encoding/' }
- it { is_expected.to respond_with(:not_found) }
+ it 'responds with not_found' do
+ request
+ expect(subject).to respond_with(:not_found)
+ end
end
- context "renamed default branch, valid file" do
- let(:id) { 'old-default-branch/encoding/' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context 'when default branch was renamed' do
+ let_it_be_with_reload(:project) { create(:project, :repository, previous_default_branch: 'old-default-branch') }
- it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/encoding/") }
- end
+ context "and the file is valid" do
+ let(:id) { 'old-default-branch/encoding/' }
+
+ it 'redirects' do
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/encoding/")
+ end
+ end
- context "renamed default branch, invalid file" do
- let(:id) { 'old-default-branch/invalid-path/' }
- let(:previous_default_branch) { 'old-default-branch' }
+ context "and the file is invalid" do
+ let(:id) { 'old-default-branch/invalid-path/' }
- it { is_expected.to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/invalid-path/") }
+ it 'redirects' do
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/#{project.default_branch}/invalid-path/")
+ end
+ end
end
context "valid empty branch, invalid path" do
let(:id) { 'empty-branch/invalid-path/' }
it 'redirects' do
- expect(subject)
- .to redirect_to("/#{project.full_path}/-/tree/empty-branch")
+ request
+ expect(subject).to redirect_to("/#{project.full_path}/-/tree/empty-branch")
end
end
context "valid empty branch" do
let(:id) { 'empty-branch' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
end
context "invalid SHA commit ID" do
let(:id) { 'ff39438/.gitignore' }
- it { is_expected.to respond_with(:not_found) }
+ it 'responds with not_found' do
+ request
+ expect(subject).to respond_with(:not_found)
+ end
end
context "valid SHA commit ID" do
let(:id) { '6d39438' }
- it { is_expected.to respond_with(:success) }
+ it 'responds with success' do
+ request
+ expect(response).to be_ok
+ end
+
+ context 'and there is a tag with the same name' do
+ before do
+ project.repository.add_tag(project.creator, id, RepoHelpers.sample_commit.id)
+ end
+
+ it 'responds with success' do
+ request
+
+ # This uses the tag
+ # TODO: Should we redirect in this case?
+ expect(response).to be_ok
+ end
+ end
end
context "valid SHA commit ID with path" do
let(:id) { '6d39438/.gitignore' }
- it { expect(response).to have_gitlab_http_status(:found) }
+ it 'responds with found' do
+ request
+ expect(response).to have_gitlab_http_status(:found)
+ end
end
end
@@ -149,7 +250,7 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
before do
get :show, params: {
- namespace_id: project.namespace.to_param, project_id: project, id: id
+ namespace_id: project.namespace.to_param, project_id: project, id: id, ref_type: 'heads'
}
end
@@ -157,7 +258,7 @@ RSpec.describe Projects::TreeController, feature_category: :source_code_manageme
let(:id) { 'master/README.md' }
it 'redirects' do
- redirect_url = "/#{project.full_path}/-/blob/master/README.md"
+ redirect_url = "/#{project.full_path}/-/blob/master/README.md?ref_type=heads"
expect(subject).to redirect_to(redirect_url)
end
end