aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorMarkus Reiter2017-02-08 10:45:25 +0100
committerMarkus Reiter2017-02-10 17:19:19 +0100
commitd8e515004c68b82532401a26ae0d6a4f27844d91 (patch)
treee48f4809d73f048241221334d39ef6536adde5e2 /Library
parent8155d27e5c11f9d0adfbb6c911d1c5d6b479aa53 (diff)
downloadbrew-d8e515004c68b82532401a26ae0d6a4f27844d91.tar.bz2
Convert DSL test to spec.
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/cask/spec/cask/dsl_spec.rb548
-rw-r--r--Library/Homebrew/cask/test/cask/dsl_test.rb479
2 files changed, 548 insertions, 479 deletions
diff --git a/Library/Homebrew/cask/spec/cask/dsl_spec.rb b/Library/Homebrew/cask/spec/cask/dsl_spec.rb
new file mode 100644
index 000000000..99525cc20
--- /dev/null
+++ b/Library/Homebrew/cask/spec/cask/dsl_spec.rb
@@ -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
diff --git a/Library/Homebrew/cask/test/cask/dsl_test.rb b/Library/Homebrew/cask/test/cask/dsl_test.rb
deleted file mode 100644
index cdd06a836..000000000
--- a/Library/Homebrew/cask/test/cask/dsl_test.rb
+++ /dev/null
@@ -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