spec/lib/gdk/command/cleanup_spec.rb (163 lines of code) (raw):

# frozen_string_literal: true RSpec.describe GDK::Command::Cleanup do let(:software_to_uninstall) do { 'ruby' => { '1.2' => :unused }, 'nodejs' => { '1.2.3' => :unused, '0.1.2' => :unused } } end subject { described_class.new } before do asdf_tool_versions_double = instance_double(Asdf::ToolVersions, unnecessary_installed_versions_of_software: software_to_uninstall) allow(Asdf::ToolVersions).to receive(:new).and_return(asdf_tool_versions_double) end describe '#run' do context 'when not confirmed' do it 'returns true' do stub_prompt('n') expect_warn_and_puts expect(subject).not_to receive(:execute) expect(subject.run).to be_truthy end end context 'without software to uninstall' do let(:software_to_uninstall) { {} } it 'does not show uninstall software messages' do stub_prompt('n') expect_warn_and_puts(show_uninstall_software: false) expect(subject).not_to receive(:execute) expect(subject.run).to be_truthy end end context 'when confirmed' do context 'but an unhandled error occurs' do it 'calls execute but returns false' do exception = StandardError.new('a failure occured') stub_prompt('y') rake_truncate_double = stub_rake_truncate allow(rake_truncate_double).to receive(:invoke).with('false').and_raise(exception) expect_warn_and_puts expect(GDK::Output).to receive(:error).with(exception) rake_uninstall_double = stub_rake_uninstall expect(rake_uninstall_double).not_to receive(:invoke).with('false') expect(subject.run).to be_falsey end end context 'but a RuntimeError error occurs' do it 'calls execute, handles the RuntimeError and returns true' do exception = RuntimeError.new('a failure occured') stub_prompt('y') rake_truncate_double = stub_rake_truncate allow(rake_truncate_double).to receive(:invoke).with('false').and_raise(exception) rake_http_router_truncate_double = stub_rake_http_router_truncate allow(rake_http_router_truncate_double).to receive(:invoke).with('false').and_raise(exception) expect_warn_and_puts expect(GDK::Output).to receive(:error).twice.with('a failure occured', exception) expect_rake_uninstall expect(subject.run).to be_truthy end end context 'and without any errors' do context 'via direct response' do it 'calls execute' do stub_prompt('y') expect_warn_and_puts expect_rake_truncate_and_uninstall expect(subject.run).to be_truthy end end context 'by setting GDK_CLEANUP_CONFIRM to true' do it 'calls execute' do stub_env('GDK_CLEANUP_CONFIRM', 'true') expect_warn_and_puts expect_rake_truncate_and_uninstall expect(subject.run).to be_truthy end end context 'by setting GDK_CLEANUP_SOFTWARE to false', :hide_output do it 'does not prompt about uninstalling unnecessary software' do stub_env('GDK_CLEANUP_SOFTWARE', 'false') stub_prompt('n') expect(GDK::Output).not_to receive(:puts).with( '- Uninstall any asdf software that is not defined in .tool-versions', stderr: true ) expect(subject.run).to be_truthy end it 'does not uninstall unnecessary software' do stub_env('GDK_CLEANUP_SOFTWARE', 'false') stub_prompt('y') allow(stub_rake_truncate).to receive(:invoke) allow(stub_rake_http_router_truncate).to receive(:invoke) expect(stub_rake_uninstall).not_to receive(:invoke) expect(subject.run).to be_truthy end end context 'by setting GDK_CLEANUP_SOFTWARE to true', :hide_output do it 'uninstalls unnecessary software' do stub_env('GDK_CLEANUP_SOFTWARE', 'true') stub_prompt('y') allow(stub_rake_truncate).to receive(:invoke) allow(stub_rake_http_router_truncate).to receive(:invoke) expect(stub_rake_uninstall).to receive(:invoke) expect(subject.run).to be_truthy end end end end def expect_warn_and_puts(show_uninstall_software: true) expect(GDK::Output).to receive(:warn).with('About to perform the following actions:').ordered expect(GDK::Output).to receive(:puts).with(stderr: true).ordered expect_truncate_puts if show_uninstall_software expect(GDK::Output).to receive(:puts).with( '- Uninstall any asdf software that is not defined in .tool-versions:', stderr: true ).ordered software_to_uninstall.sort_by { |n, _| n }.each do |name, versions| expect(GDK::Output).to receive(:puts).with("#{name} #{versions.keys.join(' ')}").ordered end expect(GDK::Output).to receive(:puts).with(stderr: true).ordered expect(GDK::Output).to receive(:puts) .with('Run `GDK_CLEANUP_SOFTWARE=false gdk cleanup` to skip uninstalling software.').ordered end expect(GDK::Output).to receive(:puts).with(stderr: true).at_least(:once).ordered end def expect_truncate_puts expect(GDK::Output).to receive(:puts).with('- Truncate gitlab/log/* files', stderr: true).ordered expect(GDK::Output).to receive(:puts).with("- Truncate #{GDK::Services::GitlabHttpRouter::LOG_PATH} file", stderr: true).ordered expect(GDK::Output).to receive(:puts).with(stderr: true).ordered end def expect_rake_truncate_and_uninstall expect_rake_truncate expect_rake_http_router_truncate expect_rake_uninstall end def stub_rake_truncate stub_rake_task('gitlab:truncate_logs', 'gitlab.rake') end def stub_rake_http_router_truncate stub_rake_task('gitlab:truncate_http_router_logs', 'gitlab.rake') end def expect_rake_truncate expect_rake_task('gitlab:truncate_logs', 'gitlab.rake', args: 'false') end def expect_rake_http_router_truncate expect_rake_task('gitlab:truncate_http_router_logs', 'gitlab.rake', args: 'false') end def stub_rake_uninstall stub_rake_task('asdf:uninstall_unnecessary_software', 'asdf.rake') end def expect_rake_uninstall expect_rake_task('asdf:uninstall_unnecessary_software', 'asdf.rake', args: 'false') end def stub_rake_task(task_name, rake_file) allow(Kernel).to receive(:load).with(GDK.root.join('lib', 'tasks', rake_file)).and_return(true) rake_task_double = double("#{task_name} rake task") # rubocop:todo RSpec/VerifiedDoubles allow(Rake::Task).to receive(:[]).with(task_name).and_return(rake_task_double) rake_task_double end def expect_rake_task(task_name, rake_file, args: nil) rake_task_double = stub_rake_task(task_name, rake_file) expect(rake_task_double).to receive(:invoke).with(args).and_return(true) end end end