From d8e515004c68b82532401a26ae0d6a4f27844d91 Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Wed, 8 Feb 2017 10:45:25 +0100 Subject: [PATCH] Convert DSL test to spec. --- Library/Homebrew/cask/spec/cask/dsl_spec.rb | 548 ++++++++++++++++++++ Library/Homebrew/cask/test/cask/dsl_test.rb | 479 ----------------- 2 files changed, 548 insertions(+), 479 deletions(-) create mode 100644 Library/Homebrew/cask/spec/cask/dsl_spec.rb delete mode 100644 Library/Homebrew/cask/test/cask/dsl_test.rb 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 0000000000..99525cc205 --- /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 cdd06a8364..0000000000 --- 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