diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-18 16:16:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-11-18 16:16:36 +0300 |
commit | 311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch) | |
tree | 07e7870bca8aed6d61fdcc810731c50d2c40af47 /spec/controllers | |
parent | 27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff) |
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'spec/controllers')
39 files changed, 592 insertions, 222 deletions
diff --git a/spec/controllers/admin/integrations_controller_spec.rb b/spec/controllers/admin/integrations_controller_spec.rb index 1793b3a86d1..cf6a6385425 100644 --- a/spec/controllers/admin/integrations_controller_spec.rb +++ b/spec/controllers/admin/integrations_controller_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Admin::IntegrationsController do sign_in(admin) end - it_behaves_like IntegrationsActions do + it_behaves_like Integrations::Actions do let(:integration_attributes) { { instance: true, project: nil } } let(:routing_params) do diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb index 996964fdcf0..b9a59e9ae5f 100644 --- a/spec/controllers/admin/runners_controller_spec.rb +++ b/spec/controllers/admin/runners_controller_spec.rb @@ -12,9 +12,11 @@ RSpec.describe Admin::RunnersController do describe '#index' do render_views - it 'lists all runners' do + before do get :index + end + it 'renders index template' do expect(response).to have_gitlab_http_status(:ok) expect(response).to render_template(:index) end diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index e9a49319f21..e623c1ab940 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -501,11 +501,16 @@ RSpec.describe ApplicationController do describe '#append_info_to_payload' do controller(described_class) do attr_reader :last_payload + urgency :high, [:foo] def index render html: 'authenticated' end + def foo + render html: '' + end + def append_info_to_payload(payload) super @@ -513,6 +518,13 @@ RSpec.describe ApplicationController do end end + before do + routes.draw do + get 'index' => 'anonymous#index' + get 'foo' => 'anonymous#foo' + end + end + it 'does not log errors with a 200 response' do get :index @@ -534,6 +546,22 @@ RSpec.describe ApplicationController do expect(controller.last_payload[:metadata]).to include('meta.user' => user.username) end + + context 'urgency information' do + it 'adds default urgency information to the payload' do + get :index + + expect(controller.last_payload[:request_urgency]).to eq(:default) + expect(controller.last_payload[:target_duration_s]).to eq(1) + end + + it 'adds customized urgency information to the payload' do + get :foo + + expect(controller.last_payload[:request_urgency]).to eq(:high) + expect(controller.last_payload[:target_duration_s]).to eq(0.25) + end + end end describe '#access_denied' do @@ -895,7 +923,7 @@ RSpec.describe ApplicationController do describe '#set_current_context' do controller(described_class) do - feature_category :issue_tracking + feature_category :team_planning def index Gitlab::ApplicationContext.with_raw_context do |context| @@ -949,7 +977,7 @@ RSpec.describe ApplicationController do it 'sets the feature_category as defined in the controller' do get :index, format: :json - expect(json_response['meta.feature_category']).to eq('issue_tracking') + expect(json_response['meta.feature_category']).to eq('team_planning') end it 'assigns the context to a variable for logging' do diff --git a/spec/controllers/concerns/group_tree_spec.rb b/spec/controllers/concerns/group_tree_spec.rb index e808f1caa6e..921706b2042 100644 --- a/spec/controllers/concerns/group_tree_spec.rb +++ b/spec/controllers/concerns/group_tree_spec.rb @@ -102,13 +102,5 @@ RSpec.describe GroupTree do end it_behaves_like 'returns filtered groups' - - context 'when feature flag :linear_group_tree_ancestor_scopes is disabled' do - before do - stub_feature_flags(linear_group_tree_ancestor_scopes: false) - end - - it_behaves_like 'returns filtered groups' - end end end diff --git a/spec/controllers/concerns/import_url_params_spec.rb b/spec/controllers/concerns/import_url_params_spec.rb index 72f13cdcc94..ddffb243f7a 100644 --- a/spec/controllers/concerns/import_url_params_spec.rb +++ b/spec/controllers/concerns/import_url_params_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe ImportUrlParams do let(:import_url_params) do - controller = OpenStruct.new(params: params).extend(described_class) + controller = double('controller', params: params).extend(described_class) controller.import_url_params end diff --git a/spec/controllers/concerns/renders_commits_spec.rb b/spec/controllers/concerns/renders_commits_spec.rb index 5c918267f50..acdeb98bb16 100644 --- a/spec/controllers/concerns/renders_commits_spec.rb +++ b/spec/controllers/concerns/renders_commits_spec.rb @@ -64,6 +64,12 @@ RSpec.describe RendersCommits do subject.prepare_commits_for_rendering(merge_request.commits.take(1)) end + # Populate Banzai::Filter::References::ReferenceCache + subject.prepare_commits_for_rendering(merge_request.commits) + + # Reset lazy_latest_pipeline cache to simulate a new request + BatchLoader::Executor.clear_current + expect do subject.prepare_commits_for_rendering(merge_request.commits) merge_request.commits.each(&:latest_pipeline) diff --git a/spec/controllers/confirmations_controller_spec.rb b/spec/controllers/confirmations_controller_spec.rb index 401ee36b387..1c7f8de32bb 100644 --- a/spec/controllers/confirmations_controller_spec.rb +++ b/spec/controllers/confirmations_controller_spec.rb @@ -123,4 +123,45 @@ RSpec.describe ConfirmationsController do end end end + + describe '#create' do + let(:user) { create(:user) } + + subject(:perform_request) { post(:create, params: { user: { email: user.email } }) } + + context 'when reCAPTCHA is disabled' do + before do + stub_application_setting(recaptcha_enabled: false) + end + + it 'successfully sends password reset when reCAPTCHA is not solved' do + perform_request + + expect(response).to redirect_to(dashboard_projects_path) + end + end + + context 'when reCAPTCHA is enabled' do + before do + stub_application_setting(recaptcha_enabled: true) + end + + it 'displays an error when the reCAPTCHA is not solved' do + Recaptcha.configuration.skip_verify_env.delete('test') + + perform_request + + expect(response).to render_template(:new) + expect(flash[:alert]).to include 'There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.' + end + + it 'successfully sends password reset when reCAPTCHA is solved' do + Recaptcha.configuration.skip_verify_env << 'test' + + perform_request + + expect(response).to redirect_to(dashboard_projects_path) + end + end + end end diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb index f0aa351bee0..cf528b414c0 100644 --- a/spec/controllers/dashboard/todos_controller_spec.rb +++ b/spec/controllers/dashboard/todos_controller_spec.rb @@ -62,7 +62,7 @@ RSpec.describe Dashboard::TodosController do create(:issue, project: project, assignees: [user]) group_2 = create(:group) group_2.add_owner(user) - project_2 = create(:project) + project_2 = create(:project, namespace: user.namespace) project_2.add_developer(user) merge_request_2 = create(:merge_request, source_project: project_2) create(:todo, project: project, author: author, user: user, target: merge_request_2) diff --git a/spec/controllers/explore/projects_controller_spec.rb b/spec/controllers/explore/projects_controller_spec.rb index 2297198878d..f2328303102 100644 --- a/spec/controllers/explore/projects_controller_spec.rb +++ b/spec/controllers/explore/projects_controller_spec.rb @@ -74,6 +74,28 @@ RSpec.describe Explore::ProjectsController do end end end + + describe 'GET #topic' do + context 'when topic does not exist' do + it 'renders a 404 error' do + get :topic, params: { topic_name: 'topic1' } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + context 'when topic exists' do + before do + create(:topic, name: 'topic1') + end + + it 'renders the template' do + get :topic, params: { topic_name: 'topic1' } + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to render_template('topic') + end + end + end end shared_examples "blocks high page numbers" do diff --git a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb index fa402d556c7..b22307578ab 100644 --- a/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb +++ b/spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb @@ -124,6 +124,34 @@ RSpec.describe Groups::DependencyProxyForContainersController do end end + shared_examples 'authorize action with permission' do + context 'with a valid user' do + before do + group.add_guest(user) + end + + it 'sends Workhorse local file instructions', :aggregate_failures do + subject + + expect(response.headers['Content-Type']).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE) + expect(json_response['TempPath']).to eq(DependencyProxy::FileUploader.workhorse_local_upload_path) + expect(json_response['RemoteObject']).to be_nil + expect(json_response['MaximumSize']).to eq(maximum_size) + end + + it 'sends Workhorse remote object instructions', :aggregate_failures do + stub_dependency_proxy_object_storage(direct_upload: true) + + subject + + expect(response.headers['Content-Type']).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE) + expect(json_response['TempPath']).to be_nil + expect(json_response['RemoteObject']).not_to be_nil + expect(json_response['MaximumSize']).to eq(maximum_size) + end + end + end + before do allow(Gitlab.config.dependency_proxy) .to receive(:enabled).and_return(true) @@ -136,7 +164,8 @@ RSpec.describe Groups::DependencyProxyForContainersController do end describe 'GET #manifest' do - let_it_be(:manifest) { create(:dependency_proxy_manifest) } + let_it_be(:tag) { 'latest' } + let_it_be(:manifest) { create(:dependency_proxy_manifest, file_name: "alpine:#{tag}.json", group: group) } let(:pull_response) { { status: :success, manifest: manifest, from_cache: false } } @@ -146,7 +175,7 @@ RSpec.describe Groups::DependencyProxyForContainersController do end end - subject { get_manifest } + subject { get_manifest(tag) } context 'feature enabled' do before do @@ -207,11 +236,26 @@ RSpec.describe Groups::DependencyProxyForContainersController do it_behaves_like 'a successful manifest pull' it_behaves_like 'a package tracking event', described_class.name, 'pull_manifest' - context 'with a cache entry' do - let(:pull_response) { { status: :success, manifest: manifest, from_cache: true } } + context 'with workhorse response' do + let(:pull_response) { { status: :success, manifest: nil, from_cache: false } } - it_behaves_like 'returning response status', :success - it_behaves_like 'a package tracking event', described_class.name, 'pull_manifest_from_cache' + it 'returns Workhorse send-dependency instructions', :aggregate_failures do + subject + + send_data_type, send_data = workhorse_send_data + header, url = send_data.values_at('Header', 'Url') + + expect(send_data_type).to eq('send-dependency') + expect(header).to eq( + "Authorization" => ["Bearer abcd1234"], + "Accept" => ::ContainerRegistry::Client::ACCEPTED_TYPES + ) + expect(url).to eq(DependencyProxy::Registry.manifest_url('alpine', tag)) + expect(response.headers['Content-Type']).to eq('application/gzip') + expect(response.headers['Content-Disposition']).to eq( + ActionDispatch::Http::ContentDisposition.format(disposition: 'attachment', filename: manifest.file_name) + ) + end end end @@ -237,8 +281,8 @@ RSpec.describe Groups::DependencyProxyForContainersController do it_behaves_like 'not found when disabled' - def get_manifest - get :manifest, params: { group_id: group.to_param, image: 'alpine', tag: '3.9.2' } + def get_manifest(tag) + get :manifest, params: { group_id: group.to_param, image: 'alpine', tag: tag } end end @@ -381,39 +425,28 @@ RSpec.describe Groups::DependencyProxyForContainersController do end end - describe 'GET #authorize_upload_blob' do + describe 'POST #authorize_upload_blob' do let(:blob_sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' } + let(:maximum_size) { DependencyProxy::Blob::MAX_FILE_SIZE } - subject(:authorize_upload_blob) do + subject do request.headers.merge!(workhorse_internal_api_request_header) - get :authorize_upload_blob, params: { group_id: group.to_param, image: 'alpine', sha: blob_sha } + post :authorize_upload_blob, params: { group_id: group.to_param, image: 'alpine', sha: blob_sha } end it_behaves_like 'without permission' - - context 'with a valid user' do - before do - group.add_guest(user) - end - - it 'sends Workhorse file upload instructions', :aggregate_failures do - authorize_upload_blob - - expect(response.headers['Content-Type']).to eq(Gitlab::Workhorse::INTERNAL_API_CONTENT_TYPE) - expect(json_response['TempPath']).to eq(DependencyProxy::FileUploader.workhorse_local_upload_path) - end - end + it_behaves_like 'authorize action with permission' end - describe 'GET #upload_blob' do + describe 'POST #upload_blob' do let(:blob_sha) { 'a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4' } let(:file) { fixture_file_upload("spec/fixtures/dependency_proxy/#{blob_sha}.gz", 'application/gzip') } subject do request.headers.merge!(workhorse_internal_api_request_header) - get :upload_blob, params: { + post :upload_blob, params: { group_id: group.to_param, image: 'alpine', sha: blob_sha, @@ -436,6 +469,79 @@ RSpec.describe Groups::DependencyProxyForContainersController do end end + describe 'POST #authorize_upload_manifest' do + let(:maximum_size) { DependencyProxy::Manifest::MAX_FILE_SIZE } + + subject do + request.headers.merge!(workhorse_internal_api_request_header) + + post :authorize_upload_manifest, params: { group_id: group.to_param, image: 'alpine', tag: 'latest' } + end + + it_behaves_like 'without permission' + it_behaves_like 'authorize action with permission' + end + + describe 'POST #upload_manifest' do + let_it_be(:file) { fixture_file_upload("spec/fixtures/dependency_proxy/manifest", 'application/json') } + let_it_be(:image) { 'alpine' } + let_it_be(:tag) { 'latest' } + let_it_be(:content_type) { 'v2/manifest' } + let_it_be(:digest) { 'foo' } + let_it_be(:file_name) { "#{image}:#{tag}.json" } + + subject do + request.headers.merge!( + workhorse_internal_api_request_header.merge!( + { + Gitlab::Workhorse::SEND_DEPENDENCY_CONTENT_TYPE_HEADER => content_type, + DependencyProxy::Manifest::DIGEST_HEADER => digest + } + ) + ) + params = { + group_id: group.to_param, + image: image, + tag: tag, + file: file, + file_name: file_name + } + + post :upload_manifest, params: params + end + + it_behaves_like 'without permission' + + context 'with a valid user' do + before do + group.add_guest(user) + end + + it_behaves_like 'a package tracking event', described_class.name, 'pull_manifest' + + context 'with no existing manifest' do + it 'creates a manifest' do + expect { subject }.to change { group.dependency_proxy_manifests.count }.by(1) + + manifest = group.dependency_proxy_manifests.first.reload + expect(manifest.content_type).to eq(content_type) + expect(manifest.digest).to eq(digest) + expect(manifest.file_name).to eq(file_name) + end + end + + context 'with existing stale manifest' do + let_it_be(:old_digest) { 'asdf' } + let_it_be_with_reload(:manifest) { create(:dependency_proxy_manifest, file_name: file_name, digest: old_digest, group: group) } + + it 'updates the existing manifest' do + expect { subject }.to change { group.dependency_proxy_manifests.count }.by(0) + .and change { manifest.reload.digest }.from(old_digest).to(digest) + end + end + end + end + def enable_dependency_proxy group.create_dependency_proxy_setting!(enabled: true) end diff --git a/spec/controllers/groups/settings/integrations_controller_spec.rb b/spec/controllers/groups/settings/integrations_controller_spec.rb index 31d1946652d..c070094babd 100644 --- a/spec/controllers/groups/settings/integrations_controller_spec.rb +++ b/spec/controllers/groups/settings/integrations_controller_spec.rb @@ -10,7 +10,7 @@ RSpec.describe Groups::Settings::IntegrationsController do sign_in(user) end - it_behaves_like IntegrationsActions do + it_behaves_like Integrations::Actions do let(:integration_attributes) { { group: group, project: nil } } let(:routing_params) do @@ -78,7 +78,7 @@ RSpec.describe Groups::Settings::IntegrationsController do describe '#update' do include JiraServiceHelper - let(:integration) { create(:jira_integration, project: nil, group_id: group.id) } + let(:integration) { create(:jira_integration, :group, group: group) } before do group.add_owner(user) @@ -108,7 +108,7 @@ RSpec.describe Groups::Settings::IntegrationsController do end describe '#reset' do - let_it_be(:integration) { create(:jira_integration, group: group, project: nil) } + let_it_be(:integration) { create(:jira_integration, :group, group: group) } let_it_be(:inheriting_integration) { create(:jira_integration, inherit_from_id: integration.id) } subject do diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb index a7625e65603..2525146c673 100644 --- a/spec/controllers/groups_controller_spec.rb +++ b/spec/controllers/groups_controller_spec.rb @@ -82,6 +82,16 @@ RSpec.describe GroupsController, factory_default: :keep do expect(subject).to redirect_to group_import_path(group) end end + + context 'publishing the invite_members_for_task experiment' do + it 'publishes the experiment data to the client' do + wrapped_experiment(experiment(:invite_members_for_task)) do |e| + expect(e).to receive(:publish_to_client) + end + + get :show, params: { id: group.to_param, open_modal: 'invite_members_for_task' }, format: format + end + end end describe 'GET #details' do diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb index 0427715d1ac..91e43adc472 100644 --- a/spec/controllers/import/bitbucket_controller_spec.rb +++ b/spec/controllers/import/bitbucket_controller_spec.rb @@ -252,6 +252,30 @@ RSpec.describe Import::BitbucketController do end end end + + context "when exceptions occur" do + shared_examples "handles exceptions" do + it "logs an exception" do + expect(Bitbucket::Client).to receive(:new).and_raise(error) + expect(controller).to receive(:log_exception) + + post :create, format: :json + end + end + + context "for OAuth2 errors" do + let(:fake_response) { double('Faraday::Response', headers: {}, body: '', status: 403) } + let(:error) { OAuth2::Error.new(OAuth2::Response.new(fake_response)) } + + it_behaves_like "handles exceptions" + end + + context "for Bitbucket errors" do + let(:error) { Bitbucket::Error::Unauthorized.new("error") } + + it_behaves_like "handles exceptions" + end + end end context 'user has chosen an existing nested namespace and name for the project' do diff --git a/spec/controllers/jira_connect/app_descriptor_controller_spec.rb b/spec/controllers/jira_connect/app_descriptor_controller_spec.rb index 9d890efdd33..4f8b2b90637 100644 --- a/spec/controllers/jira_connect/app_descriptor_controller_spec.rb +++ b/spec/controllers/jira_connect/app_descriptor_controller_spec.rb @@ -90,17 +90,5 @@ RSpec.describe JiraConnect::AppDescriptorController do ) ) end - - context 'when jira_connect_asymmetric_jwt is disabled' do - before do - stub_feature_flags(jira_connect_asymmetric_jwt: false) - end - - specify do - get :show - - expect(json_response).to include('apiMigrations' => include('signed-install' => false)) - end - end end end diff --git a/spec/controllers/jira_connect/events_controller_spec.rb b/spec/controllers/jira_connect/events_controller_spec.rb index 78bd0dc8318..2a70a2ea683 100644 --- a/spec/controllers/jira_connect/events_controller_spec.rb +++ b/spec/controllers/jira_connect/events_controller_spec.rb @@ -77,18 +77,6 @@ RSpec.describe JiraConnect::EventsController do expect(installation.base_url).to eq('https://test.atlassian.net') end - context 'when jira_connect_asymmetric_jwt is disabled' do - before do - stub_feature_flags(jira_connect_asymmetric_jwt: false) - end - - it 'saves the jira installation data without JWT validation' do - expect(Atlassian::JiraConnect::AsymmetricJwt).not_to receive(:new) - - expect { subject }.to change { JiraConnectInstallation.count }.by(1) - end - end - context 'when it is a version update and shared_secret is not sent' do let(:params) do { @@ -110,22 +98,6 @@ RSpec.describe JiraConnect::EventsController do expect { subject }.not_to change { JiraConnectInstallation.count } expect(response).to have_gitlab_http_status(:ok) end - - context 'when jira_connect_asymmetric_jwt is disabled' do - before do - stub_feature_flags(jira_connect_asymmetric_jwt: false) - end - - it 'decodes the JWT token in authorization header and returns 200 without creating a new installation' do - request.headers["Authorization"] = "Bearer #{Atlassian::Jwt.encode({ iss: client_key }, shared_secret)}" - - expect(Atlassian::JiraConnect::AsymmetricJwt).not_to receive(:new) - - expect { subject }.not_to change { JiraConnectInstallation.count } - - expect(response).to have_gitlab_http_status(:ok) - end - end end end end @@ -153,23 +125,6 @@ RSpec.describe JiraConnect::EventsController do it 'does not delete the installation' do expect { post_uninstalled }.not_to change { JiraConnectInstallation.count } end - - context 'when jira_connect_asymmetric_jwt is disabled' do - before do - stub_feature_flags(jira_connect_asymmetric_jwt: false) - request.headers['Authorization'] = 'JWT invalid token' - end - - it 'returns 403' do - post_uninstalled - - expect(response).to have_gitlab_http_status(:forbidden) - end - - it 'does not delete the installation' do - expect { post_uninstalled }.not_to change { JiraConnectInstallation.count } - end - end end context 'when JWT is valid' do @@ -197,36 +152,6 @@ RSpec.describe JiraConnect::EventsController do expect(response).to have_gitlab_http_status(:unprocessable_entity) end - - context 'when jira_connect_asymmetric_jwt is disabled' do - before do - stub_feature_flags(jira_connect_asymmetric_jwt: false) - - request.headers['Authorization'] = "JWT #{Atlassian::Jwt.encode({ iss: installation.client_key, qsh: qsh }, installation.shared_secret)}" - end - - let(:qsh) { Atlassian::Jwt.create_query_string_hash('https://gitlab.test/events/uninstalled', 'POST', 'https://gitlab.test') } - - it 'calls the DestroyService and returns ok in case of success' do - expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service| - expect(destroy_service).to receive(:execute).and_return(true) - end - - post_uninstalled - - expect(response).to have_gitlab_http_status(:ok) - end - - it 'calls the DestroyService and returns unprocessable_entity in case of failure' do - expect_next_instance_of(JiraConnectInstallations::DestroyService, installation, jira_base_path, jira_event_path) do |destroy_service| - expect(destroy_service).to receive(:execute).and_return(false) - end - - post_uninstalled - - expect(response).to have_gitlab_http_status(:unprocessable_entity) - end - end end end end diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb index 0e25f6a96d7..98cc8d83e0c 100644 --- a/spec/controllers/oauth/authorizations_controller_spec.rb +++ b/spec/controllers/oauth/authorizations_controller_spec.rb @@ -3,8 +3,7 @@ require 'spec_helper' RSpec.describe Oauth::AuthorizationsController do - let(:user) { create(:user, confirmed_at: confirmed_at) } - let(:confirmed_at) { 1.hour.ago } + let(:user) { create(:user) } let!(:application) { create(:oauth_application, scopes: 'api read_user', redirect_uri: 'http://example.com') } let(:params) do { @@ -40,7 +39,7 @@ RSpec.describe Oauth::AuthorizationsController do end context 'when the user is unconfirmed' do - let(:confirmed_at) { nil } + let(:user) { create(:user, :unconfirmed) } it 'returns 200 and renders error view' do subject @@ -73,8 +72,6 @@ RSpec.describe Oauth::AuthorizationsController do include_examples "Implicit grant can't be used in confidential application" context 'when the user is confirmed' do - let(:confirmed_at) { 1.hour.ago } - context 'when there is already an access token for the application with a matching scope' do before do scopes = Doorkeeper::OAuth::Scopes.from_string('api') diff --git a/spec/controllers/passwords_controller_spec.rb b/spec/controllers/passwords_controller_spec.rb index 08d68d7cec8..01c032d9e3b 100644 --- a/spec/controllers/passwords_controller_spec.rb +++ b/spec/controllers/passwords_controller_spec.rb @@ -91,4 +91,47 @@ RSpec.describe PasswordsController do end end end + + describe '#create' do + let(:user) { create(:user) } + + subject(:perform_request) { post(:create, params: { user: { email: user.email } }) } + + context 'when reCAPTCHA is disabled' do + before do + stub_application_setting(recaptcha_enabled: false) + end + + it 'successfully sends password reset when reCAPTCHA is not solved' do + perform_request + + expect(response).to redirect_to(new_user_session_path) + expect(flash[:notice]).to include 'If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes.' + end + end + + context 'when reCAPTCHA is enabled' do + before do + stub_application_setting(recaptcha_enabled: true) + end + + it 'displays an error when the reCAPTCHA is not solved' do + Recaptcha.configuration.skip_verify_env.delete('test') + + perform_request + + expect(response).to render_template(:new) + expect(flash[:alert]).to include 'There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.' + end + + it 'successfully sends password reset when reCAPTCHA is solved' do + Recaptcha.configuration.skip_verify_env << 'test' + + perform_request + + expect(response).to redirect_to(new_user_session_path) + expect(flash[:notice]).to include 'If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes.' + end + end + end end diff --git a/spec/controllers/profiles/accounts_controller_spec.rb b/spec/controllers/profiles/accounts_controller_spec.rb index c6e7866a659..011528016ce 100644 --- a/spec/controllers/profiles/accounts_controller_spec.rb +++ b/spec/controllers/profiles/accounts_controller_spec.rb @@ -31,7 +31,7 @@ RSpec.describe Profiles::AccountsController do end end - [:twitter, :facebook, :google_oauth2, :gitlab, :github, :bitbucket, :crowd, :auth0, :authentiq].each do |provider| + [:twitter, :facebook, :google_oauth2, :gitlab, :github, :bitbucket, :crowd, :auth0, :authentiq, :dingtalk].each do |provider| describe "#{provider} provider" do let(:user) { create(:omniauth_user, provider: provider.to_s) } diff --git a/spec/controllers/profiles/two_factor_auths_controller_spec.rb b/spec/controllers/profiles/two_factor_auths_controller_spec.rb index e57bd5be937..47086ccdd2c 100644 --- a/spec/controllers/profiles/two_factor_auths_controller_spec.rb +++ b/spec/controllers/profiles/two_factor_auths_controller_spec.rb @@ -62,6 +62,32 @@ RSpec.describe Profiles::TwoFactorAuthsController do expect(flash[:alert]).to be_nil end end + + context 'when password authentication is disabled' do + before do + stub_application_setting(password_authentication_enabled_for_web: false) + end + + it 'does not require the current password', :aggregate_failures do + go + + expect(response).not_to redirect_to(redirect_path) + expect(flash[:alert]).to be_nil + end + end + + context 'when the user is an LDAP user' do + before do + allow(user).to receive(:ldap_user?).and_return(true) + end + + it 'does not require the current password', :aggregate_failures do + go + + expect(response).not_to redirect_to(redirect_path) + expect(flash[:alert]).to be_nil + end + end end describe 'GET show' do @@ -149,7 +175,7 @@ RSpec.describe Profiles::TwoFactorAuthsController do it 'assigns error' do go - expect(assigns[:error]).to eq _('Invalid pin code') + expect(assigns[:error]).to eq({ message: 'Invalid pin code.' }) end it 'assigns qr_code' do diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb index 4959003d788..9a1f8a8442d 100644 --- a/spec/controllers/profiles_controller_spec.rb +++ b/spec/controllers/profiles_controller_spec.rb @@ -125,6 +125,8 @@ RSpec.describe ProfilesController, :request_store do end describe 'GET audit_log' do + let(:auth_event) { create(:authentication_event, user: user) } + it 'tracks search event', :snowplow do sign_in(user) @@ -136,6 +138,14 @@ RSpec.describe ProfilesController, :request_store do user: user ) end + + it 'loads page correctly' do + sign_in(user) + + get :audit_log + + expect(response).to have_gitlab_http_status(:success) + end end describe 'PUT update_username' do diff --git a/spec/controllers/projects/alerting/notifications_controller_spec.rb b/spec/controllers/projects/alerting/notifications_controller_spec.rb index 2fff8026b22..b3feeb7c07b 100644 --- a/spec/controllers/projects/alerting/notifications_controller_spec.rb +++ b/spec/controllers/projects/alerting/notifications_controller_spec.rb @@ -16,7 +16,9 @@ RSpec.describe Projects::Alerting::NotificationsController do end shared_examples 'process alert payload' do |notify_service_class| - let(:service_response) { ServiceResponse.success } + let(:alert_1) { build(:alert_management_alert, project: project) } + let(:alert_2) { build(:alert_management_alert, project: project) } + let(:service_response) { ServiceResponse.success(payload: { alerts: [alert_1, alert_2] }) } let(:notify_service) { instance_double(notify_service_class, execute: service_response) } before do @@ -30,9 +32,13 @@ RSpec.describe Projects::Alerting::NotificationsController do context 'when notification service succeeds' do let(:permitted_params) { ActionController::Parameters.new(payload).permit! } - it 'responds with ok' do + it 'responds with the alert data' do make_request + expect(json_response).to contain_exactly( + { 'iid' => alert_1.iid, 'title' => alert_1.title }, + { 'iid' => alert_2.iid, 'title' => alert_2.title } + ) expect(response).to have_gitlab_http_status(:ok) end diff --git a/spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb b/spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb index 1351ba35a71..3f0318c3973 100644 --- a/spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb +++ b/spec/controllers/projects/analytics/cycle_analytics/stages_controller_spec.rb @@ -16,6 +16,7 @@ RSpec.describe Projects::Analytics::CycleAnalytics::StagesController do end before do + stub_feature_flags(use_vsa_aggregated_tables: false) sign_in(user) end diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb index 43e8bbd83cf..d9dedb04b0d 100644 --- a/spec/controllers/projects/branches_controller_spec.rb +++ b/spec/controllers/projects/branches_controller_spec.rb @@ -356,7 +356,7 @@ RSpec.describe Projects::BranchesController do context "valid branch name with encoded slashes" do let(:branch) { "improve%2Fawesome" } - it { expect(response).to have_gitlab_http_status(:ok) } + it { expect(response).to have_gitlab_http_status(:not_found) } it { expect(response.body).to be_blank } end @@ -396,10 +396,10 @@ RSpec.describe Projects::BranchesController do let(:branch) { 'improve%2Fawesome' } it 'returns JSON response with message' do - expect(json_response).to eql('message' => 'Branch was deleted') + expect(json_response).to eql('message' => 'No such branch') end - it { expect(response).to have_gitlab_http_status(:ok) } + it { expect(response).to have_gitlab_http_status(:not_found) } end context 'invalid branch name, valid ref' do diff --git a/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb b/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb index 942402a6d00..d55aad20689 100644 --- a/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb +++ b/spec/controllers/projects/ci/pipeline_editor_controller_spec.rb @@ -6,6 +6,8 @@ RSpec.describe Projects::Ci::PipelineEditorController do let_it_be(:project) { create(:project, :repository) } let_it_be(:user) { create(:user) } + subject(:show_request) { get :show, params: { namespace_id: project.namespace, project_id: project } } + before do sign_in(user) end @@ -14,8 +16,7 @@ RSpec.describe Projects::Ci::PipelineEditorController do context 'with enough privileges' do before do project.add_developer(user) - - get :show, params: { namespace_id: project.namespace, project_id: project } + show_request end it { expect(response).to have_gitlab_http_status(:ok) } @@ -28,13 +29,24 @@ RSpec.describe Projects::Ci::PipelineEditorController do context 'without enough privileges' do before do project.add_reporter(user) - - get :show, params: { namespace_id: project.namespace, project_id: project } + show_request end it 'responds with 404' do expect(response).to have_gitlab_http_status(:not_found) end end + + describe 'pipeline_editor_walkthrough experiment' do + before do + project.add_developer(user) + end + + subject(:action) { show_request } + + it_behaves_like 'tracks assignment and records the subject', :pipeline_editor_walkthrough, :namespace do + subject { project.namespace } + end + end end end diff --git a/spec/controllers/projects/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb index 4cf77fde3a1..a8e71d73beb 100644 --- a/spec/controllers/projects/commits_controller_spec.rb +++ b/spec/controllers/projects/commits_controller_spec.rb @@ -67,6 +67,29 @@ RSpec.describe Projects::CommitsController do end end + context "with an invalid limit" do + let(:id) { "master/README.md" } + + 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: "foo" + }) + + expect(response).to be_successful + end + end + context "when the ref name ends in .atom" do context "when the ref does not exist with the suffix" do before do diff --git a/spec/controllers/projects/hooks_controller_spec.rb b/spec/controllers/projects/hooks_controller_spec.rb index 17baf38ef32..2ab18ccddbf 100644 --- a/spec/controllers/projects/hooks_controller_spec.rb +++ b/spec/controllers/projects/hooks_controller_spec.rb @@ -109,7 +109,7 @@ RSpec.describe Projects::HooksController do describe '#test' do let(:hook) { create(:project_hook, project: project) } - context 'when the endpoint receives requests above the limit' do + context 'when the endpoint receives requests above the limit', :freeze_time, :clean_gitlab_redis_rate_limiting do before do allow(Gitlab::ApplicationRateLimiter).to receive(:rate_limits) .and_return(project_testing_hook: { threshold: 1, interval: 1.minute }) diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 0b3bd4d78ac..68cccfa8bde 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -1084,28 +1084,30 @@ RSpec.describe Projects::IssuesController do end context 'real-time sidebar feature flag' do - using RSpec::Parameterized::TableSyntax - let_it_be(:project) { create(:project, :public) } let_it_be(:issue) { create(:issue, project: project) } - where(:action_cable_in_app_enabled, :feature_flag_enabled, :gon_feature_flag) do - true | true | true - true | false | true - false | true | true - false | false | false + context 'when enabled' do + before do + stub_feature_flags(real_time_issue_sidebar: true) + end + + it 'pushes the correct value to the frontend' do + go(id: issue.to_param) + + expect(Gon.features).to include('realTimeIssueSidebar' => true) + end end - with_them do + context 'when disabled' do before do - expect(Gitlab::ActionCable::Config).to receive(:in_app?).and_return(action_cable_in_app_enabled) - stub_feature_flags(real_time_issue_sidebar: feature_flag_enabled) + stub_feature_flags(real_time_issue_sidebar: false) end - it 'broadcasts to the issues channel based on ActionCable and feature flag values' do + it 'pushes the correct value to the frontend' do go(id: issue.to_param) - expect(Gon.features).to include('realTimeIssueSidebar' => gon_feature_flag) + expect(Gon.features).to include('realTimeIssueSidebar' => false) end end end @@ -1406,14 +1408,14 @@ RSpec.describe Projects::IssuesController do end end - context 'when the endpoint receives requests above the limit' do + context 'when the endpoint receives requests above the limit', :freeze_time, :clean_gitlab_redis_rate_limiting do before do - stub_application_setting(issues_create_limit: 5) + stub_application_setting(issues_create_limit: 1) end context 'when issue creation limits imposed' do it 'prevents from creating more issues', :request_store do - 5.times { post_new_issue } + post_new_issue expect { post_new_issue } .to change { Gitlab::GitalyClient.get_request_count }.by(1) # creates 1 projects and 0 issues @@ -1440,7 +1442,7 @@ RSpec.describe Projects::IssuesController do project.add_developer(user) sign_in(user) - 6.times do + 2.times do post :create, params: { namespace_id: project.namespace.to_param, project_id: project, diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb index 06c29e767ad..ed68d6a87b8 100644 --- a/spec/controllers/projects/jobs_controller_spec.rb +++ b/spec/controllers/projects/jobs_controller_spec.rb @@ -463,12 +463,25 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do end end - context 'when job has trace' do + context 'when job has live trace' do let(:job) { create(:ci_build, :running, :trace_live, pipeline: pipeline) } - it "has_trace is true" do + it 'has_trace is true' do get_show_json + expect(response).to have_gitlab_http_status(:ok) + expect(response).to match_response_schema('job/job_details') + expect(json_response['has_trace']).to be true + end + end + + context 'when has live trace and unarchived artifact' do + let(:job) { create(:ci_build, :running, :trace_live, :unarchived_trace_artifact, pipeline: pipeline) } + + it 'has_trace is true' do + get_show_json + + expect(response).to have_gitlab_http_status(:ok) expect(response).to match_response_schema('job/job_details') expect(json_response['has_trace']).to be true end @@ -631,15 +644,25 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do end end - context 'when job has a trace' do + context 'when job has a live trace' do let(:job) { create(:ci_build, :trace_live, pipeline: pipeline) } - it 'returns a trace' do - expect(response).to have_gitlab_http_status(:ok) - expect(response).to match_response_schema('job/build_trace') - expect(json_response['id']).to eq job.id - expect(json_response['status']).to eq job.status - expect(json_response['lines']).to eq [{ 'content' => [{ 'text' => 'BUILD TRACE' }], 'offset' => 0 }] + shared_examples_for 'returns trace' do + it 'returns a trace' do + expect(response).to have_gitlab_http_status(:ok) + expect(response).to match_response_schema('job/build_trace') + expect(json_response['id']).to eq job.id + expect(json_response['status']).to eq job.status + expect(json_response['lines']).to match_array [{ 'content' => [{ 'text' => 'BUILD TRACE' }], 'offset' => 0 }] + end + end + + it_behaves_like 'returns trace' + + context 'when job has unarchived artifact' do + let(:job) { create(:ci_build, :trace_live, :unarchived_trace_artifact, pipeline: pipeline) } + + it_behaves_like 'returns trace' end context 'when job is running' do @@ -1055,9 +1078,7 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do post_erase end - context 'when job is erasable' do - let(:job) { create(:ci_build, :erasable, :trace_artifact, pipeline: pipeline) } - + shared_examples_for 'erases' do it 'redirects to the erased job page' do expect(response).to have_gitlab_http_status(:found) expect(response).to redirect_to(namespace_project_job_path(id: job.id)) @@ -1073,7 +1094,19 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do end end - context 'when job is not erasable' do + context 'when job is successful and has artifacts' do + let(:job) { create(:ci_build, :erasable, :trace_artifact, pipeline: pipeline) } + + it_behaves_like 'erases' + end + + context 'when job has live trace and unarchived artifact' do + let(:job) { create(:ci_build, :success, :trace_live, :unarchived_trace_artifact, pipeline: pipeline) } + + it_behaves_like 'erases' + end + + context 'when job is erased' do let(:job) { create(:ci_build, :erased, pipeline: pipeline) } it 'returns unprocessable_entity' do @@ -1165,16 +1198,26 @@ RSpec.describe Projects::JobsController, :clean_gitlab_redis_shared_state do end end - context "when job has a trace file" do + context 'when job has a live trace' do let(:job) { create(:ci_build, :trace_live, pipeline: pipeline) } - it 'sends a trace file' do - response = subject + shared_examples_for 'sends live trace' do + it 'sends a trace file' do + response = subject - expect(response).to have_gitlab_http_status(:ok) - expect(response.headers["Content-Type"]).to eq("text/plain; charset=utf-8") - expect(response.headers["Content-Disposition"]).to match(/^inline/) - expect(response.body).to eq("BUILD TRACE") + expect(response).to have_gitlab_http_status(:ok) + expect(response.headers["Content-Type"]).to eq("text/plain; charset=utf-8") + expect(response.headers["Content-Disposition"]).to match(/^inline/) + expect(response.body).to eq("BUILD TRACE") + end + end + + it_behaves_like 'sends live trace' + + context 'and when job has unarchived artifact' do + let(:job) { create(:ci_build, :trace_live, :unarchived_trace_artifact, pipeline: pipeline) } + + it_behaves_like 'sends live trace' end end diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb index 3d7636b1f30..5b1c6777523 100644 --- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb @@ -86,10 +86,11 @@ RSpec.describe Projects::MergeRequests::DiffsController do let(:project) { create(:project, :repository) } let(:user) { create(:user) } + let(:maintainer) { true } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } before do - project.add_maintainer(user) + project.add_maintainer(user) if maintainer sign_in(user) end @@ -383,8 +384,9 @@ RSpec.describe Projects::MergeRequests::DiffsController do end context 'when the user cannot view the merge request' do + let(:maintainer) { false } + before do - project.team.truncate diff_for_path(old_path: existing_path, new_path: existing_path) end diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 438fc2f2106..46b332a8938 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -10,7 +10,8 @@ RSpec.describe Projects::MergeRequestsController do let_it_be_with_reload(:project_public_with_private_builds) { create(:project, :repository, :public, :builds_private) } let(:user) { project.owner } - let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } + 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 } before do sign_in(user) @@ -506,6 +507,7 @@ RSpec.describe Projects::MergeRequestsController do end it 'starts the merge immediately with permitted params' do + allow(MergeWorker).to receive(:with_status).and_return(MergeWorker) expect(MergeWorker).to receive(:perform_async).with(merge_request.id, anything, { 'sha' => merge_request.diff_head_sha }) merge_with_sha @@ -2073,19 +2075,21 @@ RSpec.describe Projects::MergeRequestsController do end describe 'POST #rebase' do - let(:viewer) { user } - def post_rebase post :rebase, params: { namespace_id: project.namespace, project_id: project, id: merge_request } end + before do + allow(RebaseWorker).to receive(:with_status).and_return(RebaseWorker) + end + def expect_rebase_worker_for(user) expect(RebaseWorker).to receive(:perform_async).with(merge_request.id, user.id, false) end context 'successfully' do it 'enqeues a RebaseWorker' do - expect_rebase_worker_for(viewer) + expect_rebase_worker_for(user) post_rebase @@ -2108,17 +2112,17 @@ RSpec.describe Projects::MergeRequestsController do context 'with a forked project' do let(:forked_project) { fork_project(project, fork_owner, repository: true) } let(:fork_owner) { create(:user) } + let(:merge_request_source_project) { forked_project } - before do - project.add_developer(fork_owner) + context 'user cannot push to source branch' do + before do + project.add_developer(fork_owner) - merge_request.update!(source_project: forked_project) - forked_project.add_reporter(user) - end + forked_project.add_reporter(user) + end - context 'user cannot push to source branch' do it 'returns 404' do - expect_rebase_worker_for(viewer).never + expect_rebase_worker_for(user).never post_rebase diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb index d92862f0ca3..66af546b113 100644 --- a/spec/controllers/projects/notes_controller_spec.rb +++ b/spec/controllers/projects/notes_controller_spec.rb @@ -1007,6 +1007,35 @@ RSpec.describe Projects::NotesController do end end + describe 'GET outdated_line_change' do + let(:request_params) do + { + namespace_id: project.namespace, + project_id: project, + id: note, + format: 'json' + } + end + + before do + service = double + allow(service).to receive(:execute).and_return([{ line_text: 'Test' }]) + allow(MergeRequests::OutdatedDiscussionDiffLinesService).to receive(:new).once.and_return(service) + + sign_in(user) + project.add_developer(user) + end + + it "successfully renders expected JSON response" do + get :outdated_line_change, params: request_params + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to be_an(Array) + expect(json_response.count).to eq(1) + expect(json_response.first).to include({ "line_text" => "Test" }) + end + end + # Convert a time to an integer number of microseconds def microseconds(time) (time.to_i * 1_000_000) + time.usec diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb index 1354e894872..14c613ff9c4 100644 --- a/spec/controllers/projects/pipelines_controller_spec.rb +++ b/spec/controllers/projects/pipelines_controller_spec.rb @@ -44,7 +44,7 @@ RSpec.describe Projects::PipelinesController do end end - it 'does not execute N+1 queries' do + it 'does not execute N+1 queries', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/345470' do get_pipelines_index_json control_count = ActiveRecord::QueryRecorder.new do diff --git a/spec/controllers/projects/prometheus/alerts_controller_spec.rb b/spec/controllers/projects/prometheus/alerts_controller_spec.rb index 46de8aa4baf..d66ad445c32 100644 --- a/spec/controllers/projects/prometheus/alerts_controller_spec.rb +++ b/spec/controllers/projects/prometheus/alerts_controller_spec.rb @@ -160,7 +160,9 @@ RSpec.describe Projects::Prometheus::AlertsController do end describe 'POST #notify' do - let(:service_response) { ServiceResponse.success } + let(:alert_1) { build(:alert_management_alert, :prometheus, project: project) } + let(:alert_2) { build(:alert_management_alert, :prometheus, project: project) } + let(:service_response) { ServiceResponse.success(payload: { alerts: [alert_1, alert_2] }) } let(:notify_service) { instance_double(Projects::Prometheus::Alerts::NotifyService, execute: service_response) } before do @@ -173,10 +175,15 @@ RSpec.describe Projects::Prometheus::AlertsController do end it 'returns ok if notification succeeds' do - expect(notify_service).to receive(:execute).and_return(ServiceResponse.success) + expect(notify_service).to receive(:execute).and_return(service_response) post :notify, params: project_params, session: { as: :json } + expect(json_response).to contain_exactly( + { 'iid' => alert_1.iid, 'title' => alert_1.title }, + { 'iid' => alert_2.iid, 'title' => alert_2.title } + ) + expect(response).to have_gitlab_http_status(:ok) end diff --git a/spec/controllers/projects/releases_controller_spec.rb b/spec/controllers/projects/releases_controller_spec.rb index a1e36ec5c4c..120020273f9 100644 --- a/spec/controllers/projects/releases_controller_spec.rb +++ b/spec/controllers/projects/releases_controller_spec.rb @@ -207,7 +207,18 @@ RSpec.describe Projects::ReleasesController do let(:project) { private_project } let(:user) { guest } - it_behaves_like 'not found' + it_behaves_like 'successful request' + end + + context 'when user is an external user for the project' do + let(:project) { private_project } + let(:user) { create(:user) } + + it 'behaves like not found' do + subject + + expect(response).to have_gitlab_http_status(:not_found) + end end end diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb index 482ba552f8f..29988da6e60 100644 --- a/spec/controllers/projects/services_controller_spec.rb +++ b/spec/controllers/projects/services_controller_spec.rb @@ -18,7 +18,7 @@ RSpec.describe Projects::ServicesController do project.add_maintainer(user) end - it_behaves_like IntegrationsActions do + it_behaves_like Integrations::Actions do let(:integration_attributes) { { project: project } } let(:routing_params) do @@ -254,7 +254,7 @@ RSpec.describe Projects::ServicesController do let_it_be(:project) { create(:project, group: group) } let_it_be(:jira_integration) { create(:jira_integration, project: project) } - let(:group_integration) { create(:jira_integration, group: group, project: nil, url: 'http://group.com', password: 'group') } + let(:group_integration) { create(:jira_integration, :group, group: group, url: 'http://group.com', password: 'group') } let(:integration_params) { { inherit_from_id: group_integration.id, url: 'http://custom.com', password: 'custom' } } it 'ignores submitted params and inherits group settings' do @@ -269,7 +269,7 @@ RSpec.describe Projects::ServicesController do context 'when param `inherit_from_id` is set to an unrelated group' do let_it_be(:group) { create(:group) } - let(:group_integration) { create(:jira_integration, group: group, project: nil, url: 'http://group.com', password: 'group') } + let(:group_integration) { create(:jira_integration, :group, group: group, url: 'http://group.com', password: 'group') } let(:integration_params) { { inherit_from_id: group_integration.id, url: 'http://custom.com', password: 'custom' } } it 'ignores the param and saves the submitted settings' do diff --git a/spec/controllers/projects/tags_controller_spec.rb b/spec/controllers/projects/tags_controller_spec.rb index d0719643b7f..0045c0a484b 100644 --- a/spec/controllers/projects/tags_controller_spec.rb +++ b/spec/controllers/projects/tags_controller_spec.rb @@ -25,7 +25,7 @@ RSpec.describe Projects::TagsController do with_them do it 'returns 503 status code' do expect_next_instance_of(TagsFinder) do |finder| - expect(finder).to receive(:execute).and_return([[], Gitlab::Git::CommandError.new]) + expect(finder).to receive(:execute).and_raise(Gitlab::Git::CommandError) end get :index, params: { namespace_id: project.namespace.to_param, project_id: project }, format: format diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index b34cfedb767..dafa639a2d5 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -213,21 +213,6 @@ RSpec.describe ProjectsController do before do sign_in(user) - - allow(controller).to receive(:record_experiment_user) - end - - context 'when user can push to default branch', :experiment do - let(:user) { empty_project.owner } - - it 'creates an "view_project_show" experiment tracking event' do - expect(experiment(:empty_repo_upload)).to track( - :view_project_show, - property: 'empty' - ).on_next_instance - - get :show, params: { namespace_id: empty_project.namespace, id: empty_project } - end end User.project_views.keys.each do |project_view| @@ -1158,6 +1143,22 @@ RSpec.describe ProjectsController do expect(json_response["Commits"]).to include("123456") end + context 'when gitaly is unavailable' do + before do + expect_next_instance_of(TagsFinder) do |finder| + allow(finder).to receive(:execute).and_raise(Gitlab::Git::CommandError) + end + end + + it 'gets an empty list of tags' do + get :refs, params: { namespace_id: project.namespace, id: project, ref: "123456" } + + expect(json_response["Branches"]).to include("master") + expect(json_response["Tags"]).to eq([]) + expect(json_response["Commits"]).to include("123456") + end + end + context "when preferred language is Japanese" do before do user.update!(preferred_language: 'ja') diff --git a/spec/controllers/registrations/welcome_controller_spec.rb b/spec/controllers/registrations/welcome_controller_spec.rb index 034c9b3d1c0..0a1e6b8ec8f 100644 --- a/spec/controllers/registrations/welcome_controller_spec.rb +++ b/spec/controllers/registrations/welcome_controller_spec.rb @@ -97,6 +97,16 @@ RSpec.describe Registrations::WelcomeController do expect(subject).to redirect_to(dashboard_projects_path) end end + + context 'when tasks to be done are assigned' do + let!(:member1) { create(:group_member, user: user, tasks_to_be_done: %w(ci code)) } + + before do + stub_experiments(invite_members_for_task: true) + end + + it { is_expected.to redirect_to(issues_dashboard_path(assignee_username: user.username)) } + end end end end diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb index a25c597edb2..baf500c2b57 100644 --- a/spec/controllers/registrations_controller_spec.rb +++ b/spec/controllers/registrations_controller_spec.rb @@ -499,13 +499,12 @@ RSpec.describe RegistrationsController do expect(User.last.name).to eq("#{base_user_params[:first_name]} #{base_user_params[:last_name]}") end - it 'sets the username and caller_id in the context' do + it 'sets the caller_id in the context' do expect(controller).to receive(:create).and_wrap_original do |m, *args| m.call(*args) expect(Gitlab::ApplicationContext.current) - .to include('meta.user' => base_user_params[:username], - 'meta.caller_id' => 'RegistrationsController#create') + .to include('meta.caller_id' => 'RegistrationsController#create') end subject |