diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-07-19 17:16:28 +0300 |
commit | e4384360a16dd9a19d4d2d25d0ef1f2b862ed2a6 (patch) | |
tree | 2fcdfa7dcdb9db8f5208b2562f4b4e803d671243 /spec/controllers/projects | |
parent | ffda4e7bcac36987f936b4ba515995a6698698f0 (diff) |
Add latest changes from gitlab-org/gitlab@16-2-stable-eev16.2.0-rc42
Diffstat (limited to 'spec/controllers/projects')
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 |