diff options
Diffstat (limited to 'spec/controllers/projects')
15 files changed, 219 insertions, 248 deletions
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb index f410c16b30b..d51880b282d 100644 --- a/spec/controllers/projects/artifacts_controller_spec.rb +++ b/spec/controllers/projects/artifacts_controller_spec.rb @@ -323,6 +323,7 @@ RSpec.describe Projects::ArtifactsController do subject expect(response).to have_gitlab_http_status(:ok) + expect(response.headers['Gitlab-Workhorse-Detect-Content-Type']).to eq('true') expect(send_data).to start_with('artifacts-entry:') expect(params.keys).to eq(%w(Archive Entry)) @@ -338,7 +339,7 @@ RSpec.describe Projects::ArtifactsController do def params @params ||= begin - base64_params = send_data.sub(/\Aartifacts\-entry:/, '') + base64_params = send_data.delete_prefix('artifacts-entry:') Gitlab::Json.parse(Base64.urlsafe_decode64(base64_params)) end end diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index ea22e6b6f10..1580ad9361d 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -688,21 +688,23 @@ RSpec.describe Projects::BranchesController do end context 'when gitaly is not available' do + let(:request) { get :index, format: :html, params: { namespace_id: project.namespace, project_id: project } } + before do allow_next_instance_of(Gitlab::GitalyClient::RefService) do |ref_service| allow(ref_service).to receive(:local_branches).and_raise(GRPC::DeadlineExceeded) end - - get :index, format: :html, params: { - namespace_id: project.namespace, project_id: project - } end - it 'returns with a status 200' do - expect(response).to have_gitlab_http_status(:ok) + it 'returns with a status 503' do + request + + expect(response).to have_gitlab_http_status(:service_unavailable) end it 'sets gitaly_unavailable variable' do + request + expect(assigns[:gitaly_unavailable]).to be_truthy end end diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb index 72fee40a6e9..a72c98552a5 100644 --- a/spec/controllers/projects/commit_controller_spec.rb +++ b/spec/controllers/projects/commit_controller_spec.rb @@ -60,6 +60,22 @@ RSpec.describe Projects::CommitController do end end + context 'with valid page' do + it 'responds with 200' do + go(id: commit.id, page: 1) + + expect(response).to be_ok + end + end + + context 'with invalid page' do + it 'does not return an error' do + go(id: commit.id, page: ['invalid']) + + expect(response).to be_ok + end + end + it 'handles binary files' do go(id: TestEnv::BRANCH_SHA['binary-encoding'], format: 'html') @@ -212,6 +228,21 @@ RSpec.describe Projects::CommitController do end end + context 'when the revert commit is missing' do + it 'renders the 404 page' do + post(:revert, + params: { + namespace_id: project.namespace, + project_id: project, + start_branch: 'master', + id: '1234567890' + }) + + expect(response).not_to be_successful + expect(response).to have_gitlab_http_status(:not_found) + end + end + context 'when the revert was successful' do it 'redirects to the commits page' do post(:revert, @@ -269,6 +300,21 @@ RSpec.describe Projects::CommitController do end end + context 'when the cherry-pick commit is missing' do + it 'renders the 404 page' do + post(:cherry_pick, + params: { + namespace_id: project.namespace, + project_id: project, + start_branch: 'master', + id: '1234567890' + }) + + expect(response).not_to be_successful + expect(response).to have_gitlab_http_status(:not_found) + end + end + context 'when the cherry-pick was successful' do it 'redirects to the commits page' do post(:cherry_pick, diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb index 62b93a2728b..9821618df8d 100644 --- a/spec/controllers/projects/compare_controller_spec.rb +++ b/spec/controllers/projects/compare_controller_spec.rb @@ -58,11 +58,13 @@ RSpec.describe Projects::CompareController do from_project_id: from_project_id, from: from_ref, to: to_ref, - w: whitespace + w: whitespace, + page: page } end let(:whitespace) { nil } + let(:page) { nil } context 'when the refs exist in the same project' do context 'when we set the white space param' do @@ -196,6 +198,34 @@ RSpec.describe Projects::CompareController do expect(response).to have_gitlab_http_status(:found) end end + + context 'when page is valid' do + let(:from_project_id) { nil } + let(:from_ref) { '08f22f25' } + let(:to_ref) { '66eceea0' } + let(:page) { 1 } + + it 'shows the diff' do + show_request + + expect(response).to be_successful + expect(assigns(:diffs).diff_files.first).to be_present + expect(assigns(:commits).length).to be >= 1 + end + end + + context 'when page is not valid' do + let(:from_project_id) { nil } + let(:from_ref) { '08f22f25' } + let(:to_ref) { '66eceea0' } + let(:page) { ['invalid'] } + + it 'does not return an error' do + show_request + + expect(response).to be_successful + end + end end describe 'GET diff_for_path' do diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb index fdfc21887a6..f4cad5790a3 100644 --- a/spec/controllers/projects/environments_controller_spec.rb +++ b/spec/controllers/projects/environments_controller_spec.rb @@ -254,38 +254,54 @@ RSpec.describe Projects::EnvironmentsController do end describe 'PATCH #stop' do + subject { patch :stop, params: environment_params(format: :json) } + context 'when env not available' do it 'returns 404' do allow_any_instance_of(Environment).to receive(:available?) { false } - patch :stop, params: environment_params(format: :json) + subject expect(response).to have_gitlab_http_status(:not_found) end end context 'when stop action' do - it 'returns action url' do + it 'returns action url for single stop action' do action = create(:ci_build, :manual) allow_any_instance_of(Environment) - .to receive_messages(available?: true, stop_with_action!: action) + .to receive_messages(available?: true, stop_with_actions!: [action]) - patch :stop, params: environment_params(format: :json) + subject expect(response).to have_gitlab_http_status(:ok) expect(json_response).to eq( { 'redirect_url' => project_job_url(project, action) }) end + + it 'returns environment url for multiple stop actions' do + actions = create_list(:ci_build, 2, :manual) + + allow_any_instance_of(Environment) + .to receive_messages(available?: true, stop_with_actions!: actions) + + subject + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to eq( + { 'redirect_url' => + project_environment_url(project, environment) }) + end end context 'when no stop action' do it 'returns env url' do allow_any_instance_of(Environment) - .to receive_messages(available?: true, stop_with_action!: nil) + .to receive_messages(available?: true, stop_with_actions!: nil) - patch :stop, params: environment_params(format: :json) + subject expect(response).to have_gitlab_http_status(:ok) expect(json_response).to eq( diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb index ea15d483c90..96705d82ac5 100644 --- a/spec/controllers/projects/group_links_controller_spec.rb +++ b/spec/controllers/projects/group_links_controller_spec.rb @@ -18,136 +18,6 @@ RSpec.describe Projects::GroupLinksController do travel_back end - describe '#create' do - shared_context 'link project to group' do - before do - post(:create, params: { - namespace_id: project.namespace, - project_id: project, - link_group_id: group.id, - link_group_access: ProjectGroupLink.default_access - }) - end - end - - context 'when project is not allowed to be shared with a group' do - before do - group.update!(share_with_group_lock: false) - end - - include_context 'link project to group' - - it 'responds with status 404' do - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'when user has access to group they want to link project to' do - before do - group.add_developer(user) - end - - include_context 'link project to group' - - it 'links project with selected group' do - expect(group.shared_projects).to include project - end - - it 'redirects to project group links page' do - expect(response).to redirect_to( - project_project_members_path(project) - ) - end - end - - context 'when user doers not have access to group they want to link to' do - include_context 'link project to group' - - it 'renders 404' do - expect(response).to have_gitlab_http_status(:not_found) - end - - it 'does not share project with that group' do - expect(group.shared_projects).not_to include project - end - end - - context 'when user does not have access to the public group' do - let(:group) { create(:group, :public) } - - include_context 'link project to group' - - it 'renders 404' do - expect(response).to have_gitlab_http_status(:not_found) - end - - it 'does not share project with that group' do - expect(group.shared_projects).not_to include project - end - end - - context 'when project group id equal link group id' do - before do - group2.add_developer(user) - - post(:create, params: { - namespace_id: project.namespace, - project_id: project, - link_group_id: group2.id, - link_group_access: ProjectGroupLink.default_access - }) - end - - it 'does not share project with selected group' do - expect(group2.shared_projects).not_to include project - end - - it 'redirects to project group links page' do - expect(response).to redirect_to( - project_project_members_path(project) - ) - end - end - - context 'when link group id is not present' do - before do - post(:create, params: { - namespace_id: project.namespace, - project_id: project, - link_group_access: ProjectGroupLink.default_access - }) - end - - it 'redirects to project group links page' do - expect(response).to redirect_to( - project_project_members_path(project) - ) - expect(flash[:alert]).to eq('Please select a group.') - end - end - - context 'when link is not persisted in the database' do - before do - allow(::Projects::GroupLinks::CreateService).to receive_message_chain(:new, :execute) - .and_return({ status: :error, http_status: 409, message: 'error' }) - - post(:create, params: { - namespace_id: project.namespace, - project_id: project, - link_group_id: group.id, - link_group_access: ProjectGroupLink.default_access - }) - end - - it 'redirects to project group links page' do - expect(response).to redirect_to( - project_project_members_path(project) - ) - expect(flash[:alert]).to eq('error') - end - end - end - describe '#update' do let_it_be(:link) do create( diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 9d3711d8a96..ce0af784cdf 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -148,6 +148,13 @@ RSpec.describe Projects::IssuesController do allow(Kaminari.config).to receive(:default_per_page).and_return(1) end + it 'redirects to last page when out of bounds on non-html requests' do + get :index, params: params.merge(page: last_page + 1), format: 'atom' + + expect(response).to have_gitlab_http_status(:redirect) + expect(response).to redirect_to(action: 'index', format: 'atom', page: last_page, state: 'opened') + end + it 'does not use pagination if disabled' do allow(controller).to receive(:pagination_disabled?).and_return(true) diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb index ed68d6a87b8..e9f1232b5e7 100644 --- a/spec/controllers/projects/jobs_controller_spec.rb +++ b/spec/controllers/projects/jobs_controller_spec.rb @@ -796,7 +796,7 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do retried_build = Ci::Build.last - Ci::RetryBuildService.clone_accessors.each do |accessor| + Ci::Build.clone_accessors.each do |accessor| expect(job.read_attribute(accessor)) .to eq(retried_build.read_attribute(accessor)), "Mismatched attribute on \"#{accessor}\". " \ diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb index 2df31904380..07874c8a8af 100644 --- a/spec/controllers/projects/notes_controller_spec.rb +++ b/spec/controllers/projects/notes_controller_spec.rb @@ -423,7 +423,21 @@ RSpec.describe Projects::NotesController do end context 'when creating a confidential note' do - let(:extra_request_params) { { format: :json } } + let(:project) { create(:project) } + let(:note_params) do + { note: note_text, noteable_id: issue.id, noteable_type: 'Issue' }.merge(extra_note_params) + end + + let(:request_params) do + { + note: note_params, + namespace_id: project.namespace, + project_id: project, + target_type: 'issue', + target_id: issue.id, + format: :json + } + end context 'when `confidential` parameter is not provided' do it 'sets `confidential` to `false` in JSON response' do diff --git a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb index a655c742973..fc741d0f3f6 100644 --- a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb +++ b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb @@ -41,17 +41,5 @@ RSpec.describe Projects::Packages::InfrastructureRegistryController do it_behaves_like 'returning response status', :not_found end - - context 'with package file pending destruction' do - let_it_be(:package_file_pending_destruction) { create(:package_file, :pending_destruction, package: terraform_module) } - - let(:terraform_module_package_file) { terraform_module.package_files.first } - - it 'does not return them' do - subject - - expect(assigns(:package_files)).to contain_exactly(terraform_module_package_file) - end - end end end diff --git a/spec/controllers/projects/pipelines/tests_controller_spec.rb b/spec/controllers/projects/pipelines/tests_controller_spec.rb index e6ff3a487ac..113781bab7c 100644 --- a/spec/controllers/projects/pipelines/tests_controller_spec.rb +++ b/spec/controllers/projects/pipelines/tests_controller_spec.rb @@ -40,28 +40,56 @@ RSpec.describe Projects::Pipelines::TestsController do let(:suite_name) { 'test' } let(:build_ids) { pipeline.latest_builds.pluck(:id) } - before do - build = main_pipeline.builds.last - build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window - - # The JUnit fixture for the given build has 3 failures. - # This service will create 1 test case failure record for each. - Ci::TestFailureHistoryService.new(main_pipeline).execute + context 'when artifacts are expired' do + before do + pipeline.job_artifacts.first.update!(expire_at: Date.yesterday) + end + + it 'renders not_found errors', :aggregate_failures do + get_tests_show_json(build_ids) + + expect(response).to have_gitlab_http_status(:not_found) + expect(json_response['errors']).to eq('Test report artifacts have expired') + end + + context 'when ci_test_report_artifacts_expired is disabled' do + before do + stub_feature_flags(ci_test_report_artifacts_expired: false) + end + it 'renders test suite', :aggregate_failures do + get_tests_show_json(build_ids) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response['name']).to eq('test') + end + end end - it 'renders test suite data' do - get_tests_show_json(build_ids) - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['name']).to eq('test') - - # Each test failure in this pipeline has a matching failure in the default branch - recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] } - expect(recent_failures).to eq([ - { 'count' => 1, 'base_branch' => 'master' }, - { 'count' => 1, 'base_branch' => 'master' }, - { 'count' => 1, 'base_branch' => 'master' } - ]) + context 'when artifacts are not expired' do + before do + build = main_pipeline.builds.last + build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window + + # The JUnit fixture for the given build has 3 failures. + # This service will create 1 test case failure record for each. + Ci::TestFailureHistoryService.new(main_pipeline).execute + end + + it 'renders test suite data', :aggregate_failures do + get_tests_show_json(build_ids) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response['name']).to eq('test') + expect(json_response['artifacts_expired']).to be_falsey + + # Each test failure in this pipeline has a matching failure in the default branch + recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] } + expect(recent_failures).to eq([ + { 'count' => 1, 'base_branch' => 'master' }, + { 'count' => 1, 'base_branch' => 'master' }, + { 'count' => 1, 'base_branch' => 'master' } + ]) + end end end diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb index 35e5422d072..7e96c59fbb1 100644 --- a/spec/controllers/projects/services_controller_spec.rb +++ b/spec/controllers/projects/services_controller_spec.rb @@ -359,10 +359,9 @@ RSpec.describe Projects::ServicesController do def prometheus_integration_as_data pi = project.prometheus_integration.reload attrs = pi.attributes.except('encrypted_properties', - 'encrypted_properties_iv', - 'encrypted_properties_tmp') + 'encrypted_properties_iv') - [attrs, pi.encrypted_properties_tmp] + [attrs, pi.properties] end end diff --git a/spec/controllers/projects/static_site_editor_controller_spec.rb b/spec/controllers/projects/static_site_editor_controller_spec.rb index 26161b5fb5c..e1f25589eeb 100644 --- a/spec/controllers/projects/static_site_editor_controller_spec.rb +++ b/spec/controllers/projects/static_site_editor_controller_spec.rb @@ -76,12 +76,11 @@ RSpec.describe Projects::StaticSiteEditorController do get :show, params: default_params end - it 'increases the views counter' do - expect(Gitlab::UsageDataCounters::StaticSiteEditorCounter).to have_received(:increment_views_count) - end + it 'redirects to the Web IDE' do + get :show, params: default_params - it 'renders the edit page' do - expect(response).to render_template(:show) + expected_path_regex = %r[-/ide/project/#{project.full_path}/edit/master/-/README.md] + expect(response).to redirect_to(expected_path_regex) end it 'assigns ref and path variables' do @@ -96,62 +95,6 @@ RSpec.describe Projects::StaticSiteEditorController do expect(response).to have_gitlab_http_status(:not_found) end end - - context 'when invalid config file' do - let(:service_response) { ServiceResponse.error(message: 'invalid') } - - it 'redirects to project page and flashes error message' do - expect(response).to redirect_to(project_path(project)) - expect(controller).to set_flash[:alert].to('invalid') - end - end - - context 'with a service response payload containing multiple data types' do - let(:data) do - { - a_string: 'string', - an_array: [ - { - foo: 'bar' - } - ], - an_integer: 123, - a_hash: { - a_deeper_hash: { - foo: 'bar' - } - }, - a_boolean: true, - a_nil: nil - } - end - - let(:assigns_data) { assigns(:data) } - - it 'leaves data values which are strings as strings' do - expect(assigns_data[:a_string]).to eq('string') - end - - it 'leaves data values which are integers as integers' do - expect(assigns_data[:an_integer]).to eq(123) - end - - it 'serializes data values which are booleans to JSON' do - expect(assigns_data[:a_boolean]).to eq('true') - end - - it 'serializes data values which are arrays to JSON' do - expect(assigns_data[:an_array]).to eq('[{"foo":"bar"}]') - end - - it 'serializes data values which are hashes to JSON' do - expect(assigns_data[:a_hash]).to eq('{"a_deeper_hash":{"foo":"bar"}}') - end - - it 'serializes data values which are nil to an empty string' do - expect(assigns_data[:a_nil]).to eq('') - end - end end end end diff --git a/spec/controllers/projects/todos_controller_spec.rb b/spec/controllers/projects/todos_controller_spec.rb index 9a73417ffdb..d87f4258b9c 100644 --- a/spec/controllers/projects/todos_controller_spec.rb +++ b/spec/controllers/projects/todos_controller_spec.rb @@ -8,7 +8,7 @@ RSpec.describe Projects::TodosController do let(:issue) { create(:issue, project: project) } let(:merge_request) { create(:merge_request, source_project: project) } - let(:design) { create(:design, project: project, issue: issue) } + let(:design) { create(:design, :with_versions, project: project, issue: issue) } let(:parent) { project } shared_examples 'issuable todo actions' do diff --git a/spec/controllers/projects/usage_quotas_controller_spec.rb b/spec/controllers/projects/usage_quotas_controller_spec.rb index 6125ba13f96..2831de00348 100644 --- a/spec/controllers/projects/usage_quotas_controller_spec.rb +++ b/spec/controllers/projects/usage_quotas_controller_spec.rb @@ -4,17 +4,44 @@ require 'spec_helper' RSpec.describe Projects::UsageQuotasController do let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, namespace: user.namespace) } + let_it_be(:group) { create(:group) } + let_it_be(:project) { create(:project, group: group) } describe 'GET #index' do render_views - it 'does not render search settings partial' do + subject { get(:index, params: { namespace_id: project.namespace, project_id: project }) } + + before do sign_in(user) - get(:index, params: { namespace_id: user.namespace, project_id: project }) + end + + context 'when user does not have read_usage_quotas permission' do + before do + project.add_developer(user) + end + + it 'renders not_found' do + subject + + expect(response).to render_template('errors/not_found') + expect(response).not_to render_template('shared/search_settings') + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'when user has read_usage_quotas permission' do + before do + project.add_maintainer(user) + end + + it 'renders index with 200 status code' do + subject - expect(response).to render_template('index') - expect(response).not_to render_template('shared/search_settings') + expect(response).to render_template('index') + expect(response).not_to render_template('shared/search_settings') + expect(response).to have_gitlab_http_status(:ok) + end end end end |