
This reduces the surface area of our `Kernel` monkeypatch and removes the need to `include Kernel` in a bunch of modules. While we're here, also move `Kernel#require?` to `Homebrew` and fully scope the calls to it.
118 lines
3.4 KiB
Ruby
118 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "utils/output"
|
|
|
|
RSpec.describe Utils::Output do
|
|
def esc(code)
|
|
/(\e\[\d+m)*\e\[#{code}m/
|
|
end
|
|
|
|
describe "#pretty_installed" do
|
|
subject(:pretty_installed_output) { described_class.pretty_installed("foo") }
|
|
|
|
context "when $stdout is a TTY" do
|
|
before { allow($stdout).to receive(:tty?).and_return(true) }
|
|
|
|
context "with HOMEBREW_NO_EMOJI unset" do
|
|
it "returns a string with a colored checkmark" do
|
|
expect(pretty_installed_output)
|
|
.to match(/#{esc 1}foo #{esc 32}✔#{esc 0}/)
|
|
end
|
|
end
|
|
|
|
context "with HOMEBREW_NO_EMOJI set" do
|
|
before { ENV["HOMEBREW_NO_EMOJI"] = "1" }
|
|
|
|
it "returns a string with colored info" do
|
|
expect(pretty_installed_output)
|
|
.to match(/#{esc 1}foo \(installed\)#{esc 0}/)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when $stdout is not a TTY" do
|
|
before { allow($stdout).to receive(:tty?).and_return(false) }
|
|
|
|
it "returns plain text" do
|
|
expect(pretty_installed_output).to eq("foo")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#pretty_uninstalled" do
|
|
subject(:pretty_uninstalled_output) { described_class.pretty_uninstalled("foo") }
|
|
|
|
context "when $stdout is a TTY" do
|
|
before { allow($stdout).to receive(:tty?).and_return(true) }
|
|
|
|
context "with HOMEBREW_NO_EMOJI unset" do
|
|
it "returns a string with a colored checkmark" do
|
|
expect(pretty_uninstalled_output)
|
|
.to match(/#{esc 1}foo #{esc 31}✘#{esc 0}/)
|
|
end
|
|
end
|
|
|
|
context "with HOMEBREW_NO_EMOJI set" do
|
|
before { ENV["HOMEBREW_NO_EMOJI"] = "1" }
|
|
|
|
it "returns a string with colored info" do
|
|
expect(pretty_uninstalled_output)
|
|
.to match(/#{esc 1}foo \(uninstalled\)#{esc 0}/)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when $stdout is not a TTY" do
|
|
before { allow($stdout).to receive(:tty?).and_return(false) }
|
|
|
|
it "returns plain text" do
|
|
expect(pretty_uninstalled_output).to eq("foo")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#pretty_duration" do
|
|
it "converts seconds to a human-readable string" do
|
|
expect(described_class.pretty_duration(1)).to eq("1 second")
|
|
expect(described_class.pretty_duration(2.5)).to eq("2 seconds")
|
|
expect(described_class.pretty_duration(42)).to eq("42 seconds")
|
|
expect(described_class.pretty_duration(240)).to eq("4 minutes")
|
|
expect(described_class.pretty_duration(252.45)).to eq("4 minutes 12 seconds")
|
|
end
|
|
end
|
|
|
|
describe "#ofail" do
|
|
it "sets Homebrew.failed to true" do
|
|
expect do
|
|
described_class.ofail "foo"
|
|
end.to output("Error: foo\n").to_stderr
|
|
|
|
expect(Homebrew).to have_failed
|
|
end
|
|
end
|
|
|
|
describe "#odie" do
|
|
it "exits with 1" do
|
|
expect do
|
|
described_class.odie "foo"
|
|
end.to output("Error: foo\n").to_stderr.and raise_error SystemExit
|
|
end
|
|
end
|
|
|
|
describe "#odeprecated" do
|
|
it "raises a MethodDeprecatedError when `disable` is true" do
|
|
ENV.delete("HOMEBREW_DEVELOPER")
|
|
expect do
|
|
described_class.odeprecated(
|
|
"method", "replacement",
|
|
caller: ["#{HOMEBREW_LIBRARY}/Taps/playbrew/homebrew-play/"],
|
|
disable: true
|
|
)
|
|
end.to raise_error(
|
|
MethodDeprecatedError,
|
|
%r{method.*replacement.*playbrew/homebrew-play.*/Taps/playbrew/homebrew-play/}m,
|
|
)
|
|
end
|
|
end
|
|
end
|