| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-09 01:34:07 +02:00
										 |  |  | require "cask/audit" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  | describe Cask::Audit, :cask do | 
					
						
							| 
									
										
										
										
											2021-04-03 03:49:41 +02:00
										 |  |  |   def include_msg?(problems, msg) | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     if msg.is_a?(Regexp) | 
					
						
							| 
									
										
										
										
											2021-04-03 03:49:41 +02:00
										 |  |  |       Array(problems).any? { |problem| problem[:message] =~ msg } | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2021-04-03 03:49:41 +02:00
										 |  |  |       Array(problems).any? { |problem| problem[:message] == msg } | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   matcher :pass do | 
					
						
							|  |  |  |     match do |audit| | 
					
						
							|  |  |  |       !audit.errors? && !audit.warnings? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |   matcher :fail_with do |message| | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     match do |audit| | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       include_msg?(audit.errors, message) | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |   matcher :warn_with do |message| | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     match do |audit| | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       include_msg?(audit.warnings, message) | 
					
						
							| 
									
										
										
										
											2017-03-05 03:46:13 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |   let(:cask) { instance_double(Cask::Cask) } | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |   let(:new_cask) { nil } | 
					
						
							|  |  |  |   let(:online) { nil } | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |   let(:only) { [] } | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |   let(:strict) { nil } | 
					
						
							|  |  |  |   let(:token_conflicts) { nil } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   let(:audit) { | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |     described_class.new(cask, online:          online, | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |                               strict:          strict, | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |                               new_cask:        new_cask, | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |                               token_conflicts: token_conflicts, | 
					
						
							|  |  |  |                               only:            only) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |   describe "#new" do | 
					
						
							|  |  |  |     context "when `new_cask` is specified" do | 
					
						
							|  |  |  |       let(:new_cask) { true } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "implies `online`" do | 
					
						
							|  |  |  |         expect(audit).to be_online | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "implies `strict`" do | 
					
						
							|  |  |  |         expect(audit).to be_strict | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it "implies `token_conflicts`" do | 
					
						
							|  |  |  |         expect(audit.token_conflicts?).to be true | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-09-04 05:29:56 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when `online` is specified" do | 
					
						
							|  |  |  |       let(:online) { true } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "implies `appcast`" do | 
					
						
							|  |  |  |         expect(audit.appcast?).to be true | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "implies `download`" do | 
					
						
							|  |  |  |         expect(audit.download).to be_truthy | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   describe "#result" do | 
					
						
							|  |  |  |     subject { audit.result } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when there are errors" do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         audit.add_error "bad" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |       it { is_expected.to match(/failed/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when there are warnings" do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         audit.add_warning "eh" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |       it { is_expected.to match(/warning/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when there are errors and warnings" do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         audit.add_error "bad" | 
					
						
							|  |  |  |         audit.add_warning "eh" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |       it { is_expected.to match(/failed/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when there are no errors or warnings" do | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |       it { is_expected.to match(/passed/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#run!" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |     subject(:run) { audit.run! } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |     def tmp_cask(name, text) | 
					
						
							|  |  |  |       path = Pathname.new "#{dir}/#{name}.rb" | 
					
						
							|  |  |  |       path.open("w") do |f| | 
					
						
							|  |  |  |         f.write text | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Cask::CaskLoader.load(path) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let(:dir) { mktmpdir } | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |     let(:cask) { Cask::CaskLoader.load(cask_token) } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     describe "required stanzas" do | 
					
						
							| 
									
										
										
										
											2022-09-15 15:27:43 +02:00
										 |  |  |       let(:only) { ["required_stanzas"] } | 
					
						
							| 
									
										
										
										
											2022-09-15 15:33:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 21:27:44 +08:00
										 |  |  |       %w[version sha256 url name homepage].each do |stanza| | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         context "when missing #{stanza}" do | 
					
						
							|  |  |  |           let(:cask_token) { "missing-#{stanza}" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |           it { is_expected.to fail_with(/#{stanza} stanza is required/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |     describe "token validation" do | 
					
						
							|  |  |  |       let(:strict) { true } | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["token_valid"] } | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |       let(:cask) do | 
					
						
							|  |  |  |         tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |           cask '#{cask_token}' do | 
					
						
							|  |  |  |             version '1.0' | 
					
						
							|  |  |  |             sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a' | 
					
						
							|  |  |  |             url "https://brew.sh/" | 
					
						
							|  |  |  |             name 'Audit' | 
					
						
							|  |  |  |             homepage 'https://brew.sh/' | 
					
						
							|  |  |  |             app 'Audit.app' | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token is not lowercase" do | 
					
						
							|  |  |  |         let(:cask_token) { "Upper-Case" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/lowercase/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token is not ascii" do | 
					
						
							|  |  |  |         let(:cask_token) { "ascii⌘" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/contains non-ascii characters/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has +" do | 
					
						
							|  |  |  |         let(:cask_token) { "app++" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/\+ should be replaced by -plus-/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has @" do | 
					
						
							|  |  |  |         let(:cask_token) { "app@stuff" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/@ should be replaced by -at-/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has whitespace" do | 
					
						
							|  |  |  |         let(:cask_token) { "app stuff" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/whitespace should be replaced by hyphens/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has underscores" do | 
					
						
							|  |  |  |         let(:cask_token) { "app_stuff" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/underscores should be replaced by hyphens/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has non-alphanumeric characters" do | 
					
						
							|  |  |  |         let(:cask_token) { "app(stuff)" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/alphanumeric characters and hyphens/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has double hyphens" do | 
					
						
							|  |  |  |         let(:cask_token) { "app--stuff" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/should not contain double hyphens/) | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has leading hyphens" do | 
					
						
							|  |  |  |         let(:cask_token) { "-app" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/should not have leading or trailing hyphens/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token has trailing hyphens" do | 
					
						
							|  |  |  |         let(:cask_token) { "app-" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/should not have leading or trailing hyphens/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "token bad words" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:new_cask) { true } | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["token_bad_words", "reverse_migration"] } | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:online) { false } | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |       let(:cask) do | 
					
						
							|  |  |  |         tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							| 
									
										
										
										
											2020-12-11 21:58:09 +01:00
										 |  |  |           cask "#{cask_token}" do | 
					
						
							|  |  |  |             version "1.0" | 
					
						
							|  |  |  |             sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" | 
					
						
							|  |  |  |             url "https://brew.sh/v\#{version}.zip" | 
					
						
							|  |  |  |             name "Audit" | 
					
						
							|  |  |  |             desc "Cask for testing tokens" | 
					
						
							|  |  |  |             homepage "https://brew.sh/" | 
					
						
							|  |  |  |             app "Audit.app" | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains .app" do | 
					
						
							|  |  |  |         let(:cask_token) { "token.app" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token contains .app/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 21:22:41 +02:00
										 |  |  |       context "when cask token contains version designation" do | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         let(:cask_token) { "token-beta" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails if the cask is from an official tap" do | 
					
						
							| 
									
										
										
										
											2020-08-11 21:22:41 +02:00
										 |  |  |           allow(cask).to receive(:tap).and_return(Tap.fetch("homebrew/cask")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token contains version designation/) | 
					
						
							| 
									
										
										
										
											2020-08-11 21:22:41 +02:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "does not fail if the cask is from the `cask-versions` tap" do | 
					
						
							| 
									
										
										
										
											2020-08-11 21:22:41 +02:00
										 |  |  |           allow(cask).to receive(:tap).and_return(Tap.fetch("homebrew/cask-versions")) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to pass | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains launcher" do | 
					
						
							|  |  |  |         let(:cask_token) { "token-launcher" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token mentions launcher/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains desktop" do | 
					
						
							|  |  |  |         let(:cask_token) { "token-desktop" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token mentions desktop/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains platform" do | 
					
						
							|  |  |  |         let(:cask_token) { "token-osx" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token mentions platform/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains architecture" do | 
					
						
							|  |  |  |         let(:cask_token) { "token-x86" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/token mentions architecture/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token contains framework" do | 
					
						
							|  |  |  |         let(:cask_token) { "token-java" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/cask token mentions framework/) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token is framework" do | 
					
						
							|  |  |  |         let(:cask_token) { "java" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "does not fail" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to pass | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       context "when cask token is in tap_migrations.json and" do | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  |         let(:cask_token) { "token-migrated" } | 
					
						
							|  |  |  |         let(:tap) { Tap.fetch("homebrew/cask") } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         before do | 
					
						
							|  |  |  |           allow(tap).to receive(:tap_migrations).and_return({ cask_token => "homebrew/core" }) | 
					
						
							|  |  |  |           allow(cask).to receive(:tap).and_return(tap) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         context "when `new_cask` is true" do | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  |           let(:new_cask) { true } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |             expect(run).to fail_with("#{cask_token} is listed in tap_migrations.json") | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         context "when `new_cask` is false" do | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  |           let(:new_cask) { false } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "does not fail" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |             expect(run).to pass | 
					
						
							| 
									
										
										
										
											2021-01-26 01:16:00 -08:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-06-04 23:11:51 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-04 23:37:54 +02:00
										 |  |  |     describe "locale validation" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["languages"] } | 
					
						
							| 
									
										
										
										
											2020-06-04 23:37:54 +02:00
										 |  |  |       let(:cask) do | 
					
						
							|  |  |  |         tmp_cask "locale-cask-test", <<~RUBY | 
					
						
							|  |  |  |           cask 'locale-cask-test' do | 
					
						
							|  |  |  |             version '1.0' | 
					
						
							|  |  |  |             url "https://brew.sh/" | 
					
						
							|  |  |  |             name 'Audit' | 
					
						
							|  |  |  |             homepage 'https://brew.sh/' | 
					
						
							|  |  |  |             app 'Audit.app' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             language 'en', default: true do | 
					
						
							|  |  |  |               sha256 '96574251b885c12b48a3495e843e434f9174e02bb83121b578e17d9dbebf1ffb' | 
					
						
							|  |  |  |               'zh-CN' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             language 'zh-CN' do | 
					
						
							|  |  |  |               sha256 '96574251b885c12b48a3495e843e434f9174e02bb83121b578e17d9dbebf1ffb' | 
					
						
							|  |  |  |               'zh-CN' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             language 'ZH-CN' do | 
					
						
							|  |  |  |               sha256 '96574251b885c12b48a3495e843e434f9174e02bb83121b578e17d9dbebf1ffb' | 
					
						
							|  |  |  |               'zh-CN' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             language 'zh-' do | 
					
						
							|  |  |  |               sha256 '96574251b885c12b48a3495e843e434f9174e02bb83121b578e17d9dbebf1ffb' | 
					
						
							|  |  |  |               'zh-CN' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             language 'zh-cn' do | 
					
						
							|  |  |  |               sha256 '96574251b885c12b48a3495e843e434f9174e02bb83121b578e17d9dbebf1ffb' | 
					
						
							|  |  |  |               'zh-CN' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask locale is invalid" do | 
					
						
							|  |  |  |         it "error with invalid locale" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/Locale 'ZH-CN' is invalid\./) | 
					
						
							|  |  |  |           expect(run).to fail_with(/Locale 'zh-' is invalid\./) | 
					
						
							|  |  |  |           expect(run).to fail_with(/Locale 'zh-cn' is invalid\./) | 
					
						
							| 
									
										
										
										
											2020-06-04 23:37:54 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  |     describe "pkg allow_untrusted checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["untrusted_pkg"] } | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "allow_untrusted is not permitted in official Homebrew Cask taps" } | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask has no pkg stanza" do | 
					
						
							|  |  |  |         let(:cask_token) { "basic-cask" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask does not have allow_untrusted" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-uninstall-pkgutil" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask has allow_untrusted" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-allow-untrusted" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-25 15:30:16 +10:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-01 14:30:04 +02:00
										 |  |  |     describe "signing checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["signing"] } | 
					
						
							| 
									
										
										
										
											2022-08-01 14:30:04 +02:00
										 |  |  |       let(:download_double) { instance_double(Cask::Download) } | 
					
						
							|  |  |  |       let(:unpack_double) { instance_double(UnpackStrategy::Zip) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         allow(audit).to receive(:download).and_return(download_double) | 
					
						
							|  |  |  |         allow(audit).to receive(:signing?).and_return(true) | 
					
						
							|  |  |  |         allow(audit).to receive(:check_https_availability) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask is not using a signed artifact" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask "signing-cask-test", <<~RUBY | 
					
						
							|  |  |  |             cask 'signing-cask-test' do | 
					
						
							|  |  |  |               version '1.0' | 
					
						
							|  |  |  |               url "https://brew.sh/index.html" | 
					
						
							|  |  |  |               binary 'Audit.app' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it "does not fail" do | 
					
						
							|  |  |  |           expect(download_double).not_to receive(:fetch) | 
					
						
							|  |  |  |           expect(UnpackStrategy).not_to receive(:detect) | 
					
						
							|  |  |  |           expect(run).not_to warn_with(/Audit\.app/) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask is using a signed artifact" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask "signing-cask-test", <<~RUBY | 
					
						
							|  |  |  |             cask 'signing-cask-test' do | 
					
						
							|  |  |  |               version '1.0' | 
					
						
							|  |  |  |               url "https://brew.sh/" | 
					
						
							|  |  |  |               pkg 'Audit.app' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it "does not fail since no extract" do | 
					
						
							|  |  |  |           allow(download_double).to receive(:fetch).and_return(Pathname.new("/tmp/test.zip")) | 
					
						
							|  |  |  |           allow(UnpackStrategy).to receive(:detect).and_return(nil) | 
					
						
							|  |  |  |           expect(run).not_to warn_with(/Audit\.app/) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |     describe "livecheck should be skipped" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["livecheck_version"] } | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |       let(:online) { true } | 
					
						
							|  |  |  |       let(:message) { /Version '[^']*' differs from '[^']*' retrieved by livecheck\./ } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask has a livecheck block using skip" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/livecheck-skip" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 12:09:56 -04:00
										 |  |  |       context "when the Cask has a livecheck block referencing a Cask using skip" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/livecheck-skip-reference" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |       context "when the Cask is discontinued" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/discontinued" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 12:09:56 -04:00
										 |  |  |       context "when the Cask has a livecheck block referencing a discontinued Cask" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/discontinued-reference" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |       context "when version is :latest" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/version-latest" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 12:09:56 -04:00
										 |  |  |       context "when the Cask has a livecheck block referencing a Cask where version is :latest" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/version-latest-reference" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |       context "when url is unversioned" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/url-unversioned" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-11-02 12:09:56 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask has a livecheck block referencing a Cask with an unversioned url" do | 
					
						
							|  |  |  |         let(:cask_token) { "livecheck/url-unversioned-reference" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-06-14 12:05:32 -04:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |     describe "when the Cask stanza requires uninstall" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["stanza_requires_uninstall"] } | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "installer and pkg stanzas require an uninstall stanza" } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask does not require an uninstall" do | 
					
						
							|  |  |  |         let(:cask_token) { "basic-cask" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the pkg Cask has an uninstall" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-uninstall-pkgutil" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the installer Cask has an uninstall" do | 
					
						
							|  |  |  |         let(:cask_token) { "installer-with-uninstall" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the installer Cask does not have an uninstall" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-installer-manual" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the pkg Cask does not have an uninstall" do | 
					
						
							|  |  |  |         let(:cask_token) { "pkg-without-uninstall" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-05-19 12:38:47 +10:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |     describe "preflight stanza checks" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "only a single preflight stanza is allowed" } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has no preflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has only one preflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-preflight" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has multiple preflight stanzas" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-preflight-multi" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |     describe "postflight stanza checks" do | 
					
						
							|  |  |  |       let(:message) { "only a single postflight stanza is allowed" } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has no postflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has only one postflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-postflight" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has multiple postflight stanzas" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-postflight-multi" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "uninstall_preflight stanza checks" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "only a single uninstall_preflight stanza is allowed" } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has no uninstall_preflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has only one uninstall_preflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-uninstall-preflight" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has multiple uninstall_preflight stanzas" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-uninstall-preflight-multi" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "uninstall_postflight stanza checks" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "only a single uninstall_postflight stanza is allowed" } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has no uninstall_postflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has only one uninstall_postflight stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-uninstall-postflight" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has multiple uninstall_postflight stanzas" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-uninstall-postflight-multi" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "zap stanza checks" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "only a single zap stanza is allowed" } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has no zap stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-uninstall-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has only one zap stanza" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-rmdir" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 08:41:32 +10:00
										 |  |  |       context "when the Cask has multiple zap stanzas" do | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |         let(:cask_token) { "with-zap-multi" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2017-10-30 20:47:40 -03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     describe "version checks" do | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "you should use version :latest instead of version 'latest'" } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when version is 'latest'" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         let(:only) { ["no_string_version_latest"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "version-latest-string" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when version is :latest" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         let(:only) { ["sha256_no_check_if_latest"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "version-latest-with-checksum" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "sha256 checks" do | 
					
						
							|  |  |  |       context "when version is :latest and sha256 is not :no_check" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         let(:only) { ["sha256_no_check_if_latest"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "version-latest-with-checksum" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-27 11:52:14 +02:00
										 |  |  |         it { is_expected.to fail_with("you should use sha256 :no_check when version is :latest") } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when sha256 is not a legal SHA-256 digest" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         let(:only) { ["sha256_actually_256"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "invalid-sha256" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-27 11:52:14 +02:00
										 |  |  |         it { is_expected.to fail_with("sha256 string must be of 64 hexadecimal characters") } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when sha256 is sha256 for empty string" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         let(:only) { ["sha256_invalid"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "sha256-for-empty-string" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |         it { is_expected.to fail_with(/cannot use the sha256 for an empty string/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |     describe "hosting with livecheck checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["hosting_with_livecheck"] } | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       let(:message) { /please add a livecheck/ } | 
					
						
							| 
									
										
										
										
											2018-03-26 21:25:00 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download does not use hosting with a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-03-26 21:25:00 +10:00
										 |  |  |         let(:cask_token) { "basic-cask" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-26 21:25:00 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on SourceForge and has a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "sourceforge-with-appcast" } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on SourceForge and does not have a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "sourceforge-correct-url-format" } | 
					
						
							| 
									
										
										
										
											2021-04-07 02:19:16 +02:00
										 |  |  |         let(:online) { true } | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on DevMate and has a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "devmate-with-appcast" } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on DevMate and does not have a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "devmate-without-appcast" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on HockeyApp and has a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "hockeyapp-with-appcast" } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-01 00:53:47 +02:00
										 |  |  |       context "when the download is hosted on HockeyApp and does not have a livecheck" do | 
					
						
							| 
									
										
										
										
											2018-06-15 17:01:27 +10:00
										 |  |  |         let(:cask_token) { "hockeyapp-without-appcast" } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-06-05 16:42:15 +10:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 20:56:01 +10:00
										 |  |  |     describe "latest with appcast checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["latest_with_appcast_or_livecheck"] } | 
					
						
							| 
									
										
										
										
											2021-01-08 03:48:53 +01:00
										 |  |  |       let(:message) { "Casks with an `appcast` should not use `version :latest`." } | 
					
						
							| 
									
										
										
										
											2018-03-27 20:56:01 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is :latest and does not have an appcast" do | 
					
						
							|  |  |  |         let(:cask_token) { "version-latest" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-27 20:56:01 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is versioned and has an appcast" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-appcast" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-27 20:56:01 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is :latest and has an appcast" do | 
					
						
							|  |  |  |         let(:cask_token) { "latest-with-appcast" } | 
					
						
							| 
									
										
										
										
											2018-03-28 22:05:56 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-03-27 20:56:01 +10:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-06 21:10:16 +01:00
										 |  |  |     describe "denylist checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["denylist"] } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       context "when the Cask is not on the denylist" do | 
					
						
							| 
									
										
										
										
											2019-09-08 09:09:37 -04:00
										 |  |  |         let(:cask_token) { "adobe-air" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to pass } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       context "when the Cask is on the denylist and" do | 
					
						
							|  |  |  |         context "when it's in the official Homebrew tap" do | 
					
						
							| 
									
										
										
										
											2019-09-08 09:09:37 -04:00
										 |  |  |           let(:cask_token) { "adobe-illustrator" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-06 21:10:16 +01:00
										 |  |  |           it { is_expected.to fail_with(/#{cask_token} is not allowed: \w+/) } | 
					
						
							| 
									
										
										
										
											2019-09-08 09:09:37 -04:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |         context "when it isn't in the official Homebrew tap" do | 
					
						
							| 
									
										
										
										
											2019-09-08 09:09:37 -04:00
										 |  |  |           let(:cask_token) { "pharo" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it { is_expected.to pass } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  |     describe "latest with auto_updates checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["latest_with_auto_updates"] } | 
					
						
							| 
									
										
										
										
											2021-01-08 03:48:53 +01:00
										 |  |  |       let(:message) { "Casks with `version :latest` should not use `auto_updates`." } | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is :latest and does not have auto_updates" do | 
					
						
							|  |  |  |         let(:cask_token) { "version-latest" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is versioned and does not have auto_updates" do | 
					
						
							|  |  |  |         let(:cask_token) { "basic-cask" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is versioned and has auto_updates" do | 
					
						
							|  |  |  |         let(:cask_token) { "auto-updates" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when the Cask is :latest and has auto_updates" do | 
					
						
							|  |  |  |         let(:cask_token) { "latest-with-auto-updates" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2018-07-12 16:13:46 +10:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     describe "preferred download URL formats" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["download_url_format"] } | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { /URL format incorrect/ } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "with incorrect SourceForge URL format" do | 
					
						
							|  |  |  |         let(:cask_token) { "sourceforge-incorrect-url-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with correct SourceForge URL format" do | 
					
						
							|  |  |  |         let(:cask_token) { "sourceforge-correct-url-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with correct SourceForge URL format for version :latest" do | 
					
						
							|  |  |  |         let(:cask_token) { "sourceforge-version-latest-correct-url-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with incorrect OSDN URL format" do | 
					
						
							|  |  |  |         let(:cask_token) { "osdn-incorrect-url-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with correct OSDN URL format" do | 
					
						
							|  |  |  |         let(:cask_token) { "osdn-correct-url-format" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.not_to fail_with(message) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "generic artifact checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["generic_artifacts"] } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       context "with relative target" do | 
					
						
							|  |  |  |         let(:cask_token) { "generic-artifact-relative-target" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-13 03:12:30 +01:00
										 |  |  |         it { is_expected.to fail_with(/target must be.*absolute/) } | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with user-relative target" do | 
					
						
							|  |  |  |         let(:cask_token) { "generic-artifact-user-relative-target" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.not_to fail_with(/target must be.*absolute/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "with absolute target" do | 
					
						
							|  |  |  |         let(:cask_token) { "generic-artifact-absolute-target" } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-13 03:12:30 +01:00
										 |  |  |         it { is_expected.not_to fail_with(/target must be.*absolute/) } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "url checks" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { %w[unnecessary_verified missing_verified no_match] } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 23:15:33 +00:00
										 |  |  |       context "with a block" do | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |         let(:cask_token) { "booby-trap" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         context "when loading the cask" do | 
					
						
							|  |  |  |           it "does not evaluate the block" do | 
					
						
							| 
									
										
										
										
											2016-08-27 11:52:14 +02:00
										 |  |  |             expect { cask }.not_to raise_error | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-31 06:25:33 +02:00
										 |  |  |         context "when doing an offline audit" do | 
					
						
							|  |  |  |           let(:online) { false } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "does not evaluate the block" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |             expect(run).not_to fail_with(/Boom/) | 
					
						
							| 
									
										
										
										
											2021-03-31 06:25:33 +02:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         context "when doing and online audit" do | 
					
						
							|  |  |  |           let(:online) { true } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |           it "evaluates the block" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |             expect(run).to fail_with(/Boom/) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "token conflicts" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["token_conflicts"] } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       let(:cask_token) { "with-binary" } | 
					
						
							| 
									
										
										
										
											2020-04-23 21:16:17 +02:00
										 |  |  |       let(:token_conflicts) { true } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token conflicts with a core formula" do | 
					
						
							|  |  |  |         let(:formula_names) { %w[with-binary other-formula] } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |         it "warns about duplicates" do | 
					
						
							|  |  |  |           expect(audit).to receive(:core_formula_names).and_return(formula_names) | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to warn_with(/possible duplicate/) | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when cask token does not conflict with a core formula" do | 
					
						
							|  |  |  |         let(:formula_names) { %w[other-formula] } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "audit of downloads" do | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["download"] } | 
					
						
							| 
									
										
										
										
											2022-08-01 14:30:04 +02:00
										 |  |  |       let(:cask_token) { "basic-cask" } | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       let(:cask) { Cask::CaskLoader.load(cask_token) } | 
					
						
							| 
									
										
										
										
											2020-07-21 19:05:55 +02:00
										 |  |  |       let(:download_double) { instance_double(Cask::Download) } | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       let(:message) { "Download Failed" } | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 19:05:55 +02:00
										 |  |  |       before do | 
					
						
							|  |  |  |         allow(audit).to receive(:download).and_return(download_double) | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         allow(audit).to receive(:check_https_availability) | 
					
						
							| 
									
										
										
										
											2022-08-01 14:30:04 +02:00
										 |  |  |         allow(UnpackStrategy).to receive(:detect).and_return(nil) | 
					
						
							| 
									
										
										
										
											2020-07-21 19:05:55 +02:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-28 19:16:56 +00:00
										 |  |  |       it "when download and verification succeed it does not fail" do | 
					
						
							| 
									
										
										
										
											2022-08-01 14:30:04 +02:00
										 |  |  |         expect(download_double).to receive(:fetch).and_return(Pathname.new("/tmp/test.zip")) | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |         expect(run).to pass | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       it "when download fails it fails" do | 
					
						
							| 
									
										
										
										
											2020-11-19 18:12:16 +01:00
										 |  |  |         expect(download_double).to receive(:fetch).and_raise(StandardError.new(message)) | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |         expect(run).to fail_with(/#{message}/) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when an exception is raised" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       let(:cask) { instance_double(Cask::Cask) } | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       let(:only) { ["description_present"] } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-08 09:09:37 -04:00
										 |  |  |       it "fails the audit" do | 
					
						
							|  |  |  |         expect(cask).to receive(:tap).and_raise(StandardError.new) | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |         expect(run).to fail_with(/exception while auditing/) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |     describe "checking description" do | 
					
						
							|  |  |  |       let(:only) { ["description_present"] } | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |       let(:cask_token) { "without-description" } | 
					
						
							|  |  |  |       let(:cask) do | 
					
						
							|  |  |  |         tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |           cask '#{cask_token}' do | 
					
						
							|  |  |  |             version '1.0' | 
					
						
							|  |  |  |             sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a' | 
					
						
							|  |  |  |             url "https://brew.sh/" | 
					
						
							|  |  |  |             name 'Audit' | 
					
						
							|  |  |  |             homepage 'https://brew.sh/' | 
					
						
							|  |  |  |             app 'Audit.app' | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context "when `new_cask` is true" do | 
					
						
							|  |  |  |         let(:new_cask) { true } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "fails" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to fail_with(/should have a description/) | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |       context "when `new_cask` is false" do | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |         let(:new_cask) { false } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-14 04:17:50 +02:00
										 |  |  |         it "warns" do | 
					
						
							| 
									
										
										
										
											2021-01-31 13:14:23 -05:00
										 |  |  |           expect(run).to warn_with(/should have a description/) | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "with description" do | 
					
						
							|  |  |  |         let(:cask_token) { "with-description" } | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask "#{cask_token}" do | 
					
						
							|  |  |  |               version "1.0" | 
					
						
							|  |  |  |               sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" | 
					
						
							|  |  |  |               url "https://brew.sh/\#{version}.zip" | 
					
						
							|  |  |  |               name "Audit" | 
					
						
							|  |  |  |               desc "Cask Auditor" | 
					
						
							|  |  |  |               homepage "https://brew.sh/" | 
					
						
							|  |  |  |               app "Audit.app" | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it "passes" do | 
					
						
							|  |  |  |           expect(run).to pass | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-08-10 19:34:38 +02:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |     describe "checking verified" do | 
					
						
							|  |  |  |       let(:only) { %w[unnecessary_verified missing_verified no_match required_stanzas] } | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |       let(:cask_token) { "foo" } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "when the url matches the homepage" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask '#{cask_token}' do | 
					
						
							|  |  |  |               version '1.0' | 
					
						
							|  |  |  |               sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a' | 
					
						
							|  |  |  |               url 'https://foo.brew.sh/foo.zip' | 
					
						
							|  |  |  |               name 'Audit' | 
					
						
							|  |  |  |               desc 'Audit Description' | 
					
						
							|  |  |  |               homepage 'https://foo.brew.sh' | 
					
						
							|  |  |  |               app 'Audit.app' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "when the url does not match the homepage" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask '#{cask_token}' do | 
					
						
							|  |  |  |               version "1.8.0_72,8.13.0.5" | 
					
						
							|  |  |  |               sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" | 
					
						
							|  |  |  |               url "https://brew.sh/foo-\#{version.after_comma}.zip" | 
					
						
							|  |  |  |               name "Audit" | 
					
						
							|  |  |  |               desc "Audit Description" | 
					
						
							|  |  |  |               homepage "https://foo.example.org" | 
					
						
							|  |  |  |               app "Audit.app" | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it { is_expected.to fail_with(/a 'verified' parameter has to be added/) } | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "when the url does not match the homepage with verified" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask "#{cask_token}" do | 
					
						
							|  |  |  |               version "1.8.0_72,8.13.0.5" | 
					
						
							|  |  |  |               sha256 "8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a" | 
					
						
							|  |  |  |               url "https://brew.sh/foo-\#{version.after_comma}.zip", verified: "brew.sh" | 
					
						
							|  |  |  |               name "Audit" | 
					
						
							|  |  |  |               desc "Audit Description" | 
					
						
							|  |  |  |               homepage "https://foo.example.org" | 
					
						
							|  |  |  |               app "Audit.app" | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-08-23 15:52:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2021-03-12 10:26:59 -07:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "when there is no homepage" do | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask '#{cask_token}' do | 
					
						
							|  |  |  |               version '1.8.0_72,8.13.0.5' | 
					
						
							|  |  |  |               sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a' | 
					
						
							|  |  |  |               url 'https://brew.sh/foo.zip' | 
					
						
							|  |  |  |               name 'Audit' | 
					
						
							|  |  |  |               desc 'Audit Description' | 
					
						
							|  |  |  |               app 'Audit.app' | 
					
						
							| 
									
										
										
										
											2022-08-23 15:52:10 +02:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to fail_with(/a homepage stanza is required/) } | 
					
						
							| 
									
										
										
										
											2022-09-06 11:46:40 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-08-23 15:52:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |       context "when url is lazy" do | 
					
						
							|  |  |  |         let(:strict) { true } | 
					
						
							|  |  |  |         let(:cask_token) { "with-lazy" } | 
					
						
							|  |  |  |         let(:cask) do | 
					
						
							|  |  |  |           tmp_cask cask_token.to_s, <<~RUBY | 
					
						
							|  |  |  |             cask '#{cask_token}' do | 
					
						
							|  |  |  |               version '1.8.0_72,8.13.0.5' | 
					
						
							|  |  |  |               sha256 '8dd95daa037ac02455435446ec7bc737b34567afe9156af7d20b2a83805c1d8a' | 
					
						
							|  |  |  |               url do | 
					
						
							|  |  |  |                 ['https://brew.sh/foo.zip', {referer: 'https://example.com', cookies: {'foo' => 'bar'}}] | 
					
						
							|  |  |  |               end | 
					
						
							|  |  |  |               name 'Audit' | 
					
						
							|  |  |  |               desc 'Audit Description' | 
					
						
							|  |  |  |               homepage 'https://brew.sh' | 
					
						
							|  |  |  |               app 'Audit.app' | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           RUBY | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it { is_expected.to pass } | 
					
						
							| 
									
										
										
										
											2021-03-12 10:26:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it "receives a referer" do | 
					
						
							|  |  |  |           expect(audit.cask.url.referer).to eq "https://example.com" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-03-12 10:26:59 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-13 10:54:05 +02:00
										 |  |  |         it "receives cookies" do | 
					
						
							|  |  |  |           expect(audit.cask.url.cookies).to eq "foo" => "bar" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-03-12 10:26:59 -07:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | end |