aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test/utils_spec.rb
diff options
context:
space:
mode:
authorMarkus Reiter2017-02-16 21:17:46 +0100
committerMarkus Reiter2017-02-19 18:41:53 +0100
commit05a98f24c4d21b3a3c7fcb4045e74619a4628f4c (patch)
tree4b48a58a7d392fc963681745c445a9cf2dc49e8f /Library/Homebrew/test/utils_spec.rb
parent9f31d41fb263718bff98e194df411b8aaea72aba (diff)
downloadbrew-05a98f24c4d21b3a3c7fcb4045e74619a4628f4c.tar.bz2
Convert Utils test to spec.
Diffstat (limited to 'Library/Homebrew/test/utils_spec.rb')
-rw-r--r--Library/Homebrew/test/utils_spec.rb283
1 files changed, 283 insertions, 0 deletions
diff --git a/Library/Homebrew/test/utils_spec.rb b/Library/Homebrew/test/utils_spec.rb
new file mode 100644
index 000000000..de6b287d2
--- /dev/null
+++ b/Library/Homebrew/test/utils_spec.rb
@@ -0,0 +1,283 @@
+require "utils"
+
+RSpec::Matchers.alias_matcher :have_failed, :be_failed
+
+describe "globally-scoped helper methods" do
+ let(:dir) { @dir = Pathname.new(Dir.mktmpdir) }
+
+ after(:each) { dir.rmtree unless @dir.nil? }
+
+ def esc(code)
+ /(\e\[\d+m)*\e\[#{code}m/
+ end
+
+ describe "#ofail" do
+ it "sets Homebrew.failed to true" do
+ begin
+ shutup do
+ ofail "foo"
+ end
+
+ expect(Homebrew).to have_failed
+ ensure
+ Homebrew.failed = false
+ end
+ end
+ end
+
+ describe "#odie" do
+ it "exits with 1" do
+ expect(self).to receive(:exit).and_return(1)
+ expect {
+ odie "foo"
+ }.to output("Error: foo\n").to_stderr
+ end
+ end
+
+ describe "#pretty_installed" do
+ subject { pretty_installed("foo") }
+
+ context "when $stdout is a TTY" do
+ before(:each) { allow($stdout).to receive(:tty?).and_return(true) }
+
+ context "with HOMEBREW_NO_EMOJI unset" do
+ before(:each) { ENV.delete("HOMEBREW_NO_EMOJI") }
+
+ it "returns a string with a colored checkmark" do
+ expect(subject)
+ .to match(/#{esc 1}foo #{esc 32}✔#{esc 0}/)
+ end
+ end
+
+ context "with HOMEBREW_NO_EMOJI set" do
+ before(:each) { ENV["HOMEBREW_NO_EMOJI"] = "1" }
+
+ it "returns a string with colored info" do
+ expect(subject)
+ .to match(/#{esc 1}foo \(installed\)#{esc 0}/)
+ end
+ end
+ end
+
+ context "when $stdout is not a TTY" do
+ before(:each) { allow($stdout).to receive(:tty?).and_return(false) }
+
+ it "returns plain text" do
+ expect(subject).to eq("foo")
+ end
+ end
+ end
+
+ describe "#pretty_uninstalled" do
+ subject { pretty_uninstalled("foo") }
+
+ context "when $stdout is a TTY" do
+ before(:each) { allow($stdout).to receive(:tty?).and_return(true) }
+
+ context "with HOMEBREW_NO_EMOJI unset" do
+ before(:each) { ENV.delete("HOMEBREW_NO_EMOJI") }
+
+ it "returns a string with a colored checkmark" do
+ expect(subject)
+ .to match(/#{esc 1}foo #{esc 31}✘#{esc 0}/)
+ end
+ end
+
+ context "with HOMEBREW_NO_EMOJI set" do
+ before(:each) { ENV["HOMEBREW_NO_EMOJI"] = "1" }
+
+ it "returns a string with colored info" do
+ expect(subject)
+ .to match(/#{esc 1}foo \(uninstalled\)#{esc 0}/)
+ end
+ end
+ end
+
+ context "when $stdout is not a TTY" do
+ before(:each) { allow($stdout).to receive(:tty?).and_return(false) }
+
+ it "returns plain text" do
+ expect(subject).to eq("foo")
+ end
+ end
+ end
+
+ describe "#interactive_shell" do
+ let(:shell) { dir/"myshell" }
+
+ it "starts an interactive shell session" do
+ IO.write shell, <<-EOS.undent
+ #!/bin/sh
+ echo called > "#{dir}/called"
+ EOS
+
+ FileUtils.chmod 0755, shell
+
+ ENV["SHELL"] = shell
+
+ expect { interactive_shell }.not_to raise_error
+ expect(dir/"called").to exist
+ end
+ end
+
+ describe "#with_custom_locale" do
+ it "temporarily overrides the system locale" do
+ ENV["LC_ALL"] = "en_US.UTF-8"
+
+ with_custom_locale("C") do
+ expect(ENV["LC_ALL"]).to eq("C")
+ end
+
+ expect(ENV["LC_ALL"]).to eq("en_US.UTF-8")
+ end
+ end
+
+ describe "#run_as_not_developer" do
+ it "temporarily unsets HOMEBREW_DEVELOPER" do
+ ENV["HOMEBREW_DEVELOPER"] = "foo"
+
+ run_as_not_developer do
+ expect(ENV["HOMEBREW_DEVELOPER"]).to be nil
+ end
+
+ expect(ENV["HOMEBREW_DEVELOPER"]).to eq("foo")
+ end
+ end
+
+ describe "#which" do
+ let(:cmd) { dir/"foo" }
+
+ before(:each) { FileUtils.touch cmd }
+
+ it "returns the first executable that is found" do
+ cmd.chmod 0744
+ expect(which(File.basename(cmd), File.dirname(cmd))).to eq(cmd)
+ end
+
+ it "skips non-executables" do
+ expect(which(File.basename(cmd), File.dirname(cmd))).to be nil
+ end
+
+ it "skips malformed path and doesn't fail" do
+ # 'which' should not fail if a path is malformed
+ # see https://github.com/Homebrew/legacy-homebrew/issues/32789 for an example
+ cmd.chmod 0744
+
+ # ~~ will fail because ~foo resolves to foo's home and there is no '~' user
+ path = ["~~", File.dirname(cmd)].join(File::PATH_SEPARATOR)
+ expect(which(File.basename(cmd), path)).to eq(cmd)
+ end
+ end
+
+ describe "#which_all" do
+ let(:cmd1) { dir/"foo" }
+ let(:cmd2) { dir/"bar/foo" }
+ let(:cmd3) { dir/"bar/baz/foo" }
+
+ before(:each) do
+ (dir/"bar/baz").mkpath
+
+ FileUtils.touch cmd2
+
+ [cmd1, cmd3].each do |cmd|
+ FileUtils.touch cmd
+ cmd.chmod 0744
+ end
+ end
+
+ it "returns an array of all executables that are found" do
+ path = [
+ "#{dir}/bar/baz",
+ "#{dir}/baz:#{dir}",
+ "~baduserpath",
+ ].join(File::PATH_SEPARATOR)
+ expect(which_all("foo", path)).to eq([cmd3, cmd1])
+ end
+ end
+
+ specify "#which_editor" do
+ ENV["HOMEBREW_EDITOR"] = "vemate"
+ expect(which_editor).to eq("vemate")
+ end
+
+ specify "#gzip" do
+ Dir.mktmpdir do |path|
+ path = Pathname.new(path)
+ somefile = path/"somefile"
+ FileUtils.touch somefile
+ expect(gzip(somefile)[0].to_s).to eq("#{somefile}.gz")
+ expect(Pathname.new("#{somefile}.gz")).to exist
+ end
+ end
+
+ specify "#capture_stderr" do
+ err = capture_stderr do
+ $stderr.print "test"
+ end
+
+ expect(err).to eq("test")
+ end
+
+ describe "#pretty_duration" do
+ it "converts seconds to a human-readable string" do
+ expect(pretty_duration(1)).to eq("1 second")
+ expect(pretty_duration(2.5)).to eq("2 seconds")
+ expect(pretty_duration(42)).to eq("42 seconds")
+ expect(pretty_duration(240)).to eq("4 minutes")
+ expect(pretty_duration(252.45)).to eq("4 minutes 12 seconds")
+ end
+ end
+
+ specify "#plural" do
+ expect(plural(1)).to eq("")
+ expect(plural(0)).to eq("s")
+ expect(plural(42)).to eq("s")
+ expect(plural(42, "")).to eq("")
+ end
+
+ specify "#disk_usage_readable" do
+ expect(disk_usage_readable(1)).to eq("1B")
+ expect(disk_usage_readable(1000)).to eq("1000B")
+ expect(disk_usage_readable(1024)).to eq("1K")
+ expect(disk_usage_readable(1025)).to eq("1K")
+ expect(disk_usage_readable(4_404_020)).to eq("4.2M")
+ expect(disk_usage_readable(4_509_715_660)).to eq("4.2G")
+ end
+
+ describe "#number_readable" do
+ it "returns a string with thousands separators" do
+ expect(number_readable(1)).to eq("1")
+ expect(number_readable(1_000)).to eq("1,000")
+ expect(number_readable(1_000_000)).to eq("1,000,000")
+ end
+ end
+
+ specify "#truncate_text_to_approximate_size" do
+ glue = "\n[...snip...]\n" # hard-coded copy from truncate_text_to_approximate_size
+ n = 20
+ long_s = "x" * 40
+
+ s = truncate_text_to_approximate_size(long_s, n)
+ expect(s.length).to eq(n)
+ expect(s).to match(/^x+#{Regexp.escape(glue)}x+$/)
+
+ s = truncate_text_to_approximate_size(long_s, n, front_weight: 0.0)
+ expect(s).to eq(glue + ("x" * (n - glue.length)))
+
+ s = truncate_text_to_approximate_size(long_s, n, front_weight: 1.0)
+ expect(s).to eq(("x" * (n - glue.length)) + glue)
+ end
+
+ describe "#odeprecated" do
+ it "raises a MethodDeprecatedError" do
+ ENV.delete("HOMEBREW_DEVELOPER")
+ expect {
+ odeprecated(
+ "method", "replacement",
+ caller: ["#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core/"],
+ disable: true
+ )
+ }.to raise_error(MethodDeprecatedError, %r{method.*replacement.*homebrew/homebrew-core.*homebrew/core}m)
+ end
+ end
+end