Convert DSL test to spec.
This commit is contained in:
parent
8155d27e5c
commit
d8e515004c
548
Library/Homebrew/cask/spec/cask/dsl_spec.rb
Normal file
548
Library/Homebrew/cask/spec/cask/dsl_spec.rb
Normal file
@ -0,0 +1,548 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe Hbc::DSL do
|
||||
let(:cask) { Hbc::CaskLoader.load_from_file(TEST_FIXTURE_DIR/"cask/Casks/#{token}.rb") }
|
||||
let(:token) { "basic-cask" }
|
||||
|
||||
context "stanzas" do
|
||||
it "lets you set url, homepage, and version" do
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
|
||||
describe "when a Cask includes an unknown method" do
|
||||
let(:attempt_unknown_method) {
|
||||
lambda do
|
||||
Hbc::Cask.new("unexpected-method-cask") do
|
||||
future_feature :not_yet_on_your_machine
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
it "prints a warning that it has encountered an unexpected method" do
|
||||
expected = Regexp.compile(<<-EOS.undent.lines.map(&:chomp).join(""))
|
||||
(?m)
|
||||
Warning:
|
||||
.*
|
||||
Unexpected method 'future_feature' called on Cask unexpected-method-cask\\.
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask/blob/master/doc/reporting_bugs/pre_bug_report.md
|
||||
.*
|
||||
https://github.com/caskroom/homebrew-cask#reporting-bugs
|
||||
EOS
|
||||
|
||||
expect {
|
||||
expect(attempt_unknown_method).not_to output.to_stdout
|
||||
}.to output(expected).to_stderr
|
||||
end
|
||||
|
||||
it "will simply warn, not throw an exception" do
|
||||
expect {
|
||||
shutup do
|
||||
attempt_unknown_method.call
|
||||
end
|
||||
}.not_to raise_error
|
||||
end
|
||||
end
|
||||
|
||||
describe "header line" do
|
||||
context "when invalid" do
|
||||
let(:token) { "invalid/invalid-header-format" }
|
||||
it "raises an error" do
|
||||
expect { cask }.to raise_error(SyntaxError)
|
||||
end
|
||||
end
|
||||
|
||||
context "when token does not match the file name" do
|
||||
let(:token) { "invalid/invalid-header-token-mismatch" }
|
||||
|
||||
it "raises an error" do
|
||||
expect {
|
||||
cask
|
||||
}.to raise_error(Hbc::CaskTokenDoesNotMatchError, /Bad header line:.*does not match file name/)
|
||||
end
|
||||
end
|
||||
|
||||
context "when it contains no DSL version" do
|
||||
let(:token) { "no-dsl-version" }
|
||||
|
||||
it "does not require a DSL version in the header" do
|
||||
expect(cask.token).to eq("no-dsl-version")
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
|
||||
context "when it contains a deprecated DSL version" do
|
||||
let(:token) { "with-dsl-version" }
|
||||
|
||||
it "may use deprecated DSL version hash syntax" do
|
||||
allow(ENV).to receive(:[]).with("HOMEBREW_DEVELOPER").and_return(nil)
|
||||
|
||||
shutup do
|
||||
expect(cask.token).to eq("with-dsl-version")
|
||||
expect(cask.url.to_s).to eq("http://example.com/TestCask.dmg")
|
||||
expect(cask.homepage).to eq("http://example.com/")
|
||||
expect(cask.version.to_s).to eq("1.2.3")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "name stanza" do
|
||||
it "lets you set the full name via a name stanza" do
|
||||
cask = Hbc::Cask.new("name-cask") do
|
||||
name "Proper Name"
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
])
|
||||
end
|
||||
|
||||
it "Accepts an array value to the name stanza" do
|
||||
cask = Hbc::Cask.new("array-name-cask") do
|
||||
name ["Proper Name", "Alternate Name"]
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
])
|
||||
end
|
||||
|
||||
it "Accepts multiple name stanzas" do
|
||||
cask = Hbc::Cask.new("multi-name-cask") do
|
||||
name "Proper Name"
|
||||
name "Alternate Name"
|
||||
end
|
||||
|
||||
expect(cask.name).to eq([
|
||||
"Proper Name",
|
||||
"Alternate Name",
|
||||
])
|
||||
end
|
||||
end
|
||||
|
||||
describe "sha256 stanza" do
|
||||
it "lets you set checksum via sha256" do
|
||||
cask = Hbc::Cask.new("checksum-cask") do
|
||||
sha256 "imasha2"
|
||||
end
|
||||
|
||||
expect(cask.sha256).to eq("imasha2")
|
||||
end
|
||||
end
|
||||
|
||||
describe "language stanza" do
|
||||
it "allows multilingual casks" do
|
||||
cask = lambda do
|
||||
Hbc::Cask.new("cask-with-apps") do
|
||||
language "zh" do
|
||||
sha256 "abc123"
|
||||
"zh-CN"
|
||||
end
|
||||
|
||||
language "en-US", default: true do
|
||||
sha256 "xyz789"
|
||||
"en-US"
|
||||
end
|
||||
|
||||
url "https://example.org/#{language}.zip"
|
||||
end
|
||||
end
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["zh"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["zh-XX"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["en"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX", "zh", "en"])
|
||||
expect(cask.call.language).to eq("zh-CN")
|
||||
expect(cask.call.sha256).to eq("abc123")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/zh-CN.zip")
|
||||
|
||||
allow(MacOS).to receive(:languages).and_return(["xx-XX", "en-US", "zh"])
|
||||
expect(cask.call.language).to eq("en-US")
|
||||
expect(cask.call.sha256).to eq("xyz789")
|
||||
expect(cask.call.url.to_s).to eq("https://example.org/en-US.zip")
|
||||
end
|
||||
end
|
||||
|
||||
describe "app stanza" do
|
||||
it "allows you to specify app stanzas" do
|
||||
cask = Hbc::Cask.new("cask-with-apps") do
|
||||
app "Foo.app"
|
||||
app "Bar.app"
|
||||
end
|
||||
|
||||
expect(Array(cask.artifacts[:app])).to eq([["Foo.app"], ["Bar.app"]])
|
||||
end
|
||||
|
||||
it "allow app stanzas to be empty" do
|
||||
cask = Hbc::Cask.new("cask-with-no-apps")
|
||||
expect(Array(cask.artifacts[:app])).to eq([])
|
||||
end
|
||||
end
|
||||
|
||||
describe "caveats stanza" do
|
||||
it "allows caveats to be specified via a method define" do
|
||||
cask = Hbc::Cask.new("plain-cask")
|
||||
|
||||
expect(cask.caveats).to be_empty
|
||||
|
||||
cask = Hbc::Cask.new("cask-with-caveats") do
|
||||
def caveats; <<-EOS.undent
|
||||
When you install this Cask, you probably want to know this.
|
||||
EOS
|
||||
end
|
||||
end
|
||||
|
||||
expect(cask.caveats).to eq("When you install this Cask, you probably want to know this.\n")
|
||||
end
|
||||
end
|
||||
|
||||
describe "pkg stanza" do
|
||||
it "allows installable pkgs to be specified" do
|
||||
cask = Hbc::Cask.new("cask-with-pkgs") do
|
||||
pkg "Foo.pkg"
|
||||
pkg "Bar.pkg"
|
||||
end
|
||||
|
||||
expect(Array(cask.artifacts[:pkg])).to eq([["Foo.pkg"], ["Bar.pkg"]])
|
||||
end
|
||||
end
|
||||
|
||||
describe "url stanza" do
|
||||
let(:token) { "invalid/invalid-two-url" }
|
||||
|
||||
it "prevents defining multiple urls" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'url' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "homepage stanza" do
|
||||
let(:token) { "invalid/invalid-two-homepage" }
|
||||
|
||||
it "prevents defining multiple homepages" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'homepage' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "version stanza" do
|
||||
let(:token) { "invalid/invalid-two-version" }
|
||||
it "prevents defining multiple versions" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'version' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
describe "appcast stanza" do
|
||||
let(:token) { "with-appcast" }
|
||||
|
||||
it "allows appcasts to be specified" do
|
||||
expect(cask.appcast.to_s).to match(/^http/)
|
||||
end
|
||||
|
||||
context "when multiple appcasts are defined" do
|
||||
let(:token) { "invalid/invalid-appcast-multiple" }
|
||||
|
||||
it "raises an error" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'appcast' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
context "when appcast URL is invalid" do
|
||||
let(:token) { "invalid/invalid-appcast-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "GPG stanza" do
|
||||
context "valid" do
|
||||
let(:token) { "with-gpg" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.gpg.to_s).to match(/\S/)
|
||||
end
|
||||
end
|
||||
|
||||
context "with :key_url" do
|
||||
let(:token) { "with-gpg-key-url" }
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.gpg.to_s).to match(/\S/)
|
||||
end
|
||||
end
|
||||
|
||||
context "specifying mmultiple times" do
|
||||
let(:token) { "invalid/invalid-gpg-multiple-stanzas" }
|
||||
|
||||
it "is not allowed" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza may only appear once/)
|
||||
end
|
||||
end
|
||||
|
||||
context "missing GPG key parameters" do
|
||||
let(:token) { "invalid/invalid-gpg-missing-key" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza must include exactly one/)
|
||||
end
|
||||
end
|
||||
|
||||
context "conflicting GPG key parameters" do
|
||||
let(:token) { "invalid/invalid-gpg-conflicting-keys" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'gpg' stanza must include exactly one/)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG signature URLs" do
|
||||
let(:token) { "invalid/invalid-gpg-signature-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG key URLs" do
|
||||
let(:token) { "invalid/invalid-gpg-key-url" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid GPG key IDs" do
|
||||
let(:token) { "invalid/invalid-gpg-key-id" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "GPG parameter is unknown" do
|
||||
let(:token) { "invalid/invalid-gpg-parameter" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on stanza" do
|
||||
let(:token) { "invalid/invalid-depends-on-key" }
|
||||
|
||||
it "refuses to load with an invalid depends_on key" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on formula" do
|
||||
context "with one Formula" do
|
||||
let(:token) { "with-depends-on-formula" }
|
||||
|
||||
it "allows depends_on formula to be specified" do
|
||||
expect(cask.depends_on.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "with multiple Formulae" do
|
||||
let(:token) { "with-depends-on-formula-multiple" }
|
||||
|
||||
it "allows multiple depends_on formula to be specified" do
|
||||
expect(cask.depends_on.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on cask" do
|
||||
context "specifying one" do
|
||||
let(:token) { "with-depends-on-cask" }
|
||||
it "is allowed" do
|
||||
expect(cask.depends_on.cask).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "specifying multiple" do
|
||||
let(:token) { "with-depends-on-cask-multiple" }
|
||||
|
||||
it "is allowed" do
|
||||
expect(cask.depends_on.cask).not_to be nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on macos" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-macos-string" }
|
||||
|
||||
it "allows depends_on macos to be specified" do
|
||||
expect(cask.depends_on.macos).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on macos value" do
|
||||
let(:token) { "invalid/invalid-depends-on-macos-bad-release" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
|
||||
context "conflicting depends_on macos forms" do
|
||||
let(:token) { "invalid/invalid-depends-on-macos-conflicting-forms" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on arch" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-arch" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.depends_on.arch).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on arch value" do
|
||||
let(:token) { "invalid/invalid-depends-on-arch-value" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "depends_on x11" do
|
||||
context "valid" do
|
||||
let(:token) { "with-depends-on-x11" }
|
||||
|
||||
it "is allowed to be specified" do
|
||||
expect(cask.depends_on.x11).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid depends_on x11 value" do
|
||||
let(:token) { "invalid/invalid-depends-on-x11-value" }
|
||||
|
||||
it "refuses to load" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "conflicts_with stanza" do
|
||||
context "valid" do
|
||||
let(:token) { "with-conflicts-with" }
|
||||
|
||||
it "allows conflicts_with stanza to be specified" do
|
||||
expect(cask.conflicts_with.formula).not_to be nil
|
||||
end
|
||||
end
|
||||
|
||||
context "invalid conflicts_with key" do
|
||||
let(:token) { "invalid/invalid-conflicts-with-key" }
|
||||
|
||||
it "refuses to load invalid conflicts_with key" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "installer stanza" do
|
||||
context "script" do
|
||||
let(:token) { "with-installer-script" }
|
||||
|
||||
it "allows installer script to be specified" do
|
||||
expect(cask.artifacts[:installer].first.script[:executable]).to eq("/usr/bin/true")
|
||||
expect(cask.artifacts[:installer].first.script[:args]).to eq(["--flag"])
|
||||
expect(cask.artifacts[:installer].to_a[1].script[:executable]).to eq("/usr/bin/false")
|
||||
expect(cask.artifacts[:installer].to_a[1].script[:args]).to eq(["--flag"])
|
||||
end
|
||||
end
|
||||
|
||||
context "manual" do
|
||||
let(:token) { "with-installer-manual" }
|
||||
|
||||
it "allows installer manual to be specified" do
|
||||
expect(cask.artifacts[:installer].first.manual).to eq("Caffeine.app")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "stage_only stanza" do
|
||||
context "when there is no other activatable artifact" do
|
||||
let(:token) { "stage-only" }
|
||||
|
||||
it "allows stage_only stanza to be specified" do
|
||||
expect(cask.artifacts[:stage_only].first).to eq([true])
|
||||
end
|
||||
end
|
||||
|
||||
context "when there is are activatable artifacts" do
|
||||
let(:token) { "invalid/invalid-stage-only-conflict" }
|
||||
|
||||
it "prevents specifying stage_only" do
|
||||
expect { cask }.to raise_error(Hbc::CaskInvalidError, /'stage_only' must be the only activatable artifact/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "auto_updates stanza" do
|
||||
let(:token) { "auto-updates" }
|
||||
|
||||
it "allows auto_updates stanza to be specified" do
|
||||
expect(cask.auto_updates).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe "appdir" do
|
||||
context "interpolation of the appdir in stanzas" do
|
||||
let(:token) { "appdir-interpolation" }
|
||||
|
||||
it "is allowed" do
|
||||
expect(cask.artifacts[:binary].first).to eq(["#{Hbc.appdir}/some/path"])
|
||||
end
|
||||
end
|
||||
|
||||
it "does not include a trailing slash" do
|
||||
begin
|
||||
original_appdir = Hbc.appdir
|
||||
Hbc.appdir = "#{original_appdir}/"
|
||||
|
||||
cask = Hbc::Cask.new("appdir-trailing-slash") do
|
||||
binary "#{appdir}/some/path"
|
||||
end
|
||||
|
||||
expect(cask.artifacts[:binary].first).to eq(["#{original_appdir}/some/path"])
|
||||
ensure
|
||||
Hbc.appdir = original_appdir
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,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
|
||||
Loading…
x
Reference in New Issue
Block a user