diff --git a/Library/Homebrew/test/error_during_execution_spec.rb b/Library/Homebrew/test/error_during_execution_spec.rb new file mode 100644 index 0000000000..4dd6d1ec3f --- /dev/null +++ b/Library/Homebrew/test/error_during_execution_spec.rb @@ -0,0 +1,63 @@ +describe ErrorDuringExecution do + subject(:error) { described_class.new(command, status: status, output: output) } + let(:command) { ["false"] } + let(:status) { instance_double(Process::Status, exitstatus: exitstatus) } + let(:exitstatus) { 1 } + let(:output) { nil } + + describe "#initialize" do + it "fails when only given a command" do + expect { + described_class.new(command) + }.to raise_error(ArgumentError) + end + + it "fails when only given a status" do + expect { + described_class.new(status: status) + }.to raise_error(ArgumentError) + end + + it "does not raise an error when given both a command and a status" do + expect { + described_class.new(command, status: status) + }.not_to raise_error + end + end + + describe "#to_s" do + context "when only given a command and a status" do + its(:to_s) { is_expected.to eq "Failure while executing; `false` exited with 1." } + end + + context "when additionally given the output" do + let(:output) { + [ + [:stdout, "This still worked.\n"], + [:stderr, "Here something went wrong.\n"], + ] + } + + before do + allow($stdout).to receive(:tty?).and_return(true) + end + + its(:to_s) { + is_expected.to eq <<~EOS + Failure while executing; `false` exited with 1. Here's the output: + This still worked. + #{Formatter.error("Here something went wrong.\n")} + EOS + } + end + + context "when command arguments contain special characters" do + let(:command) { ["env", "PATH=/bin", "cat", "with spaces"] } + + its(:to_s) { + is_expected + .to eq 'Failure while executing; `env PATH=/bin cat with\ spaces` exited with 1.' + } + end + end +end