2025-03-18 17:38:37 +00:00
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
require "bundle"
|
2025-03-24 21:55:47 +08:00
|
|
|
|
require "bundle/cask_dumper"
|
2025-03-18 17:38:37 +00:00
|
|
|
|
require "cask"
|
|
|
|
|
|
|
|
|
|
RSpec.describe Homebrew::Bundle::CaskDumper do
|
|
|
|
|
subject(:dumper) { described_class }
|
|
|
|
|
|
|
|
|
|
context "when brew-cask is not installed" do
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(false)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns empty list" do
|
|
|
|
|
expect(dumper.cask_names).to be_empty
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "dumps as empty string" do
|
|
|
|
|
expect(dumper.dump).to eql("")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
context "when there is no cask" do
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
|
|
|
|
|
allow(described_class).to receive(:`).and_return("")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns empty list" do
|
|
|
|
|
expect(dumper.cask_names).to be_empty
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "dumps as empty string" do
|
|
|
|
|
expect(dumper.dump).to eql("")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "doesn’t want to greedily update a non-installed cask" do
|
|
|
|
|
expect(dumper.cask_is_outdated_using_greedy?("foo")).to be(false)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
context "when casks `foo`, `bar` and `baz` are installed, with `baz` being a formula requirement" do
|
|
|
|
|
let(:foo) { instance_double(Cask::Cask, to_s: "foo", desc: nil, config: nil) }
|
|
|
|
|
let(:baz) { instance_double(Cask::Cask, to_s: "baz", desc: "Software", config: nil) }
|
|
|
|
|
let(:bar) do
|
|
|
|
|
instance_double(
|
|
|
|
|
Cask::Cask, to_s: "bar",
|
|
|
|
|
desc: nil,
|
|
|
|
|
config: instance_double(
|
|
|
|
|
Cask::Config,
|
|
|
|
|
explicit: {
|
|
|
|
|
fontdir: "/Library/Fonts",
|
|
|
|
|
languages: ["zh-TW"],
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
|
|
|
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
|
|
|
|
|
allow(Cask::Caskroom).to receive(:casks).and_return([foo, bar, baz])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns list %w[foo bar baz]" do
|
|
|
|
|
expect(dumper.cask_names).to eql(%w[foo bar baz])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "dumps as `cask 'baz'` and `cask 'foo' cask 'bar'` plus descriptions and config values" do
|
|
|
|
|
expected = <<~EOS
|
|
|
|
|
cask "foo"
|
|
|
|
|
cask "bar", args: { fontdir: "/Library/Fonts", language: "zh-TW" }
|
|
|
|
|
# Software
|
|
|
|
|
cask "baz"
|
|
|
|
|
EOS
|
|
|
|
|
expect(dumper.dump(describe: true)).to eql(expected.chomp)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "doesn’t want to greedily update a non-installed cask" do
|
|
|
|
|
expect(dumper.cask_is_outdated_using_greedy?("qux")).to be(false)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "wants to greedily update foo if there is an update available" do
|
|
|
|
|
expect(foo).to receive(:outdated?).with(greedy: true).and_return(true)
|
|
|
|
|
expect(dumper.cask_is_outdated_using_greedy?("foo")).to be(true)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "does not want to greedily update bar if there is no update available" do
|
|
|
|
|
expect(bar).to receive(:outdated?).with(greedy: true).and_return(false)
|
|
|
|
|
expect(dumper.cask_is_outdated_using_greedy?("bar")).to be(false)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2025-07-10 08:05:36 +00:00
|
|
|
|
describe "#cask_oldnames" do
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns an empty string when no casks are installed" do
|
|
|
|
|
expect(dumper.cask_oldnames).to eql({})
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns a hash with installed casks old names" do
|
|
|
|
|
foo = instance_double(Cask::Cask, to_s: "foo", old_tokens: ["oldfoo"], full_name: "qux/quuz/foo")
|
|
|
|
|
bar = instance_double(Cask::Cask, to_s: "bar", old_tokens: [], full_name: "bar")
|
|
|
|
|
allow(Cask::Caskroom).to receive(:casks).and_return([foo, bar])
|
|
|
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
|
|
|
|
|
expect(dumper.cask_oldnames).to eql({
|
|
|
|
|
"qux/quuz/oldfoo" => "qux/quuz/foo",
|
|
|
|
|
"oldfoo" => "qux/quuz/foo",
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2025-03-18 17:38:37 +00:00
|
|
|
|
describe "#formula_dependencies" do
|
|
|
|
|
context "when the given casks don't have formula dependencies" do
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns an empty array" do
|
|
|
|
|
expect(dumper.formula_dependencies(["foo"])).to eql([])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
context "when multiple casks have the same dependency" do
|
|
|
|
|
before do
|
|
|
|
|
described_class.reset!
|
|
|
|
|
foo = instance_double(Cask::Cask, to_s: "foo", depends_on: { formula: ["baz", "qux"] })
|
|
|
|
|
bar = instance_double(Cask::Cask, to_s: "bar", depends_on: {})
|
|
|
|
|
allow(Cask::Caskroom).to receive(:casks).and_return([foo, bar])
|
|
|
|
|
allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it "returns an array of unique formula dependencies" do
|
|
|
|
|
expect(dumper.formula_dependencies(["foo", "bar"])).to eql(["baz", "qux"])
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|