| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  | describe Cask::DSL, :cask do | 
					
						
							|  |  |  |   let(:cask) { Cask::CaskLoader.load(cask_path(token.to_s)) } | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |   let(:token) { "basic-cask" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   context "stanzas" do | 
					
						
							|  |  |  |     it "lets you set url, homepage, and version" do | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |       expect(cask.url.to_s).to eq("https://brew.sh/TestCask.dmg") | 
					
						
							|  |  |  |       expect(cask.homepage).to eq("https://brew.sh/") | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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) { | 
					
						
							| 
									
										
										
										
											2019-10-03 08:50:45 +02:00
										 |  |  |       Cask::Cask.new("unexpected-method-cask") do | 
					
						
							|  |  |  |         future_feature :not_yet_on_your_machine | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prints a warning that it has encountered an unexpected method" do | 
					
						
							| 
									
										
										
										
											2018-06-14 22:48:37 +02:00
										 |  |  |       expected = Regexp.compile(<<~EOS.lines.map(&:chomp).join) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         (?m) | 
					
						
							|  |  |  |         Warning: | 
					
						
							|  |  |  |         .* | 
					
						
							|  |  |  |         Unexpected method 'future_feature' called on Cask unexpected-method-cask\\. | 
					
						
							|  |  |  |         .* | 
					
						
							| 
									
										
										
										
											2018-05-25 18:03:16 +02:00
										 |  |  |         https://github.com/Homebrew/homebrew-cask#reporting-bugs | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect { | 
					
						
							| 
									
										
										
										
											2019-10-03 08:50:45 +02:00
										 |  |  |         expect { attempt_unknown_method }.not_to output.to_stdout | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       }.to output(expected).to_stderr | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "will simply warn, not throw an exception" do | 
					
						
							|  |  |  |       expect { | 
					
						
							| 
									
										
										
										
											2019-10-03 08:50:45 +02:00
										 |  |  |         attempt_unknown_method | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       }.not_to raise_error | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "header line" do | 
					
						
							|  |  |  |     context "when invalid" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-header-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       it "raises an error" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskUnreadableError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         }.to raise_error(Cask::CaskTokenMismatchError, /header line does not match the file name/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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") | 
					
						
							| 
									
										
										
										
											2018-11-28 20:51:55 +01:00
										 |  |  |         expect(cask.url.to_s).to eq("https://brew.sh/TestCask.dmg") | 
					
						
							|  |  |  |         expect(cask.homepage).to eq("https://brew.sh/") | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  |         expect(cask.version.to_s).to eq("1.2.3") | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "name stanza" do | 
					
						
							|  |  |  |     it "lets you set the full name via a name stanza" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("name-cask") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         name "Proper Name" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.name).to eq([ | 
					
						
							|  |  |  |                                 "Proper Name", | 
					
						
							|  |  |  |                               ]) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "Accepts an array value to the name stanza" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("array-name-cask") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         name ["Proper Name", "Alternate Name"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.name).to eq([ | 
					
						
							|  |  |  |                                 "Proper Name", | 
					
						
							|  |  |  |                                 "Alternate Name", | 
					
						
							|  |  |  |                               ]) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "Accepts multiple name stanzas" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("multi-name-cask") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         name "Proper Name" | 
					
						
							|  |  |  |         name "Alternate Name" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.name).to eq([ | 
					
						
							|  |  |  |                                 "Proper Name", | 
					
						
							|  |  |  |                                 "Alternate Name", | 
					
						
							|  |  |  |                               ]) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-29 15:40:31 +01:00
										 |  |  |   describe "desc stanza" do | 
					
						
							|  |  |  |     it "lets you set the description via a desc stanza" do | 
					
						
							|  |  |  |       cask = Cask::Cask.new("desc-cask") do | 
					
						
							|  |  |  |         desc "The package's description" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.desc).to eq("The package's description") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |   describe "sha256 stanza" do | 
					
						
							|  |  |  |     it "lets you set checksum via sha256" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("checksum-cask") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         sha256 "imasha2" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.sha256).to eq("imasha2") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "language stanza" do | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |     context "when language is set explicitly" do | 
					
						
							|  |  |  |       subject(:cask) { | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         Cask::Cask.new("cask-with-apps") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |           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 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       matcher :be_the_chinese_version do | 
					
						
							|  |  |  |         match do |cask| | 
					
						
							|  |  |  |           expect(cask.language).to eq("zh-CN") | 
					
						
							|  |  |  |           expect(cask.sha256).to eq("abc123") | 
					
						
							|  |  |  |           expect(cask.url.to_s).to eq("https://example.org/zh-CN.zip") | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       matcher :be_the_english_version do | 
					
						
							|  |  |  |         match do |cask| | 
					
						
							|  |  |  |           expect(cask.language).to eq("en-US") | 
					
						
							|  |  |  |           expect(cask.sha256).to eq("xyz789") | 
					
						
							|  |  |  |           expect(cask.url.to_s).to eq("https://example.org/en-US.zip") | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         config = cask.config | 
					
						
							|  |  |  |         config.languages = languages | 
					
						
							|  |  |  |         cask.config = config | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "to 'zh'" do | 
					
						
							|  |  |  |         let(:languages) { ["zh"] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to be_the_chinese_version } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "to 'zh-XX'" do | 
					
						
							|  |  |  |         let(:languages) { ["zh-XX"] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to be_the_chinese_version } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "to 'en'" do | 
					
						
							|  |  |  |         let(:languages) { ["en"] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to be_the_english_version } | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |       context "to 'xx-XX'" do | 
					
						
							|  |  |  |         let(:languages) { ["xx-XX"] } | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |         it { is_expected.to be_the_english_version } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |       context "to 'xx-XX,zh,en'" do | 
					
						
							|  |  |  |         let(:languages) { ["xx-XX", "zh", "en"] } | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |         it { is_expected.to be_the_chinese_version } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |       context "to 'xx-XX,en-US,zh'" do | 
					
						
							|  |  |  |         let(:languages) { ["xx-XX", "en-US", "zh"] } | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 21:28:58 +02:00
										 |  |  |         it { is_expected.to be_the_english_version } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-09-27 00:17:47 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 11:34:50 -07:00
										 |  |  |     it "returns an empty array if no languages are specified" do | 
					
						
							| 
									
										
										
										
											2017-09-27 00:17:47 -07:00
										 |  |  |       cask = lambda do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         Cask::Cask.new("cask-with-apps") do | 
					
						
							| 
									
										
										
										
											2017-09-27 00:17:47 -07:00
										 |  |  |           url "https://example.org/file.zip" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.call.languages).to be_empty | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns an array of available languages" do | 
					
						
							|  |  |  |       cask = lambda do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         Cask::Cask.new("cask-with-apps") do | 
					
						
							| 
									
										
										
										
											2017-09-27 00:17:47 -07:00
										 |  |  |           language "zh" do | 
					
						
							|  |  |  |             sha256 "abc123" | 
					
						
							|  |  |  |             "zh-CN" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           language "en-US", default: true do | 
					
						
							|  |  |  |             sha256 "xyz789" | 
					
						
							|  |  |  |             "en-US" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           url "https://example.org/file.zip" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.call.languages).to eq(["zh", "en-US"]) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "app stanza" do | 
					
						
							|  |  |  |     it "allows you to specify app stanzas" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("cask-with-apps") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         app "Foo.app" | 
					
						
							|  |  |  |         app "Bar.app" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-04 17:54:52 +02:00
										 |  |  |       expect(cask.artifacts.map(&:to_s)).to eq(["Foo.app (App)", "Bar.app (App)"]) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "allow app stanzas to be empty" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("cask-with-no-apps") | 
					
						
							| 
									
										
										
										
											2017-10-04 17:54:52 +02:00
										 |  |  |       expect(cask.artifacts).to be_empty | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "caveats stanza" do | 
					
						
							|  |  |  |     it "allows caveats to be specified via a method define" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("plain-cask") | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.caveats).to be_empty | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("cask-with-caveats") do | 
					
						
							| 
									
										
										
										
											2018-01-17 10:42:43 +00:00
										 |  |  |         def caveats | 
					
						
							|  |  |  |           <<~EOS | 
					
						
							|  |  |  |             When you install this Cask, you probably want to know this. | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |           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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("cask-with-pkgs") do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |         pkg "Foo.pkg" | 
					
						
							|  |  |  |         pkg "Bar.pkg" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-04 17:54:52 +02:00
										 |  |  |       expect(cask.artifacts.map(&:to_s)).to eq(["Foo.pkg (Pkg)", "Bar.pkg (Pkg)"]) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "url stanza" do | 
					
						
							|  |  |  |     let(:token) { "invalid/invalid-two-url" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prevents defining multiple urls" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       expect { cask }.to raise_error(Cask::CaskInvalidError, /'url' stanza may only appear once/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "homepage stanza" do | 
					
						
							|  |  |  |     let(:token) { "invalid/invalid-two-homepage" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prevents defining multiple homepages" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       expect { cask }.to raise_error(Cask::CaskInvalidError, /'homepage' stanza may only appear once/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "version stanza" do | 
					
						
							|  |  |  |     let(:token) { "invalid/invalid-two-version" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     it "prevents defining multiple versions" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       expect { cask }.to raise_error(Cask::CaskInvalidError, /'version' stanza may only appear once/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError, /'appcast' stanza may only appear once/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when appcast URL is invalid" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-appcast-url" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "refuses to load" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     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" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 "invalid depends_on macos value" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-depends-on-macos-bad-release" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "refuses to load" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "conflicting depends_on macos forms" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-depends-on-macos-conflicting-forms" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "refuses to load" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2019-01-27 21:34:24 +01:00
										 |  |  |         expect(cask.conflicts_with[:formula]).to be_empty | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "invalid conflicts_with key" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-conflicts-with-key" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "refuses to load invalid conflicts_with key" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "installer stanza" do | 
					
						
							|  |  |  |     context "script" do | 
					
						
							|  |  |  |       let(:token) { "with-installer-script" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows installer script to be specified" do | 
					
						
							| 
									
										
										
										
											2018-09-17 19:44:12 +02:00
										 |  |  |         expect(cask.artifacts.to_a.first.path).to eq(Pathname("/usr/bin/true")) | 
					
						
							|  |  |  |         expect(cask.artifacts.to_a.first.args[:args]).to eq(["--flag"]) | 
					
						
							|  |  |  |         expect(cask.artifacts.to_a.second.path).to eq(Pathname("/usr/bin/false")) | 
					
						
							|  |  |  |         expect(cask.artifacts.to_a.second.args[:args]).to eq(["--flag"]) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "manual" do | 
					
						
							|  |  |  |       let(:token) { "with-installer-manual" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "allows installer manual to be specified" do | 
					
						
							| 
									
										
										
										
											2017-10-04 17:54:52 +02:00
										 |  |  |         installer = cask.artifacts.first | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect(installer).to be_a(Cask::Artifact::Installer::ManualInstaller) | 
					
						
							| 
									
										
										
										
											2018-07-11 16:39:17 +02:00
										 |  |  |         expect(installer.path).to eq(Pathname("Caffeine.app")) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect(cask.artifacts).to contain_exactly a_kind_of Cask::Artifact::StageOnly | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when there is are activatable artifacts" do | 
					
						
							|  |  |  |       let(:token) { "invalid/invalid-stage-only-conflict" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "prevents specifying stage_only" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         expect { cask }.to raise_error(Cask::CaskInvalidError, /'stage_only' must be the only activatable artifact/) | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-04 17:08:35 +02:00
										 |  |  |   describe "#appdir" do | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     context "interpolation of the appdir in stanzas" do | 
					
						
							|  |  |  |       let(:token) { "appdir-interpolation" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "is allowed" do | 
					
						
							| 
									
										
										
										
											2019-02-02 17:11:37 +01:00
										 |  |  |         expect(cask.artifacts.first.source).to eq(cask.config.appdir/"some/path") | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "does not include a trailing slash" do | 
					
						
							| 
									
										
										
										
											2019-10-13 10:03:26 +01:00
										 |  |  |       original_appdir = Cask::Config.global.appdir | 
					
						
							|  |  |  |       Cask::Config.global.appdir = "#{original_appdir}/" | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-13 10:03:26 +01:00
										 |  |  |       cask = Cask::Cask.new("appdir-trailing-slash") do | 
					
						
							|  |  |  |         binary "#{appdir}/some/path" | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-10-13 10:03:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.artifacts.first.source).to eq(original_appdir/"some/path") | 
					
						
							|  |  |  |     ensure | 
					
						
							|  |  |  |       Cask::Config.global.appdir = original_appdir | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-10-04 17:08:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "#artifacts" do | 
					
						
							|  |  |  |     it "sorts artifacts according to the preferable installation order" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       cask = Cask::Cask.new("appdir-trailing-slash") do | 
					
						
							| 
									
										
										
										
											2017-10-04 17:08:35 +02:00
										 |  |  |         postflight do | 
					
						
							|  |  |  |           next | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         preflight do | 
					
						
							|  |  |  |           next | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         binary "binary" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         app "App.app" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       expect(cask.artifacts.map(&:class).map(&:dsl_key)).to eq [ | 
					
						
							|  |  |  |         :preflight, | 
					
						
							|  |  |  |         :app, | 
					
						
							|  |  |  |         :binary, | 
					
						
							|  |  |  |         :postflight, | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-08 10:45:25 +01:00
										 |  |  | end |