| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  | require "cmd/shared_examples/args_parse" | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  | require "cmd/untap" | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  | RSpec.describe Homebrew::Cmd::Untap do | 
					
						
							|  |  |  |   let(:class_instance) { described_class.new(%w[arg1]) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  |   it_behaves_like "parseable arguments" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-01 16:14:25 -05:00
										 |  |  |   it "untaps a given Tap", :integration_test do | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  |     setup_test_tap | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect { brew "untap", "homebrew/foo" } | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |       .to output(/Untapped/).to_stderr | 
					
						
							|  |  |  |       .and not_to_output.to_stdout | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  |       .and be_a_success | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "#installed_formulae_for", :integration_test do | 
					
						
							| 
									
										
										
										
											2025-06-10 14:37:21 +00:00
										 |  |  |     shared_examples "finds installed formulae in tap", :no_api do | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  |       def load_formula(name:, with_formula_file: false, mock_install: false) | 
					
						
							|  |  |  |         formula = if with_formula_file | 
					
						
							|  |  |  |           path = setup_test_formula(name, tap:) | 
					
						
							|  |  |  |           Formulary.factory(path) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           formula(name, tap:) do | 
					
						
							|  |  |  |             url "https://brew.sh/#{name}-1.0.tgz" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if mock_install | 
					
						
							|  |  |  |           keg_path = HOMEBREW_CELLAR/name/"1.2.3" | 
					
						
							|  |  |  |           keg_path.mkpath | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-25 00:15:41 -04:00
										 |  |  |           tab_path = keg_path/AbstractTab::FILENAME | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  |           tab_path.write <<~JSON | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |               "source": { | 
					
						
							|  |  |  |                 "tap": "#{tap}" | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           JSON | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         formula | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let!(:currently_installed_formula) do | 
					
						
							|  |  |  |         load_formula(name: "current_install", with_formula_file: true, mock_install: true) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         # Formula that is available from a tap but not installed. | 
					
						
							|  |  |  |         load_formula(name: "no_install", with_formula_file: true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Formula that was installed from a tap but is no longer available from that tap. | 
					
						
							|  |  |  |         load_formula(name: "legacy_install", mock_install: true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tap.clear_cache | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns the expected formulae" do | 
					
						
							|  |  |  |         expect(class_instance.installed_formulae_for(tap:).map(&:full_name)) | 
					
						
							|  |  |  |           .to eq([currently_installed_formula.full_name]) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "with core tap" do | 
					
						
							|  |  |  |       let(:tap) { CoreTap.instance } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       include_examples "finds installed formulae in tap" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "with non-core tap" do | 
					
						
							|  |  |  |       let(:tap) { Tap.fetch("homebrew", "foo") } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         tap.formula_dir.mkpath | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       include_examples "finds installed formulae in tap" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "#installed_casks_for", :cask do | 
					
						
							| 
									
										
										
										
											2025-06-10 14:37:21 +00:00
										 |  |  |     shared_examples "finds installed casks in tap", :no_api do | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  |       def load_cask(token:, with_cask_file: false, mock_install: false) | 
					
						
							|  |  |  |         cask_loader = Cask::CaskLoader::FromContentLoader.new(<<~RUBY, tap:) | 
					
						
							|  |  |  |           cask '#{token}' do | 
					
						
							|  |  |  |             version "1.2.3" | 
					
						
							|  |  |  |             sha256 :no_check | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             url 'https://brew.sh/' | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         RUBY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cask = cask_loader.load(config: nil) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if with_cask_file | 
					
						
							|  |  |  |           cask_path = tap.cask_dir/"#{token}.rb" | 
					
						
							|  |  |  |           cask_path.parent.mkpath | 
					
						
							|  |  |  |           cask_path.write cask.source | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         InstallHelper.install_with_caskfile(cask) if mock_install | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cask | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       let!(:currently_installed_cask) do | 
					
						
							|  |  |  |         load_cask(token: "current_install", with_cask_file: true, mock_install: true) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         # Cask that is available from a tap but not installed. | 
					
						
							|  |  |  |         load_cask(token: "no_install", with_cask_file: true) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Cask that was installed from a tap but is no longer available from that tap. | 
					
						
							|  |  |  |         load_cask(token: "legacy_install", mock_install: true) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns the expected casks" do | 
					
						
							|  |  |  |         expect(class_instance.installed_casks_for(tap:)).to eq([currently_installed_cask]) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "with core cask tap" do | 
					
						
							|  |  |  |       let(:tap) { CoreCaskTap.instance } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       include_examples "finds installed casks in tap" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "with non-core cask tap" do | 
					
						
							|  |  |  |       let(:tap) { Tap.fetch("homebrew", "foo") } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       include_examples "finds installed casks in tap" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2019-03-26 09:49:13 +00:00
										 |  |  | end |