spec/lib/release_tools/prometheus/wraparound_vacuum_checks_spec.rb (106 lines of code) (raw):

# frozen_string_literal: true require 'spec_helper' describe ReleaseTools::Prometheus::WraparoundVacuumChecks do before do enable_feature(:pdm_vacuum_check) end describe '#running?' do subject(:checks) { service.running? } let(:tables) { %i[ci_stages ci_job_artifacts] } let(:service) { described_class.new(tables) } let(:prom_query) do <<~QUERY.strip sum(rate(pg_stat_activity_autovacuum_age_in_seconds{relname=~"ci_stages \\\\(to prevent wraparound\\\\)|ci_job_artifacts \\\\(to prevent wraparound\\\\)", type="patroni-ci"}[1m])) QUERY end before do query_instance = instance_double(ReleaseTools::Prometheus::Query) allow(ReleaseTools::Prometheus::Query).to receive(:new).and_return(query_instance) allow(query_instance).to receive(:run).with(prom_query).and_return(response) end context 'when the vacuum is active' do let(:response) do { 'status' => 'success', 'data' => { 'resultType' => 'vector', 'result' => [{ 'metric' => {}, 'value' => [1_703_063_560.544, '0.9994165111111618'] }] } } end it { is_expected.to be_truthy } context 'with the feature flag disabled' do before do disable_feature(:pdm_vacuum_check) end it { is_expected.to be_falsey } end end context 'when the vacuum is not active' do let(:response) do { 'status' => 'success', 'data' => { 'resultType' => 'vector', 'result' => [] } } end it { is_expected.to be_falsey } end end describe '.running?' do subject(:checks) { described_class.running?(migrations) } before do query_instance = instance_double(ReleaseTools::Prometheus::Query) allow(ReleaseTools::Prometheus::Query).to receive(:new).and_return(query_instance) allow(query_instance).to receive(:run).and_return({ 'data' => { 'result' => [] } }) end context 'when tables have the same prefix' do context 'with longer tables first' do let(:migrations) do [ '20230712064637_change_fk_ci_builds_metadata_to_ci_builds.rb', '20230712064638_change_fk_ci_pipelines_config_to_ci_pipelines.rb' ] end it 'invokes the service with the correct tables' do expect(described_class).to receive(:new) .with(%w[ci_builds_metadata ci_builds ci_pipelines_config ci_pipelines]) .and_call_original expect(checks).to be_falsey end end context 'with shorter tables first' do let(:migrations) do [ '20230712064637_change_fk_ci_builds_to_ci_builds_metadata.rb', '202307120646378_change_fk_ci_pipelines_to_ci_pipelines_config.rb' ] end it 'invokes the service with the correct tables' do expect(described_class).to receive(:new) .with(%w[ci_builds ci_builds_metadata ci_pipelines ci_pipelines_config]) .and_call_original expect(checks).to be_falsey end end end context 'when no table matches' do let(:migrations) do [ '20230712064637_add_async_index_on_builds.rb', '20230712064638_validate_async_fk_on_job_artifacts.rb' ] end it 'invokes the service with the correct tables' do expect(described_class).to receive(:new) .with([]) .and_call_original expect(checks).to be_falsey end end end end