91 lines
3 KiB
Ruby
91 lines
3 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
|