diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-09-20 02:18:09 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-09-20 02:18:09 +0300 |
commit | 6ed4ec3e0b1340f96b7c043ef51d1b33bbe85fde (patch) | |
tree | dc4d20fe6064752c0bd323187252c77e0a89144b /spec/requests/projects/google_cloud/databases_controller_spec.rb | |
parent | 9868dae7fc0655bd7ce4a6887d4e6d487690eeed (diff) |
Add latest changes from gitlab-org/gitlab@15-4-stable-eev15.4.0-rc42
Diffstat (limited to 'spec/requests/projects/google_cloud/databases_controller_spec.rb')
-rw-r--r-- | spec/requests/projects/google_cloud/databases_controller_spec.rb | 221 |
1 files changed, 127 insertions, 94 deletions
diff --git a/spec/requests/projects/google_cloud/databases_controller_spec.rb b/spec/requests/projects/google_cloud/databases_controller_spec.rb index c9335f8f317..4edef71f326 100644 --- a/spec/requests/projects/google_cloud/databases_controller_spec.rb +++ b/spec/requests/projects/google_cloud/databases_controller_spec.rb @@ -2,133 +2,166 @@ require 'spec_helper' -# Mock Types -MockGoogleOAuth2Credentials = Struct.new(:app_id, :app_secret) +RSpec.describe Projects::GoogleCloud::DatabasesController, :snowplow do + shared_examples 'shared examples for database controller endpoints' do + include_examples 'requires `admin_project_google_cloud` role' -RSpec.describe Projects::GoogleCloud::DatabasesController do - let_it_be(:project) { create(:project, :public) } - let_it_be(:url) { project_google_cloud_databases_path(project) } + include_examples 'requires feature flag `incubation_5mp_google_cloud` enabled' - let_it_be(:user_guest) { create(:user) } - let_it_be(:user_developer) { create(:user) } - let_it_be(:user_maintainer) { create(:user) } + include_examples 'requires valid Google OAuth2 configuration' - let_it_be(:unauthorized_members) { [user_guest, user_developer] } - let_it_be(:authorized_members) { [user_maintainer] } + include_examples 'requires valid Google Oauth2 token' do + let_it_be(:mock_gcp_projects) { [{}, {}, {}] } + let_it_be(:mock_branches) { [] } + let_it_be(:mock_tags) { [] } + end + end + + context '-/google_cloud/databases' do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:renders_template) { 'projects/google_cloud/databases/index' } + let_it_be(:redirects_to) { nil } - before do - project.add_guest(user_guest) - project.add_developer(user_developer) - project.add_maintainer(user_maintainer) + subject { get project_google_cloud_databases_path(project) } + + include_examples 'shared examples for database controller endpoints' end - context 'when accessed by unauthorized members' do - it 'returns not found on GET request' do - unauthorized_members.each do |unauthorized_member| - sign_in(unauthorized_member) + context '-/google_cloud/databases/new/postgres' do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:renders_template) { 'projects/google_cloud/databases/cloudsql_form' } + let_it_be(:redirects_to) { nil } - get url - expect_snowplow_event( - category: 'Projects::GoogleCloud', - action: 'admin_project_google_cloud!', - label: 'error_access_denied', - property: 'invalid_user', - project: project, - user: unauthorized_member - ) + subject { get new_project_google_cloud_database_path(project, :postgres) } - expect(response).to have_gitlab_http_status(:not_found) - end - end + include_examples 'shared examples for database controller endpoints' end - context 'when accessed by authorized members' do - it 'returns successful' do - authorized_members.each do |authorized_member| - sign_in(authorized_member) + context '-/google_cloud/databases/new/mysql' do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:renders_template) { 'projects/google_cloud/databases/cloudsql_form' } + let_it_be(:redirects_to) { nil } - get url + subject { get new_project_google_cloud_database_path(project, :mysql) } - expect(response).to be_successful - expect(response).to render_template('projects/google_cloud/databases/index') - end - end + include_examples 'shared examples for database controller endpoints' + end - context 'but gitlab instance is not configured for google oauth2' do - it 'returns forbidden' do - unconfigured_google_oauth2 = MockGoogleOAuth2Credentials.new('', '') - allow(Gitlab::Auth::OAuth::Provider).to receive(:config_for) - .with('google_oauth2') - .and_return(unconfigured_google_oauth2) + context '-/google_cloud/databases/new/sqlserver' do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:renders_template) { 'projects/google_cloud/databases/cloudsql_form' } + let_it_be(:redirects_to) { nil } - authorized_members.each do |authorized_member| - sign_in(authorized_member) + subject { get new_project_google_cloud_database_path(project, :sqlserver) } - get url + include_examples 'shared examples for database controller endpoints' + end - expect(response).to have_gitlab_http_status(:forbidden) - expect_snowplow_event( - category: 'Projects::GoogleCloud', - action: 'google_oauth2_enabled!', - label: 'error_access_denied', - extra: { reason: 'google_oauth2_not_configured', - config: unconfigured_google_oauth2 }, - project: project, - user: authorized_member - ) + context '-/google_cloud/databases/create' do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:renders_template) { nil } + let_it_be(:redirects_to) { project_google_cloud_databases_path(project) } + + subject { post project_google_cloud_databases_path(project) } + + include_examples 'shared examples for database controller endpoints' + + context 'when the request is valid' do + before do + project.add_maintainer(user) + sign_in(user) + + allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client| + allow(client).to receive(:validate_token).and_return(true) + allow(client).to receive(:list_projects).and_return(mock_gcp_projects) + end + + allow_next_instance_of(BranchesFinder) do |finder| + allow(finder).to receive(:execute).and_return(mock_branches) + end + + allow_next_instance_of(TagsFinder) do |finder| + allow(finder).to receive(:execute).and_return(mock_branches) end end - end - context 'but feature flag is disabled' do - before do - stub_feature_flags(incubation_5mp_google_cloud: false) + subject do + post project_google_cloud_databases_path(project) end - it 'returns not found' do - authorized_members.each do |authorized_member| - sign_in(authorized_member) + it 'calls EnableCloudsqlService and redirects on error' do + expect_next_instance_of(::GoogleCloud::EnableCloudsqlService) do |service| + expect(service).to receive(:execute) + .and_return({ status: :error, message: 'error' }) + end - get url + subject - expect(response).to have_gitlab_http_status(:not_found) - expect_snowplow_event( - category: 'Projects::GoogleCloud', - action: 'feature_flag_enabled!', - label: 'error_access_denied', - property: 'feature_flag_not_enabled', - project: project, - user: authorized_member - ) - end + expect(response).to redirect_to(project_google_cloud_databases_path(project)) + + expect_snowplow_event( + category: 'Projects::GoogleCloud::DatabasesController', + action: 'error_enable_cloudsql_services', + label: nil, + project: project, + user: user + ) end - end - context 'but google oauth2 token is not valid' do - it 'does not return revoke oauth url' do - allow_next_instance_of(GoogleApi::CloudPlatform::Client) do |client| - allow(client).to receive(:validate_token).and_return(false) + context 'when EnableCloudsqlService is successful' do + before do + allow_next_instance_of(::GoogleCloud::EnableCloudsqlService) do |service| + allow(service).to receive(:execute) + .and_return({ status: :success, message: 'success' }) + end end - authorized_members.each do |authorized_member| - sign_in(authorized_member) + it 'calls CreateCloudsqlInstanceService and redirects on error' do + expect_next_instance_of(::GoogleCloud::CreateCloudsqlInstanceService) do |service| + expect(service).to receive(:execute) + .and_return({ status: :error, message: 'error' }) + end + + subject - get url + expect(response).to redirect_to(project_google_cloud_databases_path(project)) - expect(response).to be_successful expect_snowplow_event( - category: 'Projects::GoogleCloud', - action: 'databases#index', - label: 'success', - extra: { - configurationUrl: project_google_cloud_configuration_path(project), - deploymentsUrl: project_google_cloud_deployments_path(project), - databasesUrl: project_google_cloud_databases_path(project) - }, + category: 'Projects::GoogleCloud::DatabasesController', + action: 'error_create_cloudsql_instance', + label: nil, project: project, - user: authorized_member + user: user ) end + + context 'when CreateCloudsqlInstanceService is successful' do + before do + allow_next_instance_of(::GoogleCloud::CreateCloudsqlInstanceService) do |service| + allow(service).to receive(:execute) + .and_return({ status: :success, message: 'success' }) + end + end + + it 'redirects as expected' do + subject + + expect(response).to redirect_to(project_google_cloud_databases_path(project)) + + expect_snowplow_event( + category: 'Projects::GoogleCloud::DatabasesController', + action: 'create_cloudsql_instance', + label: "{}", + project: project, + user: user + ) + end + end end end end |