Merge pull request #1978 from reitermarkus/convert-to-spec
Convert all Cask tests to RSpec.
This commit is contained in:
commit
5a90d6e853
@ -21,17 +21,11 @@ cask_root.cd do
|
||||
system "bundle", "install"
|
||||
end
|
||||
|
||||
rspec = ARGV.flag?("--rspec") || !ARGV.flag?("--minitest")
|
||||
minitest = ARGV.flag?("--minitest") || !ARGV.flag?("--rspec")
|
||||
|
||||
if ARGV.flag?("--coverage")
|
||||
ENV["HOMEBREW_TESTS_COVERAGE"] = "1"
|
||||
upload_coverage = ENV["CODECOV_TOKEN"] || ENV["TRAVIS"]
|
||||
end
|
||||
|
||||
failed = false
|
||||
|
||||
if rspec
|
||||
run_tests "parallel_rspec", Dir["spec/**/*_spec.rb"], %w[
|
||||
--color
|
||||
--require spec_helper
|
||||
@ -39,18 +33,13 @@ cask_root.cd do
|
||||
--format ParallelTests::RSpec::RuntimeLogger
|
||||
--out tmp/parallel_runtime_rspec.log
|
||||
]
|
||||
failed ||= !$CHILD_STATUS.success?
|
||||
end
|
||||
|
||||
if minitest
|
||||
run_tests "parallel_test", Dir["test/**/*_test.rb"]
|
||||
failed ||= !$CHILD_STATUS.success?
|
||||
unless $CHILD_STATUS.success?
|
||||
Homebrew.failed = true
|
||||
end
|
||||
|
||||
Homebrew.failed = failed
|
||||
|
||||
if upload_coverage
|
||||
puts "Submitting Codecov coverage..."
|
||||
system "bundle", "exec", "test/upload_coverage.rb"
|
||||
system "bundle", "exec", "spec/upload_coverage.rb"
|
||||
end
|
||||
end
|
||||
|
||||
82
Library/Homebrew/cask/spec/cask/accessibility_spec.rb
Normal file
82
Library/Homebrew/cask/spec/cask/accessibility_spec.rb
Normal file
@ -0,0 +1,82 @@
|
||||
require "spec_helper"
|
||||
|
||||
# TODO: this test should be named after the corresponding class, once
|
||||
# that class is abstracted from installer.rb.
|
||||
describe "Accessibility Access" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-accessibility-access.rb") }
|
||||
let(:fake_system_command) { class_double(Hbc::SystemCommand) }
|
||||
let(:installer) { Hbc::Installer.new(cask, command: fake_system_command) }
|
||||
|
||||
before(:each) do
|
||||
allow(MacOS).to receive(:version).and_return(MacOS::Version.new(macos_version))
|
||||
allow(installer).to receive(:bundle_identifier).and_return("com.example.BasicCask")
|
||||
end
|
||||
|
||||
context "on MacOS 10.8 and below" do
|
||||
let(:macos_version) { "10.8" }
|
||||
|
||||
it "can enable accessibility access in macOS releases prior to Mavericks" do
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/bin/touch",
|
||||
args: [Hbc.pre_mavericks_accessibility_dotfile],
|
||||
sudo: true
|
||||
)
|
||||
|
||||
shutup do
|
||||
installer.enable_accessibility_access
|
||||
end
|
||||
end
|
||||
|
||||
it "warns about disabling accessibility access on old macOS releases" do
|
||||
expect {
|
||||
installer.disable_accessibility_access
|
||||
}.to output(/Warning: Accessibility access cannot be disabled automatically on this version of macOS\./).to_stderr
|
||||
end
|
||||
end
|
||||
|
||||
context "on MacOS 10.9" do
|
||||
let(:macos_version) { "10.9" }
|
||||
|
||||
it "can enable accessibility access" do
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/bin/sqlite3",
|
||||
args: [Hbc.tcc_db, "INSERT OR REPLACE INTO access VALUES('kTCCServiceAccessibility','com.example.BasicCask',0,1,1,NULL);"],
|
||||
sudo: true
|
||||
)
|
||||
|
||||
shutup do
|
||||
installer.enable_accessibility_access
|
||||
end
|
||||
end
|
||||
|
||||
it "can disable accessibility access" do
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/bin/sqlite3",
|
||||
args: [Hbc.tcc_db, "DELETE FROM access WHERE client='com.example.BasicCask';"],
|
||||
sudo: true
|
||||
)
|
||||
|
||||
shutup do
|
||||
installer.disable_accessibility_access
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "on MacOS 10.12 and above" do
|
||||
let(:macos_version) { "10.12" }
|
||||
|
||||
it "warns about enabling accessibility access on new macOS releases" do
|
||||
expect {
|
||||
expect {
|
||||
installer.enable_accessibility_access
|
||||
}.to output.to_stdout
|
||||
}.to output(/Warning: Accessibility access cannot be enabled automatically on this version of macOS\./).to_stderr
|
||||
end
|
||||
|
||||
it "warns about disabling accessibility access on new macOS releases" do
|
||||
expect {
|
||||
installer.disable_accessibility_access
|
||||
}.to output(/Warning: Accessibility access cannot be disabled automatically on this version of macOS\./).to_stderr
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::App do
|
||||
describe "activate to alternate target" do
|
||||
@ -12,19 +12,19 @@ describe Hbc::Artifact::App do
|
||||
let(:target_path) { Hbc.appdir.join("AnotherName.app") }
|
||||
|
||||
before do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
|
||||
it "installs the given apps using the proper target directory" do
|
||||
source_path.must_be :directory?
|
||||
target_path.wont_be :exist?
|
||||
expect(source_path).to be_a_directory
|
||||
expect(target_path).not_to exist
|
||||
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(source_path).not_to exist
|
||||
end
|
||||
|
||||
describe "when app is in a subdirectory" do
|
||||
@ -46,8 +46,8 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
appsubdir.join("Caffeine.app").wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(appsubdir.join("Caffeine.app")).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
@ -59,23 +59,21 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(source_path).not_to exist
|
||||
|
||||
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist?
|
||||
cask.staged_path.join("Caffeine Deluxe.app").must_be :directory?
|
||||
expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
|
||||
expect(cask.staged_path.join("Caffeine Deluxe.app")).to be_a_directory
|
||||
end
|
||||
|
||||
it "avoids clobbering an existing app by moving over it" do
|
||||
target_path.mkpath
|
||||
|
||||
err = install_phase.must_raise(Hbc::CaskError)
|
||||
expect(install_phase).to raise_error(Hbc::CaskError, "It seems there is already an App at '#{target_path}'.")
|
||||
|
||||
err.message.must_equal("It seems there is already an App at '#{target_path}'.")
|
||||
|
||||
source_path.must_be :directory?
|
||||
target_path.must_be :directory?
|
||||
File.identical?(source_path, target_path).must_equal false
|
||||
expect(source_path).to be_a_directory
|
||||
expect(target_path).to be_a_directory
|
||||
expect(File.identical?(source_path, target_path)).to be false
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::App do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb") }
|
||||
@ -12,8 +12,8 @@ describe Hbc::Artifact::App do
|
||||
let(:install_phase) { -> { app.install_phase } }
|
||||
let(:uninstall_phase) { -> { app.uninstall_phase } }
|
||||
|
||||
before do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
before(:each) do
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
|
||||
describe "install_phase" do
|
||||
@ -22,8 +22,8 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(source_path).not_to exist
|
||||
end
|
||||
|
||||
describe "when app is in a subdirectory" do
|
||||
@ -45,8 +45,8 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
appsubdir.join("Caffeine.app").wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(appsubdir.join("Caffeine.app")).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
@ -58,36 +58,34 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(source_path).not_to exist
|
||||
|
||||
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist?
|
||||
cask.staged_path.join("Caffeine Deluxe.app").must_be :exist?
|
||||
expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
|
||||
expect(cask.staged_path.join("Caffeine Deluxe.app")).to exist
|
||||
end
|
||||
|
||||
describe "when the target already exists" do
|
||||
before do
|
||||
before(:each) do
|
||||
target_path.mkpath
|
||||
end
|
||||
|
||||
it "avoids clobbering an existing app" do
|
||||
err = install_phase.must_raise(Hbc::CaskError)
|
||||
expect(install_phase).to raise_error(Hbc::CaskError, "It seems there is already an App at '#{target_path}'.")
|
||||
|
||||
err.message.must_equal("It seems there is already an App at '#{target_path}'.")
|
||||
|
||||
source_path.must_be :directory?
|
||||
target_path.must_be :directory?
|
||||
File.identical?(source_path, target_path).must_equal false
|
||||
expect(source_path).to be_a_directory
|
||||
expect(target_path).to be_a_directory
|
||||
expect(File.identical?(source_path, target_path)).to be false
|
||||
|
||||
contents_path = target_path.join("Contents/Info.plist")
|
||||
contents_path.wont_be :exist?
|
||||
expect(contents_path).not_to exist
|
||||
end
|
||||
|
||||
describe "given the force option" do
|
||||
let(:force) { true }
|
||||
|
||||
before do
|
||||
Hbc::Utils.stubs(current_user: "fake_user")
|
||||
before(:each) do
|
||||
allow(Hbc::Utils).to receive(:current_user).and_return("fake_user")
|
||||
end
|
||||
|
||||
describe "target is both writable and user-owned" do
|
||||
@ -101,40 +99,31 @@ describe Hbc::Artifact::App do
|
||||
Warning: It seems there is already an App at '#{target_path}'; overwriting.
|
||||
EOS
|
||||
|
||||
install_phase.must_output(stdout, stderr)
|
||||
expect {
|
||||
expect(install_phase).to output(stdout).to_stdout
|
||||
}.to output(stderr).to_stderr
|
||||
|
||||
source_path.wont_be :exist?
|
||||
target_path.must_be :directory?
|
||||
expect(source_path).not_to exist
|
||||
expect(target_path).to be_a_directory
|
||||
|
||||
contents_path = target_path.join("Contents/Info.plist")
|
||||
contents_path.must_be :exist?
|
||||
expect(contents_path).to exist
|
||||
end
|
||||
end
|
||||
|
||||
describe "target is user-owned but contains read-only files" do
|
||||
let(:command) { Hbc::FakeSystemCommand }
|
||||
|
||||
let(:chmod_cmd) {
|
||||
["/bin/chmod", "-R", "--", "u+rwx", target_path]
|
||||
}
|
||||
|
||||
let(:chmod_n_cmd) {
|
||||
["/bin/chmod", "-R", "-N", target_path]
|
||||
}
|
||||
|
||||
let(:chflags_cmd) {
|
||||
["/usr/bin/chflags", "-R", "--", "000", target_path]
|
||||
}
|
||||
|
||||
before do
|
||||
before(:each) do
|
||||
system "/usr/bin/touch", "--", "#{target_path}/foo"
|
||||
system "/bin/chmod", "--", "0555", target_path
|
||||
end
|
||||
|
||||
it "overwrites the existing app" do
|
||||
command.expect_and_pass_through(chflags_cmd)
|
||||
command.expect_and_pass_through(chmod_cmd)
|
||||
command.expect_and_pass_through(chmod_n_cmd)
|
||||
expect(command).to receive(:run).with("/bin/chmod", args: ["-R", "--", "u+rwx", target_path], must_succeed: false)
|
||||
.and_call_original
|
||||
expect(command).to receive(:run).with("/bin/chmod", args: ["-R", "-N", target_path], must_succeed: false)
|
||||
.and_call_original
|
||||
expect(command).to receive(:run).with("/usr/bin/chflags", args: ["-R", "--", "000", target_path], must_succeed: false)
|
||||
.and_call_original
|
||||
|
||||
stdout = <<-EOS.undent
|
||||
==> Removing App: '#{target_path}'
|
||||
@ -145,16 +134,18 @@ describe Hbc::Artifact::App do
|
||||
Warning: It seems there is already an App at '#{target_path}'; overwriting.
|
||||
EOS
|
||||
|
||||
install_phase.must_output(stdout, stderr)
|
||||
expect {
|
||||
expect(install_phase).to output(stdout).to_stdout
|
||||
}.to output(stderr).to_stderr
|
||||
|
||||
source_path.wont_be :exist?
|
||||
target_path.must_be :directory?
|
||||
expect(source_path).not_to exist
|
||||
expect(target_path).to be_a_directory
|
||||
|
||||
contents_path = target_path.join("Contents/Info.plist")
|
||||
contents_path.must_be :exist?
|
||||
expect(contents_path).to exist
|
||||
end
|
||||
|
||||
after do
|
||||
after(:each) do
|
||||
system "/bin/chmod", "--", "0755", target_path
|
||||
end
|
||||
end
|
||||
@ -164,18 +155,15 @@ describe Hbc::Artifact::App do
|
||||
describe "when the target is a broken symlink" do
|
||||
let(:deleted_path) { cask.staged_path.join("Deleted.app") }
|
||||
|
||||
before do
|
||||
before(:each) do
|
||||
deleted_path.mkdir
|
||||
File.symlink(deleted_path, target_path)
|
||||
deleted_path.rmdir
|
||||
end
|
||||
|
||||
it "leaves the target alone" do
|
||||
err = install_phase.must_raise(Hbc::CaskError)
|
||||
|
||||
err.message.must_equal("It seems there is already an App at '#{target_path}'.")
|
||||
|
||||
File.symlink?(target_path).must_equal true
|
||||
expect(install_phase).to raise_error(Hbc::CaskError, "It seems there is already an App at '#{target_path}'.")
|
||||
expect(target_path).to be_a_symlink
|
||||
end
|
||||
|
||||
describe "given the force option" do
|
||||
@ -191,13 +179,15 @@ describe Hbc::Artifact::App do
|
||||
Warning: It seems there is already an App at '#{target_path}'; overwriting.
|
||||
EOS
|
||||
|
||||
install_phase.must_output(stdout, stderr)
|
||||
expect {
|
||||
expect(install_phase).to output(stdout).to_stdout
|
||||
}.to output(stderr).to_stderr
|
||||
|
||||
source_path.wont_be :exist?
|
||||
target_path.must_be :directory?
|
||||
expect(source_path).not_to exist
|
||||
expect(target_path).to be_a_directory
|
||||
|
||||
contents_path = target_path.join("Contents/Info.plist")
|
||||
contents_path.must_be :exist?
|
||||
expect(contents_path).to exist
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -207,26 +197,23 @@ describe Hbc::Artifact::App do
|
||||
|
||||
message = "It seems the App source is not there: '#{source_path}'"
|
||||
|
||||
error = install_phase.must_raise(Hbc::CaskError)
|
||||
error.message.must_equal message
|
||||
expect(install_phase).to raise_error(Hbc::CaskError, message)
|
||||
end
|
||||
end
|
||||
|
||||
describe "uninstall_phase" do
|
||||
before do
|
||||
it "deletes managed apps" do
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
end
|
||||
|
||||
it "deletes managed apps" do
|
||||
target_path.must_be :exist?
|
||||
expect(target_path).to exist
|
||||
|
||||
shutup do
|
||||
uninstall_phase.call
|
||||
end
|
||||
|
||||
target_path.wont_be :exist?
|
||||
expect(target_path).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
@ -235,25 +222,23 @@ describe Hbc::Artifact::App do
|
||||
let(:contents) { app.summary[:contents] }
|
||||
|
||||
it "returns the correct english_description" do
|
||||
description.must_equal "Apps"
|
||||
expect(description).to eq("Apps")
|
||||
end
|
||||
|
||||
describe "app is correctly installed" do
|
||||
before do
|
||||
it "returns the path to the app" do
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
end
|
||||
|
||||
it "returns the path to the app" do
|
||||
contents.must_equal ["#{target_path} (#{target_path.abv})"]
|
||||
expect(contents).to eq(["#{target_path} (#{target_path.abv})"])
|
||||
end
|
||||
end
|
||||
|
||||
describe "app is missing" do
|
||||
it "returns a warning and the supposed path to the app" do
|
||||
contents.size.must_equal 1
|
||||
contents[0].must_match(/.*Missing App.*: #{target_path}/)
|
||||
expect(contents.size).to eq(1)
|
||||
expect(contents[0]).to match(/.*Missing App.*: #{target_path}/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::Artifact do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-generic-artifact.rb") }
|
||||
@ -11,14 +11,14 @@ describe Hbc::Artifact::Artifact do
|
||||
let(:target_path) { Hbc.appdir.join("Caffeine.app") }
|
||||
|
||||
before do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
|
||||
describe "with no target" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-generic-artifact-no-target.rb") }
|
||||
|
||||
it "fails to install with no target" do
|
||||
install_phase.must_raise Hbc::CaskInvalidError
|
||||
expect(install_phase).to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
@ -27,21 +27,21 @@ describe Hbc::Artifact::Artifact do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(source_path).not_to exist
|
||||
end
|
||||
|
||||
it "avoids clobbering an existing artifact" do
|
||||
target_path.mkpath
|
||||
|
||||
assert_raises Hbc::CaskError do
|
||||
expect {
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
|
||||
source_path.must_be :directory?
|
||||
target_path.must_be :directory?
|
||||
File.identical?(source_path, target_path).must_equal false
|
||||
expect(source_path).to be_a_directory
|
||||
expect(target_path).to be_a_directory
|
||||
expect(File.identical?(source_path, target_path)).to be false
|
||||
end
|
||||
end
|
||||
@ -1,17 +1,17 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::NestedContainer do
|
||||
describe "install" do
|
||||
it "extracts the specified paths as containers" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/nested-app.rb").tap do |c|
|
||||
TestHelper.install_without_artifacts(c)
|
||||
InstallHelper.install_without_artifacts(c)
|
||||
end
|
||||
|
||||
shutup do
|
||||
Hbc::Artifact::NestedContainer.new(cask).install_phase
|
||||
end
|
||||
|
||||
cask.staged_path.join("MyNestedApp.app").must_be :directory?
|
||||
expect(cask.staged_path.join("MyNestedApp.app")).to be_a_directory
|
||||
end
|
||||
end
|
||||
end
|
||||
71
Library/Homebrew/cask/spec/cask/artifact/pkg_spec.rb
Normal file
71
Library/Homebrew/cask/spec/cask/artifact/pkg_spec.rb
Normal file
@ -0,0 +1,71 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::Pkg do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installable.rb") }
|
||||
let(:fake_system_command) { class_double(Hbc::SystemCommand) }
|
||||
|
||||
before(:each) do
|
||||
shutup do
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
end
|
||||
|
||||
describe "install_phase" do
|
||||
it "runs the system installer on the specified pkgs" do
|
||||
pkg = Hbc::Artifact::Pkg.new(cask, command: fake_system_command)
|
||||
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/installer",
|
||||
args: ["-pkg", cask.staged_path.join("MyFancyPkg", "Fancy.pkg"), "-target", "/"],
|
||||
sudo: true,
|
||||
print_stdout: true
|
||||
)
|
||||
|
||||
shutup do
|
||||
pkg.install_phase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "choices" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-choices.rb") }
|
||||
|
||||
it "passes the choice changes xml to the system installer" do
|
||||
pkg = Hbc::Artifact::Pkg.new(cask, command: fake_system_command)
|
||||
|
||||
file = double(path: Pathname.new("/tmp/choices.xml"))
|
||||
|
||||
expect(file).to receive(:write).with(<<-EOS.undent)
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
\t<dict>
|
||||
\t\t<key>attributeSetting</key>
|
||||
\t\t<integer>1</integer>
|
||||
\t\t<key>choiceAttribute</key>
|
||||
\t\t<string>selected</string>
|
||||
\t\t<key>choiceIdentifier</key>
|
||||
\t\t<string>choice1</string>
|
||||
\t</dict>
|
||||
</array>
|
||||
</plist>
|
||||
EOS
|
||||
|
||||
expect(file).to receive(:close)
|
||||
expect(file).to receive(:unlink)
|
||||
expect(Tempfile).to receive(:open).and_yield(file)
|
||||
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/installer",
|
||||
args: ["-pkg", cask.staged_path.join("MyFancyPkg", "Fancy.pkg"), "-target", "/", "-applyChoiceChangesXML", cask.staged_path.join("/tmp/choices.xml")],
|
||||
sudo: true,
|
||||
print_stdout: true
|
||||
)
|
||||
|
||||
shutup do
|
||||
pkg.install_phase
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::PostflightBlock do
|
||||
describe "install_phase" do
|
||||
@ -13,10 +13,10 @@ describe Hbc::Artifact::PostflightBlock do
|
||||
end
|
||||
end
|
||||
|
||||
Hbc::Artifact::PostflightBlock.new(cask).install_phase
|
||||
described_class.new(cask).install_phase
|
||||
|
||||
called.must_equal true
|
||||
yielded_arg.must_be_kind_of Hbc::DSL::Postflight
|
||||
expect(called).to be true
|
||||
expect(yielded_arg).to be_kind_of(Hbc::DSL::Postflight)
|
||||
end
|
||||
end
|
||||
|
||||
@ -32,10 +32,10 @@ describe Hbc::Artifact::PostflightBlock do
|
||||
end
|
||||
end
|
||||
|
||||
Hbc::Artifact::PostflightBlock.new(cask).uninstall_phase
|
||||
described_class.new(cask).uninstall_phase
|
||||
|
||||
called.must_equal true
|
||||
yielded_arg.must_be_kind_of Hbc::DSL::UninstallPostflight
|
||||
expect(called).to be true
|
||||
expect(yielded_arg).to be_kind_of(Hbc::DSL::UninstallPostflight)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::PreflightBlock do
|
||||
describe "install_phase" do
|
||||
@ -13,10 +13,10 @@ describe Hbc::Artifact::PreflightBlock do
|
||||
end
|
||||
end
|
||||
|
||||
Hbc::Artifact::PreflightBlock.new(cask).install_phase
|
||||
described_class.new(cask).install_phase
|
||||
|
||||
called.must_equal true
|
||||
yielded_arg.must_be_kind_of Hbc::DSL::Preflight
|
||||
expect(called).to be true
|
||||
expect(yielded_arg).to be_kind_of Hbc::DSL::Preflight
|
||||
end
|
||||
end
|
||||
|
||||
@ -32,10 +32,10 @@ describe Hbc::Artifact::PreflightBlock do
|
||||
end
|
||||
end
|
||||
|
||||
Hbc::Artifact::PreflightBlock.new(cask).uninstall_phase
|
||||
described_class.new(cask).uninstall_phase
|
||||
|
||||
called.must_equal true
|
||||
yielded_arg.must_be_kind_of Hbc::DSL::UninstallPreflight
|
||||
expect(called).to be true
|
||||
expect(yielded_arg).to be_kind_of Hbc::DSL::UninstallPreflight
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::Suite do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-suite.rb") }
|
||||
@ -8,20 +8,21 @@ describe Hbc::Artifact::Suite do
|
||||
let(:target_path) { Hbc.appdir.join("Caffeine") }
|
||||
let(:source_path) { cask.staged_path.join("Caffeine") }
|
||||
|
||||
before do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
before(:each) do
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
|
||||
it "moves the suite to the proper directory" do
|
||||
skip("flaky test")
|
||||
skip("flaky test") # FIXME
|
||||
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.must_be :directory?
|
||||
TestHelper.valid_symlink?(target_path).must_equal false
|
||||
source_path.wont_be :exist?
|
||||
expect(target_path).to be_a_directory
|
||||
expect(target_path).to be_a_symlink
|
||||
expect(target_path.readlink).to exist
|
||||
expect(source_path).not_to exist
|
||||
end
|
||||
|
||||
it "creates a suite containing the expected app" do
|
||||
@ -29,20 +30,20 @@ describe Hbc::Artifact::Suite do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path.join("Caffeine.app").must_be :exist?
|
||||
expect(target_path.join("Caffeine.app")).to exist
|
||||
end
|
||||
|
||||
it "avoids clobbering an existing suite by moving over it" do
|
||||
target_path.mkpath
|
||||
|
||||
assert_raises Hbc::CaskError do
|
||||
expect {
|
||||
shutup do
|
||||
install_phase.call
|
||||
end
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
|
||||
source_path.must_be :directory?
|
||||
target_path.must_be :directory?
|
||||
File.identical?(source_path, target_path).must_equal false
|
||||
expect(source_path).to be_a_directory
|
||||
expect(target_path).to be_a_directory
|
||||
expect(File.identical?(source_path, target_path)).to be false
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::App do
|
||||
describe "multiple apps" do
|
||||
@ -14,8 +14,8 @@ describe Hbc::Artifact::App do
|
||||
let(:source_path_pro) { cask.staged_path.join("Caffeine Pro.app") }
|
||||
let(:target_path_pro) { Hbc.appdir.join("Caffeine Pro.app") }
|
||||
|
||||
before do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
before(:each) do
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
|
||||
it "installs both apps using the proper target directory" do
|
||||
@ -23,11 +23,11 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path_mini.must_be :directory?
|
||||
source_path_mini.wont_be :exist?
|
||||
expect(target_path_mini).to be_a_directory
|
||||
expect(source_path_mini).not_to exist
|
||||
|
||||
target_path_pro.must_be :directory?
|
||||
source_path_pro.wont_be :exist?
|
||||
expect(target_path_pro).to be_a_directory
|
||||
expect(source_path_pro).not_to exist
|
||||
end
|
||||
|
||||
describe "when apps are in a subdirectory" do
|
||||
@ -38,11 +38,11 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path_mini.must_be :directory?
|
||||
source_path_mini.wont_be :exist?
|
||||
expect(target_path_mini).to be_a_directory
|
||||
expect(source_path_mini).not_to exist
|
||||
|
||||
target_path_pro.must_be :directory?
|
||||
source_path_pro.wont_be :exist?
|
||||
expect(target_path_pro).to be_a_directory
|
||||
expect(source_path_pro).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
@ -53,44 +53,40 @@ describe Hbc::Artifact::App do
|
||||
install_phase.call
|
||||
end
|
||||
|
||||
target_path_mini.must_be :directory?
|
||||
source_path_mini.wont_be :exist?
|
||||
expect(target_path_mini).to be_a_directory
|
||||
expect(source_path_mini).not_to exist
|
||||
|
||||
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist?
|
||||
cask.staged_path.join("Caffeine Deluxe.app").must_be :exist?
|
||||
expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
|
||||
expect(cask.staged_path.join("Caffeine Deluxe.app")).to exist
|
||||
end
|
||||
|
||||
describe "avoids clobbering an existing app" do
|
||||
it "when the first app of two already exists" do
|
||||
target_path_mini.mkpath
|
||||
|
||||
err = assert_raises Hbc::CaskError do
|
||||
install_phase.must_output <<-EOS.undent
|
||||
expect {
|
||||
expect(install_phase).to output(<<-EOS.undent).to_stdout
|
||||
==> Moving App 'Caffeine Pro.app' to '#{target_path_pro}'
|
||||
EOS
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError, "It seems there is already an App at '#{target_path_mini}'.")
|
||||
|
||||
err.message.must_equal("It seems there is already an App at '#{target_path_mini}'.")
|
||||
|
||||
source_path_mini.must_be :directory?
|
||||
target_path_mini.must_be :directory?
|
||||
File.identical?(source_path_mini, target_path_mini).must_equal false
|
||||
expect(source_path_mini).to be_a_directory
|
||||
expect(target_path_mini).to be_a_directory
|
||||
expect(File.identical?(source_path_mini, target_path_mini)).to be false
|
||||
end
|
||||
|
||||
it "when the second app of two already exists" do
|
||||
target_path_pro.mkpath
|
||||
|
||||
err = assert_raises Hbc::CaskError do
|
||||
install_phase.must_output <<-EOS.undent
|
||||
expect {
|
||||
expect(install_phase).to output(<<-EOS.undent).to_stdout
|
||||
==> Moving App 'Caffeine Mini.app' to '#{target_path_mini}'
|
||||
EOS
|
||||
end
|
||||
}.to raise_error(Hbc::CaskError, "It seems there is already an App at '#{target_path_pro}'.")
|
||||
|
||||
err.message.must_equal("It seems there is already an App at '#{target_path_pro}'.")
|
||||
|
||||
source_path_pro.must_be :directory?
|
||||
target_path_pro.must_be :directory?
|
||||
File.identical?(source_path_pro, target_path_pro).must_equal false
|
||||
expect(source_path_pro).to be_a_directory
|
||||
expect(target_path_pro).to be_a_directory
|
||||
expect(File.identical?(source_path_pro, target_path_pro)).to be false
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::App do
|
||||
# FIXME: Doesn't actually raise because the `app` stanza is not evaluated on load.
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Artifact::Uninstall do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installable.rb") }
|
||||
@ -7,9 +7,9 @@ describe Hbc::Artifact::Uninstall do
|
||||
Hbc::Artifact::Uninstall.new(cask, command: Hbc::FakeSystemCommand)
|
||||
}
|
||||
|
||||
before do
|
||||
before(:each) do
|
||||
shutup do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
end
|
||||
|
||||
@ -20,7 +20,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
}
|
||||
|
||||
describe "when using launchctl" do
|
||||
context "when using launchctl" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-launchctl.rb") }
|
||||
let(:launchctl_list_cmd) { %w[/bin/launchctl list my.fancy.package.service] }
|
||||
let(:launchctl_remove_cmd) { %w[/bin/launchctl remove my.fancy.package.service] }
|
||||
@ -40,7 +40,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
EOS
|
||||
}
|
||||
|
||||
describe "when launchctl job is owned by user" do
|
||||
context "when launchctl job is owned by user" do
|
||||
it "can uninstall" do
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
launchctl_list_cmd,
|
||||
@ -58,7 +58,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when launchctl job is owned by system" do
|
||||
context "when launchctl job is owned by system" do
|
||||
it "can uninstall" do
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
launchctl_list_cmd,
|
||||
@ -77,7 +77,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using pkgutil" do
|
||||
context "when using pkgutil" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-pkgutil.rb") }
|
||||
let(:main_pkg_id) { "my.fancy.package.main" }
|
||||
let(:agent_pkg_id) { "my.fancy.package.agent" }
|
||||
@ -163,7 +163,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using kext" do
|
||||
context "when using kext" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-kext.rb") }
|
||||
let(:kext_id) { "my.fancy.package.kernelextension" }
|
||||
|
||||
@ -188,7 +188,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using quit" do
|
||||
context "when using quit" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-quit.rb") }
|
||||
let(:bundle_id) { "my.fancy.package.app" }
|
||||
let(:quit_application_script) {
|
||||
@ -208,7 +208,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using signal" do
|
||||
context "when using signal" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-signal.rb") }
|
||||
let(:bundle_id) { "my.fancy.package.app" }
|
||||
let(:signals) { %w[TERM KILL] }
|
||||
@ -220,14 +220,14 @@ describe Hbc::Artifact::Uninstall do
|
||||
)
|
||||
|
||||
signals.each do |signal|
|
||||
Process.expects(:kill).with(signal, *unix_pids)
|
||||
expect(Process).to receive(:kill).with(signal, *unix_pids)
|
||||
end
|
||||
|
||||
subject
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using delete" do
|
||||
context "when using delete" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-delete.rb") }
|
||||
|
||||
it "can uninstall" do
|
||||
@ -241,7 +241,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using trash" do
|
||||
context "when using trash" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-trash.rb") }
|
||||
|
||||
it "can uninstall" do
|
||||
@ -255,7 +255,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using rmdir" do
|
||||
context "when using rmdir" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-rmdir.rb") }
|
||||
let(:dir_pathname) { Pathname.new("#{TEST_FIXTURE_DIR}/cask/empty_directory") }
|
||||
|
||||
@ -272,7 +272,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using script" do
|
||||
context "when using script" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-script.rb") }
|
||||
let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
|
||||
|
||||
@ -287,7 +287,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using early_script" do
|
||||
context "when using early_script" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-early-script.rb") }
|
||||
let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
|
||||
|
||||
@ -302,7 +302,7 @@ describe Hbc::Artifact::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using login_item" do
|
||||
context "when using login_item" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-login-item.rb") }
|
||||
|
||||
it "can uninstall" do
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
# TODO: test that zap removes an alternate version of the same Cask
|
||||
describe Hbc::Artifact::Zap do
|
||||
@ -8,9 +8,9 @@ describe Hbc::Artifact::Zap do
|
||||
Hbc::Artifact::Zap.new(cask, command: Hbc::FakeSystemCommand)
|
||||
}
|
||||
|
||||
before do
|
||||
before(:each) do
|
||||
shutup do
|
||||
TestHelper.install_without_artifacts(cask)
|
||||
InstallHelper.install_without_artifacts(cask)
|
||||
end
|
||||
end
|
||||
|
||||
@ -21,7 +21,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
}
|
||||
|
||||
describe "when using launchctl" do
|
||||
context "when using launchctl" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-launchctl.rb") }
|
||||
let(:launchctl_list_cmd) { %w[/bin/launchctl list my.fancy.package.service] }
|
||||
let(:launchctl_remove_cmd) { %w[/bin/launchctl remove my.fancy.package.service] }
|
||||
@ -41,7 +41,7 @@ describe Hbc::Artifact::Zap do
|
||||
EOS
|
||||
}
|
||||
|
||||
describe "when launchctl job is owned by user" do
|
||||
context "when launchctl job is owned by user" do
|
||||
it "can zap" do
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
launchctl_list_cmd,
|
||||
@ -78,7 +78,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using pkgutil" do
|
||||
context "when using pkgutil" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-pkgutil.rb") }
|
||||
let(:main_pkg_id) { "my.fancy.package.main" }
|
||||
let(:agent_pkg_id) { "my.fancy.package.agent" }
|
||||
@ -164,7 +164,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using kext" do
|
||||
context "when using kext" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-kext.rb") }
|
||||
let(:kext_id) { "my.fancy.package.kernelextension" }
|
||||
|
||||
@ -189,7 +189,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using quit" do
|
||||
context "when using quit" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-quit.rb") }
|
||||
let(:bundle_id) { "my.fancy.package.app" }
|
||||
let(:quit_application_script) {
|
||||
@ -209,7 +209,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using signal" do
|
||||
context "when using signal" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-signal.rb") }
|
||||
let(:bundle_id) { "my.fancy.package.app" }
|
||||
let(:signals) { %w[TERM KILL] }
|
||||
@ -221,14 +221,14 @@ describe Hbc::Artifact::Zap do
|
||||
)
|
||||
|
||||
signals.each do |signal|
|
||||
Process.expects(:kill).with(signal, *unix_pids)
|
||||
expect(Process).to receive(:kill).with(signal, *unix_pids)
|
||||
end
|
||||
|
||||
subject
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using delete" do
|
||||
context "when using delete" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-delete.rb") }
|
||||
|
||||
it "can zap" do
|
||||
@ -242,7 +242,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using trash" do
|
||||
context "when using trash" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-trash.rb") }
|
||||
|
||||
it "can zap" do
|
||||
@ -256,7 +256,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using rmdir" do
|
||||
context "when using rmdir" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-rmdir.rb") }
|
||||
let(:dir_pathname) { Pathname.new("#{TEST_FIXTURE_DIR}/cask/empty_directory") }
|
||||
|
||||
@ -273,7 +273,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using script" do
|
||||
context "when using script" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-script.rb") }
|
||||
let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
|
||||
|
||||
@ -288,7 +288,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using early_script" do
|
||||
context "when using early_script" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-early-script.rb") }
|
||||
let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
|
||||
|
||||
@ -303,7 +303,7 @@ describe Hbc::Artifact::Zap do
|
||||
end
|
||||
end
|
||||
|
||||
describe "when using login_item" do
|
||||
context "when using login_item" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-login-item.rb") }
|
||||
|
||||
it "can zap" do
|
||||
@ -20,4 +20,73 @@ describe Hbc::Cask do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "load" do
|
||||
let(:hbc_relative_tap_path) { "../../Taps/caskroom/homebrew-cask" }
|
||||
|
||||
it "returns an instance of the Cask for the given token" do
|
||||
c = Hbc.load("adium")
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("adium")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a specific file location" do
|
||||
location = File.expand_path(hbc_relative_tap_path + "/Casks/dia.rb")
|
||||
c = Hbc.load(location)
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("dia")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a url" do
|
||||
url = "file://" + File.expand_path(hbc_relative_tap_path + "/Casks/dia.rb")
|
||||
c = shutup do
|
||||
Hbc.load(url)
|
||||
end
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("dia")
|
||||
end
|
||||
|
||||
it "raises an error when failing to download a Cask from a url" do
|
||||
expect {
|
||||
url = "file://" + File.expand_path(hbc_relative_tap_path + "/Casks/notacask.rb")
|
||||
shutup do
|
||||
Hbc.load(url)
|
||||
end
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a relative file location" do
|
||||
c = Hbc.load(hbc_relative_tap_path + "/Casks/bbedit.rb")
|
||||
expect(c).to be_kind_of(Hbc::Cask)
|
||||
expect(c.token).to eq("bbedit")
|
||||
end
|
||||
|
||||
it "uses exact match when loading by token" do
|
||||
expect(Hbc.load("test-opera").token).to eq("test-opera")
|
||||
expect(Hbc.load("test-opera-mail").token).to eq("test-opera-mail")
|
||||
end
|
||||
|
||||
it "raises an error when attempting to load a Cask that doesn't exist" do
|
||||
expect {
|
||||
Hbc.load("notacask")
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "all_tokens" do
|
||||
it "returns a token for every Cask" do
|
||||
all_cask_tokens = Hbc.all_tokens
|
||||
expect(all_cask_tokens.count).to be > 20
|
||||
all_cask_tokens.each { |token| expect(token).to be_kind_of(String) }
|
||||
end
|
||||
end
|
||||
|
||||
describe "metadata" do
|
||||
it "proposes a versioned metadata directory name for each instance" do
|
||||
cask_token = "adium"
|
||||
c = Hbc.load(cask_token)
|
||||
metadata_path = Hbc.caskroom.join(cask_token, ".metadata", c.version)
|
||||
expect(c.metadata_versioned_container_path.to_s).to eq(metadata_path.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
61
Library/Homebrew/cask/spec/cask/cli/audit_spec.rb
Normal file
61
Library/Homebrew/cask/spec/cask/cli/audit_spec.rb
Normal file
@ -0,0 +1,61 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Audit do
|
||||
let(:auditor) { double }
|
||||
let(:cask) { double }
|
||||
|
||||
describe "selection of Casks to audit" do
|
||||
it "audits all Casks if no tokens are given" do
|
||||
allow(Hbc).to receive(:all).and_return([cask, cask])
|
||||
|
||||
expect(auditor).to receive(:audit).twice
|
||||
|
||||
run_audit([], auditor)
|
||||
end
|
||||
|
||||
it "audits specified Casks if tokens are given" do
|
||||
cask_token = "nice-app"
|
||||
expect(Hbc).to receive(:load).with(cask_token).and_return(cask)
|
||||
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit([cask_token], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
describe "rules for downloading a Cask" do
|
||||
it "does not download the Cask per default" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
|
||||
it "download a Cask if --download flag is set" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: true, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken", "--download"], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
describe "rules for checking token conflicts" do
|
||||
it "does not check for token conflicts per default" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
|
||||
it "checks for token conflicts if --token-conflicts flag is set" do
|
||||
allow(Hbc).to receive(:load).and_return(cask)
|
||||
expect(auditor).to receive(:audit).with(cask, audit_download: false, check_token_conflicts: true)
|
||||
|
||||
run_audit(["casktoken", "--token-conflicts"], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
def run_audit(args, auditor)
|
||||
Hbc::CLI::Audit.new(args, auditor).run
|
||||
end
|
||||
end
|
||||
@ -1,9 +1,9 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Cat do
|
||||
describe "given a basic Cask" do
|
||||
before do
|
||||
@expected_output = <<-EOS.undent
|
||||
let(:expected_output) {
|
||||
<<-EOS.undent
|
||||
cask 'basic-cask' do
|
||||
version '1.2.3'
|
||||
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'
|
||||
@ -14,46 +14,46 @@ describe Hbc::CLI::Cat do
|
||||
app 'TestCask.app'
|
||||
end
|
||||
EOS
|
||||
end
|
||||
}
|
||||
|
||||
it "displays the Cask file content about the specified Cask" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("basic-cask")
|
||||
}.must_output(@expected_output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
|
||||
it "throws away additional Cask arguments and uses the first" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("basic-cask", "local-caffeine")
|
||||
}.must_output(@expected_output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
|
||||
it "throws away stray options" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("--notavalidoption", "basic-cask")
|
||||
}.must_output(@expected_output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an exception when the Cask does not exist" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("notacask")
|
||||
}.must_raise Hbc::CaskUnavailableError
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Cat.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
# monkeypatch for testing
|
||||
module Hbc
|
||||
@ -20,11 +20,11 @@ module Hbc
|
||||
end
|
||||
|
||||
describe Hbc::CLI::Create do
|
||||
before do
|
||||
before(:each) do
|
||||
Hbc::CLI::Create.reset!
|
||||
end
|
||||
|
||||
after do
|
||||
after(:each) do
|
||||
%w[new-cask additional-cask another-cask yet-another-cask local-caff].each do |cask|
|
||||
path = Hbc.path(cask)
|
||||
path.delete if path.exist?
|
||||
@ -33,7 +33,7 @@ describe Hbc::CLI::Create do
|
||||
|
||||
it "opens the editor for the specified Cask" do
|
||||
Hbc::CLI::Create.run("new-cask")
|
||||
Hbc::CLI::Create.editor_commands.must_equal [
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("new-cask")],
|
||||
]
|
||||
end
|
||||
@ -41,7 +41,7 @@ describe Hbc::CLI::Create do
|
||||
it "drops a template down for the specified Cask" do
|
||||
Hbc::CLI::Create.run("new-cask")
|
||||
template = File.read(Hbc.path("new-cask"))
|
||||
template.must_equal <<-EOS.undent
|
||||
expect(template).to eq <<-EOS.undent
|
||||
cask 'new-cask' do
|
||||
version ''
|
||||
sha256 ''
|
||||
@ -57,44 +57,44 @@ describe Hbc::CLI::Create do
|
||||
|
||||
it "throws away additional Cask arguments and uses the first" do
|
||||
Hbc::CLI::Create.run("additional-cask", "another-cask")
|
||||
Hbc::CLI::Create.editor_commands.must_equal [
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("additional-cask")],
|
||||
]
|
||||
end
|
||||
|
||||
it "throws away stray options" do
|
||||
Hbc::CLI::Create.run("--notavalidoption", "yet-another-cask")
|
||||
Hbc::CLI::Create.editor_commands.must_equal [
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("yet-another-cask")],
|
||||
]
|
||||
end
|
||||
|
||||
it "raises an exception when the Cask already exists" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Create.run("basic-cask")
|
||||
}.must_raise Hbc::CaskAlreadyCreatedError
|
||||
}.to raise_error(Hbc::CaskAlreadyCreatedError)
|
||||
end
|
||||
|
||||
it "allows creating Casks that are substrings of existing Casks" do
|
||||
Hbc::CLI::Create.run("local-caff")
|
||||
Hbc::CLI::Create.editor_commands.must_equal [
|
||||
expect(Hbc::CLI::Create.editor_commands).to eq [
|
||||
[Hbc.path("local-caff")],
|
||||
]
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Create.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Create.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
# monkeypatch for testing
|
||||
module Hbc
|
||||
@ -20,43 +20,43 @@ module Hbc
|
||||
end
|
||||
|
||||
describe Hbc::CLI::Edit do
|
||||
before do
|
||||
before(:each) do
|
||||
Hbc::CLI::Edit.reset!
|
||||
end
|
||||
|
||||
it "opens the editor for the specified Cask" do
|
||||
Hbc::CLI::Edit.run("alfred")
|
||||
Hbc::CLI::Edit.editor_commands.must_equal [
|
||||
[Hbc.path("alfred")],
|
||||
Hbc::CLI::Edit.run("local-caffeine")
|
||||
expect(Hbc::CLI::Edit.editor_commands).to eq [
|
||||
[Hbc.path("local-caffeine")],
|
||||
]
|
||||
end
|
||||
|
||||
it "throws away additional arguments and uses the first" do
|
||||
Hbc::CLI::Edit.run("adium", "alfred")
|
||||
Hbc::CLI::Edit.editor_commands.must_equal [
|
||||
[Hbc.path("adium")],
|
||||
Hbc::CLI::Edit.run("local-caffeine", "local-transmission")
|
||||
expect(Hbc::CLI::Edit.editor_commands).to eq [
|
||||
[Hbc.path("local-caffeine")],
|
||||
]
|
||||
end
|
||||
|
||||
it "raises an exception when the Cask doesnt exist" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Edit.run("notacask")
|
||||
}.must_raise Hbc::CaskUnavailableError
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Edit.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Edit.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Fetch do
|
||||
let(:local_transmission) {
|
||||
@ -13,8 +13,8 @@ describe Hbc::CLI::Fetch do
|
||||
shutup do
|
||||
Hbc::CLI::Fetch.run("local-transmission", "local-caffeine")
|
||||
end
|
||||
Hbc::CurlDownloadStrategy.new(local_transmission).cached_location.must_be :exist?
|
||||
Hbc::CurlDownloadStrategy.new(local_caffeine).cached_location.must_be :exist?
|
||||
expect(Hbc::CurlDownloadStrategy.new(local_transmission).cached_location).to exist
|
||||
expect(Hbc::CurlDownloadStrategy.new(local_caffeine).cached_location).to exist
|
||||
end
|
||||
|
||||
it "prevents double fetch (without nuking existing installation)" do
|
||||
@ -30,7 +30,7 @@ describe Hbc::CLI::Fetch do
|
||||
end
|
||||
new_ctime = File.stat(download_stategy.cached_location).ctime
|
||||
|
||||
old_ctime.to_i.must_equal new_ctime.to_i
|
||||
expect(old_ctime.to_i).to eq(new_ctime.to_i)
|
||||
end
|
||||
|
||||
it "allows double fetch with --force" do
|
||||
@ -48,31 +48,30 @@ describe Hbc::CLI::Fetch do
|
||||
download_stategy = Hbc::CurlDownloadStrategy.new(local_transmission)
|
||||
new_ctime = File.stat(download_stategy.cached_location).ctime
|
||||
|
||||
# new_ctime.to_i.must_be :>, old_ctime.to_i
|
||||
new_ctime.to_i.must_be :>, old_ctime.to_i
|
||||
expect(new_ctime.to_i).to be > old_ctime.to_i
|
||||
end
|
||||
|
||||
it "properly handles Casks that are not present" do
|
||||
lambda {
|
||||
expect {
|
||||
shutup do
|
||||
Hbc::CLI::Fetch.run("notacask")
|
||||
end
|
||||
}.must_raise Hbc::CaskUnavailableError
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Fetch.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Fetch.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
# monkeypatch for testing
|
||||
module Hbc
|
||||
@ -25,23 +25,23 @@ describe Hbc::CLI::Home do
|
||||
end
|
||||
|
||||
it "opens the homepage for the specified Cask" do
|
||||
Hbc::CLI::Home.run("alfred")
|
||||
Hbc::CLI::Home.system_commands.must_equal [
|
||||
["/usr/bin/open", "--", "https://www.alfredapp.com/"],
|
||||
Hbc::CLI::Home.run("local-caffeine")
|
||||
expect(Hbc::CLI::Home.system_commands).to eq [
|
||||
["/usr/bin/open", "--", "http://example.com/local-caffeine"],
|
||||
]
|
||||
end
|
||||
|
||||
it "works for multiple Casks" do
|
||||
Hbc::CLI::Home.run("alfred", "adium")
|
||||
Hbc::CLI::Home.system_commands.must_equal [
|
||||
["/usr/bin/open", "--", "https://www.alfredapp.com/"],
|
||||
["/usr/bin/open", "--", "https://www.adium.im/"],
|
||||
Hbc::CLI::Home.run("local-caffeine", "local-transmission")
|
||||
expect(Hbc::CLI::Home.system_commands).to eq [
|
||||
["/usr/bin/open", "--", "http://example.com/local-caffeine"],
|
||||
["/usr/bin/open", "--", "http://example.com/local-transmission"],
|
||||
]
|
||||
end
|
||||
|
||||
it "opens the project page when no Cask is specified" do
|
||||
Hbc::CLI::Home.run
|
||||
Hbc::CLI::Home.system_commands.must_equal [
|
||||
expect(Hbc::CLI::Home.system_commands).to eq [
|
||||
["/usr/bin/open", "--", "http://caskroom.io/"],
|
||||
]
|
||||
end
|
||||
@ -1,14 +1,14 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Info do
|
||||
it "displays some nice info about the specified Cask" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("local-caffeine")
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine: 1.2.3
|
||||
http://example.com/local-caffeine
|
||||
Not installed
|
||||
From: https://github.com/caskroom/homebrew-test/blob/master/Casks/local-caffeine.rb
|
||||
From: https://github.com/caskroom/homebrew-spec/blob/master/Casks/local-caffeine.rb
|
||||
==> Name
|
||||
None
|
||||
==> Artifacts
|
||||
@ -17,12 +17,12 @@ describe Hbc::CLI::Info do
|
||||
end
|
||||
|
||||
describe "given multiple Casks" do
|
||||
before do
|
||||
@expected_output = <<-EOS.undent
|
||||
let(:expected_output) {
|
||||
<<-EOS.undent
|
||||
local-caffeine: 1.2.3
|
||||
http://example.com/local-caffeine
|
||||
Not installed
|
||||
From: https://github.com/caskroom/homebrew-test/blob/master/Casks/local-caffeine.rb
|
||||
From: https://github.com/caskroom/homebrew-spec/blob/master/Casks/local-caffeine.rb
|
||||
==> Name
|
||||
None
|
||||
==> Artifacts
|
||||
@ -30,35 +30,35 @@ describe Hbc::CLI::Info do
|
||||
local-transmission: 2.61
|
||||
http://example.com/local-transmission
|
||||
Not installed
|
||||
From: https://github.com/caskroom/homebrew-test/blob/master/Casks/local-transmission.rb
|
||||
From: https://github.com/caskroom/homebrew-spec/blob/master/Casks/local-transmission.rb
|
||||
==> Name
|
||||
None
|
||||
==> Artifacts
|
||||
Transmission.app (app)
|
||||
EOS
|
||||
end
|
||||
}
|
||||
|
||||
it "displays the info" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("local-caffeine", "local-transmission")
|
||||
}.must_output(@expected_output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
|
||||
it "throws away stray options" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("--notavalidoption", "local-caffeine", "local-transmission")
|
||||
}.must_output(@expected_output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
end
|
||||
|
||||
it "should print caveats if the Cask provided one" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("with-caveats")
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
with-caveats: 1.2.3
|
||||
http://example.com/local-caffeine
|
||||
Not installed
|
||||
From: https://github.com/caskroom/homebrew-test/blob/master/Casks/with-caveats.rb
|
||||
From: https://github.com/caskroom/homebrew-spec/blob/master/Casks/with-caveats.rb
|
||||
==> Name
|
||||
None
|
||||
==> Artifacts
|
||||
@ -78,13 +78,13 @@ describe Hbc::CLI::Info do
|
||||
end
|
||||
|
||||
it 'should not print "Caveats" section divider if the caveats block has no output' do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("with-conditional-caveats")
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
with-conditional-caveats: 1.2.3
|
||||
http://example.com/local-caffeine
|
||||
Not installed
|
||||
From: https://github.com/caskroom/homebrew-test/blob/master/Casks/with-conditional-caveats.rb
|
||||
From: https://github.com/caskroom/homebrew-spec/blob/master/Casks/with-conditional-caveats.rb
|
||||
==> Name
|
||||
None
|
||||
==> Artifacts
|
||||
@ -94,17 +94,17 @@ describe Hbc::CLI::Info do
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Info.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Install do
|
||||
it "allows staging and activation of multiple Casks at once" do
|
||||
@ -6,10 +6,10 @@ describe Hbc::CLI::Install do
|
||||
Hbc::CLI::Install.run("local-transmission", "local-caffeine")
|
||||
end
|
||||
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").must_be :installed?
|
||||
Hbc.appdir.join("Transmission.app").must_be :directory?
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb").must_be :installed?
|
||||
Hbc.appdir.join("Caffeine.app").must_be :directory?
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).to be_installed
|
||||
expect(Hbc.appdir.join("Transmission.app")).to be_a_directory
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb")).to be_installed
|
||||
expect(Hbc.appdir.join("Caffeine.app")).to be_a_directory
|
||||
end
|
||||
|
||||
it "skips double install (without nuking existing installation)" do
|
||||
@ -19,7 +19,7 @@ describe Hbc::CLI::Install do
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
end
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").must_be :installed?
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).to be_installed
|
||||
end
|
||||
|
||||
it "prints a warning message on double install" do
|
||||
@ -27,9 +27,9 @@ describe Hbc::CLI::Install do
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
end
|
||||
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Install.run("local-transmission", "")
|
||||
}.must_output nil, /Warning: A Cask for local-transmission is already installed./
|
||||
}.to output(/Warning: A Cask for local-transmission is already installed./).to_stderr
|
||||
end
|
||||
|
||||
it "allows double install with --force" do
|
||||
@ -37,54 +37,56 @@ describe Hbc::CLI::Install do
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
end
|
||||
|
||||
lambda {
|
||||
expect {
|
||||
expect {
|
||||
Hbc::CLI::Install.run("local-transmission", "--force")
|
||||
}.must_output(/local-transmission was successfully installed!/)
|
||||
}.to output(/It seems there is already an App at.*overwriting\./).to_stderr
|
||||
}.to output(/local-transmission was successfully installed!/).to_stdout
|
||||
end
|
||||
|
||||
it "skips dependencies with --skip-cask-deps" do
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("with-depends-on-cask-multiple", "--skip-cask-deps")
|
||||
end
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-multiple.rb").must_be :installed?
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb").wont_be :installed?
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").wont_be :installed?
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-multiple.rb")).to be_installed
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb")).not_to be_installed
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).not_to be_installed
|
||||
end
|
||||
|
||||
it "properly handles Casks that are not present" do
|
||||
lambda {
|
||||
expect {
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("notacask")
|
||||
end
|
||||
}.must_raise Hbc::CaskError
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
end
|
||||
|
||||
it "returns a suggestion for a misspelled Cask" do
|
||||
lambda {
|
||||
expect {
|
||||
begin
|
||||
Hbc::CLI::Install.run("googlechrome")
|
||||
rescue Hbc::CaskError
|
||||
nil
|
||||
end
|
||||
}.must_output(nil, /No available Cask for googlechrome\. Did you mean:\ngoogle-chrome/)
|
||||
}.to output(/No available Cask for googlechrome\. Did you mean:\ngoogle-chrome/).to_stderr
|
||||
end
|
||||
|
||||
it "returns multiple suggestions for a Cask fragment" do
|
||||
lambda {
|
||||
expect {
|
||||
begin
|
||||
Hbc::CLI::Install.run("google")
|
||||
rescue Hbc::CaskError
|
||||
nil
|
||||
end
|
||||
}.must_output(nil, /No available Cask for google\. Did you mean one of:\ngoogle/)
|
||||
}.to output(/No available Cask for google\. Did you mean one of:\ngoogle/).to_stderr
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
with_options = lambda do |options|
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Install.run(*options)
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::List do
|
||||
it "lists the installed Casks in a pretty fashion" do
|
||||
casks = %w[local-caffeine local-transmission].map { |c| Hbc.load(c) }
|
||||
|
||||
casks.each do |c|
|
||||
TestHelper.install_with_caskfile(c)
|
||||
InstallHelper.install_with_caskfile(c)
|
||||
end
|
||||
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::List.run
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
local-caffeine
|
||||
local-transmission
|
||||
EOS
|
||||
@ -18,7 +18,7 @@ describe Hbc::CLI::List do
|
||||
|
||||
describe "lists versions" do
|
||||
let(:casks) { ["local-caffeine", "local-transmission"] }
|
||||
let(:output) {
|
||||
let(:expected_output) {
|
||||
<<-EOS.undent
|
||||
local-caffeine 1.2.3
|
||||
local-transmission 2.61
|
||||
@ -26,19 +26,19 @@ describe Hbc::CLI::List do
|
||||
}
|
||||
|
||||
before(:each) do
|
||||
casks.map(&Hbc.method(:load)).each(&TestHelper.method(:install_with_caskfile))
|
||||
casks.map(&Hbc.method(:load)).each(&InstallHelper.method(:install_with_caskfile))
|
||||
end
|
||||
|
||||
it "of all installed Casks" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::List.run("--versions")
|
||||
}.must_output(output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
|
||||
it "of given Casks" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::List.run("--versions", "local-caffeine", "local-transmission")
|
||||
}.must_output(output)
|
||||
}.to output(expected_output).to_stdout
|
||||
end
|
||||
end
|
||||
|
||||
@ -50,14 +50,10 @@ describe Hbc::CLI::List do
|
||||
staged_path.mkpath
|
||||
end
|
||||
|
||||
after do
|
||||
caskroom_path.rmtree
|
||||
end
|
||||
|
||||
it "lists installed Casks without backing ruby files (due to renames or otherwise)" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::List.run
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
ive-been-renamed (!)
|
||||
EOS
|
||||
end
|
||||
@ -69,15 +65,15 @@ describe Hbc::CLI::List do
|
||||
let(:casks) { [caffeine, transmission] }
|
||||
|
||||
it "lists the installed files for those Casks" do
|
||||
casks.each(&TestHelper.method(:install_without_artifacts_with_caskfile))
|
||||
casks.each(&InstallHelper.method(:install_without_artifacts_with_caskfile))
|
||||
|
||||
shutup do
|
||||
Hbc::Artifact::App.new(transmission).install_phase
|
||||
end
|
||||
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::List.run("local-transmission", "local-caffeine")
|
||||
}.must_output <<-EOS.undent
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
==> Apps
|
||||
#{Hbc.appdir.join("Transmission.app")} (#{Hbc.appdir.join("Transmission.app").abv})
|
||||
==> Apps
|
||||
@ -1,10 +1,10 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI do
|
||||
it "supports setting the appdir" do
|
||||
Hbc::CLI.process_options %w[help --appdir=/some/path/foo]
|
||||
|
||||
Hbc.appdir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.appdir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the appdir from ENV" do
|
||||
@ -12,13 +12,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.appdir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.appdir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the prefpanedir" do
|
||||
Hbc::CLI.process_options %w[help --prefpanedir=/some/path/foo]
|
||||
|
||||
Hbc.prefpanedir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.prefpanedir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the prefpanedir from ENV" do
|
||||
@ -26,13 +26,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.prefpanedir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.prefpanedir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the qlplugindir" do
|
||||
Hbc::CLI.process_options %w[help --qlplugindir=/some/path/foo]
|
||||
|
||||
Hbc.qlplugindir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.qlplugindir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the qlplugindir from ENV" do
|
||||
@ -40,13 +40,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.qlplugindir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.qlplugindir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the colorpickerdir" do
|
||||
Hbc::CLI.process_options %w[help --colorpickerdir=/some/path/foo]
|
||||
|
||||
Hbc.colorpickerdir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.colorpickerdir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the colorpickerdir from ENV" do
|
||||
@ -54,13 +54,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.colorpickerdir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.colorpickerdir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the dictionarydir" do
|
||||
Hbc::CLI.process_options %w[help --dictionarydir=/some/path/foo]
|
||||
|
||||
Hbc.dictionarydir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.dictionarydir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the dictionarydir from ENV" do
|
||||
@ -68,13 +68,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.dictionarydir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.dictionarydir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the fontdir" do
|
||||
Hbc::CLI.process_options %w[help --fontdir=/some/path/foo]
|
||||
|
||||
Hbc.fontdir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.fontdir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the fontdir from ENV" do
|
||||
@ -82,13 +82,13 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.fontdir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.fontdir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "supports setting the servicedir" do
|
||||
Hbc::CLI.process_options %w[help --servicedir=/some/path/foo]
|
||||
|
||||
Hbc.servicedir.must_equal Pathname("/some/path/foo")
|
||||
expect(Hbc.servicedir).to eq(Pathname.new("/some/path/foo"))
|
||||
end
|
||||
|
||||
it "supports setting the servicedir from ENV" do
|
||||
@ -96,36 +96,36 @@ describe Hbc::CLI do
|
||||
|
||||
Hbc::CLI.process_options %w[help]
|
||||
|
||||
Hbc.servicedir.must_equal Pathname("/some/path/bar")
|
||||
expect(Hbc.servicedir).to eq(Pathname.new("/some/path/bar"))
|
||||
end
|
||||
|
||||
it "allows additional options to be passed through" do
|
||||
rest = Hbc::CLI.process_options %w[edit foo --create --appdir=/some/path/qux]
|
||||
|
||||
Hbc.appdir.must_equal Pathname("/some/path/qux")
|
||||
rest.must_equal %w[edit foo --create]
|
||||
expect(Hbc.appdir).to eq(Pathname.new("/some/path/qux"))
|
||||
expect(rest).to eq(%w[edit foo --create])
|
||||
end
|
||||
|
||||
describe "when a mandatory argument is missing" do
|
||||
it "shows a user-friendly error message" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI.process_options %w[install -f]
|
||||
}.must_raise Hbc::CaskError
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "given an ambiguous option" do
|
||||
it "shows a user-friendly error message" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI.process_options %w[edit -c]
|
||||
}.must_raise Hbc::CaskError
|
||||
}.to raise_error(Hbc::CaskError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "--debug" do
|
||||
it "sets the Cask debug method to true" do
|
||||
Hbc::CLI.process_options %w[help --debug]
|
||||
Hbc.debug.must_equal true
|
||||
expect(Hbc.debug).to be true
|
||||
Hbc.debug = false
|
||||
end
|
||||
end
|
||||
@ -133,12 +133,8 @@ describe Hbc::CLI do
|
||||
describe "--help" do
|
||||
it "sets the Cask help method to true" do
|
||||
Hbc::CLI.process_options %w[foo --help]
|
||||
Hbc.help.must_equal true
|
||||
expect(Hbc.help).to be true
|
||||
Hbc.help = false
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
ENV["HOMEBREW_CASK_OPTS"] = nil
|
||||
end
|
||||
end
|
||||
24
Library/Homebrew/cask/spec/cask/cli/reinstall_spec.rb
Normal file
24
Library/Homebrew/cask/spec/cask/cli/reinstall_spec.rb
Normal file
@ -0,0 +1,24 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Reinstall do
|
||||
it "allows reinstalling a Cask" do
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
end
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Reinstall.run("local-transmission")
|
||||
end
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).to be_installed
|
||||
end
|
||||
|
||||
it "allows reinstalling a non installed Cask" do
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).not_to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Reinstall.run("local-transmission")
|
||||
end
|
||||
expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")).to be_installed
|
||||
end
|
||||
end
|
||||
61
Library/Homebrew/cask/spec/cask/cli/search_spec.rb
Normal file
61
Library/Homebrew/cask/spec/cask/cli/search_spec.rb
Normal file
@ -0,0 +1,61 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Search do
|
||||
it "lists the available Casks that match the search term" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("photoshop")
|
||||
}.to output(<<-EOS.undent).to_stdout
|
||||
==> Partial matches
|
||||
adobe-photoshop-cc
|
||||
adobe-photoshop-lightroom
|
||||
EOS
|
||||
end
|
||||
|
||||
it "shows that there are no Casks matching a search term that did not result in anything" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("foo-bar-baz")
|
||||
}.to output("No Cask found for \"foo-bar-baz\".\n").to_stdout
|
||||
end
|
||||
|
||||
it "lists all available Casks with no search term" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run
|
||||
}.to output(/google-chrome/).to_stdout
|
||||
end
|
||||
|
||||
it "ignores hyphens in search terms" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("goo-gle-chrome")
|
||||
}.to output(/google-chrome/).to_stdout
|
||||
end
|
||||
|
||||
it "ignores hyphens in Cask tokens" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("googlechrome")
|
||||
}.to output(/google-chrome/).to_stdout
|
||||
end
|
||||
|
||||
it "accepts multiple arguments" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("google chrome")
|
||||
}.to output(/google-chrome/).to_stdout
|
||||
end
|
||||
|
||||
it "accepts a regexp argument" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("/^google-c[a-z]rome$/")
|
||||
}.to output("==> Regexp matches\ngoogle-chrome\n").to_stdout
|
||||
end
|
||||
|
||||
it "Returns both exact and partial matches" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("mnemosyne")
|
||||
}.to output(/^==> Exact match\nmnemosyne\n==> Partial matches\nsubclassed-mnemosyne/).to_stdout
|
||||
end
|
||||
|
||||
it "does not search the Tap name" do
|
||||
expect {
|
||||
Hbc::CLI::Search.run("caskroom")
|
||||
}.to output(/^No Cask found for "caskroom"\.\n/).to_stdout
|
||||
end
|
||||
end
|
||||
@ -1,22 +1,22 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Uninstall do
|
||||
it "shows an error when a bad Cask is provided" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("notacask")
|
||||
}.must_raise Hbc::CaskUnavailableError
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
it "shows an error when a Cask is provided that's not installed" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("anvil")
|
||||
}.must_raise Hbc::CaskNotInstalledError
|
||||
}.to raise_error(Hbc::CaskNotInstalledError)
|
||||
end
|
||||
|
||||
it "tries anyway on a non-present Cask when --force is given" do
|
||||
lambda do
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("anvil", "--force")
|
||||
end # wont_raise
|
||||
}.not_to raise_error
|
||||
end
|
||||
|
||||
it "can uninstall and unlink multiple Casks at once" do
|
||||
@ -28,17 +28,17 @@ describe Hbc::CLI::Uninstall do
|
||||
Hbc::Installer.new(transmission).install
|
||||
end
|
||||
|
||||
caffeine.must_be :installed?
|
||||
transmission.must_be :installed?
|
||||
expect(caffeine).to be_installed
|
||||
expect(transmission).to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Uninstall.run("local-caffeine", "local-transmission")
|
||||
end
|
||||
|
||||
caffeine.wont_be :installed?
|
||||
Hbc.appdir.join("Transmission.app").wont_be :exist?
|
||||
transmission.wont_be :installed?
|
||||
Hbc.appdir.join("Caffeine.app").wont_be :exist?
|
||||
expect(caffeine).not_to be_installed
|
||||
expect(Hbc.appdir.join("Transmission.app")).not_to exist
|
||||
expect(transmission).not_to be_installed
|
||||
expect(Hbc.appdir.join("Caffeine.app")).not_to exist
|
||||
end
|
||||
|
||||
describe "when multiple versions of a cask are installed" do
|
||||
@ -67,34 +67,29 @@ describe Hbc::CLI::Uninstall do
|
||||
end
|
||||
end
|
||||
|
||||
after(:each) do
|
||||
caskroom_path.rmtree if caskroom_path.exist?
|
||||
end
|
||||
|
||||
it "uninstalls one version at a time" do
|
||||
shutup do
|
||||
Hbc::CLI::Uninstall.run("versioned-cask")
|
||||
end
|
||||
|
||||
caskroom_path.join(first_installed_version).must_be :exist?
|
||||
caskroom_path.join(last_installed_version).wont_be :exist?
|
||||
caskroom_path.must_be :exist?
|
||||
expect(caskroom_path.join(first_installed_version)).to exist
|
||||
expect(caskroom_path.join(last_installed_version)).not_to exist
|
||||
expect(caskroom_path).to exist
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Uninstall.run("versioned-cask")
|
||||
end
|
||||
|
||||
caskroom_path.join(first_installed_version).wont_be :exist?
|
||||
caskroom_path.wont_be :exist?
|
||||
expect(caskroom_path.join(first_installed_version)).not_to exist
|
||||
expect(caskroom_path).not_to exist
|
||||
end
|
||||
|
||||
it "displays a message when versions remain installed" do
|
||||
out, err = capture_io do
|
||||
expect {
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("versioned-cask")
|
||||
end
|
||||
|
||||
out.must_match(/#{token} #{first_installed_version} is still installed./)
|
||||
err.must_be :empty?
|
||||
}.not_to output.to_stderr
|
||||
}.to output(/#{token} #{first_installed_version} is still installed./).to_stdout
|
||||
end
|
||||
end
|
||||
|
||||
@ -121,34 +116,29 @@ describe Hbc::CLI::Uninstall do
|
||||
EOS
|
||||
end
|
||||
|
||||
after do
|
||||
app.rmtree if app.exist?
|
||||
caskroom_path.rmtree if caskroom_path.exist?
|
||||
end
|
||||
|
||||
it "can still uninstall those Casks" do
|
||||
shutup do
|
||||
Hbc::CLI::Uninstall.run("ive-been-renamed")
|
||||
end
|
||||
|
||||
app.wont_be :exist?
|
||||
caskroom_path.wont_be :exist?
|
||||
expect(app).not_to exist
|
||||
expect(caskroom_path).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Uninstall.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
11
Library/Homebrew/cask/spec/cask/cli/version_spec.rb
Normal file
11
Library/Homebrew/cask/spec/cask/cli/version_spec.rb
Normal file
@ -0,0 +1,11 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe "brew cask --version" do
|
||||
it "respects the --version argument" do
|
||||
expect {
|
||||
expect {
|
||||
Hbc::CLI::NullCommand.new("--version").run
|
||||
}.not_to output.to_stderr
|
||||
}.to output(Hbc.full_version).to_stdout
|
||||
end
|
||||
end
|
||||
@ -1,10 +1,10 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::CLI::Zap do
|
||||
it "shows an error when a bad Cask is provided" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Zap.run("notacask")
|
||||
}.must_raise Hbc::CaskUnavailableError
|
||||
}.to raise_error(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
it "can zap and unlink multiple Casks at once" do
|
||||
@ -16,18 +16,18 @@ describe Hbc::CLI::Zap do
|
||||
Hbc::Installer.new(transmission).install
|
||||
end
|
||||
|
||||
caffeine.must_be :installed?
|
||||
transmission.must_be :installed?
|
||||
expect(caffeine).to be_installed
|
||||
expect(transmission).to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Zap.run("--notavalidoption",
|
||||
"local-caffeine", "local-transmission")
|
||||
end
|
||||
|
||||
caffeine.wont_be :installed?
|
||||
Hbc.appdir.join("Transmission.app").wont_be :symlink?
|
||||
transmission.wont_be :installed?
|
||||
Hbc.appdir.join("Caffeine.app").wont_be :symlink?
|
||||
expect(caffeine).not_to be_installed
|
||||
expect(Hbc.appdir.join("Caffeine.app")).not_to be_a_symlink
|
||||
expect(transmission).not_to be_installed
|
||||
expect(Hbc.appdir.join("Transmission.app")).not_to be_a_symlink
|
||||
end
|
||||
|
||||
# TODO: Explicit test that both zap and uninstall directives get dispatched.
|
||||
@ -59,17 +59,17 @@ describe Hbc::CLI::Zap do
|
||||
|
||||
describe "when no Cask is specified" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Zap.run
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "when no Cask is specified, but an invalid option" do
|
||||
it "raises an exception" do
|
||||
lambda {
|
||||
expect {
|
||||
Hbc::CLI::Zap.run("--notavalidoption")
|
||||
}.must_raise Hbc::CaskUnspecifiedError
|
||||
}.to raise_error(Hbc::CaskUnspecifiedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,7 +1,7 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Container::Dmg do
|
||||
describe "mount!" do
|
||||
describe "#mount!" do
|
||||
it "does not store nil mounts for dmgs with extra data" do
|
||||
transmission = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")
|
||||
|
||||
@ -13,7 +13,7 @@ describe Hbc::Container::Dmg do
|
||||
|
||||
begin
|
||||
dmg.mount!
|
||||
dmg.mounts.wont_include nil
|
||||
expect(dmg.mounts).not_to include nil
|
||||
ensure
|
||||
dmg.eject!
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Container::Naked do
|
||||
it "saves files with spaces in them from uris with encoded spaces" do
|
||||
@ -13,8 +13,13 @@ describe Hbc::Container::Naked do
|
||||
Hbc::FakeSystemCommand.stubs_command(expected_command)
|
||||
|
||||
container = Hbc::Container::Naked.new(cask, path, Hbc::FakeSystemCommand)
|
||||
container.extract
|
||||
|
||||
Hbc::FakeSystemCommand.system_calls[expected_command].must_equal 1
|
||||
expect {
|
||||
shutup do
|
||||
container.extract
|
||||
end
|
||||
}.not_to raise_error
|
||||
|
||||
expect(Hbc::FakeSystemCommand.system_calls[expected_command]).to eq(1)
|
||||
end
|
||||
end
|
||||
92
Library/Homebrew/cask/spec/cask/depends_on_spec.rb
Normal file
92
Library/Homebrew/cask/spec/cask/depends_on_spec.rb
Normal file
@ -0,0 +1,92 @@
|
||||
require "spec_helper"
|
||||
|
||||
# TODO: this test should be named after the corresponding class, once
|
||||
# that class is abstracted from installer.rb
|
||||
describe "Satisfy Dependencies and Requirements" do
|
||||
subject {
|
||||
lambda do
|
||||
shutup do
|
||||
Hbc::Installer.new(cask).install
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
describe "depends_on cask" do
|
||||
context "when depends_on cask is cyclic" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-cyclic.rb") }
|
||||
it { is_expected.to raise_error(Hbc::CaskCyclicCaskDependencyError) }
|
||||
end
|
||||
|
||||
context do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask.rb") }
|
||||
let(:dependency) { Hbc.load(cask.depends_on.cask.first) }
|
||||
|
||||
it "installs the dependency of a Cask and the Cask itself" do
|
||||
expect(subject).not_to raise_error
|
||||
expect(cask).to be_installed
|
||||
expect(dependency).to be_installed
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on macos" do
|
||||
context "given an array" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-array.rb") }
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
|
||||
context "given a comparisson" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-comparison.rb") }
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
|
||||
context "given a string" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-string.rb") }
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
|
||||
context "given a symbol" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-symbol.rb") }
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
|
||||
context "when not satisfied" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-failure.rb") }
|
||||
it { is_expected.to raise_error(Hbc::CaskError) }
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on arch" do
|
||||
context "when satisfied" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-arch.rb") }
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on x11" do
|
||||
before(:each) do
|
||||
allow(MacOS::X11).to receive(:installed?).and_return(x11_installed)
|
||||
end
|
||||
|
||||
context "when satisfied" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11.rb") }
|
||||
let(:x11_installed) { true }
|
||||
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
|
||||
context "when not satisfied" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11.rb") }
|
||||
let(:x11_installed) { false }
|
||||
|
||||
it { is_expected.to raise_error(Hbc::CaskX11DependencyError) }
|
||||
end
|
||||
|
||||
context "when depends_on x11: false" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11-false.rb") }
|
||||
let(:x11_installed) { false }
|
||||
|
||||
it { is_expected.not_to raise_error }
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL::Caveats do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL::Postflight do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL::Preflight do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL::UninstallPostflight do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
@ -1,4 +1,4 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL::UninstallPreflight do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
548
Library/Homebrew/cask/spec/cask/dsl_spec.rb
Normal file
548
Library/Homebrew/cask/spec/cask/dsl_spec.rb
Normal file
@ -0,0 +1,548 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/#{token}.rb") }
|
||||
let(:token) { "basic-cask" }
|
||||
|
||||
context "stanzas" do
|
||||
it "lets you set url, homepage, and version" do
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
|
||||
describe "when a Cask includes an unknown method" do
|
||||
let(:attempt_unknown_method) {
|
||||
lambda do
|
||||
Hbc::Cask.new("unexpected-method-cask") do
|
||||
future_feature :not_yet_on_your_machine
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
it "prints a warning that it has encountered an unexpected method" do
|
||||
expected = Regexp.compile(<<-EOS.undent.lines.map(&:chomp).join(""))
|
||||
(?m)
|
||||
Warning:
|
||||
.*
|
||||
Unexpected method 'future_feature' called on Cask unexpected-method-cask\\.
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask/blob/master/doc/reporting_bugs/pre_bug_report.md
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask#reporting-bugs
|
||||
EOS
|
||||
|
||||
expect {
|
||||
expect(attempt_unknown_method).not_to output.to_stdout
|
||||
}.to output(expected).to_stderr
|
||||
end
|
||||
|
||||
it "will simply warn, not throw an exception" do
|
||||
expect {
|
||||
shutup do
|
||||
attempt_unknown_method.call
|
||||
end
|
||||
}.not_to raise_error
|
||||
end
|
||||
end
|
||||
|
||||
describe "header line" do
|
||||
context "when invalid" do
|
||||
let(:token) { "invalid/invalid-header-format" }
|
||||
it "raises an error" do
|
||||
expect { cask }.to raise_error(SyntaxError)
|
||||
end
|
||||
end
|
||||
|
||||
context "when token does not match the file name" do
|
||||
let(:token) { "invalid/invalid-header-token-mismatch" }
|
||||
|
||||
it "raises an error" do
|
||||
expect {
|
||||
cask
|
||||
}.to raise_error(Hbc::CaskTokenDoesNotMatchError, /Bad header line:.*does not match file name/)
|
||||
end
|
||||
end
|
||||
|
||||
context "when it contains no DSL version" do
|
||||
let(:token) { "no-dsl-version" }
|
||||
|
||||
it "does not require a DSL version in the header" do
|
||||
expect(cask.token).to eq("no-dsl-version")
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
|
||||
context "when it contains a deprecated DSL version" do
|
||||
let(:token) { "with-dsl-version" }
|
||||
|
||||
it "may use deprecated DSL version hash syntax" do
|
||||
allow(ENV).to receive(:[]).with("HOMEBREW_DEVELOPER").and_return(nil)
|
||||
|
||||
shutup do
|
||||
expect(cask.token).to eq("with-dsl-version")
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "name stanza" do
|
||||
it "lets you set the full name via a name stanza" do
|
||||
cask = Hbc::Cask.new("name-cask") do
|
||||
name "Proper Name"
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
])
|
||||
end
|
||||
|
||||
it "Accepts an array value to the name stanza" do
|
||||
cask = Hbc::Cask.new("array-name-cask") do
|
||||
name ["Proper Name", "Alternate Name"]
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
])
|
||||
end
|
||||
|
||||
it "Accepts multiple name stanzas" do
|
||||
cask = Hbc::Cask.new("multi-name-cask") do
|
||||
name "Proper Name"
|
||||
name "Alternate Name"
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
describe "sha256 stanza" do
|
||||
it "lets you set checksum via sha256" do
|
||||
cask = Hbc::Cask.new("checksum-cask") do
|
||||
sha256 "imasha2"
|
||||
end
|
||||
|
||||
expect(cask.sha256).to eq("imasha2")
|
||||
end
|
||||
end
|
||||
|
||||
describe "language stanza" do
|
||||
it "allows multilingual casks" do
|
||||
cask = lambda do
|
||||
Hbc::Cask.new("cask-with-apps") do
|
||||
language "zh" do
|
||||
sha256 "abc123"
|
||||
"zh-CN"
|
||||
end
|
||||
|
||||
language "en-US", default: true do
|
||||
sha256 "xyz789"
|
||||
"en-US"
|
||||
end
|
||||
|
||||
url "https://example.org/#{language}.zip"
|
||||
end
|
||||
end
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["zh"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["zh-XX"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["en"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX", "zh", "en"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX", "en-US", "zh"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
end
|
||||
end
|
||||
|
||||
describe "app stanza" do
|
||||
it "allows you to specify app stanzas" do
|
||||
cask = Hbc::Cask.new("cask-with-apps") do
|
||||
app "Foo.app"
|
||||
app "Bar.app"
|
||||
end
|
||||
|
||||
expect(Array(cask.artifacts[:app])).to eq([["Foo.app"], ["Bar.app"]])
|
||||
end
|
||||
|
||||
it "allow app stanzas to be empty" do
|
||||
cask = Hbc::Cask.new("cask-with-no-apps")
|
||||
expect(Array(cask.artifacts[:app])).to eq([])
|
||||
end
|
||||
end
|
||||
|
||||
describe "caveats stanza" do
|
||||
it "allows caveats to be specified via a method define" do
|
||||
cask = Hbc::Cask.new("plain-cask")
|
||||
|
||||
expect(cask.caveats).to be_empty
|
||||
|
||||
cask = Hbc::Cask.new("cask-with-caveats") do
|
||||
def caveats; <<-EOS.undent
|
||||
When you install this Cask, you probably want to know this.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
expect(cask.caveats).to eq("When you install this Cask, you probably want to know this.\n")
|
||||
end
|
||||
end
|
||||
|
||||
describe "pkg stanza" do
|
||||
it "allows installable pkgs to be specified" do
|
||||
cask = Hbc::Cask.new("cask-with-pkgs") do
|
||||
pkg "Foo.pkg"
|
||||
pkg "Bar.pkg"
|
||||
end
|
||||
|
||||
expect(Array(cask.artifacts[:pkg])).to eq([["Foo.pkg"], ["Bar.pkg"]])
|
||||
end
|
||||
end
|
||||
|
||||
describe "url stanza" do
|
||||
let(:token) { "invalid/invalid-two-url" }
|
||||
|
||||
it "prevents defining multiple urls" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'url' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "homepage stanza" do
|
||||
let(:token) { "invalid/invalid-two-homepage" }
|
||||
|
||||
it "prevents defining multiple homepages" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'homepage' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "version stanza" do
|
||||
let(:token) { "invalid/invalid-two-version" }
|
||||
it "prevents defining multiple versions" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'version' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "appcast stanza" do
|
||||
let(:token) { "with-appcast" }
|
||||
|
||||
it "allows appcasts to be specified" do
|
||||
expect(cask.appcast.to_s).to match(/^http/)
|
||||
end
|
||||
|
||||
context "when multiple appcasts are defined" do
|
||||
let(:token) { "invalid/invalid-appcast-multiple" }
|
||||
|
||||
it "raises an error" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'appcast' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
context "when appcast URL is invalid" do
|
||||
let(:token) { "invalid/invalid-appcast-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "GPG stanza" do
|
||||
context "valid" do
|
||||
let(:token) { "with-gpg" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.gpg.to_s).to match(/\S/)
|
||||
end
|
||||
end
|
||||
|
||||
context "with :key_url" do
|
||||
let(:token) { "with-gpg-key-url" }
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.gpg.to_s).to match(/\S/)
|
||||
end
|
||||
end
|
||||
|
||||
context "specifying mmultiple times" do
|
||||
let(:token) { "invalid/invalid-gpg-multiple-stanzas" }
|
||||
|
||||
it "is not allowed" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
context "missing GPG key parameters" do
|
||||
let(:token) { "invalid/invalid-gpg-missing-key" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza must include exactly one/)
|
||||
end
|
||||
end
|
||||
|
||||
context "conflicting GPG key parameters" do
|
||||
let(:token) { "invalid/invalid-gpg-conflicting-keys" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza must include exactly one/)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG signature URLs" do
|
||||
let(:token) { "invalid/invalid-gpg-signature-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG key URLs" do
|
||||
let(:token) { "invalid/invalid-gpg-key-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG key IDs" do
|
||||
let(:token) { "invalid/invalid-gpg-key-id" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "GPG parameter is unknown" do
|
||||
let(:token) { "invalid/invalid-gpg-parameter" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on stanza" do
|
||||
let(:token) { "invalid/invalid-depends-on-key" }
|
||||
|
||||
it "refuses to load with an invalid depends_on key" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on formula" do
|
||||
context "with one Formula" do
|
||||
let(:token) { "with-depends-on-formula" }
|
||||
|
||||
it "allows depends_on formula to be specified" do
|
||||
expect(cask.depends_on.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "with multiple Formulae" do
|
||||
let(:token) { "with-depends-on-formula-multiple" }
|
||||
|
||||
it "allows multiple depends_on formula to be specified" do
|
||||
expect(cask.depends_on.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on cask" do
|
||||
context "specifying one" do
|
||||
let(:token) { "with-depends-on-cask" }
|
||||
it "is allowed" do
|
||||
expect(cask.depends_on.cask).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "specifying multiple" do
|
||||
let(:token) { "with-depends-on-cask-multiple" }
|
||||
|
||||
it "is allowed" do
|
||||
expect(cask.depends_on.cask).not_to be nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on macos" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-macos-string" }
|
||||
|
||||
it "allows depends_on macos to be specified" do
|
||||
expect(cask.depends_on.macos).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on macos value" do
|
||||
let(:token) { "invalid/invalid-depends-on-macos-bad-release" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "conflicting depends_on macos forms" do
|
||||
let(:token) { "invalid/invalid-depends-on-macos-conflicting-forms" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on arch" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-arch" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.depends_on.arch).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on arch value" do
|
||||
let(:token) { "invalid/invalid-depends-on-arch-value" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on x11" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-x11" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.depends_on.x11).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on x11 value" do
|
||||
let(:token) { "invalid/invalid-depends-on-x11-value" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "conflicts_with stanza" do
|
||||
context "valid" do
|
||||
let(:token) { "with-conflicts-with" }
|
||||
|
||||
it "allows conflicts_with stanza to be specified" do
|
||||
expect(cask.conflicts_with.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid conflicts_with key" do
|
||||
let(:token) { "invalid/invalid-conflicts-with-key" }
|
||||
|
||||
it "refuses to load invalid conflicts_with key" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "installer stanza" do
|
||||
context "script" do
|
||||
let(:token) { "with-installer-script" }
|
||||
|
||||
it "allows installer script to be specified" do
|
||||
expect(cask.artifacts[:installer].first.script[:executable]).to eq("/usr/bin/true")
|
||||
expect(cask.artifacts[:installer].first.script[:args]).to eq(["--flag"])
|
||||
expect(cask.artifacts[:installer].to_a[1].script[:executable]).to eq("/usr/bin/false")
|
||||
expect(cask.artifacts[:installer].to_a[1].script[:args]).to eq(["--flag"])
|
||||
end
|
||||
end
|
||||
|
||||
context "manual" do
|
||||
let(:token) { "with-installer-manual" }
|
||||
|
||||
it "allows installer manual to be specified" do
|
||||
expect(cask.artifacts[:installer].first.manual).to eq("Caffeine.app")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "stage_only stanza" do
|
||||
context "when there is no other activatable artifact" do
|
||||
let(:token) { "stage-only" }
|
||||
|
||||
it "allows stage_only stanza to be specified" do
|
||||
expect(cask.artifacts[:stage_only].first).to eq([true])
|
||||
end
|
||||
end
|
||||
|
||||
context "when there is are activatable artifacts" do
|
||||
let(:token) { "invalid/invalid-stage-only-conflict" }
|
||||
|
||||
it "prevents specifying stage_only" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'stage_only' must be the only activatable artifact/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "auto_updates stanza" do
|
||||
let(:token) { "auto-updates" }
|
||||
|
||||
it "allows auto_updates stanza to be specified" do
|
||||
expect(cask.auto_updates).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe "appdir" do
|
||||
context "interpolation of the appdir in stanzas" do
|
||||
let(:token) { "appdir-interpolation" }
|
||||
|
||||
it "is allowed" do
|
||||
expect(cask.artifacts[:binary].first).to eq(["#{Hbc.appdir}/some/path"])
|
||||
end
|
||||
end
|
||||
|
||||
it "does not include a trailing slash" do
|
||||
begin
|
||||
original_appdir = Hbc.appdir
|
||||
Hbc.appdir = "#{original_appdir}/"
|
||||
|
||||
cask = Hbc::Cask.new("appdir-trailing-slash") do
|
||||
binary "#{appdir}/some/path"
|
||||
end
|
||||
|
||||
expect(cask.artifacts[:binary].first).to eq(["#{original_appdir}/some/path"])
|
||||
ensure
|
||||
Hbc.appdir = original_appdir
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,9 +1,9 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Installer do
|
||||
describe "install" do
|
||||
let(:empty_depends_on_stub) {
|
||||
stub(formula: [], cask: [], macos: nil, arch: nil, x11: nil)
|
||||
double(formula: [], cask: [], macos: nil, arch: nil, x11: nil)
|
||||
}
|
||||
|
||||
it "downloads and installs a nice fresh Cask" do
|
||||
@ -13,8 +13,8 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(caffeine).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("Caffeine.app")).must_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("Caffeine.app")).to be_a_directory
|
||||
end
|
||||
|
||||
it "works with dmg-based Casks" do
|
||||
@ -24,8 +24,8 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-dmg", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-dmg", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with tar-gz-based Casks" do
|
||||
@ -35,22 +35,22 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-tar-gz", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-tar-gz", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with cab-based Casks" do
|
||||
skip("cabextract not installed") if which("cabextract").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-cab.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-cab", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-cab", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with Adobe AIR-based Casks" do
|
||||
@ -61,22 +61,21 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-air", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container.app")).must_be :directory?
|
||||
expect(Hbc.caskroom.join("container-air", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container.app")).to be_a_directory
|
||||
end
|
||||
|
||||
it "works with 7z-based Casks" do
|
||||
skip("unar not installed") if which("unar").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-7z.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-7z", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-7z", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with xar-based Casks" do
|
||||
@ -86,36 +85,34 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-xar", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-xar", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with Stuffit-based Casks" do
|
||||
skip("unar not installed") if which("unar").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-sit.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-sit", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-sit", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with RAR-based Casks" do
|
||||
skip("unar not installed") if which("unar").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-rar.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-rar", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-rar", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with pure bzip2-based Casks" do
|
||||
@ -125,8 +122,8 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-bzip2", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container-bzip2--#{asset.version}")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-bzip2", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container-bzip2--#{asset.version}")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with pure gzip-based Casks" do
|
||||
@ -136,36 +133,34 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-gzip", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-gzip", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with pure xz-based Casks" do
|
||||
skip("unxz not installed") if which("unxz").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-xz.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-xz", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container-xz--#{asset.version}")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-xz", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container-xz--#{asset.version}")).to be_a_file
|
||||
end
|
||||
|
||||
it "works with lzma-based Casks" do
|
||||
skip("unlzma not installed") if which("unlzma").nil?
|
||||
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-lzma.rb")
|
||||
|
||||
asset.stub :depends_on, empty_depends_on_stub do
|
||||
allow(asset).to receive(:depends_on).and_return(empty_depends_on_stub)
|
||||
shutup do
|
||||
Hbc::Installer.new(asset).install
|
||||
end
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-lzma", asset.version)).must_be :directory?
|
||||
expect(Hbc.appdir.join("container-lzma--#{asset.version}")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-lzma", asset.version)).to be_a_directory
|
||||
expect(Hbc.appdir.join("container-lzma--#{asset.version}")).to be_a_file
|
||||
end
|
||||
|
||||
it "blows up on a bad checksum" do
|
||||
@ -174,7 +169,7 @@ describe Hbc::Installer do
|
||||
shutup do
|
||||
Hbc::Installer.new(bad_checksum).install
|
||||
end
|
||||
}.must_raise(Hbc::CaskSha256MismatchError)
|
||||
}.to raise_error(Hbc::CaskSha256MismatchError)
|
||||
end
|
||||
|
||||
it "blows up on a missing checksum" do
|
||||
@ -183,7 +178,7 @@ describe Hbc::Installer do
|
||||
shutup do
|
||||
Hbc::Installer.new(missing_checksum).install
|
||||
end
|
||||
}.must_raise(Hbc::CaskSha256MissingError)
|
||||
}.to raise_error(Hbc::CaskSha256MissingError)
|
||||
end
|
||||
|
||||
it "installs fine if sha256 :no_check is used" do
|
||||
@ -193,14 +188,14 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(no_checksum).install
|
||||
end
|
||||
|
||||
expect(no_checksum).must_be :installed?
|
||||
expect(no_checksum).to be_installed
|
||||
end
|
||||
|
||||
it "fails to install if sha256 :no_check is used with --require-sha" do
|
||||
no_checksum = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/no-checksum.rb")
|
||||
expect {
|
||||
Hbc::Installer.new(no_checksum, require_sha: true).install
|
||||
}.must_raise(Hbc::CaskNoShasumError)
|
||||
}.to raise_error(Hbc::CaskNoShasumError)
|
||||
end
|
||||
|
||||
it "installs fine if sha256 :no_check is used with --require-sha and --force" do
|
||||
@ -210,7 +205,7 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(no_checksum, require_sha: true, force: true).install
|
||||
end
|
||||
|
||||
expect(no_checksum).must_be :installed?
|
||||
expect(no_checksum).to be_installed
|
||||
end
|
||||
|
||||
it "prints caveats if they're present" do
|
||||
@ -218,9 +213,9 @@ describe Hbc::Installer do
|
||||
|
||||
expect {
|
||||
Hbc::Installer.new(with_caveats).install
|
||||
}.must_output(/Here are some things you might want to know/)
|
||||
}.to output(/Here are some things you might want to know/).to_stdout
|
||||
|
||||
expect(with_caveats).must_be :installed?
|
||||
expect(with_caveats).to be_installed
|
||||
end
|
||||
|
||||
it "prints installer :manual instructions when present" do
|
||||
@ -228,9 +223,9 @@ describe Hbc::Installer do
|
||||
|
||||
expect {
|
||||
Hbc::Installer.new(with_installer_manual).install
|
||||
}.must_output(/To complete the installation of Cask with-installer-manual, you must also\nrun the installer at\n\n '#{with_installer_manual.staged_path.join('Caffeine.app')}'/)
|
||||
}.to output(/To complete the installation of Cask with-installer-manual, you must also\nrun the installer at\n\n '#{with_installer_manual.staged_path.join('Caffeine.app')}'/).to_stdout
|
||||
|
||||
expect(with_installer_manual).must_be :installed?
|
||||
expect(with_installer_manual).to be_installed
|
||||
end
|
||||
|
||||
it "does not extract __MACOSX directories from zips" do
|
||||
@ -240,13 +235,13 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(with_macosx_dir).install
|
||||
end
|
||||
|
||||
expect(with_macosx_dir.staged_path.join("__MACOSX")).wont_be :directory?
|
||||
expect(with_macosx_dir.staged_path.join("__MACOSX")).not_to be_a_directory
|
||||
end
|
||||
|
||||
it "installer method raises an exception when already-installed Casks which auto-update are attempted" do
|
||||
with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
|
||||
expect(with_auto_updates).wont_be :installed?
|
||||
expect(with_auto_updates).not_to be_installed
|
||||
|
||||
installer = Hbc::Installer.new(with_auto_updates)
|
||||
|
||||
@ -256,28 +251,30 @@ describe Hbc::Installer do
|
||||
|
||||
expect {
|
||||
installer.install
|
||||
}.must_raise(Hbc::CaskAlreadyInstalledAutoUpdatesError)
|
||||
}.to raise_error(Hbc::CaskAlreadyInstalledAutoUpdatesError)
|
||||
end
|
||||
|
||||
it "allows already-installed Casks which auto-update to be installed if force is provided" do
|
||||
with_auto_updates = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
|
||||
expect(with_auto_updates).wont_be :installed?
|
||||
expect(with_auto_updates).not_to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::Installer.new(with_auto_updates).install
|
||||
end
|
||||
|
||||
expect {
|
||||
shutup do
|
||||
Hbc::Installer.new(with_auto_updates, force: true).install
|
||||
end # wont_raise
|
||||
end
|
||||
}.not_to raise_error
|
||||
end
|
||||
|
||||
# unlike the CLI, the internal interface throws exception on double-install
|
||||
it "installer method raises an exception when already-installed Casks are attempted" do
|
||||
transmission = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")
|
||||
|
||||
expect(transmission).wont_be :installed?
|
||||
expect(transmission).not_to be_installed
|
||||
|
||||
installer = Hbc::Installer.new(transmission)
|
||||
|
||||
@ -287,13 +284,13 @@ describe Hbc::Installer do
|
||||
|
||||
expect {
|
||||
installer.install
|
||||
}.must_raise(Hbc::CaskAlreadyInstalledError)
|
||||
}.to raise_error(Hbc::CaskAlreadyInstalledError)
|
||||
end
|
||||
|
||||
it "allows already-installed Casks to be installed if force is provided" do
|
||||
transmission = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")
|
||||
|
||||
expect(transmission).wont_be :installed?
|
||||
expect(transmission).not_to be_installed
|
||||
|
||||
shutup do
|
||||
Hbc::Installer.new(transmission).install
|
||||
@ -311,7 +308,7 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(naked_pkg).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("container-pkg", naked_pkg.version, "container.pkg")).must_be :file?
|
||||
expect(Hbc.caskroom.join("container-pkg", naked_pkg.version, "container.pkg")).to be_a_file
|
||||
end
|
||||
|
||||
it "works properly with an overridden container :type" do
|
||||
@ -321,7 +318,7 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(naked_executable).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("naked-executable", naked_executable.version, "naked_executable")).must_be :file?
|
||||
expect(Hbc.caskroom.join("naked-executable", naked_executable.version, "naked_executable")).to be_a_file
|
||||
end
|
||||
|
||||
it "works fine with a nested container" do
|
||||
@ -331,7 +328,7 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(nested_app).install
|
||||
end
|
||||
|
||||
expect(Hbc.appdir.join("MyNestedApp.app")).must_be :directory?
|
||||
expect(Hbc.appdir.join("MyNestedApp.app")).to be_a_directory
|
||||
end
|
||||
|
||||
it "generates and finds a timestamped metadata directory for an installed Cask" do
|
||||
@ -342,8 +339,8 @@ describe Hbc::Installer do
|
||||
end
|
||||
|
||||
m_path = caffeine.metadata_path(:now, true)
|
||||
expect(caffeine.metadata_path(:now, false)).must_equal(m_path)
|
||||
expect(caffeine.metadata_path(:latest)).must_equal(m_path)
|
||||
expect(caffeine.metadata_path(:now, false)).to eq(m_path)
|
||||
expect(caffeine.metadata_path(:latest)).to eq(m_path)
|
||||
end
|
||||
|
||||
it "generates and finds a metadata subdirectory for an installed Cask" do
|
||||
@ -355,8 +352,8 @@ describe Hbc::Installer do
|
||||
|
||||
subdir_name = "Casks"
|
||||
m_subdir = caffeine.metadata_subdir(subdir_name, :now, true)
|
||||
expect(caffeine.metadata_subdir(subdir_name, :now, false)).must_equal(m_subdir)
|
||||
expect(caffeine.metadata_subdir(subdir_name, :latest)).must_equal(m_subdir)
|
||||
expect(caffeine.metadata_subdir(subdir_name, :now, false)).to eq(m_subdir)
|
||||
expect(caffeine.metadata_subdir(subdir_name, :latest)).to eq(m_subdir)
|
||||
end
|
||||
end
|
||||
|
||||
@ -370,9 +367,9 @@ describe Hbc::Installer do
|
||||
installer.uninstall
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version, "Caffeine.app")).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine")).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version, "Caffeine.app")).not_to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).not_to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine")).not_to be_a_directory
|
||||
end
|
||||
|
||||
it "uninstalls all versions if force is set" do
|
||||
@ -383,19 +380,19 @@ describe Hbc::Installer do
|
||||
Hbc::Installer.new(caffeine).install
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).must_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).not_to be_a_directory
|
||||
FileUtils.mv(Hbc.caskroom.join("local-caffeine", caffeine.version), Hbc.caskroom.join("local-caffeine", mutated_version))
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).must_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).not_to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).to be_a_directory
|
||||
|
||||
shutup do
|
||||
Hbc::Installer.new(caffeine, force: true).uninstall
|
||||
end
|
||||
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine")).wont_be :directory?
|
||||
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).not_to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).not_to be_a_directory
|
||||
expect(Hbc.caskroom.join("local-caffeine")).not_to be_a_directory
|
||||
end
|
||||
end
|
||||
end
|
||||
114
Library/Homebrew/cask/spec/cask/pkg_spec.rb
Normal file
114
Library/Homebrew/cask/spec/cask/pkg_spec.rb
Normal file
@ -0,0 +1,114 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::Pkg do
|
||||
describe "uninstall" do
|
||||
let(:fake_system_command) { Hbc::NeverSudoSystemCommand }
|
||||
let(:empty_response) { double(stdout: "") }
|
||||
let(:pkg) { described_class.new("my.fake.pkg", fake_system_command) }
|
||||
|
||||
it "removes files and dirs referenced by the pkg" do
|
||||
some_files = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
|
||||
allow(pkg).to receive(:pkgutil_bom_files).and_return(some_files)
|
||||
|
||||
some_specials = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
|
||||
allow(pkg).to receive(:pkgutil_bom_specials).and_return(some_specials)
|
||||
|
||||
some_dirs = Array.new(3) { Pathname.new(Dir.mktmpdir) }
|
||||
allow(pkg).to receive(:pkgutil_bom_dirs).and_return(some_dirs)
|
||||
|
||||
allow(pkg).to receive(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
some_files.each do |file|
|
||||
expect(file).not_to exist
|
||||
end
|
||||
|
||||
some_dirs.each do |dir|
|
||||
expect(dir).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
context "pkgutil" do
|
||||
let(:fake_system_command) { class_double(Hbc::SystemCommand) }
|
||||
|
||||
it "forgets the pkg" do
|
||||
allow(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/pkgutil",
|
||||
args: ["--only-files", "--files", "my.fake.pkg"]
|
||||
).and_return(empty_response)
|
||||
|
||||
allow(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/pkgutil",
|
||||
args: ["--only-dirs", "--files", "my.fake.pkg"]
|
||||
).and_return(empty_response)
|
||||
|
||||
allow(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/pkgutil",
|
||||
args: ["--files", "my.fake.pkg"]
|
||||
).and_return(empty_response)
|
||||
|
||||
expect(fake_system_command).to receive(:run!).with(
|
||||
"/usr/sbin/pkgutil",
|
||||
args: ["--forget", "my.fake.pkg"],
|
||||
sudo: true
|
||||
)
|
||||
|
||||
pkg.uninstall
|
||||
end
|
||||
end
|
||||
|
||||
it "removes broken symlinks" do
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
fake_file = fake_dir.join("ima_file").tap { |path| FileUtils.touch(path) }
|
||||
|
||||
intact_symlink = fake_dir.join("intact_symlink").tap { |path| path.make_symlink(fake_file) }
|
||||
broken_symlink = fake_dir.join("broken_symlink").tap { |path| path.make_symlink("im_nota_file") }
|
||||
|
||||
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
|
||||
allow(pkg).to receive(:pkgutil_bom_files).and_return([])
|
||||
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
|
||||
allow(pkg).to receive(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
expect(intact_symlink).to exist
|
||||
expect(broken_symlink).not_to exist
|
||||
expect(fake_dir).to exist
|
||||
end
|
||||
|
||||
it "removes files incorrectly reportes as directories" do
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
fake_file = fake_dir.join("ima_file_pretending_to_be_a_dir").tap { |path| FileUtils.touch(path) }
|
||||
|
||||
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
|
||||
allow(pkg).to receive(:pkgutil_bom_files).and_return([])
|
||||
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_file, fake_dir])
|
||||
allow(pkg).to receive(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
expect(fake_file).not_to exist
|
||||
expect(fake_dir).not_to exist
|
||||
end
|
||||
|
||||
it "snags permissions on ornery dirs, but returns them afterwards" do
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
fake_file = fake_dir.join("ima_installed_file").tap { |path| FileUtils.touch(path) }
|
||||
fake_dir.chmod(0000)
|
||||
|
||||
allow(pkg).to receive(:pkgutil_bom_specials).and_return([])
|
||||
allow(pkg).to receive(:pkgutil_bom_files).and_return([fake_file])
|
||||
allow(pkg).to receive(:pkgutil_bom_dirs).and_return([fake_dir])
|
||||
allow(pkg).to receive(:forget)
|
||||
|
||||
shutup do
|
||||
pkg.uninstall
|
||||
end
|
||||
|
||||
expect(fake_dir).to be_a_directory
|
||||
expect(fake_file).not_to be_a_file
|
||||
expect((fake_dir.stat.mode % 01000).to_s(8)).to eq("0")
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,39 +1,31 @@
|
||||
describe Hbc::Scopes do
|
||||
describe "installed" do
|
||||
let(:fake_caskroom) { Pathname(Dir.mktmpdir) }
|
||||
|
||||
before do
|
||||
allow(Hbc).to receive(:caskroom) { fake_caskroom }
|
||||
end
|
||||
|
||||
after do
|
||||
fake_caskroom.rmtree
|
||||
end
|
||||
|
||||
it "returns a list installed Casks by loading Casks for all the dirs that exist in the caskroom" do
|
||||
allow(Hbc).to receive(:load) { |token| "loaded-#{token}" }
|
||||
|
||||
fake_caskroom.join("cask-bar").mkdir
|
||||
fake_caskroom.join("cask-foo").mkdir
|
||||
Hbc.caskroom.join("cask-bar").mkpath
|
||||
Hbc.caskroom.join("cask-foo").mkpath
|
||||
|
||||
installed_casks = Hbc.installed
|
||||
|
||||
expect(Hbc).to have_received(:load).with("cask-bar")
|
||||
expect(Hbc).to have_received(:load).with("cask-foo")
|
||||
expect(installed_casks).to eq(%w[
|
||||
expect(installed_casks).to eq(
|
||||
%w[
|
||||
loaded-cask-bar
|
||||
loaded-cask-foo
|
||||
])
|
||||
]
|
||||
)
|
||||
end
|
||||
|
||||
it "optimizes performance by resolving to a fully qualified path before calling Hbc.load" do
|
||||
fake_tapped_cask_dir = Pathname(Dir.mktmpdir).join("Casks")
|
||||
fake_tapped_cask_dir = Pathname.new(Dir.mktmpdir).join("Casks")
|
||||
absolute_path_to_cask = fake_tapped_cask_dir.join("some-cask.rb")
|
||||
|
||||
allow(Hbc).to receive(:load)
|
||||
allow(Hbc).to receive(:all_tapped_cask_dirs) { [fake_tapped_cask_dir] }
|
||||
|
||||
fake_caskroom.join("some-cask").mkdir
|
||||
Hbc.caskroom.join("some-cask").mkdir
|
||||
fake_tapped_cask_dir.mkdir
|
||||
FileUtils.touch(absolute_path_to_cask)
|
||||
|
||||
|
||||
@ -1,18 +1,18 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
# TODO: this test should be named after the corresponding class, once
|
||||
# that class is abstracted from installer.rb. It makes little sense
|
||||
# to be invoking bundle_identifier off of the installer instance.
|
||||
describe "Operations on staged Casks" do
|
||||
describe "bundle ID" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb") }
|
||||
let(:installer) { Hbc::Installer.new(cask) }
|
||||
it "fetches the bundle ID from a staged cask" do
|
||||
transmission_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")
|
||||
tr_installer = Hbc::Installer.new(transmission_cask)
|
||||
|
||||
shutup do
|
||||
tr_installer.install
|
||||
installer.install
|
||||
end
|
||||
tr_installer.bundle_identifier.must_equal("org.m0k.transmission")
|
||||
|
||||
expect(installer.bundle_identifier).to eq("org.m0k.transmission")
|
||||
end
|
||||
end
|
||||
end
|
||||
44
Library/Homebrew/cask/spec/cask/url_checker_spec.rb
Normal file
44
Library/Homebrew/cask/spec/cask/url_checker_spec.rb
Normal file
@ -0,0 +1,44 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::UrlChecker do
|
||||
describe "request processing" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
let(:checker) { Hbc::UrlChecker.new(cask) }
|
||||
|
||||
before(:each) do
|
||||
allow(Hbc::Fetcher).to receive(:head).and_return(response)
|
||||
checker.run
|
||||
end
|
||||
|
||||
context "with an empty response" do
|
||||
let(:response) { "" }
|
||||
|
||||
it "adds an error" do
|
||||
expect(checker.errors).to include("timeout while requesting #{cask.url}")
|
||||
end
|
||||
end
|
||||
|
||||
context "with a valid http response" do
|
||||
let(:response) {
|
||||
<<-EOS.undent
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/x-apple-diskimage
|
||||
ETag: "b4208f3e84967be4b078ecaa03fba941"
|
||||
Content-Length: 23726161
|
||||
Last-Modified: Sun, 12 Aug 2012 21:17:21 GMT
|
||||
EOS
|
||||
}
|
||||
|
||||
it "properly populates the response code and headers" do
|
||||
expect(checker.errors).to be_empty
|
||||
expect(checker.response_status).to eq("HTTP/1.1 200 OK")
|
||||
expect(checker.headers).to eq(
|
||||
"Content-Type" => "application/x-apple-diskimage",
|
||||
"ETag" => '"b4208f3e84967be4b078ecaa03fba941"',
|
||||
"Content-Length" => "23726161",
|
||||
"Last-Modified" => "Sun, 12 Aug 2012 21:17:21 GMT"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
75
Library/Homebrew/cask/spec/plist/parser_spec.rb
Normal file
75
Library/Homebrew/cask/spec/plist/parser_spec.rb
Normal file
@ -0,0 +1,75 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Plist do
|
||||
subject { described_class.parse_xml(input) }
|
||||
|
||||
describe "::parse_xml" do
|
||||
context "given a hdiutil output as input" do
|
||||
let(:input) {
|
||||
<<-EOS.undent
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>system-entities</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_partition_map</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3s1</string>
|
||||
<key>potentially-mountable</key>
|
||||
<false/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_partition_map</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_partition_scheme</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3</string>
|
||||
<key>potentially-mountable</key>
|
||||
<false/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_partition_scheme</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_HFS</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3s2</string>
|
||||
<key>mount-point</key>
|
||||
<string>/private/tmp/dmg.BhfS2g</string>
|
||||
<key>potentially-mountable</key>
|
||||
<true/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_HFS</string>
|
||||
<key>volume-kind</key>
|
||||
<string>hfs</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
EOS
|
||||
}
|
||||
|
||||
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(
|
||||
%w[
|
||||
/dev/disk3s1
|
||||
/dev/disk3
|
||||
/dev/disk3s2
|
||||
]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "given an empty input" do
|
||||
let(:input) { "" }
|
||||
|
||||
it { is_expected.to be_nil }
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -17,7 +17,7 @@ $LOAD_PATH.push(HOMEBREW_LIBRARY_PATH.join("cask", "lib").to_s)
|
||||
|
||||
require "test/support/helper/shutup"
|
||||
|
||||
Pathname.glob(HOMEBREW_LIBRARY_PATH.join("cask", "spec", "support", "*.rb")).each(&method(:require))
|
||||
Pathname.glob(HOMEBREW_LIBRARY_PATH.join("cask", "spec", "support", "**", "*.rb")).each(&method(:require))
|
||||
|
||||
require "hbc"
|
||||
|
||||
@ -31,7 +31,39 @@ Hbc.default_tap = Tap.fetch("caskroom", "spec").tap do |tap|
|
||||
FileUtils.ln_s TEST_FIXTURE_DIR.join("cask"), tap.path
|
||||
end
|
||||
|
||||
# pretend that the caskroom/cask Tap is installed
|
||||
FileUtils.ln_s Pathname.new(ENV["HOMEBREW_LIBRARY"]).join("Taps", "caskroom", "homebrew-cask"), Tap.fetch("caskroom", "cask").path
|
||||
|
||||
HOMEBREW_CASK_DIRS = [
|
||||
:appdir,
|
||||
:caskroom,
|
||||
:prefpanedir,
|
||||
:qlplugindir,
|
||||
:servicedir,
|
||||
:binarydir,
|
||||
].freeze
|
||||
|
||||
RSpec.configure do |config|
|
||||
config.order = :random
|
||||
config.include(Test::Helper::Shutup)
|
||||
config.around(:each) do |example|
|
||||
begin
|
||||
@__dirs = HOMEBREW_CASK_DIRS.map { |dir|
|
||||
Pathname.new(TEST_TMPDIR).join(dir.to_s).tap { |path|
|
||||
path.mkpath
|
||||
Hbc.public_send("#{dir}=", path)
|
||||
}
|
||||
}
|
||||
|
||||
@__argv = ARGV.dup
|
||||
@__env = ENV.to_hash # dup doesn't work on ENV
|
||||
|
||||
example.run
|
||||
ensure
|
||||
ARGV.replace(@__argv)
|
||||
ENV.replace(@__env)
|
||||
|
||||
FileUtils.rm_rf @__dirs.map(&:children)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,3 +1,7 @@
|
||||
def sudo(*args)
|
||||
%w[/usr/bin/sudo -E --] + args.flatten
|
||||
end
|
||||
|
||||
module Hbc
|
||||
class FakeSystemCommand
|
||||
def self.responses
|
||||
@ -42,6 +46,7 @@ module Hbc
|
||||
|
||||
def self.run(command_string, options = {})
|
||||
command = Hbc::SystemCommand.new(command_string, options).command
|
||||
puts command
|
||||
unless responses.key?(command)
|
||||
raise("no response faked for #{command.inspect}, faked responses are: #{responses.inspect}")
|
||||
end
|
||||
@ -61,17 +66,12 @@ module Hbc
|
||||
end
|
||||
end
|
||||
|
||||
module FakeSystemCommandHooks
|
||||
def after_teardown
|
||||
super
|
||||
RSpec.configure do |config|
|
||||
config.after(:each) do
|
||||
begin
|
||||
Hbc::FakeSystemCommand.verify_expectations!
|
||||
ensure
|
||||
Hbc::FakeSystemCommand.clear
|
||||
end
|
||||
end
|
||||
|
||||
module MiniTest
|
||||
class Spec
|
||||
include FakeSystemCommandHooks
|
||||
end
|
||||
end
|
||||
@ -1,10 +1,42 @@
|
||||
module InstallHelper
|
||||
class << self
|
||||
def install_without_artifacts(cask)
|
||||
module_function
|
||||
|
||||
require "test/support/helper/shutup"
|
||||
extend Test::Helper::Shutup
|
||||
|
||||
def self.install_without_artifacts(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.download
|
||||
i.extract_primary_container
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.install_without_artifacts_with_caskfile(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.download
|
||||
i.extract_primary_container
|
||||
i.save_caskfile
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def install_without_artifacts(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.download
|
||||
i.extract_primary_container
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def install_with_caskfile(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.save_caskfile
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
require "hbc/system_command"
|
||||
|
||||
module Hbc
|
||||
class NeverSudoSystemCommand < SystemCommand
|
||||
def self.run(command, options = {})
|
||||
@ -0,0 +1,23 @@
|
||||
require "hbc/dsl/base"
|
||||
|
||||
shared_examples Hbc::DSL::Base do
|
||||
it "supports the token method" do
|
||||
expect(dsl.token).to eq(cask.token)
|
||||
end
|
||||
|
||||
it "supports the version method" do
|
||||
expect(dsl.version).to eq(cask.version)
|
||||
end
|
||||
|
||||
it "supports the caskroom_path method" do
|
||||
expect(dsl.caskroom_path).to eq(cask.caskroom_path)
|
||||
end
|
||||
|
||||
it "supports the staged_path method" do
|
||||
expect(dsl.staged_path).to eq(cask.staged_path)
|
||||
end
|
||||
|
||||
it "supports the appdir method" do
|
||||
expect(dsl.appdir).to eq(cask.appdir)
|
||||
end
|
||||
end
|
||||
@ -1,15 +1,19 @@
|
||||
require "test_helper"
|
||||
require "spec_helper"
|
||||
|
||||
shared_examples_for Hbc::Staged do
|
||||
require "hbc/staged"
|
||||
|
||||
shared_examples Hbc::Staged do
|
||||
let(:fake_pathname_exists) {
|
||||
fake_pathname = Pathname("/path/to/file/that/exists")
|
||||
fake_pathname.stubs(exist?: true, expand_path: fake_pathname)
|
||||
fake_pathname = Pathname.new("/path/to/file/that/exists")
|
||||
allow(fake_pathname).to receive(:exist?).and_return(true)
|
||||
allow(fake_pathname).to receive(:expand_path).and_return(fake_pathname)
|
||||
fake_pathname
|
||||
}
|
||||
|
||||
let(:fake_pathname_does_not_exist) {
|
||||
fake_pathname = Pathname("/path/to/file/that/does/not/exist")
|
||||
fake_pathname.stubs(exist?: false, expand_path: fake_pathname)
|
||||
fake_pathname = Pathname.new("/path/to/file/that/does/not/exist")
|
||||
allow(fake_pathname).to receive(:exist?).and_return(false)
|
||||
allow(fake_pathname).to receive(:expand_path).and_return(fake_pathname)
|
||||
fake_pathname
|
||||
}
|
||||
|
||||
@ -17,93 +21,123 @@ shared_examples_for Hbc::Staged do
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["echo", "homebrew-cask", "rocks!"]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.system_command("echo", args: ["homebrew-cask", "rocks!"])
|
||||
end
|
||||
end
|
||||
|
||||
it "can get the Info.plist file for the primary app" do
|
||||
staged.info_plist_file.to_s.must_include Hbc.appdir.join("TestCask.app/Contents/Info.plist")
|
||||
expect(staged.info_plist_file.to_s).to include Hbc.appdir.join("TestCask.app/Contents/Info.plist")
|
||||
end
|
||||
|
||||
it "can execute commands on the Info.plist file" do
|
||||
staged.stubs(bundle_identifier: "com.example.BasicCask")
|
||||
allow(staged).to receive(:bundle_identifier).and_return("com.example.BasicCask")
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/libexec/PlistBuddy", "-c", "Print CFBundleIdentifier", staged.info_plist_file]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.plist_exec("Print CFBundleIdentifier")
|
||||
end
|
||||
end
|
||||
|
||||
it "can set a key in the Info.plist file" do
|
||||
staged.stubs(bundle_identifier: "com.example.BasicCask")
|
||||
allow(staged).to receive(:bundle_identifier).and_return("com.example.BasicCask")
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/libexec/PlistBuddy", "-c", "Set :JVMOptions:JVMVersion 1.6+", staged.info_plist_file]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.plist_set(":JVMOptions:JVMVersion", "1.6+")
|
||||
end
|
||||
end
|
||||
|
||||
it "can set the permissions of a file" do
|
||||
fake_pathname = fake_pathname_exists
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/bin/chmod", "-R", "--", "777", fake_pathname]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.set_permissions(fake_pathname.to_s, "777")
|
||||
end
|
||||
end
|
||||
|
||||
it "can set the permissions of multiple files" do
|
||||
fake_pathname = fake_pathname_exists
|
||||
staged.stubs(:Pathname).returns(fake_pathname)
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/bin/chmod", "-R", "--", "777", fake_pathname, fake_pathname]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.set_permissions([fake_pathname.to_s, fake_pathname.to_s], "777")
|
||||
end
|
||||
end
|
||||
|
||||
it "cannot set the permissions of a file that does not exist" do
|
||||
fake_pathname = fake_pathname_does_not_exist
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
staged.set_permissions(fake_pathname.to_s, "777")
|
||||
end
|
||||
|
||||
it "can set the ownership of a file" do
|
||||
staged.stubs(current_user: "fake_user")
|
||||
fake_pathname = fake_pathname_exists
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
|
||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "fake_user:staff", fake_pathname]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.set_ownership(fake_pathname.to_s)
|
||||
end
|
||||
end
|
||||
|
||||
it "can set the ownership of multiple files" do
|
||||
staged.stubs(current_user: "fake_user")
|
||||
fake_pathname = fake_pathname_exists
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
|
||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "fake_user:staff", fake_pathname, fake_pathname]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.set_ownership([fake_pathname.to_s, fake_pathname.to_s])
|
||||
end
|
||||
end
|
||||
|
||||
it "can set the ownership of a file with a different user and group" do
|
||||
fake_pathname = fake_pathname_exists
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "other_user:other_group", fake_pathname]
|
||||
)
|
||||
|
||||
shutup do
|
||||
staged.set_ownership(fake_pathname.to_s, user: "other_user", group: "other_group")
|
||||
end
|
||||
end
|
||||
|
||||
it "cannot set the ownership of a file that does not exist" do
|
||||
staged.stubs(current_user: "fake_user")
|
||||
allow(staged).to receive(:current_user).and_return("fake_user")
|
||||
fake_pathname = fake_pathname_does_not_exist
|
||||
staged.stubs(Pathname: fake_pathname)
|
||||
allow(staged).to receive(:Pathname).and_return(fake_pathname)
|
||||
|
||||
shutup do
|
||||
staged.set_ownership(fake_pathname.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,77 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
# TODO: this test should be named after the corresponding class, once
|
||||
# that class is abstracted from installer.rb.
|
||||
describe "Accessibility Access" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-accessibility-access.rb") }
|
||||
let(:with_fake_command) { { command: Hbc::FakeSystemCommand } }
|
||||
let(:installer) { Hbc::Installer.new(cask, with_fake_command) }
|
||||
|
||||
describe "install" do
|
||||
it "can enable accessibility access" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.9") do
|
||||
installer.stub :bundle_identifier, "com.example.BasicCask" do
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/bin/sqlite3", Hbc.tcc_db, "INSERT OR REPLACE INTO access VALUES('kTCCServiceAccessibility','com.example.BasicCask',0,1,1,NULL);"]
|
||||
)
|
||||
shutup do
|
||||
installer.enable_accessibility_access
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "can enable accessibility access in macOS releases prior to Mavericks" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.8") do
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/bin/touch", Hbc.pre_mavericks_accessibility_dotfile]
|
||||
)
|
||||
shutup do
|
||||
installer.enable_accessibility_access
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "warns about enabling accessibility access on new macOS releases" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.12") do
|
||||
installer.stub :bundle_identifier, "com.example.BasicCask" do
|
||||
capture_io { installer.enable_accessibility_access }[1]
|
||||
.must_match("Warning: Accessibility access cannot be enabled automatically on this version of macOS.")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "uninstall" do
|
||||
it "can disable accessibility access" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.9") do
|
||||
installer.stub :bundle_identifier, "com.example.BasicCask" do
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/bin/sqlite3", Hbc.tcc_db, "DELETE FROM access WHERE client='com.example.BasicCask';"]
|
||||
)
|
||||
shutup do
|
||||
installer.disable_accessibility_access
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "warns about disabling accessibility access on old macOS releases" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.8") do
|
||||
installer.stub :bundle_identifier, "com.example.BasicCask" do
|
||||
capture_io { installer.disable_accessibility_access }[1]
|
||||
.must_match("Warning: Accessibility access cannot be disabled automatically on this version of macOS.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "warns about disabling accessibility access on new macOS releases" do
|
||||
MacOS.stub :version, MacOS::Version.new("10.12") do
|
||||
installer.stub :bundle_identifier, "com.example.BasicCask" do
|
||||
capture_io { installer.disable_accessibility_access }[1]
|
||||
.must_match("Warning: Accessibility access cannot be disabled automatically on this version of macOS.")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,64 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::Artifact::Pkg do
|
||||
before do
|
||||
@cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installable.rb")
|
||||
shutup do
|
||||
TestHelper.install_without_artifacts(@cask)
|
||||
end
|
||||
end
|
||||
|
||||
describe "install_phase" do
|
||||
it "runs the system installer on the specified pkgs" do
|
||||
pkg = Hbc::Artifact::Pkg.new(@cask,
|
||||
command: Hbc::FakeSystemCommand)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(["/usr/bin/sudo", "-E", "--", "/usr/sbin/installer", "-pkg", @cask.staged_path.join("MyFancyPkg", "Fancy.pkg"), "-target", "/"])
|
||||
|
||||
shutup do
|
||||
pkg.install_phase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "choices" do
|
||||
before do
|
||||
@cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-choices.rb")
|
||||
shutup do
|
||||
TestHelper.install_without_artifacts(@cask)
|
||||
end
|
||||
end
|
||||
|
||||
it "passes the choice changes xml to the system installer" do
|
||||
pkg = Hbc::Artifact::Pkg.new(@cask, command: Hbc::FakeSystemCommand)
|
||||
|
||||
file = mock
|
||||
file.expects(:write).with <<-EOS.undent
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<array>
|
||||
\t<dict>
|
||||
\t\t<key>attributeSetting</key>
|
||||
\t\t<integer>1</integer>
|
||||
\t\t<key>choiceAttribute</key>
|
||||
\t\t<string>selected</string>
|
||||
\t\t<key>choiceIdentifier</key>
|
||||
\t\t<string>choice1</string>
|
||||
\t</dict>
|
||||
</array>
|
||||
</plist>
|
||||
EOS
|
||||
file.stubs path: Pathname.new("/tmp/choices.xml")
|
||||
file.expects(:close)
|
||||
file.expects(:unlink)
|
||||
Tempfile.expects(:open).yields file
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(["/usr/bin/sudo", "-E", "--", "/usr/sbin/installer", "-pkg", @cask.staged_path.join("MyFancyPkg", "Fancy.pkg"), "-target", "/", "-applyChoiceChangesXML", @cask.staged_path.join("/tmp/choices.xml")])
|
||||
|
||||
shutup do
|
||||
pkg.install_phase
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,64 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::CLI::Audit do
|
||||
let(:auditor) { mock }
|
||||
let(:cask) { mock }
|
||||
|
||||
describe "selection of Casks to audit" do
|
||||
it "audits all Casks if no tokens are given" do
|
||||
Hbc.stub :all, [cask, cask] do
|
||||
auditor.expects(:audit).times(2)
|
||||
|
||||
run_audit([], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
it "audits specified Casks if tokens are given" do
|
||||
cask_token = "nice-app"
|
||||
Hbc.expects(:load).with(cask_token).returns(cask)
|
||||
auditor.expects(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit([cask_token], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
describe "rules for downloading a Cask" do
|
||||
it "does not download the Cask per default" do
|
||||
Hbc.stub :load, cask do
|
||||
auditor.expects(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
it "download a Cask if --download flag is set" do
|
||||
Hbc.stub :load, cask do
|
||||
auditor.expects(:audit).with(cask, audit_download: true, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken", "--download"], auditor)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "rules for checking token conflicts" do
|
||||
it "does not check for token conflicts per default" do
|
||||
Hbc.stub :load, cask do
|
||||
auditor.expects(:audit).with(cask, audit_download: false, check_token_conflicts: false)
|
||||
|
||||
run_audit(["casktoken"], auditor)
|
||||
end
|
||||
end
|
||||
|
||||
it "checks for token conflicts if --token-conflicts flag is set" do
|
||||
Hbc.stub :load, cask do
|
||||
auditor.expects(:audit).with(cask, audit_download: false, check_token_conflicts: true)
|
||||
|
||||
run_audit(["casktoken", "--token-conflicts"], auditor)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def run_audit(args, auditor)
|
||||
Hbc::CLI::Audit.new(args, auditor).run
|
||||
end
|
||||
end
|
||||
@ -1,24 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::CLI::Reinstall do
|
||||
it "allows reinstalling a Cask" do
|
||||
shutup do
|
||||
Hbc::CLI::Install.run("local-transmission")
|
||||
end
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").must_be :installed?
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Reinstall.run("local-transmission")
|
||||
end
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").must_be :installed?
|
||||
end
|
||||
|
||||
it "allows reinstalling a non installed Cask" do
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").wont_be :installed?
|
||||
|
||||
shutup do
|
||||
Hbc::CLI::Reinstall.run("local-transmission")
|
||||
end
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb").must_be :installed?
|
||||
end
|
||||
end
|
||||
@ -1,59 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::CLI::Search do
|
||||
it "lists the available Casks that match the search term" do
|
||||
lambda {
|
||||
Hbc::CLI::Search.run("photoshop")
|
||||
}.must_output <<-EOS.undent
|
||||
==> Partial matches
|
||||
adobe-photoshop-cc
|
||||
adobe-photoshop-lightroom
|
||||
EOS
|
||||
end
|
||||
|
||||
it "shows that there are no Casks matching a search term that did not result in anything" do
|
||||
lambda {
|
||||
Hbc::CLI::Search.run("foo-bar-baz")
|
||||
}.must_output("No Cask found for \"foo-bar-baz\".\n")
|
||||
end
|
||||
|
||||
it "lists all available Casks with no search term" do
|
||||
out = capture_io { Hbc::CLI::Search.run }[0]
|
||||
out.must_match(/google-chrome/)
|
||||
out.length.must_be :>, 1000
|
||||
end
|
||||
|
||||
it "ignores hyphens in search terms" do
|
||||
out = capture_io { Hbc::CLI::Search.run("goo-gle-chrome") }[0]
|
||||
out.must_match(/google-chrome/)
|
||||
out.length.must_be :<, 100
|
||||
end
|
||||
|
||||
it "ignores hyphens in Cask tokens" do
|
||||
out = capture_io { Hbc::CLI::Search.run("googlechrome") }[0]
|
||||
out.must_match(/google-chrome/)
|
||||
out.length.must_be :<, 100
|
||||
end
|
||||
|
||||
it "accepts multiple arguments" do
|
||||
out = capture_io { Hbc::CLI::Search.run("google chrome") }[0]
|
||||
out.must_match(/google-chrome/)
|
||||
out.length.must_be :<, 100
|
||||
end
|
||||
|
||||
it "accepts a regexp argument" do
|
||||
lambda {
|
||||
Hbc::CLI::Search.run("/^google-c[a-z]rome$/")
|
||||
}.must_output "==> Regexp matches\ngoogle-chrome\n"
|
||||
end
|
||||
|
||||
it "Returns both exact and partial matches" do
|
||||
out = capture_io { Hbc::CLI::Search.run("mnemosyne") }[0]
|
||||
out.must_match(/^==> Exact match\nmnemosyne\n==> Partial matches\nsubclassed-mnemosyne/)
|
||||
end
|
||||
|
||||
it "does not search the Tap name" do
|
||||
out = capture_io { Hbc::CLI::Search.run("caskroom") }[0]
|
||||
out.must_match(/^No Cask found for "caskroom"\.\n/)
|
||||
end
|
||||
end
|
||||
@ -1,9 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe "brew cask --version" do
|
||||
it "respects the --version argument" do
|
||||
lambda {
|
||||
Hbc::CLI::NullCommand.new("--version").run
|
||||
}.must_output Hbc.full_version
|
||||
end
|
||||
end
|
||||
@ -1,113 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
# TODO: this test should be named after the corresponding class, once
|
||||
# that class is abstracted from installer.rb
|
||||
describe "Satisfy Dependencies and Requirements" do
|
||||
# TODO: test that depends_on formula invokes Homebrew
|
||||
#
|
||||
# describe "depends_on formula" do
|
||||
# it "" do
|
||||
# end
|
||||
# end
|
||||
#
|
||||
|
||||
describe "depends_on cask" do
|
||||
it "raises an exception when depends_on cask is cyclic" do
|
||||
dep_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-cyclic.rb")
|
||||
lambda {
|
||||
shutup do
|
||||
Hbc::Installer.new(dep_cask).install
|
||||
end
|
||||
}.must_raise(Hbc::CaskCyclicCaskDependencyError)
|
||||
end
|
||||
|
||||
it "installs the dependency of a Cask and the Cask itself" do
|
||||
csk = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask.rb")
|
||||
dependency = Hbc.load(csk.depends_on.cask.first)
|
||||
shutup do
|
||||
Hbc::Installer.new(csk).install
|
||||
end
|
||||
|
||||
csk.must_be :installed?
|
||||
dependency.must_be :installed?
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on macos" do
|
||||
it "understands depends_on macos: <array>" do
|
||||
macos_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-array.rb")
|
||||
shutup do
|
||||
Hbc::Installer.new(macos_cask).install
|
||||
end
|
||||
end
|
||||
|
||||
it "understands depends_on macos: <comparison>" do
|
||||
macos_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-comparison.rb")
|
||||
shutup do
|
||||
Hbc::Installer.new(macos_cask).install
|
||||
end
|
||||
end
|
||||
|
||||
it "understands depends_on macos: <string>" do
|
||||
macos_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-string.rb")
|
||||
shutup do
|
||||
Hbc::Installer.new(macos_cask).install
|
||||
end
|
||||
end
|
||||
|
||||
it "understands depends_on macos: <symbol>" do
|
||||
macos_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-symbol.rb")
|
||||
shutup do
|
||||
Hbc::Installer.new(macos_cask).install
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an exception when depends_on macos is not satisfied" do
|
||||
macos_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-failure.rb")
|
||||
lambda {
|
||||
shutup do
|
||||
Hbc::Installer.new(macos_cask).install
|
||||
end
|
||||
}.must_raise(Hbc::CaskError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on arch" do
|
||||
it "succeeds when depends_on arch is satisfied" do
|
||||
arch_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-arch.rb")
|
||||
shutup do
|
||||
Hbc::Installer.new(arch_cask).install
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on x11" do
|
||||
it "succeeds when depends_on x11 is satisfied" do
|
||||
x11_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11.rb")
|
||||
MacOS::X11.stubs(:installed?).returns(true)
|
||||
shutup do
|
||||
Hbc::Installer.new(x11_cask).install
|
||||
end
|
||||
end
|
||||
|
||||
it "raises an exception when depends_on x11 is not satisfied" do
|
||||
x11_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11.rb")
|
||||
MacOS::X11.stubs(:installed?).returns(false)
|
||||
lambda {
|
||||
shutup do
|
||||
Hbc::Installer.new(x11_cask).install
|
||||
end
|
||||
}.must_raise(Hbc::CaskX11DependencyError)
|
||||
end
|
||||
|
||||
it "never raises when depends_on x11: false" do
|
||||
x11_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11-false.rb")
|
||||
MacOS::X11.stubs(:installed?).returns(false)
|
||||
lambda do
|
||||
shutup do
|
||||
Hbc::Installer.new(x11_cask).install
|
||||
end
|
||||
end # won't raise
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,479 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::DSL do
|
||||
it "lets you set url, homepage, and version" do
|
||||
test_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb")
|
||||
test_cask.url.to_s.must_equal "http://example.com/TestCask.dmg"
|
||||
test_cask.homepage.must_equal "http://example.com/"
|
||||
test_cask.version.to_s.must_equal "1.2.3"
|
||||
end
|
||||
|
||||
describe "when a Cask includes an unknown method" do
|
||||
attempt_unknown_method = nil
|
||||
|
||||
before do
|
||||
attempt_unknown_method = lambda do
|
||||
Hbc::Cask.new("unexpected-method-cask") do
|
||||
future_feature :not_yet_on_your_machine
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "prints a warning that it has encountered an unexpected method" do
|
||||
expected = Regexp.compile(<<-EOS.undent.lines.map(&:chomp).join(""))
|
||||
(?m)
|
||||
Warning:
|
||||
.*
|
||||
Unexpected method 'future_feature' called on Cask unexpected-method-cask\\.
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask/blob/master/doc/reporting_bugs/pre_bug_report.md
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask#reporting-bugs
|
||||
EOS
|
||||
|
||||
attempt_unknown_method.must_output nil, expected
|
||||
end
|
||||
|
||||
it "will simply warn, not throw an exception" do
|
||||
begin
|
||||
shutup do
|
||||
attempt_unknown_method.call
|
||||
end
|
||||
rescue StandardError => e
|
||||
flunk("Wanted unexpected method to simply warn, but got exception #{e}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "header line" do
|
||||
it "requires a valid header format" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-header-format.rb")
|
||||
}.must_raise(SyntaxError)
|
||||
end
|
||||
|
||||
it "requires the header token to match the file name" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-header-token-mismatch.rb")
|
||||
}.must_raise(Hbc::CaskTokenDoesNotMatchError)
|
||||
err.message.must_include "Bad header line:"
|
||||
err.message.must_include "does not match file name"
|
||||
end
|
||||
|
||||
it "does not require a DSL version in the header" do
|
||||
test_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/no-dsl-version.rb")
|
||||
test_cask.token.must_equal "no-dsl-version"
|
||||
test_cask.url.to_s.must_equal "http://example.com/TestCask.dmg"
|
||||
test_cask.homepage.must_equal "http://example.com/"
|
||||
test_cask.version.to_s.must_equal "1.2.3"
|
||||
end
|
||||
|
||||
it "may use deprecated DSL version hash syntax" do
|
||||
stub = proc do |arg|
|
||||
arg == "HOMEBREW_DEVELOPER" ? nil : ENV[arg]
|
||||
end
|
||||
|
||||
ENV.stub :[], stub do
|
||||
shutup do
|
||||
test_cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-dsl-version.rb")
|
||||
test_cask.token.must_equal "with-dsl-version"
|
||||
test_cask.url.to_s.must_equal "http://example.com/TestCask.dmg"
|
||||
test_cask.homepage.must_equal "http://example.com/"
|
||||
test_cask.version.to_s.must_equal "1.2.3"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "name stanza" do
|
||||
it "lets you set the full name via a name stanza" do
|
||||
cask = Hbc::Cask.new("name-cask") do
|
||||
name "Proper Name"
|
||||
end
|
||||
|
||||
cask.name.must_equal [
|
||||
"Proper Name",
|
||||
]
|
||||
end
|
||||
|
||||
it "Accepts an array value to the name stanza" do
|
||||
cask = Hbc::Cask.new("array-name-cask") do
|
||||
name ["Proper Name", "Alternate Name"]
|
||||
end
|
||||
|
||||
cask.name.must_equal [
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
]
|
||||
end
|
||||
|
||||
it "Accepts multiple name stanzas" do
|
||||
cask = Hbc::Cask.new("multi-name-cask") do
|
||||
name "Proper Name"
|
||||
name "Alternate Name"
|
||||
end
|
||||
|
||||
cask.name.must_equal [
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
describe "sha256 stanza" do
|
||||
it "lets you set checksum via sha256" do
|
||||
cask = Hbc::Cask.new("checksum-cask") do
|
||||
sha256 "imasha2"
|
||||
end
|
||||
|
||||
cask.sha256.must_equal "imasha2"
|
||||
end
|
||||
end
|
||||
|
||||
describe "language stanza" do
|
||||
it "allows multilingual casks" do
|
||||
cask = lambda do
|
||||
Hbc::Cask.new("cask-with-apps") do
|
||||
language "zh" do
|
||||
sha256 "abc123"
|
||||
"zh-CN"
|
||||
end
|
||||
|
||||
language "en-US", default: true do
|
||||
sha256 "xyz789"
|
||||
"en-US"
|
||||
end
|
||||
|
||||
url "https://example.org/#{language}.zip"
|
||||
end
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["zh"] do
|
||||
cask.call.language.must_equal "zh-CN"
|
||||
cask.call.sha256.must_equal "abc123"
|
||||
cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip"
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["zh-XX"] do
|
||||
cask.call.language.must_equal "zh-CN"
|
||||
cask.call.sha256.must_equal "abc123"
|
||||
cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip"
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["en"] do
|
||||
cask.call.language.must_equal "en-US"
|
||||
cask.call.sha256.must_equal "xyz789"
|
||||
cask.call.url.to_s.must_equal "https://example.org/en-US.zip"
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["xx-XX"] do
|
||||
cask.call.language.must_equal "en-US"
|
||||
cask.call.sha256.must_equal "xyz789"
|
||||
cask.call.url.to_s.must_equal "https://example.org/en-US.zip"
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["xx-XX", "zh", "en"] do
|
||||
cask.call.language.must_equal "zh-CN"
|
||||
cask.call.sha256.must_equal "abc123"
|
||||
cask.call.url.to_s.must_equal "https://example.org/zh-CN.zip"
|
||||
end
|
||||
|
||||
MacOS.stub :languages, ["xx-XX", "en-US", "zh"] do
|
||||
cask.call.language.must_equal "en-US"
|
||||
cask.call.sha256.must_equal "xyz789"
|
||||
cask.call.url.to_s.must_equal "https://example.org/en-US.zip"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "app stanza" do
|
||||
it "allows you to specify app stanzas" do
|
||||
cask = Hbc::Cask.new("cask-with-apps") do
|
||||
app "Foo.app"
|
||||
app "Bar.app"
|
||||
end
|
||||
|
||||
Array(cask.artifacts[:app]).must_equal [["Foo.app"], ["Bar.app"]]
|
||||
end
|
||||
|
||||
it "allow app stanzas to be empty" do
|
||||
cask = Hbc::Cask.new("cask-with-no-apps")
|
||||
Array(cask.artifacts[:app]).must_equal %w[]
|
||||
end
|
||||
end
|
||||
|
||||
describe "caveats stanza" do
|
||||
it "allows caveats to be specified via a method define" do
|
||||
cask = Hbc::Cask.new("plain-cask")
|
||||
|
||||
cask.caveats.must_be :empty?
|
||||
|
||||
cask = Hbc::Cask.new("cask-with-caveats") do
|
||||
def caveats; <<-EOS.undent
|
||||
When you install this Cask, you probably want to know this.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
cask.caveats.must_equal "When you install this Cask, you probably want to know this.\n"
|
||||
end
|
||||
end
|
||||
|
||||
describe "pkg stanza" do
|
||||
it "allows installable pkgs to be specified" do
|
||||
cask = Hbc::Cask.new("cask-with-pkgs") do
|
||||
pkg "Foo.pkg"
|
||||
pkg "Bar.pkg"
|
||||
end
|
||||
|
||||
Array(cask.artifacts[:pkg]).must_equal [["Foo.pkg"], ["Bar.pkg"]]
|
||||
end
|
||||
end
|
||||
|
||||
describe "url stanza" do
|
||||
it "prevents defining multiple urls" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-two-url.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'url' stanza may only appear once"
|
||||
end
|
||||
end
|
||||
|
||||
describe "homepage stanza" do
|
||||
it "prevents defining multiple homepages" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-two-homepage.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'homepage' stanza may only appear once"
|
||||
end
|
||||
end
|
||||
|
||||
describe "version stanza" do
|
||||
it "prevents defining multiple versions" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-two-version.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'version' stanza may only appear once"
|
||||
end
|
||||
end
|
||||
|
||||
describe "appcast stanza" do
|
||||
it "allows appcasts to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-appcast.rb")
|
||||
cask.appcast.to_s.must_match(/^http/)
|
||||
end
|
||||
|
||||
it "prevents defining multiple appcasts" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-appcast-multiple.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'appcast' stanza may only appear once"
|
||||
end
|
||||
|
||||
it "refuses to load invalid appcast URLs" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-appcast-url.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "gpg stanza" do
|
||||
it "allows gpg stanza to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-gpg.rb")
|
||||
cask.gpg.to_s.must_match(/\S/)
|
||||
end
|
||||
|
||||
it "allows gpg stanza to be specified with :key_url" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-gpg-key-url.rb")
|
||||
cask.gpg.to_s.must_match(/\S/)
|
||||
end
|
||||
|
||||
it "prevents specifying gpg stanza multiple times" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-multiple-stanzas.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'gpg' stanza may only appear once"
|
||||
end
|
||||
|
||||
it "prevents missing gpg key parameters" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-missing-key.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'gpg' stanza must include exactly one"
|
||||
end
|
||||
|
||||
it "prevents conflicting gpg key parameters" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-conflicting-keys.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'gpg' stanza must include exactly one"
|
||||
end
|
||||
|
||||
it "refuses to load invalid gpg signature URLs" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-signature-url.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
|
||||
it "refuses to load invalid gpg key URLs" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-key-url.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
|
||||
it "refuses to load invalid gpg key IDs" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-key-id.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
|
||||
it "refuses to load if gpg parameter is unknown" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-gpg-parameter.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on stanza" do
|
||||
it "refuses to load with an invalid depends_on key" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-depends-on-key.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on formula" do
|
||||
it "allows depends_on formula to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-formula.rb")
|
||||
cask.depends_on.formula.wont_be_nil
|
||||
end
|
||||
|
||||
it "allows multiple depends_on formula to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-formula-multiple.rb")
|
||||
cask.depends_on.formula.wont_be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on cask" do
|
||||
it "allows depends_on cask to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask.rb")
|
||||
cask.depends_on.cask.wont_be_nil
|
||||
end
|
||||
|
||||
it "allows multiple depends_on cask to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-multiple.rb")
|
||||
cask.depends_on.cask.wont_be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on macos" do
|
||||
it "allows depends_on macos to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-macos-string.rb")
|
||||
cask.depends_on.macos.wont_be_nil
|
||||
end
|
||||
it "refuses to load with an invalid depends_on macos value" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-depends-on-macos-bad-release.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
it "refuses to load with conflicting depends_on macos forms" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-depends-on-macos-conflicting-forms.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on arch" do
|
||||
it "allows depends_on arch to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-arch.rb")
|
||||
cask.depends_on.arch.wont_be_nil
|
||||
end
|
||||
it "refuses to load with an invalid depends_on arch value" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-depends-on-arch-value.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on x11" do
|
||||
it "allows depends_on x11 to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-x11.rb")
|
||||
cask.depends_on.x11.wont_be_nil
|
||||
end
|
||||
it "refuses to load with an invalid depends_on x11 value" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-depends-on-x11-value.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "conflicts_with stanza" do
|
||||
it "allows conflicts_with stanza to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-conflicts-with.rb")
|
||||
cask.conflicts_with.formula.wont_be_nil
|
||||
end
|
||||
|
||||
it "refuses to load invalid conflicts_with key" do
|
||||
lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-conflicts-with-key.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "installer stanza" do
|
||||
it "allows installer script to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installer-script.rb")
|
||||
cask.artifacts[:installer].first.script[:executable].must_equal "/usr/bin/true"
|
||||
cask.artifacts[:installer].first.script[:args].must_equal ["--flag"]
|
||||
cask.artifacts[:installer].to_a[1].script[:executable].must_equal "/usr/bin/false"
|
||||
cask.artifacts[:installer].to_a[1].script[:args].must_equal ["--flag"]
|
||||
end
|
||||
it "allows installer manual to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installer-manual.rb")
|
||||
cask.artifacts[:installer].first.manual.must_equal "Caffeine.app"
|
||||
end
|
||||
end
|
||||
|
||||
describe "stage_only stanza" do
|
||||
it "allows stage_only stanza to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/stage-only.rb")
|
||||
cask.artifacts[:stage_only].first.must_equal [true]
|
||||
end
|
||||
|
||||
it "prevents specifying stage_only with other activatables" do
|
||||
err = lambda {
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/invalid/invalid-stage-only-conflict.rb")
|
||||
}.must_raise(Hbc::CaskInvalidError)
|
||||
err.message.must_include "'stage_only' must be the only activatable artifact"
|
||||
end
|
||||
end
|
||||
|
||||
describe "auto_updates stanza" do
|
||||
it "allows auto_updates stanza to be specified" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/auto-updates.rb")
|
||||
cask.auto_updates.must_equal true
|
||||
end
|
||||
end
|
||||
|
||||
describe "appdir" do
|
||||
it "allows interpolation of the appdir value in stanzas" do
|
||||
cask = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/appdir-interpolation.rb")
|
||||
cask.artifacts[:binary].first.must_equal ["#{Hbc.appdir}/some/path"]
|
||||
end
|
||||
|
||||
it "does not include a trailing slash" do
|
||||
original_appdir = Hbc.appdir
|
||||
Hbc.appdir = "#{original_appdir}/"
|
||||
|
||||
begin
|
||||
cask = Hbc::Cask.new("appdir-trailing-slash") do
|
||||
binary "#{appdir}/some/path"
|
||||
end
|
||||
|
||||
cask.artifacts[:binary].first.must_equal ["#{original_appdir}/some/path"]
|
||||
ensure
|
||||
Hbc.appdir = original_appdir
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,111 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::Pkg do
|
||||
describe "uninstall" do
|
||||
it "removes files and dirs referenced by the pkg" do
|
||||
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
|
||||
|
||||
some_files = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
|
||||
pkg.stubs(:pkgutil_bom_files).returns some_files
|
||||
|
||||
some_specials = Array.new(3) { Pathname.new(Tempfile.new("testfile").path) }
|
||||
pkg.stubs(:pkgutil_bom_specials).returns some_specials
|
||||
|
||||
some_dirs = Array.new(3) { Pathname.new(Dir.mktmpdir) }
|
||||
pkg.stubs(:pkgutil_bom_dirs).returns some_dirs
|
||||
|
||||
pkg.stubs(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
some_files.each do |file|
|
||||
file.wont_be :exist?
|
||||
end
|
||||
|
||||
some_dirs.each do |dir|
|
||||
dir.wont_be :exist?
|
||||
end
|
||||
end
|
||||
|
||||
it "forgets the pkg" do
|
||||
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::FakeSystemCommand)
|
||||
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
["/usr/sbin/pkgutil", "--only-files", "--files", "my.fake.pkg"]
|
||||
)
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
["/usr/sbin/pkgutil", "--only-dirs", "--files", "my.fake.pkg"]
|
||||
)
|
||||
Hbc::FakeSystemCommand.stubs_command(
|
||||
["/usr/sbin/pkgutil", "--files", "my.fake.pkg"]
|
||||
)
|
||||
|
||||
Hbc::FakeSystemCommand.expects_command(
|
||||
["/usr/bin/sudo", "-E", "--", "/usr/sbin/pkgutil", "--forget", "my.fake.pkg"]
|
||||
)
|
||||
|
||||
pkg.uninstall
|
||||
end
|
||||
|
||||
it "cleans broken symlinks, but leaves AOK symlinks" do
|
||||
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
|
||||
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
fake_file = fake_dir.join("ima_file").tap { |path| FileUtils.touch(path) }
|
||||
|
||||
intact_symlink = fake_dir.join("intact_symlink").tap { |path| path.make_symlink(fake_file) }
|
||||
broken_symlink = fake_dir.join("broken_symlink").tap { |path| path.make_symlink("im_nota_file") }
|
||||
|
||||
pkg.stubs(:pkgutil_bom_specials).returns([])
|
||||
pkg.stubs(:pkgutil_bom_files).returns([])
|
||||
pkg.stubs(:pkgutil_bom_dirs).returns([fake_dir])
|
||||
pkg.stubs(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
intact_symlink.must_be :exist?
|
||||
broken_symlink.wont_be :exist?
|
||||
fake_dir.must_be :exist?
|
||||
end
|
||||
|
||||
it "cleans files incorrectly reported as directories" do
|
||||
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
|
||||
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
fake_file = fake_dir.join("ima_file_pretending_to_be_a_dir").tap { |path| FileUtils.touch(path) }
|
||||
|
||||
pkg.stubs(:pkgutil_bom_specials).returns([])
|
||||
pkg.stubs(:pkgutil_bom_files).returns([])
|
||||
pkg.stubs(:pkgutil_bom_dirs).returns([fake_file, fake_dir])
|
||||
pkg.stubs(:forget)
|
||||
|
||||
pkg.uninstall
|
||||
|
||||
fake_file.wont_be :exist?
|
||||
fake_dir.wont_be :exist?
|
||||
end
|
||||
|
||||
it "snags permissions on ornery dirs, but returns them afterwords" do
|
||||
pkg = Hbc::Pkg.new("my.fake.pkg", Hbc::NeverSudoSystemCommand)
|
||||
|
||||
fake_dir = Pathname.new(Dir.mktmpdir)
|
||||
|
||||
fake_file = fake_dir.join("ima_installed_file").tap { |path| FileUtils.touch(path) }
|
||||
|
||||
fake_dir.chmod(0000)
|
||||
|
||||
pkg.stubs(:pkgutil_bom_specials).returns([])
|
||||
pkg.stubs(:pkgutil_bom_files).returns([fake_file])
|
||||
pkg.stubs(:pkgutil_bom_dirs).returns([fake_dir])
|
||||
pkg.stubs(:forget)
|
||||
|
||||
shutup do
|
||||
pkg.uninstall
|
||||
end
|
||||
|
||||
fake_dir.must_be :directory?
|
||||
fake_file.wont_be :file?
|
||||
(fake_dir.stat.mode % 01000).to_s(8).must_equal "0"
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,51 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Hbc::UrlChecker do
|
||||
describe "request processing" do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }
|
||||
let(:checker) { Hbc::UrlChecker.new(cask) }
|
||||
let(:with_stubbed_fetcher) {
|
||||
lambda { |&block|
|
||||
Hbc::Fetcher.stub(:head, response) do
|
||||
checker.run
|
||||
instance_eval(&block)
|
||||
end
|
||||
}
|
||||
}
|
||||
|
||||
describe "with an empty response" do
|
||||
let(:response) { "" }
|
||||
|
||||
it "adds an error" do
|
||||
with_stubbed_fetcher.call do
|
||||
expect(checker.errors).must_include("timeout while requesting #{cask.url}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "with a valid http response" do
|
||||
let(:response) {
|
||||
<<-EOS.undent
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: application/x-apple-diskimage
|
||||
ETag: "b4208f3e84967be4b078ecaa03fba941"
|
||||
Content-Length: 23726161
|
||||
Last-Modified: Sun, 12 Aug 2012 21:17:21 GMT
|
||||
EOS
|
||||
}
|
||||
|
||||
it "properly populates the response code and headers" do
|
||||
with_stubbed_fetcher.call do
|
||||
expect(checker.errors).must_be_empty
|
||||
expect(checker.response_status).must_equal("HTTP/1.1 200 OK")
|
||||
expect(checker.headers).must_equal(
|
||||
"Content-Type" => "application/x-apple-diskimage",
|
||||
"ETag" => '"b4208f3e84967be4b078ecaa03fba941"',
|
||||
"Content-Length" => "23726161",
|
||||
"Last-Modified" => "Sun, 12 Aug 2012 21:17:21 GMT"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,71 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe "Cask" do
|
||||
hbc_relative_tap_path = "../../Taps/caskroom/homebrew-cask"
|
||||
describe "load" do
|
||||
it "returns an instance of the Cask for the given token" do
|
||||
c = Hbc.load("adium")
|
||||
c.must_be_kind_of(Hbc::Cask)
|
||||
c.token.must_equal("adium")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a specific file location" do
|
||||
location = File.expand_path(hbc_relative_tap_path + "/Casks/dia.rb")
|
||||
c = Hbc.load(location)
|
||||
c.must_be_kind_of(Hbc::Cask)
|
||||
c.token.must_equal("dia")
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a url" do
|
||||
url = "file://" + File.expand_path(hbc_relative_tap_path + "/Casks/dia.rb")
|
||||
c = shutup do
|
||||
Hbc.load(url)
|
||||
end
|
||||
c.must_be_kind_of(Hbc::Cask)
|
||||
c.token.must_equal("dia")
|
||||
end
|
||||
|
||||
it "raises an error when failing to download a Cask from a url" do
|
||||
lambda {
|
||||
url = "file://" + File.expand_path(hbc_relative_tap_path + "/Casks/notacask.rb")
|
||||
shutup do
|
||||
Hbc.load(url)
|
||||
end
|
||||
}.must_raise(Hbc::CaskUnavailableError)
|
||||
end
|
||||
|
||||
it "returns an instance of the Cask from a relative file location" do
|
||||
c = Hbc.load(hbc_relative_tap_path + "/Casks/bbedit.rb")
|
||||
c.must_be_kind_of(Hbc::Cask)
|
||||
c.token.must_equal("bbedit")
|
||||
end
|
||||
|
||||
it "uses exact match when loading by token" do
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/test-opera.rb").token.must_equal("test-opera")
|
||||
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/test-opera-mail.rb").token.must_equal("test-opera-mail")
|
||||
end
|
||||
|
||||
it "raises an error when attempting to load a Cask that doesn't exist" do
|
||||
lambda {
|
||||
Hbc.load("notacask")
|
||||
}.must_raise(Hbc::CaskUnavailableError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "all_tokens" do
|
||||
it "returns a token for every Cask" do
|
||||
all_cask_tokens = Hbc.all_tokens
|
||||
all_cask_tokens.count.must_be :>, 20
|
||||
all_cask_tokens.each { |token| token.must_be_kind_of String }
|
||||
end
|
||||
end
|
||||
|
||||
describe "metadata" do
|
||||
it "proposes a versioned metadata directory name for each instance" do
|
||||
cask_token = "adium"
|
||||
c = Hbc.load(cask_token)
|
||||
metadata_path = Hbc.caskroom.join(cask_token, ".metadata", c.version)
|
||||
c.metadata_versioned_container_path.to_s.must_equal(metadata_path.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,65 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe Plist do
|
||||
it "parses some hdiutil output okay" do
|
||||
hdiutil_output = <<-EOS.undent
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>system-entities</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_partition_map</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3s1</string>
|
||||
<key>potentially-mountable</key>
|
||||
<false/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_partition_map</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_partition_scheme</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3</string>
|
||||
<key>potentially-mountable</key>
|
||||
<false/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_partition_scheme</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>content-hint</key>
|
||||
<string>Apple_HFS</string>
|
||||
<key>dev-entry</key>
|
||||
<string>/dev/disk3s2</string>
|
||||
<key>mount-point</key>
|
||||
<string>/private/tmp/dmg.BhfS2g</string>
|
||||
<key>potentially-mountable</key>
|
||||
<true/>
|
||||
<key>unmapped-content-hint</key>
|
||||
<string>Apple_HFS</string>
|
||||
<key>volume-kind</key>
|
||||
<string>hfs</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
EOS
|
||||
|
||||
parsed = Plist.parse_xml(hdiutil_output)
|
||||
|
||||
parsed.keys.must_equal ["system-entities"]
|
||||
parsed["system-entities"].length.must_equal 3
|
||||
parsed["system-entities"].map { |e| e["dev-entry"] }.must_equal %w[
|
||||
/dev/disk3s1
|
||||
/dev/disk3
|
||||
/dev/disk3s2
|
||||
]
|
||||
end
|
||||
|
||||
it "does not choke on empty input" do
|
||||
Plist.parse_xml("").must_equal {}
|
||||
end
|
||||
end
|
||||
@ -1,10 +0,0 @@
|
||||
module MiniTest
|
||||
class Spec
|
||||
def after_teardown
|
||||
super
|
||||
Hbc.installed.each do |cask|
|
||||
Hbc::Installer.new(cask).purge_versioned_files
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,31 +0,0 @@
|
||||
# wire in a set of fake link dirs per-test
|
||||
module FakeDirHooks
|
||||
DIRS = [:appdir, :qlplugindir, :binarydir].freeze
|
||||
|
||||
def before_setup
|
||||
super
|
||||
|
||||
@canned_dirs = {}
|
||||
|
||||
DIRS.each do |dir_name|
|
||||
dir = HOMEBREW_PREFIX.join("#{dir_name}-#{Time.now.to_i}-#{rand(1024)}")
|
||||
dir.mkpath
|
||||
Hbc.send("#{dir_name}=", dir)
|
||||
@canned_dirs[:dir_name] = dir
|
||||
end
|
||||
end
|
||||
|
||||
def after_teardown
|
||||
super
|
||||
|
||||
@canned_dirs.each_value do |dir|
|
||||
dir.rmtree if dir.exist?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module MiniTest
|
||||
class Spec
|
||||
include FakeDirHooks
|
||||
end
|
||||
end
|
||||
@ -1,25 +0,0 @@
|
||||
# Adapted from https://gist.github.com/jodosha/1560208
|
||||
MiniTest::Spec.class_eval do
|
||||
def self.shared_examples
|
||||
@shared_examples ||= {}
|
||||
end
|
||||
end
|
||||
|
||||
module MiniTest
|
||||
class Spec
|
||||
module SharedExamples
|
||||
def shared_examples_for(desc, &block)
|
||||
MiniTest::Spec.shared_examples[desc] = block
|
||||
end
|
||||
|
||||
def it_behaves_like(desc, *args, &block)
|
||||
instance_exec(*args, &MiniTest::Spec.shared_examples[desc])
|
||||
instance_eval(&block) if block_given?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Object.class_eval do
|
||||
include(MiniTest::Spec::SharedExamples)
|
||||
end
|
||||
@ -1,23 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
shared_examples_for Hbc::DSL::Base do
|
||||
it "supports the token method" do
|
||||
dsl.token.must_equal cask.token
|
||||
end
|
||||
|
||||
it "supports the version method" do
|
||||
dsl.version.must_equal cask.version
|
||||
end
|
||||
|
||||
it "supports the caskroom_path method" do
|
||||
dsl.caskroom_path.must_equal cask.caskroom_path
|
||||
end
|
||||
|
||||
it "supports the staged_path method" do
|
||||
dsl.staged_path.must_equal cask.staged_path
|
||||
end
|
||||
|
||||
it "supports the appdir method" do
|
||||
dsl.appdir.must_equal cask.appdir
|
||||
end
|
||||
end
|
||||
@ -1,17 +0,0 @@
|
||||
require "test_helper"
|
||||
|
||||
describe "Syntax check" do
|
||||
project_root = Pathname.new(File.expand_path("#{File.dirname(__FILE__)}/../"))
|
||||
backend_files = Dir[project_root.join("**", "*.rb")].reject { |f| f.match %r{/vendor/|/Casks/} }
|
||||
interpreter = RUBY_PATH
|
||||
flags = %w[-c]
|
||||
flags.unshift "--disable-all"
|
||||
backend_files.each do |file|
|
||||
it "#{file} is valid Ruby" do
|
||||
args = flags + ["--", file]
|
||||
shutup do
|
||||
raise SyntaxError, "#{file} failed syntax check" unless system(interpreter, *args)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,104 +0,0 @@
|
||||
require "bundler"
|
||||
require "bundler/setup"
|
||||
require "pathname"
|
||||
|
||||
require "simplecov" if ENV["HOMEBREW_TESTS_COVERAGE"]
|
||||
|
||||
# add Homebrew to load path
|
||||
$LOAD_PATH.unshift(File.expand_path("#{ENV["HOMEBREW_REPOSITORY"]}/Library/Homebrew"))
|
||||
$LOAD_PATH.unshift(File.expand_path("#{ENV["HOMEBREW_REPOSITORY"]}/Library/Homebrew/test/support/lib"))
|
||||
|
||||
require "global"
|
||||
|
||||
# add Homebrew-Cask to load path
|
||||
$LOAD_PATH.push(HOMEBREW_LIBRARY_PATH.join("cask", "lib").to_s)
|
||||
|
||||
require "test/support/helper/shutup"
|
||||
include Test::Helper::Shutup
|
||||
|
||||
def sudo(*args)
|
||||
%w[/usr/bin/sudo -E --] + args.flatten
|
||||
end
|
||||
|
||||
# must be called after testing_env so at_exit hooks are in proper order
|
||||
require "minitest/autorun"
|
||||
require "minitest/reporters"
|
||||
Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true)
|
||||
|
||||
require "parallel_tests/test/runtime_logger"
|
||||
|
||||
# Force mocha to patch MiniTest since we have both loaded thanks to homebrew's testing_env
|
||||
require "mocha/api"
|
||||
require "mocha/integration/mini_test"
|
||||
Mocha::Integration::MiniTest.activate
|
||||
|
||||
# our baby
|
||||
require "hbc"
|
||||
|
||||
# create and override default directories
|
||||
Hbc.appdir = Pathname.new(TEST_TMPDIR).join("Applications").tap(&:mkpath)
|
||||
Hbc.cache.mkpath
|
||||
Hbc.caskroom = Hbc.default_caskroom.tap(&:mkpath)
|
||||
Hbc.default_tap = Tap.fetch("caskroom", "test").tap do |tap|
|
||||
# link test casks
|
||||
FileUtils.mkdir_p tap.path.dirname
|
||||
FileUtils.ln_s TEST_FIXTURE_DIR.join("cask"), tap.path
|
||||
end
|
||||
|
||||
# pretend that the caskroom/cask Tap is installed
|
||||
FileUtils.ln_s Pathname.new(ENV["HOMEBREW_LIBRARY"]).join("Taps", "caskroom", "homebrew-cask"), Tap.fetch("caskroom", "cask").path
|
||||
|
||||
class TestHelper
|
||||
# helpers for test Casks to reference local files easily
|
||||
def self.local_binary_path(name)
|
||||
File.expand_path(File.join(File.dirname(__FILE__), "support", "binaries", name))
|
||||
end
|
||||
|
||||
def self.local_binary_url(name)
|
||||
"file://" + local_binary_path(name)
|
||||
end
|
||||
|
||||
def self.valid_symlink?(candidate)
|
||||
return false unless candidate.symlink?
|
||||
candidate.readlink.exist?
|
||||
end
|
||||
|
||||
def self.install_without_artifacts(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.download
|
||||
i.extract_primary_container
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.install_with_caskfile(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.save_caskfile
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.install_without_artifacts_with_caskfile(cask)
|
||||
Hbc::Installer.new(cask).tap do |i|
|
||||
shutup do
|
||||
i.download
|
||||
i.extract_primary_container
|
||||
i.save_caskfile
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Extend MiniTest API with support for RSpec-style shared examples
|
||||
require "support/shared_examples"
|
||||
require "support/shared_examples/dsl_base.rb"
|
||||
require "support/shared_examples/staged.rb"
|
||||
|
||||
require "support/fake_dirs"
|
||||
require "support/fake_system_command"
|
||||
require "support/cleanup"
|
||||
require "support/never_sudo_system_command"
|
||||
require "tmpdir"
|
||||
require "tempfile"
|
||||
Loading…
x
Reference in New Issue
Block a user