mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

This adds support for Cask old tokens used for renames of Casks. We'll now correctly check these at installation time to avoid repeatedly installing renamed Casks and dump them in the Brewfile. We also use this logic to avoid cleaning up renamed Casks.
145 lines
4.5 KiB
Ruby
145 lines
4.5 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
require "bundle"
|
||
require "bundle/cask_dumper"
|
||
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
|
||
|
||
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
|
||
|
||
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
|