require "system_command" describe SystemCommand::Result do describe "#to_ary" do let(:output) { [ [:stdout, "output"], [:stderr, "error"], ] } subject(:result) { described_class.new([], output, instance_double(Process::Status, exitstatus: 0, success?: true)) } it "can be destructed like `Open3.capture3`" do out, err, status = result expect(out).to eq "output" expect(err).to eq "error" expect(status).to be_a_success end end describe "#plist" do subject { described_class.new(command, [[:stdout, stdout]], instance_double(Process::Status, exitstatus: 0)).plist } let(:command) { ["true"] } let(:garbage) { <<~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 } let(:plist) { <<~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 } context "when stdout contains garbage before XML" do let(:stdout) { <<~EOS #{garbage} #{plist} EOS } it "ignores garbage" do expect(subject["system-entities"].length).to eq(3) end context "when verbose" do before(:each) do allow(ARGV).to receive(:verbose?).and_return(true) end it "warns about garbage" do expect { subject } .to output(a_string_containing(garbage)).to_stderr end end end context "when stdout contains garbage after XML" do let(:stdout) { <<~EOS #{plist} #{garbage} EOS } it "ignores garbage" do expect(subject["system-entities"].length).to eq(3) end context "when verbose" do before(:each) do allow(ARGV).to receive(:verbose?).and_return(true) end it "warns about garbage" do expect { subject } .to output(a_string_containing(garbage)).to_stderr end end end context "given a hdiutil stdout" do let(:stdout) { plist } it "successfully parses it" do expect(subject.keys).to eq(["system-entities"]) expect(subject["system-entities"].length).to eq(3) expect(subject["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(subject).to be nil end end end end