Convert DSL test to spec.

This commit is contained in:
Markus Reiter 2017-02-08 10:45:25 +01:00
parent 8155d27e5c
commit d8e515004c
2 changed files with 548 additions and 479 deletions

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