brew/Library/Homebrew/test/diagnostic_checks_spec.rb
Mike McQuaid e9f55a8f71
tests: default to API mode enabled.
While we're here, also add `brew tests --no-parallel` which I relied
on during testing.

Pretty much anywhere we rely on a stubbed formula on disk to work: we
need to disable the API.
2025-06-10 15:53:27 +01:00

134 lines
3.9 KiB
Ruby

# frozen_string_literal: true
require "diagnostic"
RSpec.describe Homebrew::Diagnostic::Checks do
subject(:checks) { described_class.new }
specify "#inject_file_list" do
expect(checks.inject_file_list([], "foo:\n")).to eq("foo:\n")
expect(checks.inject_file_list(%w[/a /b], "foo:\n")).to eq("foo:\n /a\n /b\n")
end
specify "#check_access_directories" do
skip "User is root so everything is writable." if Process.euid.zero?
begin
dirs = [
HOMEBREW_CACHE,
HOMEBREW_CELLAR,
HOMEBREW_REPOSITORY,
HOMEBREW_LOGS,
HOMEBREW_LOCKS,
]
modes = {}
dirs.each do |dir|
modes[dir] = dir.stat.mode & 0777
dir.chmod 0555
expect(checks.check_access_directories).to match(dir.to_s)
end
ensure
modes.each do |dir, mode|
dir.chmod mode
end
end
end
specify "#check_user_path_1" do
bin = HOMEBREW_PREFIX/"bin"
sep = File::PATH_SEPARATOR
# ensure /usr/bin is before HOMEBREW_PREFIX/bin in the PATH
ENV["PATH"] = "/usr/bin#{sep}#{bin}#{sep}" +
ENV["PATH"].gsub(%r{(?:^|#{sep})(?:/usr/bin|#{bin})}, "")
# ensure there's at least one file with the same name in both /usr/bin/ and
# HOMEBREW_PREFIX/bin/
(bin/File.basename(Dir["/usr/bin/*"].first)).mkpath
expect(checks.check_user_path_1)
.to match("/usr/bin occurs before #{HOMEBREW_PREFIX}/bin")
end
specify "#check_user_path_2" do
ENV["PATH"] = ENV["PATH"].gsub \
%r{(?:^|#{File::PATH_SEPARATOR})#{HOMEBREW_PREFIX}/bin}o, ""
expect(checks.check_user_path_1).to be_nil
expect(checks.check_user_path_2)
.to match("Homebrew's \"bin\" was not found in your PATH.")
end
specify "#check_user_path_3" do
sbin = HOMEBREW_PREFIX/"sbin"
(sbin/"something").mkpath
homebrew_path =
"#{HOMEBREW_PREFIX}/bin#{File::PATH_SEPARATOR}" +
ENV["HOMEBREW_PATH"].gsub(/(?:^|#{Regexp.escape(File::PATH_SEPARATOR)})#{Regexp.escape(sbin)}/, "")
stub_const("ORIGINAL_PATHS", PATH.new(homebrew_path).filter_map { |path| Pathname.new(path).expand_path })
expect(checks.check_user_path_1).to be_nil
expect(checks.check_user_path_2).to be_nil
expect(checks.check_user_path_3)
.to match("Homebrew's \"sbin\" was not found in your PATH")
ensure
FileUtils.rm_rf(sbin)
end
specify "#check_for_symlinked_cellar" do
FileUtils.rm_r(HOMEBREW_CELLAR)
mktmpdir do |path|
FileUtils.ln_s path, HOMEBREW_CELLAR
expect(checks.check_for_symlinked_cellar).to match(path)
end
ensure
HOMEBREW_CELLAR.unlink
HOMEBREW_CELLAR.mkpath
end
specify "#check_tmpdir" do
ENV["TMPDIR"] = "/i/don/t/exis/t"
expect(checks.check_tmpdir).to match("doesn't exist")
end
specify "#check_for_external_cmd_name_conflict" do
mktmpdir do |path1|
mktmpdir do |path2|
[path1, path2].each do |path|
cmd = "#{path}/brew-foo"
FileUtils.touch cmd
FileUtils.chmod 0755, cmd
end
allow(Commands).to receive(:tap_cmd_directories).and_return([path1, path2])
expect(checks.check_for_external_cmd_name_conflict)
.to match("brew-foo")
end
end
end
specify "#check_homebrew_prefix" do
allow(Homebrew).to receive(:default_prefix?).and_return(false)
expect(checks.check_homebrew_prefix)
.to match("Your Homebrew's prefix is not #{Homebrew::DEFAULT_PREFIX}")
end
specify "#check_for_unnecessary_core_tap" do
ENV.delete("HOMEBREW_DEVELOPER")
expect_any_instance_of(CoreTap).to receive(:installed?).and_return(true)
expect(checks.check_for_unnecessary_core_tap).to match("You have an unnecessary local Core tap")
end
specify "#check_for_unnecessary_cask_tap" do
ENV.delete("HOMEBREW_DEVELOPER")
expect_any_instance_of(CoreCaskTap).to receive(:installed?).and_return(true)
expect(checks.check_for_unnecessary_cask_tap).to match("unnecessary local Cask tap")
end
end