diff options
Diffstat (limited to 'spec/controllers/projects')
18 files changed, 385 insertions, 228 deletions
diff --git a/spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb b/spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb new file mode 100644 index 00000000000..1832b84ab6e --- /dev/null +++ b/spec/controllers/projects/analytics/cycle_analytics/summary_controller_spec.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::Analytics::CycleAnalytics::SummaryController do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project) } + + let(:params) { { namespace_id: project.namespace.to_param, project_id: project.to_param, created_after: '2010-01-01', created_before: '2010-01-02' } } + + before do + sign_in(user) + end + + describe 'GET "show"' do + subject { get :show, params: params } + + it 'succeeds' do + project.add_reporter(user) + + subject + + expect(response).to be_successful + expect(response).to match_response_schema('analytics/cycle_analytics/summary') + end + + context 'when analytics_disabled features are disabled' do + it 'renders 404' do + project.add_reporter(user) + project.project_feature.update!(analytics_access_level: ProjectFeature::DISABLED) + + subject + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'when user is not part of the project' do + it 'renders 404' do + subject + + expect(response).to have_gitlab_http_status(:not_found) + end + end + end +end diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb index b965feee645..9493215247a 100644 --- a/spec/controllers/projects/blob_controller_spec.rb +++ b/spec/controllers/projects/blob_controller_spec.rb @@ -444,6 +444,40 @@ RSpec.describe Projects::BlobController do end end + describe 'POST preview' do + subject(:request) { post :preview, params: default_params } + + let(:user) { create(:user) } + let(:filename) { 'preview.md' } + let(:default_params) do + { + namespace_id: project.namespace, + project_id: project, + id: "#{project.default_branch}/#{filename}", + content: "Bar\n" + } + end + + before do + project.add_developer(user) + sign_in(user) + + project.repository.create_file( + project.creator, + filename, + "Foo\n", + message: 'Test', + branch_name: project.default_branch + ) + end + + it 'is successful' do + request + + expect(response).to be_successful + end + end + describe 'POST create' do let(:user) { create(:user) } let(:default_params) do diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index a99db2664a7..a00e302a64f 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -655,21 +655,6 @@ RSpec.describe Projects::BranchesController do ["feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"] ) end - - context 'branch_list_keyset_pagination is disabled' do - before do - stub_feature_flags(branch_list_keyset_pagination: false) - end - - it 'sets active and stale branches' do - expect(assigns[:active_branches].map(&:name)).not_to include( - "feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'" - ) - expect(assigns[:stale_branches].map(&:name)).to eq( - ["feature", "improve/awesome", "merge-test", "markdown", "feature_conflict", "'test'"] - ) - end - end end end diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb index a231b54419e..c650d145bef 100644 --- a/spec/controllers/projects/commit_controller_spec.rb +++ b/spec/controllers/projects/commit_controller_spec.rb @@ -380,18 +380,6 @@ RSpec.describe Projects::CommitController do expect(response).to have_gitlab_http_status(:not_found) end end - - context 'disable pick_into_project feature flag' do - before do - stub_feature_flags(pick_into_project: false) - end - - it 'does not cherry pick a commit from fork to upstream' do - send_request - - expect(project.commit('feature').message).not_to include(forked_project.commit.id) - end - end end end diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb index 80a6d3960cd..2412b970342 100644 --- a/spec/controllers/projects/compare_controller_spec.rb +++ b/spec/controllers/projects/compare_controller_spec.rb @@ -156,7 +156,7 @@ RSpec.describe Projects::CompareController do it 'shows a flash message and redirects' do show_request - expect(flash[:alert]).to eq('Invalid branch name') + expect(flash[:alert]).to eq("Invalid branch name(s): master%' AND 2554=4423 AND '%'='") expect(response).to have_gitlab_http_status(:found) end end @@ -169,7 +169,20 @@ RSpec.describe Projects::CompareController do it 'shows a flash message and redirects' do show_request - expect(flash[:alert]).to eq('Invalid branch name') + expect(flash[:alert]).to eq("Invalid branch name(s): master%' AND 2554=4423 AND '%'='") + expect(response).to have_gitlab_http_status(:found) + end + end + + context 'when the both refs are invalid' do + let(:from_project_id) { nil } + let(:from_ref) { "master%' AND 2554=4423 AND '%'='" } + let(:to_ref) { "improve%' =,awesome" } + + it 'shows a flash message and redirects' do + show_request + + expect(flash[:alert]).to eq("Invalid branch name(s): improve%' =,awesome, master%' AND 2554=4423 AND '%'='") expect(response).to have_gitlab_http_status(:found) end end diff --git a/spec/controllers/projects/feature_flags_controller_spec.rb b/spec/controllers/projects/feature_flags_controller_spec.rb index cd7d1ea0e8a..f809dd31b3b 100644 --- a/spec/controllers/projects/feature_flags_controller_spec.rb +++ b/spec/controllers/projects/feature_flags_controller_spec.rb @@ -154,60 +154,6 @@ RSpec.describe Projects::FeatureFlagsController do end end - context 'when feature flags have additional scopes' do - let!(:feature_flag_active_scope) do - create(:operations_feature_flag_scope, - feature_flag: feature_flag_active, - environment_scope: 'production', - active: false) - end - - let!(:feature_flag_inactive_scope) do - create(:operations_feature_flag_scope, - feature_flag: feature_flag_inactive, - environment_scope: 'staging', - active: false) - end - - it 'returns a correct summary' do - subject - - expect(json_response['count']['all']).to eq(2) - expect(json_response['count']['enabled']).to eq(1) - expect(json_response['count']['disabled']).to eq(1) - end - - it 'recognizes feature flag 1 as active' do - subject - - expect(json_response['feature_flags'].first['active']).to be_truthy - end - - it 'recognizes feature flag 2 as inactive' do - subject - - expect(json_response['feature_flags'].second['active']).to be_falsy - end - - it 'has ordered scopes' do - subject - - expect(json_response['feature_flags'][0]['scopes'][0]['id']) - .to be < json_response['feature_flags'][0]['scopes'][1]['id'] - expect(json_response['feature_flags'][1]['scopes'][0]['id']) - .to be < json_response['feature_flags'][1]['scopes'][1]['id'] - end - - it 'does not have N+1 problem' do - recorded = ActiveRecord::QueryRecorder.new { subject } - - related_count = recorded.log - .count { |query| query.include?('operations_feature_flag') } - - expect(related_count).to be_within(5).of(2) - end - end - context 'with version 1 and 2 feature flags' do let!(:new_version_feature_flag) do create(:operations_feature_flag, :new_version_flag, project: project, name: 'feature_flag_c') @@ -235,7 +181,7 @@ RSpec.describe Projects::FeatureFlagsController do subject { get(:show, params: params, format: :json) } let!(:feature_flag) do - create(:operations_feature_flag, project: project) + create(:operations_feature_flag, :legacy_flag, project: project) end let(:params) do @@ -371,6 +317,42 @@ RSpec.describe Projects::FeatureFlagsController do end end + describe 'GET edit' do + subject { get(:edit, params: params) } + + context 'with legacy flags' do + let!(:feature_flag) { create(:operations_feature_flag, :legacy_flag, project: project) } + + let(:params) do + { + namespace_id: project.namespace, + project_id: project, + iid: feature_flag.iid + } + end + + it 'returns not found' do + is_expected.to have_gitlab_http_status(:not_found) + end + end + + context 'with new version flags' do + let!(:feature_flag) { create(:operations_feature_flag, project: project) } + + let(:params) do + { + namespace_id: project.namespace, + project_id: project, + iid: feature_flag.iid + } + end + + it 'returns successfully' do + is_expected.to have_gitlab_http_status(:ok) + end + end + end + describe 'POST create.json' do subject { post(:create, params: params, format: :json) } @@ -762,7 +744,7 @@ RSpec.describe Projects::FeatureFlagsController do describe 'DELETE destroy.json' do subject { delete(:destroy, params: params, format: :json) } - let!(:feature_flag) { create(:operations_feature_flag, project: project) } + let!(:feature_flag) { create(:operations_feature_flag, :legacy_flag, project: project) } let(:params) do { diff --git a/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb b/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb index e0d1d3765b2..32817f048e6 100644 --- a/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb +++ b/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb @@ -16,6 +16,39 @@ RSpec.describe Projects::FeatureFlagsUserListsController do { namespace_id: project.namespace, project_id: project }.merge(extra_params) end + describe 'GET #index' do + it 'redirects when the user is unauthenticated' do + get(:index, params: request_params) + + expect(response).to redirect_to(new_user_session_path) + end + + it 'returns not found if the user does not belong to the project' do + user = create(:user) + sign_in(user) + + get(:index, params: request_params) + + expect(response).to have_gitlab_http_status(:not_found) + end + + it 'returns not found for a reporter' do + sign_in(reporter) + + get(:index, params: request_params) + + expect(response).to have_gitlab_http_status(:not_found) + end + + it 'renders the new page for a developer' do + sign_in(developer) + + get(:index, params: request_params) + + expect(response).to have_gitlab_http_status(:ok) + end + end + describe 'GET #new' do it 'redirects when the user is unauthenticated' do get(:new, params: request_params) diff --git a/spec/controllers/projects/forks_controller_spec.rb b/spec/controllers/projects/forks_controller_spec.rb index 8ca3009e0c7..e53e53980b5 100644 --- a/spec/controllers/projects/forks_controller_spec.rb +++ b/spec/controllers/projects/forks_controller_spec.rb @@ -195,6 +195,25 @@ RSpec.describe Projects::ForksController do expect(json_response['namespaces'].length).to eq(1) expect(json_response['namespaces'][0]['id']).to eq(group.id) end + + context 'N+1 queries' do + before do + create(:fork_network, root_project: project) + end + + it 'avoids N+1 queries' do + do_request = -> { get :new, format: format, params: { namespace_id: project.namespace, project_id: project } } + + # warm up + do_request.call + + control = ActiveRecord::QueryRecorder.new { do_request.call } + + create(:group, :public).add_owner(user) + + expect { do_request.call }.not_to exceed_query_limit(control) + end + end end end diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 059e7884d55..7569a18baeb 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -310,7 +310,7 @@ RSpec.describe Projects::IssuesController do context 'external issue tracker' do let!(:service) do - create(:custom_issue_tracker_service, project: project, new_issue_url: 'http://test.com') + create(:custom_issue_tracker_integration, project: project, new_issue_url: 'http://test.com') end before do diff --git a/spec/controllers/projects/mattermosts_controller_spec.rb b/spec/controllers/projects/mattermosts_controller_spec.rb index 10bcee28f71..edec8c3e9c6 100644 --- a/spec/controllers/projects/mattermosts_controller_spec.rb +++ b/spec/controllers/projects/mattermosts_controller_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Projects::MattermostsController do describe 'GET #new' do before do - allow_next_instance_of(MattermostSlashCommandsService) do |instance| + allow_next_instance_of(Integrations::MattermostSlashCommands) do |instance| allow(instance).to receive(:list_teams).and_return([]) end end @@ -43,7 +43,7 @@ RSpec.describe Projects::MattermostsController do context 'no request can be made to mattermost' do it 'shows the error' do - allow_next_instance_of(MattermostSlashCommandsService) do |instance| + allow_next_instance_of(Integrations::MattermostSlashCommands) do |instance| allow(instance).to receive(:configure).and_return([false, "error message"]) end @@ -53,7 +53,7 @@ RSpec.describe Projects::MattermostsController do context 'the request is succesull' do before do - allow_next_instance_of(Mattermost::Command) do |instance| + allow_next_instance_of(::Mattermost::Command) do |instance| allow(instance).to receive(:create).and_return('token') end end diff --git a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb index c2cc3d10ea0..e07b7e4586a 100644 --- a/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/conflicts_controller_spec.rb @@ -17,8 +17,31 @@ RSpec.describe Projects::MergeRequests::ConflictsController do end describe 'GET show' do + context 'when the request is html' do + before do + allow(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to receive(:track_loading_conflict_ui_action) + + get :show, + params: { + namespace_id: merge_request_with_conflicts.project.namespace.to_param, + project_id: merge_request_with_conflicts.project, + id: merge_request_with_conflicts.iid + }, + format: 'html' + end + + it 'does tracks the resolve call' do + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to have_received(:track_loading_conflict_ui_action).with(user: user) + end + end + context 'when the conflicts cannot be resolved in the UI' do before do + allow(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to receive(:track_loading_conflict_ui_action) + allow(Gitlab::Git::Conflict::Parser).to receive(:parse) .and_raise(Gitlab::Git::Conflict::Parser::UnmergeableFile) @@ -38,6 +61,11 @@ RSpec.describe Projects::MergeRequests::ConflictsController do it 'returns JSON with a message' do expect(json_response.keys).to contain_exactly('message', 'type') end + + it 'does not track the resolve call' do + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .not_to have_received(:track_loading_conflict_ui_action).with(user: user) + end end context 'with valid conflicts' do @@ -145,20 +173,19 @@ RSpec.describe Projects::MergeRequests::ConflictsController do conflict_for_path(path) end - it 'returns a 200 status code' do - expect(response).to have_gitlab_http_status(:ok) - end - - it 'returns the file in JSON format' do + it 'returns a 200 and the file in JSON format' do content = MergeRequests::Conflicts::ListService.new(merge_request_with_conflicts) .file_for_path(path, path) .content - expect(json_response).to include('old_path' => path, - 'new_path' => path, - 'blob_icon' => 'doc-text', - 'blob_path' => a_string_ending_with(path), - 'content' => content) + aggregate_failures do + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to include('old_path' => path, + 'new_path' => path, + 'blob_icon' => 'doc-text', + 'blob_path' => a_string_ending_with(path), + 'content' => content) + end end end end @@ -166,6 +193,11 @@ RSpec.describe Projects::MergeRequests::ConflictsController do context 'POST resolve_conflicts' do let!(:original_head_sha) { merge_request_with_conflicts.diff_head_sha } + before do + allow(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to receive(:track_resolve_conflict_action) + end + def resolve_conflicts(files) post :resolve_conflicts, params: { @@ -201,13 +233,16 @@ RSpec.describe Projects::MergeRequests::ConflictsController do resolve_conflicts(resolved_files) end - it 'creates a new commit on the branch' do - expect(original_head_sha).not_to eq(merge_request_with_conflicts.source_branch_head.sha) - expect(merge_request_with_conflicts.source_branch_head.message).to include('Commit message') - end + it 'handles the success case' do + aggregate_failures do + # creates a new commit on the branch + expect(original_head_sha).not_to eq(merge_request_with_conflicts.source_branch_head.sha) + expect(merge_request_with_conflicts.source_branch_head.message).to include('Commit message') - it 'returns an OK response' do - expect(response).to have_gitlab_http_status(:ok) + expect(response).to have_gitlab_http_status(:ok) + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to have_received(:track_resolve_conflict_action).with(user: user) + end end end @@ -232,16 +267,17 @@ RSpec.describe Projects::MergeRequests::ConflictsController do resolve_conflicts(resolved_files) end - it 'returns a 400 error' do - expect(response).to have_gitlab_http_status(:bad_request) - end - - it 'has a message with the name of the first missing section' do - expect(json_response['message']).to include('6eb14e00385d2fb284765eb1cd8d420d33d63fc9_21_21') - end + it 'handles the error case' do + aggregate_failures do + # has a message with the name of the first missing section + expect(json_response['message']).to include('6eb14e00385d2fb284765eb1cd8d420d33d63fc9_21_21') + # does not create a new commit + expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) - it 'does not create a new commit' do - expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) + expect(response).to have_gitlab_http_status(:bad_request) + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to have_received(:track_resolve_conflict_action).with(user: user) + end end end @@ -262,16 +298,17 @@ RSpec.describe Projects::MergeRequests::ConflictsController do resolve_conflicts(resolved_files) end - it 'returns a 400 error' do - expect(response).to have_gitlab_http_status(:bad_request) - end + it 'handles the error case' do + aggregate_failures do + # has a message with the name of the missing file + expect(json_response['message']).to include('files/ruby/popen.rb') + # does not create a new commit + expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) - it 'has a message with the name of the missing file' do - expect(json_response['message']).to include('files/ruby/popen.rb') - end - - it 'does not create a new commit' do - expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) + expect(response).to have_gitlab_http_status(:bad_request) + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to have_received(:track_resolve_conflict_action).with(user: user) + end end end @@ -300,16 +337,17 @@ RSpec.describe Projects::MergeRequests::ConflictsController do resolve_conflicts(resolved_files) end - it 'returns a 400 error' do - expect(response).to have_gitlab_http_status(:bad_request) - end - - it 'has a message with the path of the problem file' do - expect(json_response['message']).to include('files/ruby/popen.rb') - end + it 'handles the error case' do + aggregate_failures do + # has a message with the path of the problem file + expect(json_response['message']).to include('files/ruby/popen.rb') + # does not create a new commit + expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) - it 'does not create a new commit' do - expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) + expect(response).to have_gitlab_http_status(:bad_request) + expect(Gitlab::UsageDataCounters::MergeRequestActivityUniqueCounter) + .to have_received(:track_resolve_conflict_action).with(user: user) + end end end end diff --git a/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb new file mode 100644 index 00000000000..dc5a022eb7b --- /dev/null +++ b/spec/controllers/projects/packages/infrastructure_registry_controller_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Projects::Packages::InfrastructureRegistryController do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :private) } + + let(:params) { { namespace_id: project.namespace, project_id: project } } + + before do + sign_in(user) + project.add_maintainer(user) + end + + describe 'GET #index' do + subject { get :index, params: params, format: :html } + + it_behaves_like 'returning response status', :ok + + context 'when the feature is disabled' do + before do + stub_feature_flags(infrastructure_registry_page: false) + end + + it_behaves_like 'returning response status', :not_found + end + end + + describe 'GET #show' do + let_it_be(:terraform_module) { create(:terraform_module_package, project: project) } + + subject { get :show, params: params.merge(id: terraform_module.id), format: :html } + + it_behaves_like 'returning response status', :ok + + context 'when the feature is disabled' do + before do + stub_feature_flags(infrastructure_registry_page: false) + end + + it_behaves_like 'returning response status', :not_found + end + end +end diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb index 0e6b5e84d85..a80c5fa82f6 100644 --- a/spec/controllers/projects/pipelines_controller_spec.rb +++ b/spec/controllers/projects/pipelines_controller_spec.rb @@ -274,30 +274,26 @@ RSpec.describe Projects::PipelinesController do end describe 'GET #index' do - context 'pipeline_empty_state_templates experiment' do - before do - stub_application_setting(auto_devops_enabled: false) - end + before do + stub_application_setting(auto_devops_enabled: false) + end - it 'tracks the view', :experiment do - expect(experiment(:pipeline_empty_state_templates)) - .to track(:view, value: project.namespace_id) - .with_context(actor: user) - .on_next_instance + def action + get :index, params: { namespace_id: project.namespace, project_id: project } + end - get :index, params: { namespace_id: project.namespace, project_id: project } - end + subject { project.namespace } + + context 'pipeline_empty_state_templates experiment' do + it_behaves_like 'tracks assignment and records the subject', :pipeline_empty_state_templates, :namespace end context 'code_quality_walkthrough experiment' do - it 'tracks the view', :experiment do - expect(experiment(:code_quality_walkthrough)) - .to track(:view, property: project.root_ancestor.id.to_s) - .with_context(namespace: project.root_ancestor) - .on_next_instance + it_behaves_like 'tracks assignment and records the subject', :code_quality_walkthrough, :namespace + end - get :index, params: { namespace_id: project.namespace, project_id: project } - end + context 'ci_runner_templates experiment' do + it_behaves_like 'tracks assignment and records the subject', :ci_runner_templates, :namespace end end @@ -878,19 +874,6 @@ RSpec.describe Projects::PipelinesController do expect(::Ci::RetryPipelineWorker).to have_received(:perform_async).with(pipeline.id, user.id) end - context 'when feature flag is disabled' do - before do - stub_feature_flags(background_pipeline_retry_endpoint: false) - end - - it 'retries the pipeline without returning any content' do - post_retry - - expect(response).to have_gitlab_http_status(:no_content) - expect(build.reload).to be_retried - end - end - context 'when builds are disabled' do let(:feature) { ProjectFeature::DISABLED } diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/spec/controllers/projects/project_members_controller_spec.rb index bb817fc94b2..9ed43a251a2 100644 --- a/spec/controllers/projects/project_members_controller_spec.rb +++ b/spec/controllers/projects/project_members_controller_spec.rb @@ -3,9 +3,9 @@ require('spec_helper') RSpec.describe Projects::ProjectMembersController do - let(:user) { create(:user) } - let(:group) { create(:group, :public) } - let(:project) { create(:project, :public) } + let_it_be(:user) { create(:user) } + let_it_be(:group) { create(:group, :public) } + let_it_be(:project, reload: true) { create(:project, :public) } before do travel_to DateTime.new(2019, 4, 1) @@ -24,8 +24,8 @@ RSpec.describe Projects::ProjectMembersController do context 'project members' do context 'when project belongs to group' do - let(:user_in_group) { create(:user) } - let(:project_in_group) { create(:project, :public, group: group) } + let_it_be(:user_in_group) { create(:user) } + let_it_be(:project_in_group) { create(:project, :public, group: group) } before do group.add_owner(user_in_group) @@ -69,7 +69,7 @@ RSpec.describe Projects::ProjectMembersController do end context 'group links' do - let!(:project_group_link) { create(:project_group_link, project: project, group: group) } + let_it_be(:project_group_link) { create(:project_group_link, project: project, group: group) } it 'lists group links' do get :index, params: { namespace_id: project.namespace, project_id: project } @@ -90,7 +90,7 @@ RSpec.describe Projects::ProjectMembersController do end context 'invited members' do - let!(:invited_member) { create(:project_member, :invited, project: project) } + let_it_be(:invited_member) { create(:project_member, :invited, project: project) } before do project.add_maintainer(user) @@ -123,7 +123,7 @@ RSpec.describe Projects::ProjectMembersController do end context 'access requests' do - let(:access_requester_user) { create(:user) } + let_it_be(:access_requester_user) { create(:user) } before do project.request_access(access_requester_user) @@ -158,7 +158,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'POST create' do - let(:project_user) { create(:user) } + let_it_be(:project_user) { create(:user) } before do sign_in(user) @@ -169,7 +169,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_developer(user) end - it 'returns 404' do + it 'returns 404', :aggregate_failures do post :create, params: { namespace_id: project.namespace, project_id: project, @@ -187,11 +187,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_maintainer(user) end - it 'adds user to members' do - expect_next_instance_of(Members::CreateService) do |instance| - expect(instance).to receive(:execute).and_return(status: :success) - end - + it 'adds user to members', :aggregate_failures, :snowplow do post :create, params: { namespace_id: project.namespace, project_id: project, @@ -201,9 +197,17 @@ RSpec.describe Projects::ProjectMembersController do expect(controller).to set_flash.to 'Users were successfully added.' expect(response).to redirect_to(project_project_members_path(project)) + expect(project.users).to include project_user + expect_snowplow_event( + category: 'Members::CreateService', + action: 'create_member', + label: 'project-members-page', + property: 'existing_user', + user: user + ) end - it 'adds no user to members' do + it 'adds no user to members', :aggregate_failures do expect_next_instance_of(Members::CreateService) do |instance| expect(instance).to receive(:execute).and_return(status: :failure, message: 'Message') end @@ -230,7 +234,7 @@ RSpec.describe Projects::ProjectMembersController do unrelated_project.add_maintainer(project_bot) end - it 'returns error' do + it 'returns error', :aggregate_failures do post :create, params: { namespace_id: project.namespace, project_id: project, @@ -261,7 +265,7 @@ RSpec.describe Projects::ProjectMembersController do context 'when set to a date in the past' do let(:expires_at) { 2.days.ago } - it 'does not add user to members' do + it 'does not add user to members', :aggregate_failures do subject expect(flash[:alert]).to include('Expires at cannot be a date in the past') @@ -273,7 +277,7 @@ RSpec.describe Projects::ProjectMembersController do context 'when set to a date in the future' do let(:expires_at) { 5.days.from_now } - it 'adds user to members' do + it 'adds user to members', :aggregate_failures do subject expect(controller).to set_flash.to 'Users were successfully added.' @@ -285,7 +289,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'PUT update' do - let(:requester) { create(:project_member, :access_request, project: project) } + let_it_be(:requester) { create(:project_member, :access_request, project: project) } before do project.add_maintainer(user) @@ -393,7 +397,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'DELETE destroy' do - let(:member) { create(:project_member, :developer, project: project) } + let_it_be(:member) { create(:project_member, :developer, project: project) } before do sign_in(user) @@ -417,7 +421,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_developer(user) end - it 'returns 404' do + it 'returns 404', :aggregate_failures do delete :destroy, params: { namespace_id: project.namespace, project_id: project, @@ -434,7 +438,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_maintainer(user) end - it '[HTML] removes user from members' do + it '[HTML] removes user from members', :aggregate_failures do delete :destroy, params: { namespace_id: project.namespace, project_id: project, @@ -447,7 +451,7 @@ RSpec.describe Projects::ProjectMembersController do expect(project.members).not_to include member end - it '[JS] removes user from members' do + it '[JS] removes user from members', :aggregate_failures do delete :destroy, params: { namespace_id: project.namespace, project_id: project, @@ -483,7 +487,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_developer(user) end - it 'removes user from members' do + it 'removes user from members', :aggregate_failures do delete :leave, params: { namespace_id: project.namespace, project_id: project @@ -517,7 +521,7 @@ RSpec.describe Projects::ProjectMembersController do project.request_access(user) end - it 'removes user from members' do + it 'removes user from members', :aggregate_failures do delete :leave, params: { namespace_id: project.namespace, project_id: project @@ -537,7 +541,7 @@ RSpec.describe Projects::ProjectMembersController do sign_in(user) end - it 'creates a new ProjectMember that is not a team member' do + it 'creates a new ProjectMember that is not a team member', :aggregate_failures do post :request_access, params: { namespace_id: project.namespace, project_id: project @@ -553,7 +557,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'POST approve' do - let(:member) { create(:project_member, :access_request, project: project) } + let_it_be(:member) { create(:project_member, :access_request, project: project) } before do sign_in(user) @@ -577,7 +581,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_developer(user) end - it 'returns 404' do + it 'returns 404', :aggregate_failures do post :approve_access_request, params: { namespace_id: project.namespace, project_id: project, @@ -594,7 +598,7 @@ RSpec.describe Projects::ProjectMembersController do project.add_maintainer(user) end - it 'adds user to members' do + it 'adds user to members', :aggregate_failures do post :approve_access_request, params: { namespace_id: project.namespace, project_id: project, @@ -611,8 +615,8 @@ RSpec.describe Projects::ProjectMembersController do end describe 'POST apply_import' do - let(:another_project) { create(:project, :private) } - let(:member) { create(:user) } + let_it_be(:another_project) { create(:project, :private) } + let_it_be(:member) { create(:user) } before do project.add_maintainer(user) @@ -637,7 +641,7 @@ RSpec.describe Projects::ProjectMembersController do include_context 'import applied' - it 'imports source project members' do + it 'imports source project members', :aggregate_failures do expect(project.team_members).to include member expect(controller).to set_flash.to 'Successfully imported' expect(response).to redirect_to( @@ -660,7 +664,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'POST create' do - let(:stranger) { create(:user) } + let_it_be(:stranger) { create(:user) } context 'when creating owner' do before do @@ -700,7 +704,7 @@ RSpec.describe Projects::ProjectMembersController do end describe 'POST resend_invite' do - let(:member) { create(:project_member, project: project) } + let_it_be(:member) { create(:project_member, project: project) } before do project.add_maintainer(user) diff --git a/spec/controllers/projects/service_hook_logs_controller_spec.rb b/spec/controllers/projects/service_hook_logs_controller_spec.rb index 97fb31f0546..040e59fc822 100644 --- a/spec/controllers/projects/service_hook_logs_controller_spec.rb +++ b/spec/controllers/projects/service_hook_logs_controller_spec.rb @@ -5,13 +5,13 @@ require 'spec_helper' RSpec.describe Projects::ServiceHookLogsController do let(:project) { create(:project, :repository) } let(:user) { create(:user) } - let(:service) { create(:drone_ci_service, project: project) } - let(:log) { create(:web_hook_log, web_hook: service.service_hook) } + let(:integration) { create(:drone_ci_integration, project: project) } + let(:log) { create(:web_hook_log, web_hook: integration.service_hook) } let(:log_params) do { namespace_id: project.namespace, project_id: project, - service_id: service.to_param, + service_id: integration.to_param, id: log.id } end @@ -35,7 +35,7 @@ RSpec.describe Projects::ServiceHookLogsController do it 'executes the hook and redirects to the service form' do expect_any_instance_of(ServiceHook).to receive(:execute) expect_any_instance_of(described_class).to receive(:set_hook_execution_notice) - expect(subject).to redirect_to(edit_project_service_path(project, service)) + expect(subject).to redirect_to(edit_project_service_path(project, integration)) end end end diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb index d8fb3b226ed..f8474ab1082 100644 --- a/spec/controllers/projects/services_controller_spec.rb +++ b/spec/controllers/projects/services_controller_spec.rb @@ -47,7 +47,7 @@ RSpec.describe Projects::ServicesController do let(:service) { project.create_microsoft_teams_service(webhook: 'http://webhook.com') } it 'returns success' do - allow_any_instance_of(MicrosoftTeams::Notifier).to receive(:ping).and_return(true) + allow_any_instance_of(::MicrosoftTeams::Notifier).to receive(:ping).and_return(true) put :test, params: project_params @@ -95,7 +95,7 @@ RSpec.describe Projects::ServicesController do expect(response).to be_successful expect(json_response).to be_empty - expect(BuildkiteService.first).to be_present + expect(Integrations::Buildkite.first).to be_present end it 'creates the ServiceHook object' do @@ -103,7 +103,7 @@ RSpec.describe Projects::ServicesController do expect(response).to be_successful expect(json_response).to be_empty - expect(BuildkiteService.first.service_hook).to be_present + expect(Integrations::Buildkite.first.service_hook).to be_present end def do_put @@ -145,7 +145,7 @@ RSpec.describe Projects::ServicesController do end it 'returns an error response when a network exception is raised' do - expect_next(SlackService).to receive(:test).and_raise(Errno::ECONNREFUSED) + expect_next(Integrations::Slack).to receive(:test).and_raise(Errno::ECONNREFUSED) put :test, params: project_params diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb index d2934ec4e97..7ef5371f2b5 100644 --- a/spec/controllers/projects/settings/operations_controller_spec.rb +++ b/spec/controllers/projects/settings/operations_controller_spec.rb @@ -509,7 +509,10 @@ RSpec.describe Projects::Settings::OperationsController do it 'tracks an event' do expect_snowplow_event( category: 'project:operations:tracing', - action: 'external_url_populated' + action: 'external_url_populated', + user: user, + project: project, + namespace: project.namespace ) end end diff --git a/spec/controllers/projects/templates_controller_spec.rb b/spec/controllers/projects/templates_controller_spec.rb index bd299efb5b5..da381357bda 100644 --- a/spec/controllers/projects/templates_controller_spec.rb +++ b/spec/controllers/projects/templates_controller_spec.rb @@ -160,28 +160,12 @@ RSpec.describe Projects::TemplatesController do end shared_examples 'template names request' do - context 'when feature flag enabled' do - it 'returns the template names', :aggregate_failures do - get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json) - - expect(response).to have_gitlab_http_status(:ok) - expect(json_response['Project Templates'].size).to eq(2) - expect(json_response['Project Templates'].map { |x| x.slice('name') }).to match(expected_template_names) - end - end - - context 'when feature flag disabled' do - before do - stub_feature_flags(inherited_issuable_templates: false) - end - - it 'returns the template names', :aggregate_failures do - get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json) + it 'returns the template names', :aggregate_failures do + get(:names, params: { namespace_id: project.namespace, template_type: template_type, project_id: project }, format: :json) - expect(response).to have_gitlab_http_status(:ok) - expect(json_response.size).to eq(2) - expect(json_response.map { |x| x.slice('name') }).to match(expected_template_names) - end + expect(response).to have_gitlab_http_status(:ok) + expect(json_response['Project Templates'].size).to eq(2) + expect(json_response['Project Templates'].map { |x| x.slice('name') }).to match(expected_template_names) end it 'fails for user with no access' do |