summaryrefslogtreecommitdiff
path: root/spec/requests/projects/google_cloud/databases_controller_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/requests/projects/google_cloud/databases_controller_spec.rb')
-rw-r--r--spec/requests/projects/google_cloud/databases_controller_spec.rb221
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