gitlab-org--gitlab-foss/spec/services/google_cloud/create_cloudsql_instance_se...

91 lines
3.0 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe GoogleCloud::CreateCloudsqlInstanceService do
let(:project) { create(:project) }
let(:user) { create(:user) }
let(:gcp_project_id) { 'gcp_project_120' }
let(:environment_name) { 'test_env_42' }
let(:database_version) { 'POSTGRES_8000' }
let(:tier) { 'REIT_TIER' }
let(:service) do
described_class.new(project, user, {
gcp_project_id: gcp_project_id,
environment_name: environment_name,
database_version: database_version,
tier: tier
})
end
describe '#execute' do
before do
allow_next_instance_of(::Ci::VariablesFinder) do |variable_finder|
allow(variable_finder).to receive(:execute).and_return([])
end
end
it 'triggers creation of a cloudsql instance' do
expect_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
expected_instance_name = "gitlab-#{project.id}-postgres-8000-test-env-42"
expect(client).to receive(:create_cloudsql_instance)
.with(gcp_project_id,
expected_instance_name,
String,
database_version,
'us-east1',
tier)
end
result = service.execute
expect(result[:status]).to be(:success)
end
it 'triggers worker to manage cloudsql instance creation operation results' do
expect_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
expect(client).to receive(:create_cloudsql_instance)
end
expect(GoogleCloud::CreateCloudsqlInstanceWorker).to receive(:perform_in)
result = service.execute
expect(result[:status]).to be(:success)
end
context 'when google APIs fail' do
it 'returns error' do
expect_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
expect(client).to receive(:create_cloudsql_instance).and_raise(Google::Apis::Error.new('mock-error'))
end
result = service.execute
expect(result[:status]).to eq(:error)
end
end
context 'when project has GCP_REGION defined' do
let(:gcp_region) { instance_double(::Ci::Variable, key: 'GCP_REGION', value: 'user-defined-region') }
before do
allow_next_instance_of(::Ci::VariablesFinder) do |variable_finder|
allow(variable_finder).to receive(:execute).and_return([gcp_region])
end
end
it 'uses defined region' do
expect_next_instance_of(GoogleApi::CloudPlatform::Client) do |client|
expect(client).to receive(:create_cloudsql_instance)
.with(gcp_project_id,
String,
String,
database_version,
'user-defined-region',
tier)
end
service.execute
end
end
end
end