spec/lib/gdk/diagnostic/ruby_gems_spec.rb (102 lines of code) (raw):

# frozen_string_literal: true RSpec.describe GDK::Diagnostic::RubyGems do include ShelloutHelper let(:allow_gem_not_installed) { nil } let(:bundle_check_ok) { nil } subject(:diagnostic) { described_class.new(allow_gem_not_installed: allow_gem_not_installed) } before do stub_bundle_check(bundle_check_ok) stub_const('GDK::Diagnostic::RubyGems::GEM_REQUIRE_MAPPING', { 'bad_gem' => 'actual_gem_name' }) stub_const('GDK::Diagnostic::RubyGems::GITLAB_GEMS_WITH_C_CODE_TO_CHECK', %w[bad_gem]) end describe '#success?' do context 'when bundle check fails' do let(:bundle_check_ok) { false } it { is_expected.not_to be_success } end context 'when bundle check succeeds' do let(:bundle_check_ok) { true } before do stub_gem_installed('bad_gem', gem_installed) end context 'when bad_gem is not installed' do let(:gem_installed) { false } context 'and allow_gem_not_installed is false' do let(:allow_gem_not_installed) { false } it { is_expected.not_to be_success } end context 'and allow_gem_not_installed is true' do let(:allow_gem_not_installed) { true } it { is_expected.to be_success } end end context 'when bad_gem is installed' do let(:gem_installed) { true } before do stub_gem_loads_ok('bad_gem', gem_loads_ok) end context 'and bad_gem cannot be loaded' do let(:gem_loads_ok) { false } it { is_expected.not_to be_success } end context 'and bad_gem is loaded correctly' do let(:gem_loads_ok) { true } it { is_expected.to be_success } end end end end describe '#detail' do subject(:detail) { diagnostic.detail } context 'when bundle check fails' do let(:bundle_check_ok) { false } it { is_expected.to match(/There are Ruby gems missing that need to be installed./) } end context 'when bundle check succeeds' do let(:bundle_check_ok) { true } before do stub_gem_installed('bad_gem', gem_installed) end context 'when bad_gem is not installed' do let(:gem_installed) { false } context 'and allow_gem_not_installed is false' do let(:allow_gem_not_installed) { false } it { is_expected.to match(/bundle pristine bad_gem/) } end context 'and allow_gem_not_installed is true' do let(:allow_gem_not_installed) { true } it { is_expected.to be_nil } end end context 'when bad_gem is installed' do let(:gem_installed) { true } before do stub_gem_loads_ok('bad_gem', gem_loads_ok) end context 'and bad_gem cannot be loaded' do let(:gem_loads_ok) { false } it { is_expected.to match(/bundle pristine bad_gem/) } end context 'and bad_gem is loaded correctly' do let(:gem_loads_ok) { true } it { is_expected.to be_nil } end end end end def stub_bundle_check(success) stub_shellout("/home/git/gdk/support/bundle-exec bundle check", success) end def stub_gem_installed(name, success) stub_shellout("/home/git/gdk/support/bundle-exec gem list -i #{name}", success) end def stub_gem_loads_ok(name, success) gem_name = GDK::Diagnostic::RubyGems::GEM_REQUIRE_MAPPING[name] stub_shellout("/home/git/gdk/support/bundle-exec ruby -r #{gem_name} -e 'nil'", success) end def stub_shellout(cmd, success) shellout_double = gdk_shellout_double(success?: success) allow_gdk_shellout_command(cmd, chdir: '/home/git/gdk/gitlab').and_return(shellout_double) allow(shellout_double).to receive(:execute).with(display_output: false, display_error: false).and_return(shellout_double) shellout_double end end