# frozen_string_literal: true require "system_command" describe SystemCommand::Result do subject(:result) do described_class.new([], output_array, instance_double(Process::Status, exitstatus: 0, success?: true), secrets: []) end let(:output_array) do [ [:stdout, "output\n"], [:stderr, "error\n"], ] end describe "#to_ary" do it "can be destructed like `Open3.capture3`" do out, err, status = result expect(out).to eq "output\n" expect(err).to eq "error\n" expect(status).to be_a_success end end describe "#stdout" do it "returns the standard output" do expect(result.stdout).to eq "output\n" end end describe "#stderr" do it "returns the standard error output" do expect(result.stderr).to eq "error\n" end end describe "#merged_output" do it "returns the combined standard and standard error output" do expect(result.merged_output).to eq "output\nerror\n" end end describe "#plist" do subject(:result_plist) { result.plist } let(:output_array) { [[:stdout, stdout]] } let(:garbage) do <<~EOS Hello there! I am in no way XML am I?!?! That's a little silly... you were expecting XML here! What is a parser to do? Hopefully explode! EOS end let(:plist) do <<~XML system-entities content-hint Apple_partition_map dev-entry /dev/disk3s1 potentially-mountable unmapped-content-hint Apple_partition_map content-hint Apple_partition_scheme dev-entry /dev/disk3 potentially-mountable unmapped-content-hint Apple_partition_scheme content-hint Apple_HFS dev-entry /dev/disk3s2 mount-point /private/tmp/dmg.BhfS2g potentially-mountable unmapped-content-hint Apple_HFS volume-kind hfs XML end context "when stdout contains garbage before XML" do let(:stdout) do <<~EOS #{garbage} #{plist} EOS end it "ignores garbage" do expect(result_plist["system-entities"].length).to eq(3) end context "when verbose" do before do allow(Context).to receive(:current).and_return(Context::ContextStruct.new(verbose: true)) end it "warns about garbage" do expect { result_plist } .to output(a_string_containing(garbage)).to_stderr end end end context "when stdout contains garbage after XML" do let(:stdout) do <<~EOS #{plist} #{garbage} EOS end it "ignores garbage" do expect(result_plist["system-entities"].length).to eq(3) end context "when verbose" do before do allow(Context).to receive(:current).and_return(Context::ContextStruct.new(verbose: true)) end it "warns about garbage" do expect { result_plist } .to output(a_string_containing(garbage)).to_stderr end end end context "when there's a hdiutil stdout" do let(:stdout) { plist } it "successfully parses it" do expect(result_plist.keys).to eq(["system-entities"]) expect(result_plist["system-entities"].length).to eq(3) expect(result_plist["system-entities"].map { |e| e["dev-entry"] }) .to eq(["/dev/disk3s1", "/dev/disk3", "/dev/disk3s2"]) end end context "when the stdout of the command is empty" do let(:stdout) { "" } it "returns nil" do expect(result_plist).to be_nil end end end end