Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
Expand coverage for "system checks" (mastodon#24216)
Browse files Browse the repository at this point in the history
  • Loading branch information
mjankowski authored Apr 7, 2023
1 parent 8628610 commit 9d39b11
Show file tree
Hide file tree
Showing 9 changed files with 353 additions and 0 deletions.
27 changes: 27 additions & 0 deletions spec/lib/admin/system_check/base_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
45 changes: 45 additions & 0 deletions spec/lib/admin/system_check/database_schema_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
100 changes: 100 additions & 0 deletions spec/lib/admin/system_check/elasticsearch_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
33 changes: 33 additions & 0 deletions spec/lib/admin/system_check/media_privacy_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions spec/lib/admin/system_check/message_spec.rb
Original file line number Diff line number Diff line change
@@ -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
53 changes: 53 additions & 0 deletions spec/lib/admin/system_check/rules_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
45 changes: 45 additions & 0 deletions spec/lib/admin/system_check/sidekiq_process_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
15 changes: 15 additions & 0 deletions spec/lib/admin/system_check_spec.rb
Original file line number Diff line number Diff line change
@@ -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
21 changes: 21 additions & 0 deletions spec/support/examples/lib/admin/checks.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9d39b11

Please sign in to comment.