| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  | describe Cask::Cask, :cask do | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   let(:cask) { described_class.new("versioned-cask") } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   context "when multiple versions are installed" do | 
					
						
							|  |  |  |     describe "#versions" do | 
					
						
							|  |  |  |       context "and there are duplicate versions" do | 
					
						
							|  |  |  |         it "uses the last unique version" do | 
					
						
							|  |  |  |           allow(cask).to receive(:timestamped_versions).and_return([ | 
					
						
							|  |  |  |                                                                      ["1.2.2", "0999"], | 
					
						
							|  |  |  |                                                                      ["1.2.3", "1000"], | 
					
						
							|  |  |  |                                                                      ["1.2.2", "1001"], | 
					
						
							|  |  |  |                                                                    ]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(cask).to receive(:timestamped_versions) | 
					
						
							|  |  |  |           expect(cask.versions).to eq([ | 
					
						
							|  |  |  |                                         "1.2.3", | 
					
						
							|  |  |  |                                         "1.2.2", | 
					
						
							|  |  |  |                                       ]) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "load" do | 
					
						
							| 
									
										
										
										
											2018-06-09 10:13:28 +02:00
										 |  |  |     let(:tap_path) { Tap.default_cask_tap.path } | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |     let(:file_dirname) { Pathname.new(__FILE__).dirname } | 
					
						
							| 
									
										
										
										
											2017-05-07 17:28:39 +01:00
										 |  |  |     let(:relative_tap_path) { tap_path.relative_path_from(file_dirname) } | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     it "returns an instance of the Cask for the given token" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load("local-caffeine") | 
					
						
							| 
									
										
										
										
											2019-07-23 17:09:57 +01:00
										 |  |  |       expect(c).to be_kind_of(described_class) | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |       expect(c.token).to eq("local-caffeine") | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns an instance of the Cask from a specific file location" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load("#{tap_path}/Casks/local-caffeine.rb") | 
					
						
							| 
									
										
										
										
											2019-07-23 17:09:57 +01:00
										 |  |  |       expect(c).to be_kind_of(described_class) | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |       expect(c.token).to eq("local-caffeine") | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns an instance of the Cask from a url" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load("file://#{tap_path}/Casks/local-caffeine.rb") | 
					
						
							| 
									
										
										
										
											2019-07-23 17:09:57 +01:00
										 |  |  |       expect(c).to be_kind_of(described_class) | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |       expect(c.token).to eq("local-caffeine") | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "raises an error when failing to download a Cask from a url" do | 
					
						
							|  |  |  |       expect { | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |         url = "file://#{tap_path}/Casks/notacask.rb" | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         Cask::CaskLoader.load(url) | 
					
						
							|  |  |  |       }.to raise_error(Cask::CaskUnavailableError) | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns an instance of the Cask from a relative file location" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load(relative_tap_path/"Casks/local-caffeine.rb") | 
					
						
							| 
									
										
										
										
											2019-07-23 17:09:57 +01:00
										 |  |  |       expect(c).to be_kind_of(described_class) | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |       expect(c.token).to eq("local-caffeine") | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "uses exact match when loading by token" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       expect(Cask::CaskLoader.load("test-opera").token).to eq("test-opera") | 
					
						
							|  |  |  |       expect(Cask::CaskLoader.load("test-opera-mail").token).to eq("test-opera-mail") | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "raises an error when attempting to load a Cask that doesn't exist" do | 
					
						
							|  |  |  |       expect { | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         Cask::CaskLoader.load("notacask") | 
					
						
							|  |  |  |       }.to raise_error(Cask::CaskUnavailableError) | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "metadata" do | 
					
						
							|  |  |  |     it "proposes a versioned metadata directory name for each instance" do | 
					
						
							| 
									
										
										
										
											2017-03-04 21:42:09 +01:00
										 |  |  |       cask_token = "local-caffeine" | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load(cask_token) | 
					
						
							|  |  |  |       metadata_timestamped_path = Cask::Caskroom.path.join(cask_token, ".metadata", c.version) | 
					
						
							| 
									
										
										
										
											2017-04-20 10:48:32 +02:00
										 |  |  |       expect(c.metadata_versioned_path.to_s).to eq(metadata_timestamped_path.to_s) | 
					
						
							| 
									
										
										
										
											2017-02-09 04:15:57 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "outdated" do | 
					
						
							|  |  |  |     it "ignores the Casks that have auto_updates true (without --greedy)" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load("auto-updates") | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |       expect(c).not_to be_outdated | 
					
						
							|  |  |  |       expect(c.outdated_versions).to be_empty | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "ignores the Casks that have version :latest (without --greedy)" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |       c = Cask::CaskLoader.load("version-latest-string") | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |       expect(c).not_to be_outdated | 
					
						
							|  |  |  |       expect(c.outdated_versions).to be_empty | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe "versioned casks" do | 
					
						
							|  |  |  |       subject { cask.outdated_versions } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  |       let(:cask) { described_class.new("basic-cask") } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |       shared_examples "versioned casks" do |tap_version, expectations| | 
					
						
							|  |  |  |         expectations.each do |installed_versions, expected_output| | 
					
						
							|  |  |  |           context "when versions #{installed_versions.inspect} are installed and the tap version is #{tap_version}" do | 
					
						
							|  |  |  |             it { | 
					
						
							|  |  |  |               allow(cask).to receive(:versions).and_return(installed_versions) | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |               allow(cask).to receive(:version).and_return(Cask::DSL::Version.new(tap_version)) | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |               expect(cask).to receive(:outdated_versions).and_call_original | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |               expect(subject).to eq expected_output | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe "installed version is equal to tap version => not outdated" do | 
					
						
							|  |  |  |         include_examples "versioned casks", "1.2.3", | 
					
						
							|  |  |  |                          ["1.2.3"]          => [], | 
					
						
							|  |  |  |                          ["1.2.4", "1.2.3"] => [] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe "installed version is different than tap version => outdated" do | 
					
						
							|  |  |  |         include_examples "versioned casks", "1.2.4", | 
					
						
							|  |  |  |                          ["1.2.3"]                   => ["1.2.3"], | 
					
						
							|  |  |  |                          ["1.2.4", "1.2.3"]          => ["1.2.3"], | 
					
						
							|  |  |  |                          ["1.2.2", "1.2.3"]          => ["1.2.2", "1.2.3"], | 
					
						
							|  |  |  |                          ["1.2.2", "1.2.4", "1.2.3"] => ["1.2.2", "1.2.3"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe ":latest casks" do | 
					
						
							|  |  |  |       let(:cask) { described_class.new("basic-cask") } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       shared_examples ":latest cask" do |greedy, tap_version, expectations| | 
					
						
							|  |  |  |         expectations.each do |installed_version, expected_output| | 
					
						
							| 
									
										
										
										
											2018-09-02 16:15:09 +01:00
										 |  |  |           context "when versions #{installed_version} are installed and the " \ | 
					
						
							|  |  |  |                   "tap version is #{tap_version}, #{"not" unless greedy} greedy" do | 
					
						
							| 
									
										
										
										
											2020-08-19 17:12:32 +01:00
										 |  |  |             subject { cask.outdated_versions(greedy: greedy) } | 
					
						
							| 
									
										
										
										
											2018-03-25 13:30:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |             it { | 
					
						
							|  |  |  |               allow(cask).to receive(:versions).and_return(installed_version) | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |               allow(cask).to receive(:version).and_return(Cask::DSL::Version.new(tap_version)) | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |               expect(cask).to receive(:outdated_versions).and_call_original | 
					
						
							| 
									
										
										
										
											2018-09-20 09:07:56 +01:00
										 |  |  |               expect(subject).to eq expected_output | 
					
						
							| 
									
										
										
										
											2017-02-27 22:33:34 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe ":latest version installed, :latest version in tap" do | 
					
						
							|  |  |  |         include_examples ":latest cask", false, "latest", | 
					
						
							|  |  |  |                          ["latest"] => [] | 
					
						
							|  |  |  |         include_examples ":latest cask", true, "latest", | 
					
						
							|  |  |  |                          ["latest"] => ["latest"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe "numbered version installed, :latest version in tap" do | 
					
						
							|  |  |  |         include_examples ":latest cask", false, "latest", | 
					
						
							|  |  |  |                          ["1.2.3"] => ["1.2.3"] | 
					
						
							|  |  |  |         include_examples ":latest cask", true, "latest", | 
					
						
							|  |  |  |                          ["1.2.3"] => ["1.2.3"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       describe "latest version installed, numbered version in tap" do | 
					
						
							|  |  |  |         include_examples ":latest cask", false, "1.2.3", | 
					
						
							|  |  |  |                          ["latest"] => ["latest"] | 
					
						
							|  |  |  |         include_examples ":latest cask", true, "1.2.3", | 
					
						
							|  |  |  |                          ["latest"] => ["latest"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "full_name" do | 
					
						
							|  |  |  |     context "when it is a core cask" do | 
					
						
							|  |  |  |       it "is the cask token" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         c = Cask::CaskLoader.load("local-caffeine") | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  |         expect(c.full_name).to eq("local-caffeine") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when it is from a non-core tap" do | 
					
						
							|  |  |  |       it "returns the fully-qualified name of the cask" do | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |         c = Cask::CaskLoader.load("third-party/tap/third-party-cask") | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  |         expect(c.full_name).to eq("third-party/tap/third-party-cask") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when it is from no known tap" do | 
					
						
							| 
									
										
										
										
											2019-08-19 14:27:29 +10:00
										 |  |  |       it "returns the cask token" do | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  |         file = Tempfile.new(%w[tapless-cask .rb]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           cask_name = File.basename(file.path, ".rb") | 
					
						
							|  |  |  |           file.write "cask '#{cask_name}'" | 
					
						
							|  |  |  |           file.close | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 08:29:14 +02:00
										 |  |  |           c = Cask::CaskLoader.load(file.path) | 
					
						
							| 
									
										
										
										
											2017-07-08 19:33:44 -07:00
										 |  |  |           expect(c.full_name).to eq(cask_name) | 
					
						
							|  |  |  |         ensure | 
					
						
							|  |  |  |           file.close | 
					
						
							|  |  |  |           file.unlink | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | end |