
Co-authored-by: Patrick Linnane <patrick@linnane.io> Co-authored-by: Carlo Cabrera <github@carlo.cab> Co-authored-by: Thierry Moisan <thierry.moisan@gmail.com> Co-authored-by: Mike McQuaid <mike@mikemcquaid.com>
165 lines
6.6 KiB
Ruby
165 lines
6.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "bundle"
|
|
require "bundle/cask_dumper"
|
|
require "bundle/cask_installer"
|
|
|
|
RSpec.describe Homebrew::Bundle::CaskInstaller do
|
|
describe ".installed_casks" do
|
|
before do
|
|
Homebrew::Bundle::CaskDumper.reset!
|
|
end
|
|
|
|
it "shells out" do
|
|
expect { described_class.installed_casks }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
describe ".cask_installed_and_up_to_date?" do
|
|
it "returns result" do
|
|
described_class.reset!
|
|
allow(described_class).to receive_messages(installed_casks: ["foo", "baz"],
|
|
outdated_casks: ["baz"])
|
|
expect(described_class.cask_installed_and_up_to_date?("foo")).to be(true)
|
|
expect(described_class.cask_installed_and_up_to_date?("baz")).to be(false)
|
|
end
|
|
end
|
|
|
|
context "when brew-cask is not installed" do
|
|
describe ".outdated_casks" do
|
|
it "returns empty array" do
|
|
described_class.reset!
|
|
expect(described_class.outdated_casks).to eql([])
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when brew-cask is installed" do
|
|
before do
|
|
Homebrew::Bundle::CaskDumper.reset!
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
|
|
end
|
|
|
|
describe ".outdated_casks" do
|
|
it "returns empty array" do
|
|
described_class.reset!
|
|
expect(described_class.outdated_casks).to eql([])
|
|
end
|
|
end
|
|
|
|
context "when cask is installed" do
|
|
before do
|
|
Homebrew::Bundle::CaskDumper.reset!
|
|
allow(described_class).to receive(:installed_casks).and_return(["google-chrome"])
|
|
end
|
|
|
|
it "skips" do
|
|
expect(Homebrew::Bundle).not_to receive(:system)
|
|
expect(described_class.preinstall!("google-chrome")).to be(false)
|
|
end
|
|
end
|
|
|
|
context "when cask is outdated" do
|
|
before do
|
|
allow(described_class).to receive_messages(installed_casks: ["google-chrome"],
|
|
outdated_casks: ["google-chrome"])
|
|
end
|
|
|
|
it "upgrades" do
|
|
expect(Homebrew::Bundle).to \
|
|
receive(:system).with(HOMEBREW_BREW_FILE, "upgrade", "--cask", "google-chrome", verbose: false)
|
|
.and_return(true)
|
|
expect(described_class.preinstall!("google-chrome")).to be(true)
|
|
expect(described_class.install!("google-chrome")).to be(true)
|
|
end
|
|
end
|
|
|
|
context "when cask is outdated and uses auto-update" do
|
|
before do
|
|
described_class.reset!
|
|
allow(Homebrew::Bundle::CaskDumper).to receive_messages(cask_names: ["opera"], outdated_cask_names: [])
|
|
allow(Homebrew::Bundle::CaskDumper).to receive(:cask_is_outdated_using_greedy?).with("opera").and_return(true)
|
|
end
|
|
|
|
it "upgrades" do
|
|
expect(Homebrew::Bundle).to \
|
|
receive(:system).with(HOMEBREW_BREW_FILE, "upgrade", "--cask", "opera", verbose: false)
|
|
.and_return(true)
|
|
expect(described_class.preinstall!("opera", greedy: true)).to be(true)
|
|
expect(described_class.install!("opera", greedy: true)).to be(true)
|
|
end
|
|
end
|
|
|
|
context "when cask is not installed" do
|
|
before do
|
|
allow(described_class).to receive(:installed_casks).and_return([])
|
|
end
|
|
|
|
it "installs cask" do
|
|
expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "google-chrome", "--adopt",
|
|
verbose: false)
|
|
.and_return(true)
|
|
expect(described_class.preinstall!("google-chrome")).to be(true)
|
|
expect(described_class.install!("google-chrome")).to be(true)
|
|
end
|
|
|
|
it "installs cask with arguments" do
|
|
expect(Homebrew::Bundle).to(
|
|
receive(:brew).with("install", "--cask", "firefox", "--appdir=/Applications", "--adopt",
|
|
verbose: false)
|
|
.and_return(true),
|
|
)
|
|
expect(described_class.preinstall!("firefox", args: { appdir: "/Applications" })).to be(true)
|
|
expect(described_class.install!("firefox", args: { appdir: "/Applications" })).to be(true)
|
|
end
|
|
|
|
it "reports a failure" do
|
|
expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "google-chrome", "--adopt",
|
|
verbose: false)
|
|
.and_return(false)
|
|
expect(described_class.preinstall!("google-chrome")).to be(true)
|
|
expect(described_class.install!("google-chrome")).to be(false)
|
|
end
|
|
|
|
context "with boolean arguments" do
|
|
it "includes a flag if true" do
|
|
expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "iterm", "--force",
|
|
verbose: false)
|
|
.and_return(true)
|
|
expect(described_class.preinstall!("iterm", args: { force: true })).to be(true)
|
|
expect(described_class.install!("iterm", args: { force: true })).to be(true)
|
|
end
|
|
|
|
it "does not include a flag if false" do
|
|
expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "iterm", "--adopt", verbose: false)
|
|
.and_return(true)
|
|
expect(described_class.preinstall!("iterm", args: { force: false })).to be(true)
|
|
expect(described_class.install!("iterm", args: { force: false })).to be(true)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when the postinstall option is provided" do
|
|
before do
|
|
Homebrew::Bundle::CaskDumper.reset!
|
|
allow(Homebrew::Bundle::CaskDumper).to receive_messages(cask_names: ["google-chrome"],
|
|
outdated_cask_names: ["google-chrome"])
|
|
allow(Homebrew::Bundle).to receive(:brew).and_return(true)
|
|
allow(described_class).to receive(:upgrading?).and_return(true)
|
|
end
|
|
|
|
it "runs the postinstall command" do
|
|
expect(Kernel).to receive(:system).with("custom command").and_return(true)
|
|
expect(described_class.preinstall!("google-chrome", postinstall: "custom command")).to be(true)
|
|
expect(described_class.install!("google-chrome", postinstall: "custom command")).to be(true)
|
|
end
|
|
|
|
it "reports a failure when postinstall fails" do
|
|
expect(Kernel).to receive(:system).with("custom command").and_return(false)
|
|
expect(described_class.preinstall!("google-chrome", postinstall: "custom command")).to be(true)
|
|
expect(described_class.install!("google-chrome", postinstall: "custom command")).to be(false)
|
|
end
|
|
end
|
|
end
|
|
end
|