gitlab-org--gitlab-foss/spec/support/shared_examples/models/cluster_application_status_...

333 lines
8.4 KiB
Ruby

# frozen_string_literal: true
RSpec.shared_examples 'cluster application status specs' do |application_name|
describe '#status_states' do
let(:cluster) { create(:cluster, :provided_by_gcp) }
subject { described_class.new(cluster: cluster) }
it 'returns a hash of state values' do
expect(subject.status_states).to include(:installed)
end
it 'returns an integer for installed state value' do
expect(subject.status_states[:installed]).to eq(3)
end
end
describe '.available' do
subject { described_class.available }
let!(:installed_cluster) { create(application_name, :installed) }
let!(:updated_cluster) { create(application_name, :updated) }
before do
create(application_name, :errored)
end
it { is_expected.to contain_exactly(installed_cluster, updated_cluster) }
end
describe 'status state machine' do
describe '#make_installing' do
subject { create(application_name, :scheduled) }
it 'is installing' do
subject.make_installing!
expect(subject).to be_installing
end
end
describe '#make_installed' do
subject { create(application_name, :installing) }
it 'is installed' do
subject.make_installed!
expect(subject).to be_installed
end
it 'does not update the helm version' do
subject.cluster.application_helm.update!(version: '1.2.3')
expect do
subject.make_installed!
subject.cluster.application_helm.reload
end.not_to change { subject.cluster.application_helm.version }
end
context 'the cluster has no helm installed' do
subject { create(application_name, :installing, :no_helm_installed) }
it 'runs without errors' do
expect { subject.make_installed! }.not_to raise_error
end
end
context 'application is updating' do
subject { create(application_name, :updating) }
it 'is updated' do
subject.make_installed!
expect(subject).to be_updated
end
it 'does not update the helm version' do
subject.cluster.application_helm.update!(version: '1.2.3')
expect do
subject.make_installed!
subject.cluster.application_helm.reload
end.not_to change { subject.cluster.application_helm.version }
end
context 'the cluster has no helm installed' do
subject { create(application_name, :updating, :no_helm_installed) }
it 'runs without errors' do
expect { subject.make_installed! }.not_to raise_error
end
end
end
end
describe '#make_errored' do
subject { create(application_name, :installing) }
let(:reason) { 'some errors' }
it 'is errored' do
subject.make_errored(reason)
expect(subject).to be_errored
expect(subject.status_reason).to eq(reason)
end
context 'application is updating' do
subject { create(application_name, :updating) }
it 'is update_errored' do
subject.make_errored(reason)
expect(subject).to be_update_errored
expect(subject.status_reason).to eq(reason)
end
end
context 'application is uninstalling' do
subject { create(application_name, :uninstalling) }
it 'is uninstall_errored' do
subject.make_errored(reason)
expect(subject).to be_uninstall_errored
expect(subject.status_reason).to eq(reason)
end
end
end
describe '#make_externally_installed' do
subject { create(application_name, :installing) }
let(:old_helm) { create(:clusters_applications_helm, version: '1.2.3') }
it 'is installed' do
subject.make_externally_installed
expect(subject).to be_installed
end
context 'helm record does not exist' do
subject { build(application_name, :installing, :no_helm_installed) }
it 'does not create a helm record' do
subject.make_externally_installed!
subject.cluster.reload
expect(subject.cluster.application_helm).to be_nil
end
end
context 'helm record exists' do
subject { build(application_name, :installing, cluster: old_helm.cluster) }
it 'does not update helm version' do
subject.make_externally_installed!
subject.cluster.application_helm.reload
expect(subject.cluster.application_helm.version).to eq('1.2.3')
end
end
context 'application is updated' do
subject { create(application_name, :updated) }
it 'is installed' do
subject.make_externally_installed
expect(subject).to be_installed
end
end
context 'application is errored' do
subject { create(application_name, :errored) }
it 'is installed' do
subject.make_externally_installed
expect(subject).to be_installed
end
it 'clears #status_reason' do
expect(subject.status_reason).not_to be_nil
subject.make_externally_installed!
expect(subject.status_reason).to be_nil
end
end
end
describe '#make_externally_uninstalled' do
subject { create(application_name, :installed) }
it 'is uninstalled' do
subject.make_externally_uninstalled
expect(subject).to be_uninstalled
end
context 'application is updated' do
subject { create(application_name, :updated) }
it 'is uninstalled' do
subject.make_externally_uninstalled
expect(subject).to be_uninstalled
end
end
context 'application is errored' do
subject { create(application_name, :errored) }
it 'is uninstalled' do
subject.make_externally_uninstalled
expect(subject).to be_uninstalled
end
it 'clears #status_reason' do
expect(subject.status_reason).not_to be_nil
subject.make_externally_uninstalled!
expect(subject.status_reason).to be_nil
end
end
end
describe '#make_scheduled' do
subject { create(application_name, :installable) }
it 'is scheduled' do
subject.make_scheduled
expect(subject).to be_scheduled
end
describe 'when installed' do
subject { create(application_name, :installed) }
it 'is scheduled' do
subject.make_scheduled
expect(subject).to be_scheduled
end
end
describe 'when was errored' do
subject { create(application_name, :errored) }
it 'clears #status_reason' do
expect(subject.status_reason).not_to be_nil
subject.make_scheduled!
expect(subject.status_reason).to be_nil
end
end
describe 'when was updated_errored' do
subject { create(application_name, :update_errored) }
it 'clears #status_reason' do
expect(subject.status_reason).not_to be_nil
subject.make_scheduled!
expect(subject.status_reason).to be_nil
end
end
describe 'when was uninstall_errored' do
subject { create(application_name, :uninstall_errored) }
it 'clears #status_reason' do
expect(subject.status_reason).not_to be_nil
subject.make_scheduled!
expect(subject.status_reason).to be_nil
end
end
end
describe '#make_uninstalling' do
subject { create(application_name, :scheduled) }
it 'is uninstalling' do
subject.make_uninstalling!
expect(subject).to be_uninstalling
end
end
end
describe '#available?' do
using RSpec::Parameterized::TableSyntax
let_it_be(:cluster) { create(:cluster, :provided_by_gcp) }
where(:trait, :available) do
:not_installable | false
:installable | false
:scheduled | false
:installing | false
:installed | true
:updating | false
:updated | true
:errored | false
:update_errored | false
:uninstalling | false
:uninstall_errored | false
:uninstalled | false
:timed_out | false
end
with_them do
subject { build(application_name, trait, cluster: cluster) }
if params[:available]
it { is_expected.to be_available }
else
it { is_expected.not_to be_available }
end
end
end
end