177 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require "utils/autoremove"
 | |
| 
 | |
| RSpec.describe Utils::Autoremove do
 | |
|   shared_context "with formulae for dependency testing" do
 | |
|     let(:formula_with_deps) do
 | |
|       formula "zero" do
 | |
|         url "zero-1.0"
 | |
| 
 | |
|         depends_on "three" => :build
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     let(:first_formula_dep) do
 | |
|       formula "one" do
 | |
|         url "one-1.1"
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     let(:second_formula_dep) do
 | |
|       formula "two" do
 | |
|         url "two-1.1"
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     let(:formula_is_build_dep) do
 | |
|       formula "three" do
 | |
|         url "three-1.1"
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     let(:formulae) do
 | |
|       [
 | |
|         formula_with_deps,
 | |
|         first_formula_dep,
 | |
|         second_formula_dep,
 | |
|         formula_is_build_dep,
 | |
|       ]
 | |
|     end
 | |
| 
 | |
|     let(:tab_from_keg) { instance_double(Tab) }
 | |
| 
 | |
|     before do
 | |
|       allow(formula_with_deps).to receive_messages(
 | |
|         runtime_formula_dependencies: [first_formula_dep, second_formula_dep],
 | |
|         any_installed_keg:            instance_double(Keg, tab: tab_from_keg),
 | |
|       )
 | |
|       allow(first_formula_dep).to receive_messages(
 | |
|         runtime_formula_dependencies: [second_formula_dep],
 | |
|         any_installed_keg:            instance_double(Keg, tab: tab_from_keg),
 | |
|       )
 | |
|       allow(second_formula_dep).to receive_messages(
 | |
|         runtime_formula_dependencies: [],
 | |
|         any_installed_keg:            instance_double(Keg, tab: tab_from_keg),
 | |
|       )
 | |
|       allow(formula_is_build_dep).to receive_messages(
 | |
|         runtime_formula_dependencies: [],
 | |
|         any_installed_keg:            instance_double(Keg, tab: tab_from_keg),
 | |
|       )
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe "::formulae_with_no_formula_dependents" do
 | |
|     include_context "with formulae for dependency testing"
 | |
| 
 | |
|     before do
 | |
|       allow(Formulary).to receive(:factory).with("three", { warn: false }).and_return(formula_is_build_dep)
 | |
|     end
 | |
| 
 | |
|     context "when formulae are bottles" do
 | |
|       it "filters out runtime dependencies" do
 | |
|         allow(tab_from_keg).to receive(:poured_from_bottle).and_return(true)
 | |
| 
 | |
|         expect(described_class.send(:formulae_with_no_formula_dependents, formulae))
 | |
|           .to eq([formula_with_deps, formula_is_build_dep])
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when formulae are built from source" do
 | |
|       it "filters out runtime and build dependencies" do
 | |
|         allow(tab_from_keg).to receive(:poured_from_bottle).and_return(false)
 | |
| 
 | |
|         expect(described_class.send(:formulae_with_no_formula_dependents, formulae))
 | |
|           .to eq([formula_with_deps])
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe "::unused_formulae_with_no_formula_dependents" do
 | |
|     include_context "with formulae for dependency testing"
 | |
| 
 | |
|     before do
 | |
|       allow(tab_from_keg).to receive(:poured_from_bottle).and_return(true)
 | |
|     end
 | |
| 
 | |
|     specify "installed on request" do
 | |
|       allow(tab_from_keg).to receive(:installed_on_request).and_return(true)
 | |
| 
 | |
|       expect(described_class.send(:unused_formulae_with_no_formula_dependents, formulae))
 | |
|         .to eq([])
 | |
|     end
 | |
| 
 | |
|     specify "not installed on request" do
 | |
|       allow(tab_from_keg).to receive(:installed_on_request).and_return(false)
 | |
| 
 | |
|       expect(described_class.send(:unused_formulae_with_no_formula_dependents, formulae))
 | |
|         .to match_array(formulae)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   shared_context "with formulae and casks for dependency testing" do
 | |
|     include_context "with formulae for dependency testing"
 | |
| 
 | |
|     require "cask/cask_loader"
 | |
| 
 | |
|     let(:cask_one_dep) do
 | |
|       Cask::CaskLoader.load(+<<-RUBY)
 | |
|         cask "red" do
 | |
|           depends_on formula: "two"
 | |
|         end
 | |
|       RUBY
 | |
|     end
 | |
| 
 | |
|     let(:cask_multiple_deps) do
 | |
|       Cask::CaskLoader.load(+<<-RUBY)
 | |
|         cask "blue" do
 | |
|           depends_on formula: "zero"
 | |
|         end
 | |
|       RUBY
 | |
|     end
 | |
| 
 | |
|     let(:first_cask_no_deps) do
 | |
|       Cask::CaskLoader.load(+<<-RUBY)
 | |
|         cask "green" do
 | |
|         end
 | |
|       RUBY
 | |
|     end
 | |
| 
 | |
|     let(:second_cask_no_deps) do
 | |
|       Cask::CaskLoader.load(+<<-RUBY)
 | |
|         cask "purple" do
 | |
|         end
 | |
|       RUBY
 | |
|     end
 | |
| 
 | |
|     let(:casks_no_deps) { [first_cask_no_deps, second_cask_no_deps] }
 | |
|     let(:casks_one_dep) { [first_cask_no_deps, second_cask_no_deps, cask_one_dep] }
 | |
|     let(:casks_multiple_deps) { [first_cask_no_deps, second_cask_no_deps, cask_multiple_deps] }
 | |
| 
 | |
|     before do
 | |
|       allow(Formula).to receive("[]").with("zero").and_return(formula_with_deps)
 | |
|       allow(Formula).to receive("[]").with("one").and_return(first_formula_dep)
 | |
|       allow(Formula).to receive("[]").with("two").and_return(second_formula_dep)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe "::formulae_with_cask_dependents" do
 | |
|     include_context "with formulae and casks for dependency testing"
 | |
| 
 | |
|     specify "no dependents" do
 | |
|       expect(described_class.send(:formulae_with_cask_dependents, casks_no_deps))
 | |
|         .to eq([])
 | |
|     end
 | |
| 
 | |
|     specify "one dependent" do
 | |
|       expect(described_class.send(:formulae_with_cask_dependents, casks_one_dep))
 | |
|         .to eq([second_formula_dep])
 | |
|     end
 | |
| 
 | |
|     specify "multiple dependents" do
 | |
|       expect(described_class.send(:formulae_with_cask_dependents, casks_multiple_deps))
 | |
|         .to contain_exactly(formula_with_deps, first_formula_dep, second_formula_dep)
 | |
|     end
 | |
|   end
 | |
| end
 | 
