Merge pull request #1978 from reitermarkus/convert-to-spec

Convert all Cask tests to RSpec.
This commit is contained in:
Markus Reiter 2017-02-10 20:30:18 +01:00 committed by GitHub
commit 5a90d6e853
70 changed files with 1916 additions and 1992 deletions

View File

@ -21,17 +21,11 @@ cask_root.cd do
system "bundle", "install" system "bundle", "install"
end end
rspec = ARGV.flag?("--rspec") || !ARGV.flag?("--minitest")
minitest = ARGV.flag?("--minitest") || !ARGV.flag?("--rspec")
if ARGV.flag?("--coverage") if ARGV.flag?("--coverage")
ENV["HOMEBREW_TESTS_COVERAGE"] = "1" ENV["HOMEBREW_TESTS_COVERAGE"] = "1"
upload_coverage = ENV["CODECOV_TOKEN"] || ENV["TRAVIS"] upload_coverage = ENV["CODECOV_TOKEN"] || ENV["TRAVIS"]
end end
failed = false
if rspec
run_tests "parallel_rspec", Dir["spec/**/*_spec.rb"], %w[ run_tests "parallel_rspec", Dir["spec/**/*_spec.rb"], %w[
--color --color
--require spec_helper --require spec_helper
@ -39,18 +33,13 @@ cask_root.cd do
--format ParallelTests::RSpec::RuntimeLogger --format ParallelTests::RSpec::RuntimeLogger
--out tmp/parallel_runtime_rspec.log --out tmp/parallel_runtime_rspec.log
] ]
failed ||= !$CHILD_STATUS.success?
end
if minitest unless $CHILD_STATUS.success?
run_tests "parallel_test", Dir["test/**/*_test.rb"] Homebrew.failed = true
failed ||= !$CHILD_STATUS.success?
end end
Homebrew.failed = failed
if upload_coverage if upload_coverage
puts "Submitting Codecov coverage..." puts "Submitting Codecov coverage..."
system "bundle", "exec", "test/upload_coverage.rb" system "bundle", "exec", "spec/upload_coverage.rb"
end end
end end

View 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

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::App do describe Hbc::Artifact::App do
describe "activate to alternate target" do describe "activate to alternate target" do
@ -12,19 +12,19 @@ describe Hbc::Artifact::App do
let(:target_path) { Hbc.appdir.join("AnotherName.app") } let(:target_path) { Hbc.appdir.join("AnotherName.app") }
before do before do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
it "installs the given apps using the proper target directory" do it "installs the given apps using the proper target directory" do
source_path.must_be :directory? expect(source_path).to be_a_directory
target_path.wont_be :exist? expect(target_path).not_to exist
shutup do shutup do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
source_path.wont_be :exist? expect(source_path).not_to exist
end end
describe "when app is in a subdirectory" do describe "when app is in a subdirectory" do
@ -46,8 +46,8 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
appsubdir.join("Caffeine.app").wont_be :exist? expect(appsubdir.join("Caffeine.app")).not_to exist
end end
end end
@ -59,23 +59,21 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
source_path.wont_be :exist? expect(source_path).not_to exist
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist? expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
cask.staged_path.join("Caffeine Deluxe.app").must_be :directory? expect(cask.staged_path.join("Caffeine Deluxe.app")).to be_a_directory
end end
it "avoids clobbering an existing app by moving over it" do it "avoids clobbering an existing app by moving over it" do
target_path.mkpath 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}'.") expect(source_path).to be_a_directory
expect(target_path).to be_a_directory
source_path.must_be :directory? expect(File.identical?(source_path, target_path)).to be false
target_path.must_be :directory?
File.identical?(source_path, target_path).must_equal false
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::App do describe Hbc::Artifact::App do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb") } 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(:install_phase) { -> { app.install_phase } }
let(:uninstall_phase) { -> { app.uninstall_phase } } let(:uninstall_phase) { -> { app.uninstall_phase } }
before do before(:each) do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
describe "install_phase" do describe "install_phase" do
@ -22,8 +22,8 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
source_path.wont_be :exist? expect(source_path).not_to exist
end end
describe "when app is in a subdirectory" do describe "when app is in a subdirectory" do
@ -45,8 +45,8 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
appsubdir.join("Caffeine.app").wont_be :exist? expect(appsubdir.join("Caffeine.app")).not_to exist
end end
end end
@ -58,36 +58,34 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
source_path.wont_be :exist? expect(source_path).not_to exist
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist? expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
cask.staged_path.join("Caffeine Deluxe.app").must_be :exist? expect(cask.staged_path.join("Caffeine Deluxe.app")).to exist
end end
describe "when the target already exists" do describe "when the target already exists" do
before do before(:each) do
target_path.mkpath target_path.mkpath
end end
it "avoids clobbering an existing app" do 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}'.") expect(source_path).to be_a_directory
expect(target_path).to be_a_directory
source_path.must_be :directory? expect(File.identical?(source_path, target_path)).to be false
target_path.must_be :directory?
File.identical?(source_path, target_path).must_equal false
contents_path = target_path.join("Contents/Info.plist") contents_path = target_path.join("Contents/Info.plist")
contents_path.wont_be :exist? expect(contents_path).not_to exist
end end
describe "given the force option" do describe "given the force option" do
let(:force) { true } let(:force) { true }
before do before(:each) do
Hbc::Utils.stubs(current_user: "fake_user") allow(Hbc::Utils).to receive(:current_user).and_return("fake_user")
end end
describe "target is both writable and user-owned" do 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. Warning: It seems there is already an App at '#{target_path}'; overwriting.
EOS 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? expect(source_path).not_to exist
target_path.must_be :directory? expect(target_path).to be_a_directory
contents_path = target_path.join("Contents/Info.plist") contents_path = target_path.join("Contents/Info.plist")
contents_path.must_be :exist? expect(contents_path).to exist
end end
end end
describe "target is user-owned but contains read-only files" do describe "target is user-owned but contains read-only files" do
let(:command) { Hbc::FakeSystemCommand } before(:each) do
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
system "/usr/bin/touch", "--", "#{target_path}/foo" system "/usr/bin/touch", "--", "#{target_path}/foo"
system "/bin/chmod", "--", "0555", target_path system "/bin/chmod", "--", "0555", target_path
end end
it "overwrites the existing app" do it "overwrites the existing app" do
command.expect_and_pass_through(chflags_cmd) expect(command).to receive(:run).with("/bin/chmod", args: ["-R", "--", "u+rwx", target_path], must_succeed: false)
command.expect_and_pass_through(chmod_cmd) .and_call_original
command.expect_and_pass_through(chmod_n_cmd) 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 stdout = <<-EOS.undent
==> Removing App: '#{target_path}' ==> 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. Warning: It seems there is already an App at '#{target_path}'; overwriting.
EOS 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? expect(source_path).not_to exist
target_path.must_be :directory? expect(target_path).to be_a_directory
contents_path = target_path.join("Contents/Info.plist") contents_path = target_path.join("Contents/Info.plist")
contents_path.must_be :exist? expect(contents_path).to exist
end end
after do after(:each) do
system "/bin/chmod", "--", "0755", target_path system "/bin/chmod", "--", "0755", target_path
end end
end end
@ -164,18 +155,15 @@ describe Hbc::Artifact::App do
describe "when the target is a broken symlink" do describe "when the target is a broken symlink" do
let(:deleted_path) { cask.staged_path.join("Deleted.app") } let(:deleted_path) { cask.staged_path.join("Deleted.app") }
before do before(:each) do
deleted_path.mkdir deleted_path.mkdir
File.symlink(deleted_path, target_path) File.symlink(deleted_path, target_path)
deleted_path.rmdir deleted_path.rmdir
end end
it "leaves the target alone" do it "leaves the target alone" 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}'.")
expect(target_path).to be_a_symlink
err.message.must_equal("It seems there is already an App at '#{target_path}'.")
File.symlink?(target_path).must_equal true
end end
describe "given the force option" do 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. Warning: It seems there is already an App at '#{target_path}'; overwriting.
EOS 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? expect(source_path).not_to exist
target_path.must_be :directory? expect(target_path).to be_a_directory
contents_path = target_path.join("Contents/Info.plist") contents_path = target_path.join("Contents/Info.plist")
contents_path.must_be :exist? expect(contents_path).to exist
end end
end end
end end
@ -207,26 +197,23 @@ describe Hbc::Artifact::App do
message = "It seems the App source is not there: '#{source_path}'" message = "It seems the App source is not there: '#{source_path}'"
error = install_phase.must_raise(Hbc::CaskError) expect(install_phase).to raise_error(Hbc::CaskError, message)
error.message.must_equal message
end end
end end
describe "uninstall_phase" do describe "uninstall_phase" do
before do it "deletes managed apps" do
shutup do shutup do
install_phase.call install_phase.call
end end
end
it "deletes managed apps" do expect(target_path).to exist
target_path.must_be :exist?
shutup do shutup do
uninstall_phase.call uninstall_phase.call
end end
target_path.wont_be :exist? expect(target_path).not_to exist
end end
end end
@ -235,25 +222,23 @@ describe Hbc::Artifact::App do
let(:contents) { app.summary[:contents] } let(:contents) { app.summary[:contents] }
it "returns the correct english_description" do it "returns the correct english_description" do
description.must_equal "Apps" expect(description).to eq("Apps")
end end
describe "app is correctly installed" do describe "app is correctly installed" do
before do it "returns the path to the app" do
shutup do shutup do
install_phase.call install_phase.call
end end
end
it "returns the path to the app" do expect(contents).to eq(["#{target_path} (#{target_path.abv})"])
contents.must_equal ["#{target_path} (#{target_path.abv})"]
end end
end end
describe "app is missing" do describe "app is missing" do
it "returns a warning and the supposed path to the app" do it "returns a warning and the supposed path to the app" do
contents.size.must_equal 1 expect(contents.size).to eq(1)
contents[0].must_match(/.*Missing App.*: #{target_path}/) expect(contents[0]).to match(/.*Missing App.*: #{target_path}/)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::Artifact do describe Hbc::Artifact::Artifact do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-generic-artifact.rb") } 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") } let(:target_path) { Hbc.appdir.join("Caffeine.app") }
before do before do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
describe "with no target" do describe "with no target" do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-generic-artifact-no-target.rb") } 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 it "fails to install with no target" do
install_phase.must_raise Hbc::CaskInvalidError expect(install_phase).to raise_error(Hbc::CaskInvalidError)
end end
end end
@ -27,21 +27,21 @@ describe Hbc::Artifact::Artifact do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
source_path.wont_be :exist? expect(source_path).not_to exist
end end
it "avoids clobbering an existing artifact" do it "avoids clobbering an existing artifact" do
target_path.mkpath target_path.mkpath
assert_raises Hbc::CaskError do expect {
shutup do shutup do
install_phase.call install_phase.call
end end
end }.to raise_error(Hbc::CaskError)
source_path.must_be :directory? expect(source_path).to be_a_directory
target_path.must_be :directory? expect(target_path).to be_a_directory
File.identical?(source_path, target_path).must_equal false expect(File.identical?(source_path, target_path)).to be false
end end
end end

View File

@ -1,17 +1,17 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::NestedContainer do describe Hbc::Artifact::NestedContainer do
describe "install" do describe "install" do
it "extracts the specified paths as containers" 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| 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 end
shutup do shutup do
Hbc::Artifact::NestedContainer.new(cask).install_phase Hbc::Artifact::NestedContainer.new(cask).install_phase
end end
cask.staged_path.join("MyNestedApp.app").must_be :directory? expect(cask.staged_path.join("MyNestedApp.app")).to be_a_directory
end end
end end
end end

View 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

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::PostflightBlock do describe Hbc::Artifact::PostflightBlock do
describe "install_phase" do describe "install_phase" do
@ -13,10 +13,10 @@ describe Hbc::Artifact::PostflightBlock do
end end
end end
Hbc::Artifact::PostflightBlock.new(cask).install_phase described_class.new(cask).install_phase
called.must_equal true expect(called).to be true
yielded_arg.must_be_kind_of Hbc::DSL::Postflight expect(yielded_arg).to be_kind_of(Hbc::DSL::Postflight)
end end
end end
@ -32,10 +32,10 @@ describe Hbc::Artifact::PostflightBlock do
end end
end end
Hbc::Artifact::PostflightBlock.new(cask).uninstall_phase described_class.new(cask).uninstall_phase
called.must_equal true expect(called).to be true
yielded_arg.must_be_kind_of Hbc::DSL::UninstallPostflight expect(yielded_arg).to be_kind_of(Hbc::DSL::UninstallPostflight)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::PreflightBlock do describe Hbc::Artifact::PreflightBlock do
describe "install_phase" do describe "install_phase" do
@ -13,10 +13,10 @@ describe Hbc::Artifact::PreflightBlock do
end end
end end
Hbc::Artifact::PreflightBlock.new(cask).install_phase described_class.new(cask).install_phase
called.must_equal true expect(called).to be true
yielded_arg.must_be_kind_of Hbc::DSL::Preflight expect(yielded_arg).to be_kind_of Hbc::DSL::Preflight
end end
end end
@ -32,10 +32,10 @@ describe Hbc::Artifact::PreflightBlock do
end end
end end
Hbc::Artifact::PreflightBlock.new(cask).uninstall_phase described_class.new(cask).uninstall_phase
called.must_equal true expect(called).to be true
yielded_arg.must_be_kind_of Hbc::DSL::UninstallPreflight expect(yielded_arg).to be_kind_of Hbc::DSL::UninstallPreflight
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::Suite do describe Hbc::Artifact::Suite do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-suite.rb") } 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(:target_path) { Hbc.appdir.join("Caffeine") }
let(:source_path) { cask.staged_path.join("Caffeine") } let(:source_path) { cask.staged_path.join("Caffeine") }
before do before(:each) do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
it "moves the suite to the proper directory" do it "moves the suite to the proper directory" do
skip("flaky test") skip("flaky test") # FIXME
shutup do shutup do
install_phase.call install_phase.call
end end
target_path.must_be :directory? expect(target_path).to be_a_directory
TestHelper.valid_symlink?(target_path).must_equal false expect(target_path).to be_a_symlink
source_path.wont_be :exist? expect(target_path.readlink).to exist
expect(source_path).not_to exist
end end
it "creates a suite containing the expected app" do it "creates a suite containing the expected app" do
@ -29,20 +30,20 @@ describe Hbc::Artifact::Suite do
install_phase.call install_phase.call
end end
target_path.join("Caffeine.app").must_be :exist? expect(target_path.join("Caffeine.app")).to exist
end end
it "avoids clobbering an existing suite by moving over it" do it "avoids clobbering an existing suite by moving over it" do
target_path.mkpath target_path.mkpath
assert_raises Hbc::CaskError do expect {
shutup do shutup do
install_phase.call install_phase.call
end end
end }.to raise_error(Hbc::CaskError)
source_path.must_be :directory? expect(source_path).to be_a_directory
target_path.must_be :directory? expect(target_path).to be_a_directory
File.identical?(source_path, target_path).must_equal false expect(File.identical?(source_path, target_path)).to be false
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::App do describe Hbc::Artifact::App do
describe "multiple apps" 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(:source_path_pro) { cask.staged_path.join("Caffeine Pro.app") }
let(:target_path_pro) { Hbc.appdir.join("Caffeine Pro.app") } let(:target_path_pro) { Hbc.appdir.join("Caffeine Pro.app") }
before do before(:each) do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
it "installs both apps using the proper target directory" do it "installs both apps using the proper target directory" do
@ -23,11 +23,11 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path_mini.must_be :directory? expect(target_path_mini).to be_a_directory
source_path_mini.wont_be :exist? expect(source_path_mini).not_to exist
target_path_pro.must_be :directory? expect(target_path_pro).to be_a_directory
source_path_pro.wont_be :exist? expect(source_path_pro).not_to exist
end end
describe "when apps are in a subdirectory" do describe "when apps are in a subdirectory" do
@ -38,11 +38,11 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path_mini.must_be :directory? expect(target_path_mini).to be_a_directory
source_path_mini.wont_be :exist? expect(source_path_mini).not_to exist
target_path_pro.must_be :directory? expect(target_path_pro).to be_a_directory
source_path_pro.wont_be :exist? expect(source_path_pro).not_to exist
end end
end end
@ -53,44 +53,40 @@ describe Hbc::Artifact::App do
install_phase.call install_phase.call
end end
target_path_mini.must_be :directory? expect(target_path_mini).to be_a_directory
source_path_mini.wont_be :exist? expect(source_path_mini).not_to exist
Hbc.appdir.join("Caffeine Deluxe.app").wont_be :exist? expect(Hbc.appdir.join("Caffeine Deluxe.app")).not_to exist
cask.staged_path.join("Caffeine Deluxe.app").must_be :exist? expect(cask.staged_path.join("Caffeine Deluxe.app")).to exist
end end
describe "avoids clobbering an existing app" do describe "avoids clobbering an existing app" do
it "when the first app of two already exists" do it "when the first app of two already exists" do
target_path_mini.mkpath target_path_mini.mkpath
err = assert_raises Hbc::CaskError do expect {
install_phase.must_output <<-EOS.undent expect(install_phase).to output(<<-EOS.undent).to_stdout
==> Moving App 'Caffeine Pro.app' to '#{target_path_pro}' ==> Moving App 'Caffeine Pro.app' to '#{target_path_pro}'
EOS 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}'.") expect(source_path_mini).to be_a_directory
expect(target_path_mini).to be_a_directory
source_path_mini.must_be :directory? expect(File.identical?(source_path_mini, target_path_mini)).to be false
target_path_mini.must_be :directory?
File.identical?(source_path_mini, target_path_mini).must_equal false
end end
it "when the second app of two already exists" do it "when the second app of two already exists" do
target_path_pro.mkpath target_path_pro.mkpath
err = assert_raises Hbc::CaskError do expect {
install_phase.must_output <<-EOS.undent expect(install_phase).to output(<<-EOS.undent).to_stdout
==> Moving App 'Caffeine Mini.app' to '#{target_path_mini}' ==> Moving App 'Caffeine Mini.app' to '#{target_path_mini}'
EOS 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}'.") expect(source_path_pro).to be_a_directory
expect(target_path_pro).to be_a_directory
source_path_pro.must_be :directory? expect(File.identical?(source_path_pro, target_path_pro)).to be false
target_path_pro.must_be :directory?
File.identical?(source_path_pro, target_path_pro).must_equal false
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::App do describe Hbc::Artifact::App do
# FIXME: Doesn't actually raise because the `app` stanza is not evaluated on load. # FIXME: Doesn't actually raise because the `app` stanza is not evaluated on load.

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Artifact::Uninstall do describe Hbc::Artifact::Uninstall do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-installable.rb") } 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) Hbc::Artifact::Uninstall.new(cask, command: Hbc::FakeSystemCommand)
} }
before do before(:each) do
shutup do shutup do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
end end
@ -20,7 +20,7 @@ describe Hbc::Artifact::Uninstall do
end 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(: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_list_cmd) { %w[/bin/launchctl list my.fancy.package.service] }
let(:launchctl_remove_cmd) { %w[/bin/launchctl remove 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 EOS
} }
describe "when launchctl job is owned by user" do context "when launchctl job is owned by user" do
it "can uninstall" do it "can uninstall" do
Hbc::FakeSystemCommand.stubs_command( Hbc::FakeSystemCommand.stubs_command(
launchctl_list_cmd, launchctl_list_cmd,
@ -58,7 +58,7 @@ describe Hbc::Artifact::Uninstall do
end end
end end
describe "when launchctl job is owned by system" do context "when launchctl job is owned by system" do
it "can uninstall" do it "can uninstall" do
Hbc::FakeSystemCommand.stubs_command( Hbc::FakeSystemCommand.stubs_command(
launchctl_list_cmd, launchctl_list_cmd,
@ -77,7 +77,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-pkgutil.rb") }
let(:main_pkg_id) { "my.fancy.package.main" } let(:main_pkg_id) { "my.fancy.package.main" }
let(:agent_pkg_id) { "my.fancy.package.agent" } let(:agent_pkg_id) { "my.fancy.package.agent" }
@ -163,7 +163,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-kext.rb") }
let(:kext_id) { "my.fancy.package.kernelextension" } let(:kext_id) { "my.fancy.package.kernelextension" }
@ -188,7 +188,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-quit.rb") }
let(:bundle_id) { "my.fancy.package.app" } let(:bundle_id) { "my.fancy.package.app" }
let(:quit_application_script) { let(:quit_application_script) {
@ -208,7 +208,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-signal.rb") }
let(:bundle_id) { "my.fancy.package.app" } let(:bundle_id) { "my.fancy.package.app" }
let(:signals) { %w[TERM KILL] } let(:signals) { %w[TERM KILL] }
@ -220,14 +220,14 @@ describe Hbc::Artifact::Uninstall do
) )
signals.each do |signal| signals.each do |signal|
Process.expects(:kill).with(signal, *unix_pids) expect(Process).to receive(:kill).with(signal, *unix_pids)
end end
subject subject
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-delete.rb") }
it "can uninstall" do it "can uninstall" do
@ -241,7 +241,7 @@ describe Hbc::Artifact::Uninstall do
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-trash.rb") }
it "can uninstall" do it "can uninstall" do
@ -255,7 +255,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(: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") } let(:dir_pathname) { Pathname.new("#{TEST_FIXTURE_DIR}/cask/empty_directory") }
@ -272,7 +272,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(: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") } let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
@ -287,7 +287,7 @@ describe Hbc::Artifact::Uninstall do
end end
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(: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") } let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
@ -302,7 +302,7 @@ describe Hbc::Artifact::Uninstall do
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-uninstall-login-item.rb") }
it "can uninstall" do it "can uninstall" do

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
# TODO: test that zap removes an alternate version of the same Cask # TODO: test that zap removes an alternate version of the same Cask
describe Hbc::Artifact::Zap do describe Hbc::Artifact::Zap do
@ -8,9 +8,9 @@ describe Hbc::Artifact::Zap do
Hbc::Artifact::Zap.new(cask, command: Hbc::FakeSystemCommand) Hbc::Artifact::Zap.new(cask, command: Hbc::FakeSystemCommand)
} }
before do before(:each) do
shutup do shutup do
TestHelper.install_without_artifacts(cask) InstallHelper.install_without_artifacts(cask)
end end
end end
@ -21,7 +21,7 @@ describe Hbc::Artifact::Zap do
end 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(: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_list_cmd) { %w[/bin/launchctl list my.fancy.package.service] }
let(:launchctl_remove_cmd) { %w[/bin/launchctl remove 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 EOS
} }
describe "when launchctl job is owned by user" do context "when launchctl job is owned by user" do
it "can zap" do it "can zap" do
Hbc::FakeSystemCommand.stubs_command( Hbc::FakeSystemCommand.stubs_command(
launchctl_list_cmd, launchctl_list_cmd,
@ -78,7 +78,7 @@ describe Hbc::Artifact::Zap do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-pkgutil.rb") }
let(:main_pkg_id) { "my.fancy.package.main" } let(:main_pkg_id) { "my.fancy.package.main" }
let(:agent_pkg_id) { "my.fancy.package.agent" } let(:agent_pkg_id) { "my.fancy.package.agent" }
@ -164,7 +164,7 @@ describe Hbc::Artifact::Zap do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-kext.rb") }
let(:kext_id) { "my.fancy.package.kernelextension" } let(:kext_id) { "my.fancy.package.kernelextension" }
@ -189,7 +189,7 @@ describe Hbc::Artifact::Zap do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-quit.rb") }
let(:bundle_id) { "my.fancy.package.app" } let(:bundle_id) { "my.fancy.package.app" }
let(:quit_application_script) { let(:quit_application_script) {
@ -209,7 +209,7 @@ describe Hbc::Artifact::Zap do
end end
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(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-signal.rb") }
let(:bundle_id) { "my.fancy.package.app" } let(:bundle_id) { "my.fancy.package.app" }
let(:signals) { %w[TERM KILL] } let(:signals) { %w[TERM KILL] }
@ -221,14 +221,14 @@ describe Hbc::Artifact::Zap do
) )
signals.each do |signal| signals.each do |signal|
Process.expects(:kill).with(signal, *unix_pids) expect(Process).to receive(:kill).with(signal, *unix_pids)
end end
subject subject
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-delete.rb") }
it "can zap" do it "can zap" do
@ -242,7 +242,7 @@ describe Hbc::Artifact::Zap do
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-trash.rb") }
it "can zap" do it "can zap" do
@ -256,7 +256,7 @@ describe Hbc::Artifact::Zap do
end end
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(: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") } let(:dir_pathname) { Pathname.new("#{TEST_FIXTURE_DIR}/cask/empty_directory") }
@ -273,7 +273,7 @@ describe Hbc::Artifact::Zap do
end end
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(: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") } let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
@ -288,7 +288,7 @@ describe Hbc::Artifact::Zap do
end end
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(: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") } let(:script_pathname) { cask.staged_path.join("MyFancyPkg", "FancyUninstaller.tool") }
@ -303,7 +303,7 @@ describe Hbc::Artifact::Zap do
end end
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") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-zap-login-item.rb") }
it "can zap" do it "can zap" do

View File

@ -20,4 +20,73 @@ describe Hbc::Cask do
end end
end 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 end

View 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

View File

@ -1,9 +1,9 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Cat do describe Hbc::CLI::Cat do
describe "given a basic Cask" do describe "given a basic Cask" do
before do let(:expected_output) {
@expected_output = <<-EOS.undent <<-EOS.undent
cask 'basic-cask' do cask 'basic-cask' do
version '1.2.3' version '1.2.3'
sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b' sha256 '8c62a2b791cf5f0da6066a0a4b6e85f62949cd60975da062df44adf887f4370b'
@ -14,46 +14,46 @@ describe Hbc::CLI::Cat do
app 'TestCask.app' app 'TestCask.app'
end end
EOS EOS
end }
it "displays the Cask file content about the specified Cask" do it "displays the Cask file content about the specified Cask" do
lambda { expect {
Hbc::CLI::Cat.run("basic-cask") Hbc::CLI::Cat.run("basic-cask")
}.must_output(@expected_output) }.to output(expected_output).to_stdout
end end
it "throws away additional Cask arguments and uses the first" do it "throws away additional Cask arguments and uses the first" do
lambda { expect {
Hbc::CLI::Cat.run("basic-cask", "local-caffeine") Hbc::CLI::Cat.run("basic-cask", "local-caffeine")
}.must_output(@expected_output) }.to output(expected_output).to_stdout
end end
it "throws away stray options" do it "throws away stray options" do
lambda { expect {
Hbc::CLI::Cat.run("--notavalidoption", "basic-cask") Hbc::CLI::Cat.run("--notavalidoption", "basic-cask")
}.must_output(@expected_output) }.to output(expected_output).to_stdout
end end
end end
it "raises an exception when the Cask does not exist" do it "raises an exception when the Cask does not exist" do
lambda { expect {
Hbc::CLI::Cat.run("notacask") Hbc::CLI::Cat.run("notacask")
}.must_raise Hbc::CaskUnavailableError }.to raise_error(Hbc::CaskUnavailableError)
end end
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Cat.run Hbc::CLI::Cat.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Cat.run("--notavalidoption") Hbc::CLI::Cat.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
# monkeypatch for testing # monkeypatch for testing
module Hbc module Hbc
@ -20,11 +20,11 @@ module Hbc
end end
describe Hbc::CLI::Create do describe Hbc::CLI::Create do
before do before(:each) do
Hbc::CLI::Create.reset! Hbc::CLI::Create.reset!
end end
after do after(:each) do
%w[new-cask additional-cask another-cask yet-another-cask local-caff].each do |cask| %w[new-cask additional-cask another-cask yet-another-cask local-caff].each do |cask|
path = Hbc.path(cask) path = Hbc.path(cask)
path.delete if path.exist? path.delete if path.exist?
@ -33,7 +33,7 @@ describe Hbc::CLI::Create do
it "opens the editor for the specified Cask" do it "opens the editor for the specified Cask" do
Hbc::CLI::Create.run("new-cask") 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")], [Hbc.path("new-cask")],
] ]
end end
@ -41,7 +41,7 @@ describe Hbc::CLI::Create do
it "drops a template down for the specified Cask" do it "drops a template down for the specified Cask" do
Hbc::CLI::Create.run("new-cask") Hbc::CLI::Create.run("new-cask")
template = File.read(Hbc.path("new-cask")) template = File.read(Hbc.path("new-cask"))
template.must_equal <<-EOS.undent expect(template).to eq <<-EOS.undent
cask 'new-cask' do cask 'new-cask' do
version '' version ''
sha256 '' sha256 ''
@ -57,44 +57,44 @@ describe Hbc::CLI::Create do
it "throws away additional Cask arguments and uses the first" do it "throws away additional Cask arguments and uses the first" do
Hbc::CLI::Create.run("additional-cask", "another-cask") 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")], [Hbc.path("additional-cask")],
] ]
end end
it "throws away stray options" do it "throws away stray options" do
Hbc::CLI::Create.run("--notavalidoption", "yet-another-cask") 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")], [Hbc.path("yet-another-cask")],
] ]
end end
it "raises an exception when the Cask already exists" do it "raises an exception when the Cask already exists" do
lambda { expect {
Hbc::CLI::Create.run("basic-cask") Hbc::CLI::Create.run("basic-cask")
}.must_raise Hbc::CaskAlreadyCreatedError }.to raise_error(Hbc::CaskAlreadyCreatedError)
end end
it "allows creating Casks that are substrings of existing Casks" do it "allows creating Casks that are substrings of existing Casks" do
Hbc::CLI::Create.run("local-caff") 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")], [Hbc.path("local-caff")],
] ]
end end
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Create.run Hbc::CLI::Create.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Create.run("--notavalidoption") Hbc::CLI::Create.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
# monkeypatch for testing # monkeypatch for testing
module Hbc module Hbc
@ -20,43 +20,43 @@ module Hbc
end end
describe Hbc::CLI::Edit do describe Hbc::CLI::Edit do
before do before(:each) do
Hbc::CLI::Edit.reset! Hbc::CLI::Edit.reset!
end end
it "opens the editor for the specified Cask" do it "opens the editor for the specified Cask" do
Hbc::CLI::Edit.run("alfred") Hbc::CLI::Edit.run("local-caffeine")
Hbc::CLI::Edit.editor_commands.must_equal [ expect(Hbc::CLI::Edit.editor_commands).to eq [
[Hbc.path("alfred")], [Hbc.path("local-caffeine")],
] ]
end end
it "throws away additional arguments and uses the first" do it "throws away additional arguments and uses the first" do
Hbc::CLI::Edit.run("adium", "alfred") Hbc::CLI::Edit.run("local-caffeine", "local-transmission")
Hbc::CLI::Edit.editor_commands.must_equal [ expect(Hbc::CLI::Edit.editor_commands).to eq [
[Hbc.path("adium")], [Hbc.path("local-caffeine")],
] ]
end end
it "raises an exception when the Cask doesnt exist" do it "raises an exception when the Cask doesnt exist" do
lambda { expect {
Hbc::CLI::Edit.run("notacask") Hbc::CLI::Edit.run("notacask")
}.must_raise Hbc::CaskUnavailableError }.to raise_error(Hbc::CaskUnavailableError)
end end
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Edit.run Hbc::CLI::Edit.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Edit.run("--notavalidoption") Hbc::CLI::Edit.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Fetch do describe Hbc::CLI::Fetch do
let(:local_transmission) { let(:local_transmission) {
@ -13,8 +13,8 @@ describe Hbc::CLI::Fetch do
shutup do shutup do
Hbc::CLI::Fetch.run("local-transmission", "local-caffeine") Hbc::CLI::Fetch.run("local-transmission", "local-caffeine")
end end
Hbc::CurlDownloadStrategy.new(local_transmission).cached_location.must_be :exist? expect(Hbc::CurlDownloadStrategy.new(local_transmission).cached_location).to exist
Hbc::CurlDownloadStrategy.new(local_caffeine).cached_location.must_be :exist? expect(Hbc::CurlDownloadStrategy.new(local_caffeine).cached_location).to exist
end end
it "prevents double fetch (without nuking existing installation)" do it "prevents double fetch (without nuking existing installation)" do
@ -30,7 +30,7 @@ describe Hbc::CLI::Fetch do
end end
new_ctime = File.stat(download_stategy.cached_location).ctime 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 end
it "allows double fetch with --force" do it "allows double fetch with --force" do
@ -48,31 +48,30 @@ describe Hbc::CLI::Fetch do
download_stategy = Hbc::CurlDownloadStrategy.new(local_transmission) download_stategy = Hbc::CurlDownloadStrategy.new(local_transmission)
new_ctime = File.stat(download_stategy.cached_location).ctime new_ctime = File.stat(download_stategy.cached_location).ctime
# new_ctime.to_i.must_be :>, old_ctime.to_i expect(new_ctime.to_i).to be > old_ctime.to_i
new_ctime.to_i.must_be :>, old_ctime.to_i
end end
it "properly handles Casks that are not present" do it "properly handles Casks that are not present" do
lambda { expect {
shutup do shutup do
Hbc::CLI::Fetch.run("notacask") Hbc::CLI::Fetch.run("notacask")
end end
}.must_raise Hbc::CaskUnavailableError }.to raise_error(Hbc::CaskUnavailableError)
end end
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Fetch.run Hbc::CLI::Fetch.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Fetch.run("--notavalidoption") Hbc::CLI::Fetch.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
# monkeypatch for testing # monkeypatch for testing
module Hbc module Hbc
@ -25,23 +25,23 @@ describe Hbc::CLI::Home do
end end
it "opens the homepage for the specified Cask" do it "opens the homepage for the specified Cask" do
Hbc::CLI::Home.run("alfred") Hbc::CLI::Home.run("local-caffeine")
Hbc::CLI::Home.system_commands.must_equal [ expect(Hbc::CLI::Home.system_commands).to eq [
["/usr/bin/open", "--", "https://www.alfredapp.com/"], ["/usr/bin/open", "--", "http://example.com/local-caffeine"],
] ]
end end
it "works for multiple Casks" do it "works for multiple Casks" do
Hbc::CLI::Home.run("alfred", "adium") Hbc::CLI::Home.run("local-caffeine", "local-transmission")
Hbc::CLI::Home.system_commands.must_equal [ expect(Hbc::CLI::Home.system_commands).to eq [
["/usr/bin/open", "--", "https://www.alfredapp.com/"], ["/usr/bin/open", "--", "http://example.com/local-caffeine"],
["/usr/bin/open", "--", "https://www.adium.im/"], ["/usr/bin/open", "--", "http://example.com/local-transmission"],
] ]
end end
it "opens the project page when no Cask is specified" do it "opens the project page when no Cask is specified" do
Hbc::CLI::Home.run 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/"], ["/usr/bin/open", "--", "http://caskroom.io/"],
] ]
end end

View File

@ -1,14 +1,14 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Info do describe Hbc::CLI::Info do
it "displays some nice info about the specified Cask" do it "displays some nice info about the specified Cask" do
lambda { expect {
Hbc::CLI::Info.run("local-caffeine") Hbc::CLI::Info.run("local-caffeine")
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
local-caffeine: 1.2.3 local-caffeine: 1.2.3
http://example.com/local-caffeine http://example.com/local-caffeine
Not installed 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 ==> Name
None None
==> Artifacts ==> Artifacts
@ -17,12 +17,12 @@ describe Hbc::CLI::Info do
end end
describe "given multiple Casks" do describe "given multiple Casks" do
before do let(:expected_output) {
@expected_output = <<-EOS.undent <<-EOS.undent
local-caffeine: 1.2.3 local-caffeine: 1.2.3
http://example.com/local-caffeine http://example.com/local-caffeine
Not installed 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 ==> Name
None None
==> Artifacts ==> Artifacts
@ -30,35 +30,35 @@ describe Hbc::CLI::Info do
local-transmission: 2.61 local-transmission: 2.61
http://example.com/local-transmission http://example.com/local-transmission
Not installed 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 ==> Name
None None
==> Artifacts ==> Artifacts
Transmission.app (app) Transmission.app (app)
EOS EOS
end }
it "displays the info" do it "displays the info" do
lambda { expect {
Hbc::CLI::Info.run("local-caffeine", "local-transmission") Hbc::CLI::Info.run("local-caffeine", "local-transmission")
}.must_output(@expected_output) }.to output(expected_output).to_stdout
end end
it "throws away stray options" do it "throws away stray options" do
lambda { expect {
Hbc::CLI::Info.run("--notavalidoption", "local-caffeine", "local-transmission") Hbc::CLI::Info.run("--notavalidoption", "local-caffeine", "local-transmission")
}.must_output(@expected_output) }.to output(expected_output).to_stdout
end end
end end
it "should print caveats if the Cask provided one" do it "should print caveats if the Cask provided one" do
lambda { expect {
Hbc::CLI::Info.run("with-caveats") Hbc::CLI::Info.run("with-caveats")
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
with-caveats: 1.2.3 with-caveats: 1.2.3
http://example.com/local-caffeine http://example.com/local-caffeine
Not installed 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 ==> Name
None None
==> Artifacts ==> Artifacts
@ -78,13 +78,13 @@ describe Hbc::CLI::Info do
end end
it 'should not print "Caveats" section divider if the caveats block has no output' do it 'should not print "Caveats" section divider if the caveats block has no output' do
lambda { expect {
Hbc::CLI::Info.run("with-conditional-caveats") Hbc::CLI::Info.run("with-conditional-caveats")
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
with-conditional-caveats: 1.2.3 with-conditional-caveats: 1.2.3
http://example.com/local-caffeine http://example.com/local-caffeine
Not installed 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 ==> Name
None None
==> Artifacts ==> Artifacts
@ -94,17 +94,17 @@ describe Hbc::CLI::Info do
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Info.run Hbc::CLI::Info.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Info.run("--notavalidoption") Hbc::CLI::Info.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Install do describe Hbc::CLI::Install do
it "allows staging and activation of multiple Casks at once" 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") Hbc::CLI::Install.run("local-transmission", "local-caffeine")
end 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
Hbc.appdir.join("Transmission.app").must_be :directory? expect(Hbc.appdir.join("Transmission.app")).to be_a_directory
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb").must_be :installed? expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb")).to be_installed
Hbc.appdir.join("Caffeine.app").must_be :directory? expect(Hbc.appdir.join("Caffeine.app")).to be_a_directory
end end
it "skips double install (without nuking existing installation)" do it "skips double install (without nuking existing installation)" do
@ -19,7 +19,7 @@ describe Hbc::CLI::Install do
shutup do shutup do
Hbc::CLI::Install.run("local-transmission") Hbc::CLI::Install.run("local-transmission")
end 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 end
it "prints a warning message on double install" do it "prints a warning message on double install" do
@ -27,9 +27,9 @@ describe Hbc::CLI::Install do
Hbc::CLI::Install.run("local-transmission") Hbc::CLI::Install.run("local-transmission")
end end
lambda { expect {
Hbc::CLI::Install.run("local-transmission", "") 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 end
it "allows double install with --force" do it "allows double install with --force" do
@ -37,54 +37,56 @@ describe Hbc::CLI::Install do
Hbc::CLI::Install.run("local-transmission") Hbc::CLI::Install.run("local-transmission")
end end
lambda { expect {
expect {
Hbc::CLI::Install.run("local-transmission", "--force") 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 end
it "skips dependencies with --skip-cask-deps" do it "skips dependencies with --skip-cask-deps" do
shutup do shutup do
Hbc::CLI::Install.run("with-depends-on-cask-multiple", "--skip-cask-deps") Hbc::CLI::Install.run("with-depends-on-cask-multiple", "--skip-cask-deps")
end end
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-multiple.rb").must_be :installed? expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/with-depends-on-cask-multiple.rb")).to be_installed
Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb").wont_be :installed? expect(Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-caffeine.rb")).not_to 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/local-transmission.rb")).not_to be_installed
end end
it "properly handles Casks that are not present" do it "properly handles Casks that are not present" do
lambda { expect {
shutup do shutup do
Hbc::CLI::Install.run("notacask") Hbc::CLI::Install.run("notacask")
end end
}.must_raise Hbc::CaskError }.to raise_error(Hbc::CaskError)
end end
it "returns a suggestion for a misspelled Cask" do it "returns a suggestion for a misspelled Cask" do
lambda { expect {
begin begin
Hbc::CLI::Install.run("googlechrome") Hbc::CLI::Install.run("googlechrome")
rescue Hbc::CaskError rescue Hbc::CaskError
nil nil
end 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 end
it "returns multiple suggestions for a Cask fragment" do it "returns multiple suggestions for a Cask fragment" do
lambda { expect {
begin begin
Hbc::CLI::Install.run("google") Hbc::CLI::Install.run("google")
rescue Hbc::CaskError rescue Hbc::CaskError
nil nil
end 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 end
describe "when no Cask is specified" do describe "when no Cask is specified" do
with_options = lambda do |options| with_options = lambda do |options|
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Install.run(*options) Hbc::CLI::Install.run(*options)
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end

View File

@ -1,16 +1,16 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::List do describe Hbc::CLI::List do
it "lists the installed Casks in a pretty fashion" do it "lists the installed Casks in a pretty fashion" do
casks = %w[local-caffeine local-transmission].map { |c| Hbc.load(c) } casks = %w[local-caffeine local-transmission].map { |c| Hbc.load(c) }
casks.each do |c| casks.each do |c|
TestHelper.install_with_caskfile(c) InstallHelper.install_with_caskfile(c)
end end
lambda { expect {
Hbc::CLI::List.run Hbc::CLI::List.run
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
local-caffeine local-caffeine
local-transmission local-transmission
EOS EOS
@ -18,7 +18,7 @@ describe Hbc::CLI::List do
describe "lists versions" do describe "lists versions" do
let(:casks) { ["local-caffeine", "local-transmission"] } let(:casks) { ["local-caffeine", "local-transmission"] }
let(:output) { let(:expected_output) {
<<-EOS.undent <<-EOS.undent
local-caffeine 1.2.3 local-caffeine 1.2.3
local-transmission 2.61 local-transmission 2.61
@ -26,19 +26,19 @@ describe Hbc::CLI::List do
} }
before(:each) 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 end
it "of all installed Casks" do it "of all installed Casks" do
lambda { expect {
Hbc::CLI::List.run("--versions") Hbc::CLI::List.run("--versions")
}.must_output(output) }.to output(expected_output).to_stdout
end end
it "of given Casks" do it "of given Casks" do
lambda { expect {
Hbc::CLI::List.run("--versions", "local-caffeine", "local-transmission") Hbc::CLI::List.run("--versions", "local-caffeine", "local-transmission")
}.must_output(output) }.to output(expected_output).to_stdout
end end
end end
@ -50,14 +50,10 @@ describe Hbc::CLI::List do
staged_path.mkpath staged_path.mkpath
end end
after do
caskroom_path.rmtree
end
it "lists installed Casks without backing ruby files (due to renames or otherwise)" do it "lists installed Casks without backing ruby files (due to renames or otherwise)" do
lambda { expect {
Hbc::CLI::List.run Hbc::CLI::List.run
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
ive-been-renamed (!) ive-been-renamed (!)
EOS EOS
end end
@ -69,15 +65,15 @@ describe Hbc::CLI::List do
let(:casks) { [caffeine, transmission] } let(:casks) { [caffeine, transmission] }
it "lists the installed files for those Casks" do 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 shutup do
Hbc::Artifact::App.new(transmission).install_phase Hbc::Artifact::App.new(transmission).install_phase
end end
lambda { expect {
Hbc::CLI::List.run("local-transmission", "local-caffeine") Hbc::CLI::List.run("local-transmission", "local-caffeine")
}.must_output <<-EOS.undent }.to output(<<-EOS.undent).to_stdout
==> Apps ==> Apps
#{Hbc.appdir.join("Transmission.app")} (#{Hbc.appdir.join("Transmission.app").abv}) #{Hbc.appdir.join("Transmission.app")} (#{Hbc.appdir.join("Transmission.app").abv})
==> Apps ==> Apps

View File

@ -1,10 +1,10 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI do describe Hbc::CLI do
it "supports setting the appdir" do it "supports setting the appdir" do
Hbc::CLI.process_options %w[help --appdir=/some/path/foo] 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 end
it "supports setting the appdir from ENV" do it "supports setting the appdir from ENV" do
@ -12,13 +12,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the prefpanedir" do it "supports setting the prefpanedir" do
Hbc::CLI.process_options %w[help --prefpanedir=/some/path/foo] 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 end
it "supports setting the prefpanedir from ENV" do it "supports setting the prefpanedir from ENV" do
@ -26,13 +26,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the qlplugindir" do it "supports setting the qlplugindir" do
Hbc::CLI.process_options %w[help --qlplugindir=/some/path/foo] 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 end
it "supports setting the qlplugindir from ENV" do it "supports setting the qlplugindir from ENV" do
@ -40,13 +40,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the colorpickerdir" do it "supports setting the colorpickerdir" do
Hbc::CLI.process_options %w[help --colorpickerdir=/some/path/foo] 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 end
it "supports setting the colorpickerdir from ENV" do it "supports setting the colorpickerdir from ENV" do
@ -54,13 +54,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the dictionarydir" do it "supports setting the dictionarydir" do
Hbc::CLI.process_options %w[help --dictionarydir=/some/path/foo] 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 end
it "supports setting the dictionarydir from ENV" do it "supports setting the dictionarydir from ENV" do
@ -68,13 +68,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the fontdir" do it "supports setting the fontdir" do
Hbc::CLI.process_options %w[help --fontdir=/some/path/foo] 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 end
it "supports setting the fontdir from ENV" do it "supports setting the fontdir from ENV" do
@ -82,13 +82,13 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "supports setting the servicedir" do it "supports setting the servicedir" do
Hbc::CLI.process_options %w[help --servicedir=/some/path/foo] 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 end
it "supports setting the servicedir from ENV" do it "supports setting the servicedir from ENV" do
@ -96,36 +96,36 @@ describe Hbc::CLI do
Hbc::CLI.process_options %w[help] 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 end
it "allows additional options to be passed through" do it "allows additional options to be passed through" do
rest = Hbc::CLI.process_options %w[edit foo --create --appdir=/some/path/qux] rest = Hbc::CLI.process_options %w[edit foo --create --appdir=/some/path/qux]
Hbc.appdir.must_equal Pathname("/some/path/qux") expect(Hbc.appdir).to eq(Pathname.new("/some/path/qux"))
rest.must_equal %w[edit foo --create] expect(rest).to eq(%w[edit foo --create])
end end
describe "when a mandatory argument is missing" do describe "when a mandatory argument is missing" do
it "shows a user-friendly error message" do it "shows a user-friendly error message" do
lambda { expect {
Hbc::CLI.process_options %w[install -f] Hbc::CLI.process_options %w[install -f]
}.must_raise Hbc::CaskError }.to raise_error(Hbc::CaskError)
end end
end end
describe "given an ambiguous option" do describe "given an ambiguous option" do
it "shows a user-friendly error message" do it "shows a user-friendly error message" do
lambda { expect {
Hbc::CLI.process_options %w[edit -c] Hbc::CLI.process_options %w[edit -c]
}.must_raise Hbc::CaskError }.to raise_error(Hbc::CaskError)
end end
end end
describe "--debug" do describe "--debug" do
it "sets the Cask debug method to true" do it "sets the Cask debug method to true" do
Hbc::CLI.process_options %w[help --debug] Hbc::CLI.process_options %w[help --debug]
Hbc.debug.must_equal true expect(Hbc.debug).to be true
Hbc.debug = false Hbc.debug = false
end end
end end
@ -133,12 +133,8 @@ describe Hbc::CLI do
describe "--help" do describe "--help" do
it "sets the Cask help method to true" do it "sets the Cask help method to true" do
Hbc::CLI.process_options %w[foo --help] Hbc::CLI.process_options %w[foo --help]
Hbc.help.must_equal true expect(Hbc.help).to be true
Hbc.help = false Hbc.help = false
end end
end end
after do
ENV["HOMEBREW_CASK_OPTS"] = nil
end
end end

View 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

View 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

View File

@ -1,22 +1,22 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Uninstall do describe Hbc::CLI::Uninstall do
it "shows an error when a bad Cask is provided" do it "shows an error when a bad Cask is provided" do
lambda { expect {
Hbc::CLI::Uninstall.run("notacask") Hbc::CLI::Uninstall.run("notacask")
}.must_raise Hbc::CaskUnavailableError }.to raise_error(Hbc::CaskUnavailableError)
end end
it "shows an error when a Cask is provided that's not installed" do it "shows an error when a Cask is provided that's not installed" do
lambda { expect {
Hbc::CLI::Uninstall.run("anvil") Hbc::CLI::Uninstall.run("anvil")
}.must_raise Hbc::CaskNotInstalledError }.to raise_error(Hbc::CaskNotInstalledError)
end end
it "tries anyway on a non-present Cask when --force is given" do it "tries anyway on a non-present Cask when --force is given" do
lambda do expect {
Hbc::CLI::Uninstall.run("anvil", "--force") Hbc::CLI::Uninstall.run("anvil", "--force")
end # wont_raise }.not_to raise_error
end end
it "can uninstall and unlink multiple Casks at once" do it "can uninstall and unlink multiple Casks at once" do
@ -28,17 +28,17 @@ describe Hbc::CLI::Uninstall do
Hbc::Installer.new(transmission).install Hbc::Installer.new(transmission).install
end end
caffeine.must_be :installed? expect(caffeine).to be_installed
transmission.must_be :installed? expect(transmission).to be_installed
shutup do shutup do
Hbc::CLI::Uninstall.run("local-caffeine", "local-transmission") Hbc::CLI::Uninstall.run("local-caffeine", "local-transmission")
end end
caffeine.wont_be :installed? expect(caffeine).not_to be_installed
Hbc.appdir.join("Transmission.app").wont_be :exist? expect(Hbc.appdir.join("Transmission.app")).not_to exist
transmission.wont_be :installed? expect(transmission).not_to be_installed
Hbc.appdir.join("Caffeine.app").wont_be :exist? expect(Hbc.appdir.join("Caffeine.app")).not_to exist
end end
describe "when multiple versions of a cask are installed" do describe "when multiple versions of a cask are installed" do
@ -67,34 +67,29 @@ describe Hbc::CLI::Uninstall do
end end
end end
after(:each) do
caskroom_path.rmtree if caskroom_path.exist?
end
it "uninstalls one version at a time" do it "uninstalls one version at a time" do
shutup do shutup do
Hbc::CLI::Uninstall.run("versioned-cask") Hbc::CLI::Uninstall.run("versioned-cask")
end end
caskroom_path.join(first_installed_version).must_be :exist? expect(caskroom_path.join(first_installed_version)).to exist
caskroom_path.join(last_installed_version).wont_be :exist? expect(caskroom_path.join(last_installed_version)).not_to exist
caskroom_path.must_be :exist? expect(caskroom_path).to exist
shutup do shutup do
Hbc::CLI::Uninstall.run("versioned-cask") Hbc::CLI::Uninstall.run("versioned-cask")
end end
caskroom_path.join(first_installed_version).wont_be :exist? expect(caskroom_path.join(first_installed_version)).not_to exist
caskroom_path.wont_be :exist? expect(caskroom_path).not_to exist
end end
it "displays a message when versions remain installed" do it "displays a message when versions remain installed" do
out, err = capture_io do expect {
expect {
Hbc::CLI::Uninstall.run("versioned-cask") Hbc::CLI::Uninstall.run("versioned-cask")
end }.not_to output.to_stderr
}.to output(/#{token} #{first_installed_version} is still installed./).to_stdout
out.must_match(/#{token} #{first_installed_version} is still installed./)
err.must_be :empty?
end end
end end
@ -121,34 +116,29 @@ describe Hbc::CLI::Uninstall do
EOS EOS
end end
after do
app.rmtree if app.exist?
caskroom_path.rmtree if caskroom_path.exist?
end
it "can still uninstall those Casks" do it "can still uninstall those Casks" do
shutup do shutup do
Hbc::CLI::Uninstall.run("ive-been-renamed") Hbc::CLI::Uninstall.run("ive-been-renamed")
end end
app.wont_be :exist? expect(app).not_to exist
caskroom_path.wont_be :exist? expect(caskroom_path).not_to exist
end end
end end
describe "when no Cask is specified" do describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Uninstall.run Hbc::CLI::Uninstall.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Uninstall.run("--notavalidoption") Hbc::CLI::Uninstall.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View 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

View File

@ -1,10 +1,10 @@
require "test_helper" require "spec_helper"
describe Hbc::CLI::Zap do describe Hbc::CLI::Zap do
it "shows an error when a bad Cask is provided" do it "shows an error when a bad Cask is provided" do
lambda { expect {
Hbc::CLI::Zap.run("notacask") Hbc::CLI::Zap.run("notacask")
}.must_raise Hbc::CaskUnavailableError }.to raise_error(Hbc::CaskUnavailableError)
end end
it "can zap and unlink multiple Casks at once" do it "can zap and unlink multiple Casks at once" do
@ -16,18 +16,18 @@ describe Hbc::CLI::Zap do
Hbc::Installer.new(transmission).install Hbc::Installer.new(transmission).install
end end
caffeine.must_be :installed? expect(caffeine).to be_installed
transmission.must_be :installed? expect(transmission).to be_installed
shutup do shutup do
Hbc::CLI::Zap.run("--notavalidoption", Hbc::CLI::Zap.run("--notavalidoption",
"local-caffeine", "local-transmission") "local-caffeine", "local-transmission")
end end
caffeine.wont_be :installed? expect(caffeine).not_to be_installed
Hbc.appdir.join("Transmission.app").wont_be :symlink? expect(Hbc.appdir.join("Caffeine.app")).not_to be_a_symlink
transmission.wont_be :installed? expect(transmission).not_to be_installed
Hbc.appdir.join("Caffeine.app").wont_be :symlink? expect(Hbc.appdir.join("Transmission.app")).not_to be_a_symlink
end end
# TODO: Explicit test that both zap and uninstall directives get dispatched. # 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 describe "when no Cask is specified" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Zap.run Hbc::CLI::Zap.run
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
describe "when no Cask is specified, but an invalid option" do describe "when no Cask is specified, but an invalid option" do
it "raises an exception" do it "raises an exception" do
lambda { expect {
Hbc::CLI::Zap.run("--notavalidoption") Hbc::CLI::Zap.run("--notavalidoption")
}.must_raise Hbc::CaskUnspecifiedError }.to raise_error(Hbc::CaskUnspecifiedError)
end end
end end
end end

View File

@ -1,7 +1,7 @@
require "test_helper" require "spec_helper"
describe Hbc::Container::Dmg do describe Hbc::Container::Dmg do
describe "mount!" do describe "#mount!" do
it "does not store nil mounts for dmgs with extra data" 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") transmission = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/local-transmission.rb")
@ -13,7 +13,7 @@ describe Hbc::Container::Dmg do
begin begin
dmg.mount! dmg.mount!
dmg.mounts.wont_include nil expect(dmg.mounts).not_to include nil
ensure ensure
dmg.eject! dmg.eject!
end end

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::Container::Naked do describe Hbc::Container::Naked do
it "saves files with spaces in them from uris with encoded spaces" 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) Hbc::FakeSystemCommand.stubs_command(expected_command)
container = Hbc::Container::Naked.new(cask, path, Hbc::FakeSystemCommand) 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
end end

View 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

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::DSL::Caveats do describe Hbc::DSL::Caveats do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::DSL::Postflight do describe Hbc::DSL::Postflight do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::DSL::Preflight do describe Hbc::DSL::Preflight do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::DSL::UninstallPostflight do describe Hbc::DSL::UninstallPostflight do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }

View File

@ -1,4 +1,4 @@
require "test_helper" require "spec_helper"
describe Hbc::DSL::UninstallPreflight do describe Hbc::DSL::UninstallPreflight do
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") } let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/basic-cask.rb") }

View 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

View File

@ -1,9 +1,9 @@
require "test_helper" require "spec_helper"
describe Hbc::Installer do describe Hbc::Installer do
describe "install" do describe "install" do
let(:empty_depends_on_stub) { 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 it "downloads and installs a nice fresh Cask" do
@ -13,8 +13,8 @@ describe Hbc::Installer do
Hbc::Installer.new(caffeine).install Hbc::Installer.new(caffeine).install
end end
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).must_be :directory? expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).to be_a_directory
expect(Hbc.appdir.join("Caffeine.app")).must_be :directory? expect(Hbc.appdir.join("Caffeine.app")).to be_a_directory
end end
it "works with dmg-based Casks" do it "works with dmg-based Casks" do
@ -24,8 +24,8 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-dmg", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-dmg", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with tar-gz-based Casks" do it "works with tar-gz-based Casks" do
@ -35,22 +35,22 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-tar-gz", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-tar-gz", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with cab-based Casks" do it "works with cab-based Casks" do
skip("cabextract not installed") if which("cabextract").nil? skip("cabextract not installed") if which("cabextract").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-cab.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-cab", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-cab", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with Adobe AIR-based Casks" do it "works with Adobe AIR-based Casks" do
@ -61,22 +61,21 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-air", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-air", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container.app")).must_be :directory? expect(Hbc.appdir.join("container.app")).to be_a_directory
end end
it "works with 7z-based Casks" do it "works with 7z-based Casks" do
skip("unar not installed") if which("unar").nil? skip("unar not installed") if which("unar").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-7z.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-7z", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-7z", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with xar-based Casks" do it "works with xar-based Casks" do
@ -86,36 +85,34 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-xar", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-xar", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with Stuffit-based Casks" do it "works with Stuffit-based Casks" do
skip("unar not installed") if which("unar").nil? skip("unar not installed") if which("unar").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-sit.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-sit", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-sit", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with RAR-based Casks" do it "works with RAR-based Casks" do
skip("unar not installed") if which("unar").nil? skip("unar not installed") if which("unar").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-rar.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-rar", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-rar", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with pure bzip2-based Casks" do it "works with pure bzip2-based Casks" do
@ -125,8 +122,8 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-bzip2", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-bzip2", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container-bzip2--#{asset.version}")).must_be :file? expect(Hbc.appdir.join("container-bzip2--#{asset.version}")).to be_a_file
end end
it "works with pure gzip-based Casks" do it "works with pure gzip-based Casks" do
@ -136,36 +133,34 @@ describe Hbc::Installer do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
expect(Hbc.caskroom.join("container-gzip", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-gzip", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container")).must_be :file? expect(Hbc.appdir.join("container")).to be_a_file
end end
it "works with pure xz-based Casks" do it "works with pure xz-based Casks" do
skip("unxz not installed") if which("unxz").nil? skip("unxz not installed") if which("unxz").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-xz.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-xz", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-xz", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container-xz--#{asset.version}")).must_be :file? expect(Hbc.appdir.join("container-xz--#{asset.version}")).to be_a_file
end end
it "works with lzma-based Casks" do it "works with lzma-based Casks" do
skip("unlzma not installed") if which("unlzma").nil? skip("unlzma not installed") if which("unlzma").nil?
asset = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/container-lzma.rb") 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 shutup do
Hbc::Installer.new(asset).install Hbc::Installer.new(asset).install
end end
end
expect(Hbc.caskroom.join("container-lzma", asset.version)).must_be :directory? expect(Hbc.caskroom.join("container-lzma", asset.version)).to be_a_directory
expect(Hbc.appdir.join("container-lzma--#{asset.version}")).must_be :file? expect(Hbc.appdir.join("container-lzma--#{asset.version}")).to be_a_file
end end
it "blows up on a bad checksum" do it "blows up on a bad checksum" do
@ -174,7 +169,7 @@ describe Hbc::Installer do
shutup do shutup do
Hbc::Installer.new(bad_checksum).install Hbc::Installer.new(bad_checksum).install
end end
}.must_raise(Hbc::CaskSha256MismatchError) }.to raise_error(Hbc::CaskSha256MismatchError)
end end
it "blows up on a missing checksum" do it "blows up on a missing checksum" do
@ -183,7 +178,7 @@ describe Hbc::Installer do
shutup do shutup do
Hbc::Installer.new(missing_checksum).install Hbc::Installer.new(missing_checksum).install
end end
}.must_raise(Hbc::CaskSha256MissingError) }.to raise_error(Hbc::CaskSha256MissingError)
end end
it "installs fine if sha256 :no_check is used" do it "installs fine if sha256 :no_check is used" do
@ -193,14 +188,14 @@ describe Hbc::Installer do
Hbc::Installer.new(no_checksum).install Hbc::Installer.new(no_checksum).install
end end
expect(no_checksum).must_be :installed? expect(no_checksum).to be_installed
end end
it "fails to install if sha256 :no_check is used with --require-sha" do 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") no_checksum = Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/no-checksum.rb")
expect { expect {
Hbc::Installer.new(no_checksum, require_sha: true).install Hbc::Installer.new(no_checksum, require_sha: true).install
}.must_raise(Hbc::CaskNoShasumError) }.to raise_error(Hbc::CaskNoShasumError)
end end
it "installs fine if sha256 :no_check is used with --require-sha and --force" do 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 Hbc::Installer.new(no_checksum, require_sha: true, force: true).install
end end
expect(no_checksum).must_be :installed? expect(no_checksum).to be_installed
end end
it "prints caveats if they're present" do it "prints caveats if they're present" do
@ -218,9 +213,9 @@ describe Hbc::Installer do
expect { expect {
Hbc::Installer.new(with_caveats).install 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 end
it "prints installer :manual instructions when present" do it "prints installer :manual instructions when present" do
@ -228,9 +223,9 @@ describe Hbc::Installer do
expect { expect {
Hbc::Installer.new(with_installer_manual).install 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 end
it "does not extract __MACOSX directories from zips" do it "does not extract __MACOSX directories from zips" do
@ -240,13 +235,13 @@ describe Hbc::Installer do
Hbc::Installer.new(with_macosx_dir).install Hbc::Installer.new(with_macosx_dir).install
end 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 end
it "installer method raises an exception when already-installed Casks which auto-update are attempted" do 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") 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) installer = Hbc::Installer.new(with_auto_updates)
@ -256,28 +251,30 @@ describe Hbc::Installer do
expect { expect {
installer.install installer.install
}.must_raise(Hbc::CaskAlreadyInstalledAutoUpdatesError) }.to raise_error(Hbc::CaskAlreadyInstalledAutoUpdatesError)
end end
it "allows already-installed Casks which auto-update to be installed if force is provided" do 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") 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 shutup do
Hbc::Installer.new(with_auto_updates).install Hbc::Installer.new(with_auto_updates).install
end end
expect {
shutup do shutup do
Hbc::Installer.new(with_auto_updates, force: true).install Hbc::Installer.new(with_auto_updates, force: true).install
end # wont_raise end
}.not_to raise_error
end end
# unlike the CLI, the internal interface throws exception on double-install # unlike the CLI, the internal interface throws exception on double-install
it "installer method raises an exception when already-installed Casks are attempted" do 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") 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) installer = Hbc::Installer.new(transmission)
@ -287,13 +284,13 @@ describe Hbc::Installer do
expect { expect {
installer.install installer.install
}.must_raise(Hbc::CaskAlreadyInstalledError) }.to raise_error(Hbc::CaskAlreadyInstalledError)
end end
it "allows already-installed Casks to be installed if force is provided" do 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") 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 shutup do
Hbc::Installer.new(transmission).install Hbc::Installer.new(transmission).install
@ -311,7 +308,7 @@ describe Hbc::Installer do
Hbc::Installer.new(naked_pkg).install Hbc::Installer.new(naked_pkg).install
end 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 end
it "works properly with an overridden container :type" do it "works properly with an overridden container :type" do
@ -321,7 +318,7 @@ describe Hbc::Installer do
Hbc::Installer.new(naked_executable).install Hbc::Installer.new(naked_executable).install
end 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 end
it "works fine with a nested container" do it "works fine with a nested container" do
@ -331,7 +328,7 @@ describe Hbc::Installer do
Hbc::Installer.new(nested_app).install Hbc::Installer.new(nested_app).install
end end
expect(Hbc.appdir.join("MyNestedApp.app")).must_be :directory? expect(Hbc.appdir.join("MyNestedApp.app")).to be_a_directory
end end
it "generates and finds a timestamped metadata directory for an installed Cask" do it "generates and finds a timestamped metadata directory for an installed Cask" do
@ -342,8 +339,8 @@ describe Hbc::Installer do
end end
m_path = caffeine.metadata_path(:now, true) m_path = caffeine.metadata_path(:now, true)
expect(caffeine.metadata_path(:now, false)).must_equal(m_path) expect(caffeine.metadata_path(:now, false)).to eq(m_path)
expect(caffeine.metadata_path(:latest)).must_equal(m_path) expect(caffeine.metadata_path(:latest)).to eq(m_path)
end end
it "generates and finds a metadata subdirectory for an installed Cask" do it "generates and finds a metadata subdirectory for an installed Cask" do
@ -355,8 +352,8 @@ describe Hbc::Installer do
subdir_name = "Casks" subdir_name = "Casks"
m_subdir = caffeine.metadata_subdir(subdir_name, :now, true) 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, :now, false)).to eq(m_subdir)
expect(caffeine.metadata_subdir(subdir_name, :latest)).must_equal(m_subdir) expect(caffeine.metadata_subdir(subdir_name, :latest)).to eq(m_subdir)
end end
end end
@ -370,9 +367,9 @@ describe Hbc::Installer do
installer.uninstall installer.uninstall
end end
expect(Hbc.caskroom.join("local-caffeine", caffeine.version, "Caffeine.app")).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)).wont_be :directory? expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).not_to be_a_directory
expect(Hbc.caskroom.join("local-caffeine")).wont_be :directory? expect(Hbc.caskroom.join("local-caffeine")).not_to be_a_directory
end end
it "uninstalls all versions if force is set" do it "uninstalls all versions if force is set" do
@ -383,19 +380,19 @@ describe Hbc::Installer do
Hbc::Installer.new(caffeine).install Hbc::Installer.new(caffeine).install
end end
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).must_be :directory? expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).to be_a_directory
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).wont_be :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)) 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", caffeine.version)).not_to be_a_directory
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).must_be :directory? expect(Hbc.caskroom.join("local-caffeine", mutated_version)).to be_a_directory
shutup do shutup do
Hbc::Installer.new(caffeine, force: true).uninstall Hbc::Installer.new(caffeine, force: true).uninstall
end end
expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).wont_be :directory? expect(Hbc.caskroom.join("local-caffeine", caffeine.version)).not_to be_a_directory
expect(Hbc.caskroom.join("local-caffeine", mutated_version)).wont_be :directory? expect(Hbc.caskroom.join("local-caffeine", mutated_version)).not_to be_a_directory
expect(Hbc.caskroom.join("local-caffeine")).wont_be :directory? expect(Hbc.caskroom.join("local-caffeine")).not_to be_a_directory
end end
end end
end end

View 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

View File

@ -1,39 +1,31 @@
describe Hbc::Scopes do describe Hbc::Scopes do
describe "installed" 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 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}" } allow(Hbc).to receive(:load) { |token| "loaded-#{token}" }
fake_caskroom.join("cask-bar").mkdir Hbc.caskroom.join("cask-bar").mkpath
fake_caskroom.join("cask-foo").mkdir Hbc.caskroom.join("cask-foo").mkpath
installed_casks = Hbc.installed installed_casks = Hbc.installed
expect(Hbc).to have_received(:load).with("cask-bar") expect(Hbc).to have_received(:load).with("cask-bar")
expect(Hbc).to have_received(:load).with("cask-foo") 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-bar
loaded-cask-foo loaded-cask-foo
]) ]
)
end end
it "optimizes performance by resolving to a fully qualified path before calling Hbc.load" do 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") absolute_path_to_cask = fake_tapped_cask_dir.join("some-cask.rb")
allow(Hbc).to receive(:load) allow(Hbc).to receive(:load)
allow(Hbc).to receive(:all_tapped_cask_dirs) { [fake_tapped_cask_dir] } 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 fake_tapped_cask_dir.mkdir
FileUtils.touch(absolute_path_to_cask) FileUtils.touch(absolute_path_to_cask)

View File

@ -1,18 +1,18 @@
require "test_helper" require "spec_helper"
# TODO: this test should be named after the corresponding class, once # TODO: this test should be named after the corresponding class, once
# that class is abstracted from installer.rb. It makes little sense # that class is abstracted from installer.rb. It makes little sense
# to be invoking bundle_identifier off of the installer instance. # to be invoking bundle_identifier off of the installer instance.
describe "Operations on staged Casks" do describe "Operations on staged Casks" do
describe "bundle ID" 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 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 shutup do
tr_installer.install installer.install
end end
tr_installer.bundle_identifier.must_equal("org.m0k.transmission")
expect(installer.bundle_identifier).to eq("org.m0k.transmission")
end end
end end
end end

View 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

View 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

View File

@ -17,7 +17,7 @@ $LOAD_PATH.push(HOMEBREW_LIBRARY_PATH.join("cask", "lib").to_s)
require "test/support/helper/shutup" 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" 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 FileUtils.ln_s TEST_FIXTURE_DIR.join("cask"), tap.path
end 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| RSpec.configure do |config|
config.order = :random config.order = :random
config.include(Test::Helper::Shutup) 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 end

View File

@ -1,3 +1,7 @@
def sudo(*args)
%w[/usr/bin/sudo -E --] + args.flatten
end
module Hbc module Hbc
class FakeSystemCommand class FakeSystemCommand
def self.responses def self.responses
@ -42,6 +46,7 @@ module Hbc
def self.run(command_string, options = {}) def self.run(command_string, options = {})
command = Hbc::SystemCommand.new(command_string, options).command command = Hbc::SystemCommand.new(command_string, options).command
puts command
unless responses.key?(command) unless responses.key?(command)
raise("no response faked for #{command.inspect}, faked responses are: #{responses.inspect}") raise("no response faked for #{command.inspect}, faked responses are: #{responses.inspect}")
end end
@ -61,17 +66,12 @@ module Hbc
end end
end end
module FakeSystemCommandHooks RSpec.configure do |config|
def after_teardown config.after(:each) do
super begin
Hbc::FakeSystemCommand.verify_expectations! Hbc::FakeSystemCommand.verify_expectations!
ensure ensure
Hbc::FakeSystemCommand.clear Hbc::FakeSystemCommand.clear
end end
end
module MiniTest
class Spec
include FakeSystemCommandHooks
end end
end end

View File

@ -1,10 +1,42 @@
module InstallHelper module InstallHelper
class << self module_function
def install_without_artifacts(cask)
require "test/support/helper/shutup"
extend Test::Helper::Shutup
def self.install_without_artifacts(cask)
Hbc::Installer.new(cask).tap do |i| Hbc::Installer.new(cask).tap do |i|
shutup do
i.download i.download
i.extract_primary_container i.extract_primary_container
end end
end 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 end

View File

@ -1,3 +1,5 @@
require "hbc/system_command"
module Hbc module Hbc
class NeverSudoSystemCommand < SystemCommand class NeverSudoSystemCommand < SystemCommand
def self.run(command, options = {}) def self.run(command, options = {})

View File

@ -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

View File

@ -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) { let(:fake_pathname_exists) {
fake_pathname = Pathname("/path/to/file/that/exists") fake_pathname = Pathname.new("/path/to/file/that/exists")
fake_pathname.stubs(exist?: true, expand_path: fake_pathname) allow(fake_pathname).to receive(:exist?).and_return(true)
allow(fake_pathname).to receive(:expand_path).and_return(fake_pathname)
fake_pathname fake_pathname
} }
let(:fake_pathname_does_not_exist) { let(:fake_pathname_does_not_exist) {
fake_pathname = Pathname("/path/to/file/that/does/not/exist") fake_pathname = Pathname.new("/path/to/file/that/does/not/exist")
fake_pathname.stubs(exist?: false, expand_path: fake_pathname) allow(fake_pathname).to receive(:exist?).and_return(false)
allow(fake_pathname).to receive(:expand_path).and_return(fake_pathname)
fake_pathname fake_pathname
} }
@ -17,93 +21,123 @@ shared_examples_for Hbc::Staged do
Hbc::FakeSystemCommand.expects_command( Hbc::FakeSystemCommand.expects_command(
["echo", "homebrew-cask", "rocks!"] ["echo", "homebrew-cask", "rocks!"]
) )
shutup do
staged.system_command("echo", args: ["homebrew-cask", "rocks!"]) staged.system_command("echo", args: ["homebrew-cask", "rocks!"])
end end
end
it "can get the Info.plist file for the primary app" do 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 end
it "can execute commands on the Info.plist file" do 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( Hbc::FakeSystemCommand.expects_command(
["/usr/libexec/PlistBuddy", "-c", "Print CFBundleIdentifier", staged.info_plist_file] ["/usr/libexec/PlistBuddy", "-c", "Print CFBundleIdentifier", staged.info_plist_file]
) )
shutup do
staged.plist_exec("Print CFBundleIdentifier") staged.plist_exec("Print CFBundleIdentifier")
end end
end
it "can set a key in the Info.plist file" do 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( Hbc::FakeSystemCommand.expects_command(
["/usr/libexec/PlistBuddy", "-c", "Set :JVMOptions:JVMVersion 1.6+", staged.info_plist_file] ["/usr/libexec/PlistBuddy", "-c", "Set :JVMOptions:JVMVersion 1.6+", staged.info_plist_file]
) )
shutup do
staged.plist_set(":JVMOptions:JVMVersion", "1.6+") staged.plist_set(":JVMOptions:JVMVersion", "1.6+")
end end
end
it "can set the permissions of a file" do it "can set the permissions of a file" do
fake_pathname = fake_pathname_exists fake_pathname = fake_pathname_exists
staged.stubs(Pathname: fake_pathname) allow(staged).to receive(:Pathname).and_return(fake_pathname)
Hbc::FakeSystemCommand.expects_command( Hbc::FakeSystemCommand.expects_command(
["/bin/chmod", "-R", "--", "777", fake_pathname] ["/bin/chmod", "-R", "--", "777", fake_pathname]
) )
shutup do
staged.set_permissions(fake_pathname.to_s, "777") staged.set_permissions(fake_pathname.to_s, "777")
end end
end
it "can set the permissions of multiple files" do it "can set the permissions of multiple files" do
fake_pathname = fake_pathname_exists fake_pathname = fake_pathname_exists
staged.stubs(:Pathname).returns(fake_pathname) allow(staged).to receive(:Pathname).and_return(fake_pathname)
Hbc::FakeSystemCommand.expects_command( Hbc::FakeSystemCommand.expects_command(
["/bin/chmod", "-R", "--", "777", fake_pathname, fake_pathname] ["/bin/chmod", "-R", "--", "777", fake_pathname, fake_pathname]
) )
shutup do
staged.set_permissions([fake_pathname.to_s, fake_pathname.to_s], "777") staged.set_permissions([fake_pathname.to_s, fake_pathname.to_s], "777")
end end
end
it "cannot set the permissions of a file that does not exist" do it "cannot set the permissions of a file that does not exist" do
fake_pathname = fake_pathname_does_not_exist 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") staged.set_permissions(fake_pathname.to_s, "777")
end end
it "can set the ownership of a file" do it "can set the ownership of a file" do
staged.stubs(current_user: "fake_user")
fake_pathname = fake_pathname_exists 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( Hbc::FakeSystemCommand.expects_command(
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "fake_user:staff", fake_pathname] ["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "fake_user:staff", fake_pathname]
) )
shutup do
staged.set_ownership(fake_pathname.to_s) staged.set_ownership(fake_pathname.to_s)
end end
end
it "can set the ownership of multiple files" do it "can set the ownership of multiple files" do
staged.stubs(current_user: "fake_user")
fake_pathname = fake_pathname_exists 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( Hbc::FakeSystemCommand.expects_command(
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "fake_user:staff", fake_pathname, fake_pathname] ["/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]) staged.set_ownership([fake_pathname.to_s, fake_pathname.to_s])
end end
end
it "can set the ownership of a file with a different user and group" do it "can set the ownership of a file with a different user and group" do
fake_pathname = fake_pathname_exists fake_pathname = fake_pathname_exists
staged.stubs(Pathname: fake_pathname)
allow(staged).to receive(:Pathname).and_return(fake_pathname)
Hbc::FakeSystemCommand.expects_command( Hbc::FakeSystemCommand.expects_command(
["/usr/bin/sudo", "-E", "--", "/usr/sbin/chown", "-R", "--", "other_user:other_group", fake_pathname] ["/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") staged.set_ownership(fake_pathname.to_s, user: "other_user", group: "other_group")
end end
end
it "cannot set the ownership of a file that does not exist" do 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 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) staged.set_ownership(fake_pathname.to_s)
end end
end
end end

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"