Expand coverage for "system checks" (#24216)
This commit is contained in:
		
							parent
							
								
									862861069d
								
							
						
					
					
						commit
						9d39b111f1
					
				| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::BaseCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'skip?' do
 | 
				
			||||||
 | 
					    it 'returns false' do
 | 
				
			||||||
 | 
					      expect(check.skip?).to be false
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    it 'raises not implemented error' do
 | 
				
			||||||
 | 
					      expect { check.pass? }.to raise_error(NotImplementedError)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    it 'raises not implemented error' do
 | 
				
			||||||
 | 
					      expect { check.message }.to raise_error(NotImplementedError)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,45 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::DatabaseSchemaCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it_behaves_like 'a check available to devops users'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    context 'when database needs migration' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        context = instance_double(ActiveRecord::MigrationContext, needs_migration?: true)
 | 
				
			||||||
 | 
					        allow(ActiveRecord::Base.connection).to receive(:migration_context).and_return(context)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns false' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when database does not need migration' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        context = instance_double(ActiveRecord::MigrationContext, needs_migration?: false)
 | 
				
			||||||
 | 
					        allow(ActiveRecord::Base.connection).to receive(:migration_context).and_return(context)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    it 'sends class name symbol to message instance' do
 | 
				
			||||||
 | 
					      allow(Admin::SystemCheck::Message).to receive(:new).with(:database_schema_check)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(Admin::SystemCheck::Message).to have_received(:new).with(:database_schema_check)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,100 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::ElasticsearchCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it_behaves_like 'a check available to devops users'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    context 'when chewy is enabled' do
 | 
				
			||||||
 | 
					      before { allow(Chewy).to receive(:enabled?).and_return(true) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      context 'when running version is present and high enough' do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          allow(Chewy.client).to receive(:info)
 | 
				
			||||||
 | 
					            .and_return({ 'version' => { 'number' => '999.99.9' } })
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it 'returns true' do
 | 
				
			||||||
 | 
					          expect(check.pass?).to be true
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      context 'when running version is present and too low' do
 | 
				
			||||||
 | 
					        context 'when compatible version is too low' do
 | 
				
			||||||
 | 
					          before do
 | 
				
			||||||
 | 
					            allow(Chewy.client).to receive(:info)
 | 
				
			||||||
 | 
					              .and_return({ 'version' => { 'number' => '1.2.3', 'minimum_wire_compatibility_version' => '1.0' } })
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          it 'returns false' do
 | 
				
			||||||
 | 
					            expect(check.pass?).to be false
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        context 'when compatible version is high enough' do
 | 
				
			||||||
 | 
					          before do
 | 
				
			||||||
 | 
					            allow(Chewy.client).to receive(:info)
 | 
				
			||||||
 | 
					              .and_return({ 'version' => { 'number' => '1.2.3', 'minimum_wire_compatibility_version' => '99.9' } })
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          it 'returns true' do
 | 
				
			||||||
 | 
					            expect(check.pass?).to be true
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      context 'when running version is missing' do
 | 
				
			||||||
 | 
					        before do
 | 
				
			||||||
 | 
					          client = instance_double(Elasticsearch::Transport::Client)
 | 
				
			||||||
 | 
					          allow(client).to receive(:info).and_raise(Elasticsearch::Transport::Transport::Error)
 | 
				
			||||||
 | 
					          allow(Chewy).to receive(:client).and_return(client)
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        it 'returns false' do
 | 
				
			||||||
 | 
					          expect(check.pass?).to be false
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when chewy is not enabled' do
 | 
				
			||||||
 | 
					      before { allow(Chewy).to receive(:enabled?).and_return(false) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    context 'when running version is present' do
 | 
				
			||||||
 | 
					      before { allow(Chewy.client).to receive(:info).and_return({ 'version' => { 'number' => '999.99.9' } }) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'sends class name symbol to message instance' do
 | 
				
			||||||
 | 
					        allow(Admin::SystemCheck::Message).to receive(:new)
 | 
				
			||||||
 | 
					          .with(:elasticsearch_version_check, anything)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(Admin::SystemCheck::Message).to have_received(:new)
 | 
				
			||||||
 | 
					          .with(:elasticsearch_version_check, 'Elasticsearch 999.99.9 is running while 7.x is required')
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when running version is missing' do
 | 
				
			||||||
 | 
					      it 'sends class name symbol to message instance' do
 | 
				
			||||||
 | 
					        allow(Admin::SystemCheck::Message).to receive(:new)
 | 
				
			||||||
 | 
					          .with(:elasticsearch_running_check)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        expect(Admin::SystemCheck::Message).to have_received(:new)
 | 
				
			||||||
 | 
					          .with(:elasticsearch_running_check)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::MediaPrivacyCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it_behaves_like 'a check available to devops users'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    context 'when the media cannot be listed' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        stub_request(:get, /ngrok.io/).to_return(status: 200, body: 'a list of no files')
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    it 'sends values to message instance' do
 | 
				
			||||||
 | 
					      allow(Admin::SystemCheck::Message).to receive(:new).with(nil, nil, nil, true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(Admin::SystemCheck::Message).to have_received(:new).with(nil, nil, nil, true)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::Message do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(:key_value, :value_value, :action_value, :critical_value) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it 'providers readers when initialized' do
 | 
				
			||||||
 | 
					    expect(check.key).to eq :key_value
 | 
				
			||||||
 | 
					    expect(check.value).to eq :value_value
 | 
				
			||||||
 | 
					    expect(check.action).to eq :action_value
 | 
				
			||||||
 | 
					    expect(check.critical).to eq :critical_value
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::RulesCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'skip?' do
 | 
				
			||||||
 | 
					    context 'when user can manage rules' do
 | 
				
			||||||
 | 
					      before { allow(user).to receive(:can?).with(:manage_rules).and_return(true) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns false' do
 | 
				
			||||||
 | 
					        expect(check.skip?).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when user cannot manage rules' do
 | 
				
			||||||
 | 
					      before { allow(user).to receive(:can?).with(:manage_rules).and_return(false) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.skip?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    context 'when there is not a kept rule' do
 | 
				
			||||||
 | 
					      it 'returns false' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when there is a kept rule' do
 | 
				
			||||||
 | 
					      before { Fabricate(:rule) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    it 'sends class name symbol to message instance' do
 | 
				
			||||||
 | 
					      allow(Admin::SystemCheck::Message).to receive(:new).with(:rules_check, nil, '/admin/rules')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(Admin::SystemCheck::Message).to have_received(:new).with(:rules_check, nil, '/admin/rules')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,45 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck::SidekiqProcessCheck do
 | 
				
			||||||
 | 
					  subject(:check) { described_class.new(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it_behaves_like 'a check available to devops users'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'pass?' do
 | 
				
			||||||
 | 
					    context 'when missing queues is empty' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        process_set = instance_double(Sidekiq::ProcessSet, reduce: [])
 | 
				
			||||||
 | 
					        allow(Sidekiq::ProcessSet).to receive(:new).and_return(process_set)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when missing queues is not empty' do
 | 
				
			||||||
 | 
					      before do
 | 
				
			||||||
 | 
					        process_set = instance_double(Sidekiq::ProcessSet, reduce: [:something])
 | 
				
			||||||
 | 
					        allow(Sidekiq::ProcessSet).to receive(:new).and_return(process_set)
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns false' do
 | 
				
			||||||
 | 
					        expect(check.pass?).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'message' do
 | 
				
			||||||
 | 
					    it 'sends values to message instance' do
 | 
				
			||||||
 | 
					      allow(Admin::SystemCheck::Message).to receive(:new).with(:sidekiq_process_check, 'default, push, mailers, pull, scheduler, ingress')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      check.message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(Admin::SystemCheck::Message).to have_received(:new).with(:sidekiq_process_check, 'default, push, mailers, pull, scheduler, ingress')
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require 'rails_helper'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe Admin::SystemCheck do
 | 
				
			||||||
 | 
					  let(:user) { Fabricate(:user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe 'perform' do
 | 
				
			||||||
 | 
					    let(:result) { described_class.perform(user) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'runs all the checks' do
 | 
				
			||||||
 | 
					      expect(result).to be_an(Array)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					shared_examples 'a check available to devops users' do
 | 
				
			||||||
 | 
					  describe 'skip?' do
 | 
				
			||||||
 | 
					    context 'when user can view devops' do
 | 
				
			||||||
 | 
					      before { allow(user).to receive(:can?).with(:view_devops).and_return(true) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns false' do
 | 
				
			||||||
 | 
					        expect(check.skip?).to be false
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    context 'when user cannot view devops' do
 | 
				
			||||||
 | 
					      before { allow(user).to receive(:can?).with(:view_devops).and_return(false) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it 'returns true' do
 | 
				
			||||||
 | 
					        expect(check.skip?).to be true
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
		Loading…
	
		Reference in New Issue