diff options
Diffstat (limited to 'spec/controllers/projects')
26 files changed, 406 insertions, 139 deletions
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb index 754b0ddfb94..f410c16b30b 100644 --- a/spec/controllers/projects/artifacts_controller_spec.rb +++ b/spec/controllers/projects/artifacts_controller_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Projects::ArtifactsController do include RepoHelpers - let(:user) { project.owner } + let(:user) { project.first_owner } let_it_be(:project) { create(:project, :repository, :public) } let_it_be(:pipeline, reload: true) do diff --git a/spec/controllers/projects/autocomplete_sources_controller_spec.rb b/spec/controllers/projects/autocomplete_sources_controller_spec.rb index 865b31a28d7..79edc261809 100644 --- a/spec/controllers/projects/autocomplete_sources_controller_spec.rb +++ b/spec/controllers/projects/autocomplete_sources_controller_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Projects::AutocompleteSourcesController do - let_it_be(:group) { create(:group) } + let_it_be(:group, reload: true) { create(:group) } let_it_be(:project) { create(:project, namespace: group) } let_it_be(:issue) { create(:issue, project: project) } let_it_be(:user) { create(:user) } @@ -69,4 +69,62 @@ RSpec.describe Projects::AutocompleteSourcesController do end end end + + describe 'GET contacts' do + let_it_be(:contact_1) { create(:contact, group: group) } + let_it_be(:contact_2) { create(:contact, group: group) } + + before do + sign_in(user) + end + + context 'when feature flag is enabled' do + context 'when a group has contact relations enabled' do + before do + create(:crm_settings, group: group, enabled: true) + end + + context 'when a user can read contacts' do + it 'lists contacts' do + group.add_developer(user) + + get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path } + + emails = json_response.map { |contact_data| contact_data["email"] } + expect(emails).to match_array([contact_1.email, contact_2.email]) + end + end + + context 'when a user can not read contacts' do + it 'renders 404' do + get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end + + context 'when a group has contact relations disabled' do + it 'renders 404' do + group.add_developer(user) + + get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(customer_relations: false) + end + + it 'renders 404' do + get :contacts, format: :json, params: { namespace_id: group.path, project_id: project.path } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end end diff --git a/spec/controllers/projects/avatars_controller_spec.rb b/spec/controllers/projects/avatars_controller_spec.rb index 35878fe4c2d..39a373ed6b6 100644 --- a/spec/controllers/projects/avatars_controller_spec.rb +++ b/spec/controllers/projects/avatars_controller_spec.rb @@ -38,7 +38,7 @@ RSpec.describe Projects::AvatarsController do end it 'sets appropriate caching headers' do - sign_in(project.owner) + sign_in(project.first_owner) subject expect(response.cache_control[:public]).to eq(true) @@ -63,7 +63,7 @@ RSpec.describe Projects::AvatarsController do let(:project) { create(:project, :repository, avatar: fixture_file_upload("spec/fixtures/dk.png", "image/png")) } before do - sign_in(project.owner) + sign_in(project.first_owner) end it 'removes avatar from DB by calling destroy' do diff --git a/spec/controllers/projects/badges_controller_spec.rb b/spec/controllers/projects/badges_controller_spec.rb index 242b2fd3ec6..d41e8d6169f 100644 --- a/spec/controllers/projects/badges_controller_spec.rb +++ b/spec/controllers/projects/badges_controller_spec.rb @@ -7,39 +7,100 @@ RSpec.describe Projects::BadgesController do let_it_be(:pipeline, reload: true) { create(:ci_empty_pipeline, project: project) } let_it_be(:user) { create(:user) } - shared_examples 'a badge resource' do |badge_type| - context 'when pipelines are public' do + shared_context 'renders badge irrespective of project access levels' do |badge_type| + context 'when project is public' do before do - project.update!(public_builds: true) + project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) end - context 'when project is public' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - end + it "returns the #{badge_type} badge to unauthenticated users" do + get_badge(badge_type) - it "returns the #{badge_type} badge to unauthenticated users" do - get_badge(badge_type) + expect(response).to have_gitlab_http_status(:ok) + end + end - expect(response).to have_gitlab_http_status(:ok) - end + context 'when project is restricted' do + before do + project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + project.add_guest(user) + sign_in(user) end - context 'when project is restricted' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - project.add_guest(user) - sign_in(user) - end + it "returns the #{badge_type} badge to guest users" do + get_badge(badge_type) - it "returns the #{badge_type} badge to guest users" do - get_badge(badge_type) + expect(response).to have_gitlab_http_status(:ok) + end + end + end - expect(response).to have_gitlab_http_status(:ok) - end + shared_context 'when pipelines are public' do |badge_type| + before do + project.update!(public_builds: true) + end + + it_behaves_like 'renders badge irrespective of project access levels', badge_type + end + + shared_context 'when pipelines are not public' do |badge_type| + before do + project.update!(public_builds: false) + end + + context 'when project is public' do + before do + project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) + end + + it 'returns 404 to unauthenticated users' do + get_badge(badge_type) + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'when project is restricted to the user' do + before do + project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + project.add_guest(user) + sign_in(user) + end + + it 'defaults to project permissions' do + get_badge(badge_type) + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end + + shared_context 'customization' do |badge_type| + render_views + + before do + project.add_maintainer(user) + sign_in(user) + end + + context 'when key_text param is used' do + it 'sets custom key text' do + get_badge(badge_type, key_text: 'custom key text') + + expect(response.body).to include('custom key text') + end + end + + context 'when key_width param is used' do + it 'sets custom key width' do + get_badge(badge_type, key_width: '123') + + expect(response.body).to include('123') end end + end + shared_examples 'a badge resource' do |badge_type| context 'format' do before do project.add_maintainer(user) @@ -77,61 +138,11 @@ RSpec.describe Projects::BadgesController do end end - context 'when pipelines are not public' do - before do - project.update!(public_builds: false) - end - - context 'when project is public' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - end - - it 'returns 404 to unauthenticated users' do - get_badge(badge_type) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - - context 'when project is restricted to the user' do - before do - project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - project.add_guest(user) - sign_in(user) - end - - it 'defaults to project permissions' do - get_badge(badge_type) - - expect(response).to have_gitlab_http_status(:not_found) - end - end - end - - context 'customization' do - render_views - - before do - project.add_maintainer(user) - sign_in(user) - end - - context 'when key_text param is used' do - it 'sets custom key text' do - get_badge(badge_type, key_text: 'custom key text') - - expect(response.body).to include('custom key text') - end - end - - context 'when key_width param is used' do - it 'sets custom key width' do - get_badge(badge_type, key_width: '123') + it_behaves_like 'customization', badge_type - expect(response.body).to include('123') - end - end + if [:pipeline, :coverage].include?(badge_type) + it_behaves_like 'when pipelines are public', badge_type + it_behaves_like 'when pipelines are not public', badge_type end end @@ -163,6 +174,13 @@ RSpec.describe Projects::BadgesController do it_behaves_like 'a badge resource', :coverage end + describe '#release' do + action = :release + + it_behaves_like 'a badge resource', action + it_behaves_like 'renders badge irrespective of project access levels', action + end + def get_badge(badge, args = {}) params = { namespace_id: project.namespace.to_param, diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index d9dedb04b0d..ea22e6b6f10 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -657,6 +657,36 @@ RSpec.describe Projects::BranchesController do end end + context 'sorting', :aggregate_failures do + let(:sort) { 'name_asc' } + + before do + get :index, format: :html, params: { + namespace_id: project.namespace, project_id: project, state: 'all', sort: sort + } + end + + it { expect(assigns[:sort]).to eq('name_asc') } + + context 'when sort is not provided' do + let(:sort) { nil } + + it 'uses a default sort without an error message' do + expect(assigns[:sort]).to eq('updated_desc') + expect(controller).not_to set_flash.now[:alert] + end + end + + context 'when sort is not supported' do + let(:sort) { 'unknown' } + + it 'uses a default sort and shows an error message' do + expect(assigns[:sort]).to eq('updated_desc') + expect(controller).to set_flash.now[:alert].to(/Unsupported sort/) + end + end + end + context 'when gitaly is not available' do before do allow_next_instance_of(Gitlab::GitalyClient::RefService) do |ref_service| diff --git a/spec/controllers/projects/clusters_controller_spec.rb b/spec/controllers/projects/clusters_controller_spec.rb index 2a8feb09780..d0bef810ec8 100644 --- a/spec/controllers/projects/clusters_controller_spec.rb +++ b/spec/controllers/projects/clusters_controller_spec.rb @@ -101,7 +101,7 @@ RSpec.describe Projects::ClustersController do it { expect { go }.to be_allowed_for(:owner).of(project) } it { expect { go }.to be_allowed_for(:maintainer).of(project) } - it { expect { go }.to be_denied_for(:developer).of(project) } + it { expect { go }.to be_allowed_for(:developer).of(project) } it { expect { go }.to be_denied_for(:reporter).of(project) } it { expect { go }.to be_denied_for(:guest).of(project) } it { expect { go }.to be_denied_for(:user) } @@ -315,7 +315,8 @@ RSpec.describe Projects::ClustersController do .to receive(:expires_at_in_session).and_return(1.hour.since.to_i.to_s) allow_any_instance_of(GoogleApi::CloudPlatform::Client) .to receive(:projects_zones_clusters_create) do - OpenStruct.new( + double( + 'secure', self_link: 'projects/gcp-project-12345/zones/us-central1-a/operations/ope-123', status: 'RUNNING' ) @@ -711,7 +712,7 @@ RSpec.describe Projects::ClustersController do end it { expect { go }.to be_allowed_for(:owner).of(project) } it { expect { go }.to be_allowed_for(:maintainer).of(project) } - it { expect { go }.to be_denied_for(:developer).of(project) } + it { expect { go }.to be_allowed_for(:developer).of(project) } it { expect { go }.to be_denied_for(:reporter).of(project) } it { expect { go }.to be_denied_for(:guest).of(project) } it { expect { go }.to be_denied_for(:user) } diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb index 16bb33e95c8..72fee40a6e9 100644 --- a/spec/controllers/projects/commit_controller_spec.rb +++ b/spec/controllers/projects/commit_controller_spec.rb @@ -183,6 +183,18 @@ RSpec.describe Projects::CommitController do expect(assigns(:tags)).to eq([]) expect(assigns(:tags_limit_exceeded)).to be_truthy end + + context 'when commit is not found' do + it 'responds with 404' do + get(:branches, params: { + namespace_id: project.namespace, + project_id: project, + id: '11111111111111111111111111111111111111' + }) + + expect(response).to be_not_found + end + end end describe 'POST revert' do diff --git a/spec/controllers/projects/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb index fd840fafa61..c7f98406201 100644 --- a/spec/controllers/projects/commits_controller_spec.rb +++ b/spec/controllers/projects/commits_controller_spec.rb @@ -88,6 +88,26 @@ RSpec.describe Projects::CommitsController do expect(response).to be_successful end + + context 'when limit is a hash' do + it 'uses the default limit' do + expect_any_instance_of(Repository).to receive(:commits).with( + "master", + path: "README.md", + limit: described_class::COMMITS_DEFAULT_LIMIT, + offset: 0 + ).and_call_original + + get(:show, params: { + namespace_id: project.namespace, + project_id: project, + id: id, + limit: { 'broken' => 'value' } + }) + + expect(response).to be_successful + end + end end context "when the ref name ends in .atom" do @@ -131,6 +151,20 @@ RSpec.describe Projects::CommitsController do expect(response.media_type).to eq('text/html') end end + + context 'when the ref does not exist' do + before do + get(:show, params: { + namespace_id: project.namespace, + project_id: project, + id: 'unknown.atom' + }) + end + + it 'returns 404 page' do + expect(response).to be_not_found + end + end end end diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb index 48afd42e8ff..62b93a2728b 100644 --- a/spec/controllers/projects/compare_controller_spec.rb +++ b/spec/controllers/projects/compare_controller_spec.rb @@ -25,15 +25,25 @@ RSpec.describe Projects::CompareController do end describe 'GET index' do + let(:params) { { namespace_id: project.namespace, project_id: project } } + render_views before do - get :index, params: { namespace_id: project.namespace, project_id: project } + get :index, params: params end it 'returns successfully' do expect(response).to be_successful end + + context 'with incorrect parameters' do + let(:params) { super().merge(from: { invalid: :param }, to: { also: :invalid }) } + + it 'returns successfully' do + expect(response).to be_successful + end + end end describe 'GET show' do @@ -340,12 +350,13 @@ RSpec.describe Projects::CompareController do context 'when sending invalid params' do where(:from_ref, :to_ref, :from_project_id, :expected_redirect_params) do - '' | '' | '' | {} - 'main' | '' | '' | { from: 'main' } - '' | 'main' | '' | { to: 'main' } - '' | '' | '1' | { from_project_id: 1 } - 'main' | '' | '1' | { from: 'main', from_project_id: 1 } - '' | 'main' | '1' | { to: 'main', from_project_id: 1 } + '' | '' | '' | {} + 'main' | '' | '' | { from: 'main' } + '' | 'main' | '' | { to: 'main' } + '' | '' | '1' | { from_project_id: 1 } + 'main' | '' | '1' | { from: 'main', from_project_id: 1 } + '' | 'main' | '1' | { to: 'main', from_project_id: 1 } + ['a'] | ['b'] | ['c'] | {} end with_them do diff --git a/spec/controllers/projects/forks_controller_spec.rb b/spec/controllers/projects/forks_controller_spec.rb index e53e53980b5..0f8f3b49e02 100644 --- a/spec/controllers/projects/forks_controller_spec.rb +++ b/spec/controllers/projects/forks_controller_spec.rb @@ -67,6 +67,18 @@ RSpec.describe Projects::ForksController do expect(assigns[:private_forks_count]).to eq(0) end end + + context 'when unsupported keys are provided' do + it 'ignores them' do + get :index, params: { + namespace_id: project.namespace, + project_id: project, + user: 'unsupported' + } + + expect(assigns[:forks]).to be_present + end + end end context 'when fork is internal' do diff --git a/spec/controllers/projects/group_links_controller_spec.rb b/spec/controllers/projects/group_links_controller_spec.rb index d514c486f60..ea15d483c90 100644 --- a/spec/controllers/projects/group_links_controller_spec.rb +++ b/spec/controllers/projects/group_links_controller_spec.rb @@ -178,7 +178,7 @@ RSpec.describe Projects::GroupLinksController do context 'when `expires_at` is set' do it 'returns correct json response' do - expect(json_response).to eq({ "expires_in" => "about 1 month", "expires_soon" => false }) + expect(json_response).to eq({ "expires_in" => controller.helpers.time_ago_with_tooltip(expiry_date), "expires_soon" => false }) end end diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb index 2ab18ccddbf..ebcf35a7ecd 100644 --- a/spec/controllers/projects/hooks_controller_spec.rb +++ b/spec/controllers/projects/hooks_controller_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Projects::HooksController do let_it_be(:project) { create(:project) } - let(:user) { project.owner } + let(:user) { project.first_owner } before do sign_in(user) diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index d91c1b0d29a..bf0b833b311 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -502,10 +502,7 @@ RSpec.describe Projects::IssuesController do context 'with valid params' do it 'reorders issues and returns a successful 200 response' do - reorder_issue(issue1, - move_after_id: issue2.id, - move_before_id: issue3.id, - group_full_path: group.full_path) + reorder_issue(issue1, move_after_id: issue2.id, move_before_id: issue3.id) [issue1, issue2, issue3].map(&:reload) @@ -531,12 +528,10 @@ RSpec.describe Projects::IssuesController do end it 'returns a unprocessable entity 422 response for issues not in group' do - another_group = create(:group) + other_group_project = create(:project, group: create(:group)) + other_group_issue = create(:issue, project: other_group_project) - reorder_issue(issue1, - move_after_id: issue2.id, - move_before_id: issue3.id, - group_full_path: another_group.full_path) + reorder_issue(issue1, move_after_id: issue2.id, move_before_id: other_group_issue.id) expect(response).to have_gitlab_http_status(:unprocessable_entity) end @@ -555,15 +550,14 @@ RSpec.describe Projects::IssuesController do end end - def reorder_issue(issue, move_after_id: nil, move_before_id: nil, group_full_path: nil) + def reorder_issue(issue, move_after_id: nil, move_before_id: nil) put :reorder, params: { namespace_id: project.namespace.to_param, project_id: project, id: issue.iid, move_after_id: move_after_id, - move_before_id: move_before_id, - group_full_path: group_full_path + move_before_id: move_before_id }, format: :json end diff --git a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb index e07b7e4586a..366a1e587ab 100644 --- a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe Projects::MergeRequests::ConflictsController do let(:project) { create(:project, :repository) } - let(:user) { project.owner } + let(:user) { project.first_owner } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } let(:merge_request_with_conflicts) do create(:merge_request, source_branch: 'conflict-resolvable', target_branch: 'conflict-start', source_project: project, merge_status: :unchecked) do |mr| diff --git a/spec/controllers/projects/merge_requests/creations_controller_spec.rb b/spec/controllers/projects/merge_requests/creations_controller_spec.rb index df2023b7356..3c650988b4f 100644 --- a/spec/controllers/projects/merge_requests/creations_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/creations_controller_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe Projects::MergeRequests::CreationsController do let(:project) { create(:project, :repository) } - let(:user) { project.owner } + let(:user) { project.first_owner } let(:fork_project) { create(:forked_project_with_submodules) } let(:get_diff_params) do { diff --git a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb index 580211893dc..222bb977beb 100644 --- a/spec/controllers/projects/merge_requests/drafts_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/drafts_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Projects::MergeRequests::DraftsController do let(:project) { create(:project, :repository) } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } - let(:user) { project.owner } + let(:user) { project.first_owner } let(:user2) { create(:user) } let(:params) do diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 36b6df59ef5..2390687c3ea 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Projects::MergeRequestsController do let_it_be_with_refind(:project) { create(:project, :repository) } let_it_be_with_reload(:project_public_with_private_builds) { create(:project, :repository, :public, :builds_private) } - let(:user) { project.owner } + let(:user) { project.first_owner } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: merge_request_source_project, allow_collaboration: false) } let(:merge_request_source_project) { project } @@ -57,19 +57,13 @@ RSpec.describe Projects::MergeRequestsController do merge_request.mark_as_unchecked! end - context 'check_mergeability_async_in_widget feature flag is disabled' do - before do - stub_feature_flags(check_mergeability_async_in_widget: false) + it 'checks mergeability asynchronously' do + expect_next_instance_of(MergeRequests::MergeabilityCheckService) do |service| + expect(service).not_to receive(:execute) + expect(service).to receive(:async_execute) end - it 'checks mergeability asynchronously' do - expect_next_instance_of(MergeRequests::MergeabilityCheckService) do |service| - expect(service).not_to receive(:execute) - expect(service).to receive(:async_execute) - end - - go - end + go end end @@ -449,7 +443,7 @@ RSpec.describe Projects::MergeRequestsController do context 'when the merge request is not mergeable' do before do - merge_request.update!(title: "WIP: #{merge_request.title}") + merge_request.update!(title: "Draft: #{merge_request.title}") post :merge, params: base_params end @@ -2084,6 +2078,20 @@ RSpec.describe Projects::MergeRequestsController do end end + context 'when source branch is protected from force push' do + before do + create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false) + end + + it 'returns 404' do + expect_rebase_worker_for(user).never + + post_rebase + + expect(response).to have_gitlab_http_status(:not_found) + end + end + context 'with a forked project' do let(:forked_project) { fork_project(project, fork_owner, repository: true) } let(:fork_owner) { create(:user) } diff --git a/spec/controllers/projects/mirrors_controller_spec.rb b/spec/controllers/projects/mirrors_controller_spec.rb index 7c5d14d3a22..7bc86d7c583 100644 --- a/spec/controllers/projects/mirrors_controller_spec.rb +++ b/spec/controllers/projects/mirrors_controller_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Projects::MirrorsController do shared_examples 'only admin is allowed when mirroring is disabled' do let(:subject_action) { raise 'subject_action is required' } - let(:user) { project.owner } + let(:user) { project.first_owner } let(:project_settings_path) { project_settings_repository_path(project, anchor: 'js-push-remote-settings') } context 'when project mirroring is enabled' do @@ -88,7 +88,7 @@ RSpec.describe Projects::MirrorsController do context 'when the current project is not a mirror' do it 'allows to create a remote mirror' do - sign_in(project.owner) + sign_in(project.first_owner) expect do do_put(project, remote_mirrors_attributes: { '0' => { 'enabled' => 1, 'url' => 'http://foo.com' } }) @@ -106,7 +106,7 @@ RSpec.describe Projects::MirrorsController do end it 'processes a successful update' do - sign_in(project.owner) + sign_in(project.first_owner) do_put(project, remote_mirrors_attributes: { '0' => ssh_mirror_attributes }) expect(response).to redirect_to(project_settings_repository_path(project, anchor: 'js-push-remote-settings')) @@ -126,7 +126,7 @@ RSpec.describe Projects::MirrorsController do let(:project) { create(:project, :repository, :remote_mirror) } before do - sign_in(project.owner) + sign_in(project.first_owner) end context 'With valid URL for a push' do @@ -169,7 +169,7 @@ RSpec.describe Projects::MirrorsController do let(:cache) { SshHostKey.new(project: project, url: "ssh://example.com:22") } before do - sign_in(project.owner) + sign_in(project.first_owner) end context 'invalid URLs' do diff --git a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb index 707edeaeee3..a655c742973 100644 --- a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb +++ b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb @@ -52,18 +52,6 @@ RSpec.describe Projects::Packages::InfrastructureRegistryController do expect(assigns(:package_files)).to contain_exactly(terraform_module_package_file) end - - context 'with packages_installable_package_files disabled' do - before do - stub_feature_flags(packages_installable_package_files: false) - end - - it 'returns them' do - subject - - expect(assigns(:package_files)).to contain_exactly(package_file_pending_destruction, terraform_module_package_file) - end - end end end end diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb index 3fe709a0d44..4a51e2ed5a0 100644 --- a/spec/controllers/projects/pipelines_controller_spec.rb +++ b/spec/controllers/projects/pipelines_controller_spec.rb @@ -1169,7 +1169,7 @@ RSpec.describe Projects::PipelinesController do context 'when user has ability to delete pipeline' do before do - sign_in(project.owner) + sign_in(project.first_owner) end it 'deletes pipeline and redirects' do diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb index b625ce35d61..56415663109 100644 --- a/spec/controllers/projects/refs_controller_spec.rb +++ b/spec/controllers/projects/refs_controller_spec.rb @@ -47,6 +47,23 @@ RSpec.describe Projects::RefsController do expect(response).to be_not_found end + context 'when ref is incorrect' do + it 'returns 404 page' do + xhr_get(:json, id: '.') + + expect(response).to be_not_found + end + end + + context 'when offset has an invalid format' do + it 'renders JSON' do + xhr_get(:json, offset: { wrong: :format }) + + expect(response).to be_successful + expect(json_response).to be_kind_of(Array) + end + end + context 'when json is requested' do it 'renders JSON' do expect(::Gitlab::GitalyClient).to receive(:allow_ref_name_caching).and_call_original diff --git a/spec/controllers/projects/repositories_controller_spec.rb b/spec/controllers/projects/repositories_controller_spec.rb index 1370ec9cc0b..928428b5caf 100644 --- a/spec/controllers/projects/repositories_controller_spec.rb +++ b/spec/controllers/projects/repositories_controller_spec.rb @@ -3,7 +3,37 @@ require "spec_helper" RSpec.describe Projects::RepositoriesController do - let(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository) } + + describe 'POST create' do + let_it_be(:user) { create(:user) } + + let(:request) { post :create, params: { namespace_id: project.namespace, project_id: project } } + + before do + project.add_maintainer(user) + sign_in(user) + end + + context 'when repository does not exist' do + let!(:project) { create(:project) } + + it 'creates the repository' do + expect { request }.to change { project.repository.raw_repository.exists? }.from(false).to(true) + + expect(response).to be_redirect + end + end + + context 'when repository already exists' do + it 'does not raise an exception' do + expect(Gitlab::ErrorTracking).not_to receive(:track_exception) + request + + expect(response).to be_redirect + end + end + end describe "GET archive" do before do diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb index 70ff77d7ff0..246a37129d7 100644 --- a/spec/controllers/projects/runners_controller_spec.rb +++ b/spec/controllers/projects/runners_controller_spec.rb @@ -37,6 +37,10 @@ RSpec.describe Projects::RunnersController do describe '#destroy' do it 'destroys the runner' do + expect_next_instance_of(Ci::UnregisterRunnerService, runner) do |service| + expect(service).to receive(:execute).once.and_call_original + end + delete :destroy, params: params expect(response).to have_gitlab_http_status(:found) diff --git a/spec/controllers/projects/service_ping_controller_spec.rb b/spec/controllers/projects/service_ping_controller_spec.rb index e6afaadc75f..13b34290962 100644 --- a/spec/controllers/projects/service_ping_controller_spec.rb +++ b/spec/controllers/projects/service_ping_controller_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Projects::ServicePingController do shared_examples 'counter is increased' do |counter| context 'when the authenticated user has access to the project' do - let(:user) { project.owner } + let(:user) { project.first_owner } it 'increments the usage counter' do expect do @@ -55,6 +55,33 @@ RSpec.describe Projects::ServicePingController do end context 'when web ide clientside preview is not enabled' do + let(:user) { project.first_owner } + + before do + stub_application_setting(web_ide_clientside_preview_enabled: false) + end + + it 'returns 404' do + subject + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end + + describe 'POST #web_ide_clientside_preview_success' do + subject { post :web_ide_clientside_preview_success, params: { namespace_id: project.namespace, project_id: project } } + + context 'when web ide clientside preview is enabled' do + before do + stub_application_setting(web_ide_clientside_preview_enabled: true) + end + + it_behaves_like 'counter is not increased' + it_behaves_like 'counter is increased', 'WEB_IDE_PREVIEWS_SUCCESS_COUNT' + end + + context 'when web ide clientside preview is not enabled' do let(:user) { project.owner } before do diff --git a/spec/controllers/projects/settings/repository_controller_spec.rb b/spec/controllers/projects/settings/repository_controller_spec.rb index 2bb93990c58..22287fea82c 100644 --- a/spec/controllers/projects/settings/repository_controller_spec.rb +++ b/spec/controllers/projects/settings/repository_controller_spec.rb @@ -33,6 +33,20 @@ RSpec.describe Projects::Settings::RepositoryController do expect(response).to redirect_to project_settings_repository_path(project) end + + context 'when project cleanup returns an error', :aggregate_failures do + it 'shows an error' do + expect(Projects::CleanupService) + .to receive(:enqueue) + .with(project, user, anything) + .and_return(status: :error, message: 'error message') + + put :cleanup, params: { namespace_id: project.namespace, project_id: project, project: { bfg_object_map: object_map } } + + expect(controller).to set_flash[:alert].to('error message') + expect(response).to redirect_to project_settings_repository_path(project) + end + end end describe 'POST create_deploy_token' do diff --git a/spec/controllers/projects/tags_controller_spec.rb b/spec/controllers/projects/tags_controller_spec.rb index 9823c36cb86..f955f9d0248 100644 --- a/spec/controllers/projects/tags_controller_spec.rb +++ b/spec/controllers/projects/tags_controller_spec.rb @@ -17,6 +17,14 @@ RSpec.describe Projects::TagsController do expect(assigns(:tags).map(&:name)).to include('v1.1.0', 'v1.0.0') end + context 'default sort for tags' do + it 'sorts tags by recently updated' do + subject + + expect(assigns(:sort)).to eq('updated_desc') + end + end + context 'when Gitaly is unavailable' do where(:format) do [:html, :atom] @@ -31,6 +39,7 @@ RSpec.describe Projects::TagsController do get :index, params: { namespace_id: project.namespace.to_param, project_id: project }, format: format expect(assigns(:tags)).to eq([]) + expect(assigns(:releases)).to eq([]) expect(response).to have_gitlab_http_status(:service_unavailable) end end |