165 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require "bundle"
 | |
| require "bundle/cask_dumper"
 | |
| require "bundle/cask_installer"
 | |
| 
 | |
| RSpec.describe Homebrew::Bundle::CaskInstaller do
 | |
|   describe ".installed_casks" do
 | |
|     before do
 | |
|       Homebrew::Bundle::CaskDumper.reset!
 | |
|     end
 | |
| 
 | |
|     it "shells out" do
 | |
|       expect { described_class.installed_casks }.not_to raise_error
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   describe ".cask_installed_and_up_to_date?" do
 | |
|     it "returns result" do
 | |
|       described_class.reset!
 | |
|       allow(described_class).to receive_messages(installed_casks: ["foo", "baz"],
 | |
|                                                  outdated_casks:  ["baz"])
 | |
|       expect(described_class.cask_installed_and_up_to_date?("foo")).to be(true)
 | |
|       expect(described_class.cask_installed_and_up_to_date?("baz")).to be(false)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "when brew-cask is not installed" do
 | |
|     describe ".outdated_casks" do
 | |
|       it "returns empty array" do
 | |
|         described_class.reset!
 | |
|         expect(described_class.outdated_casks).to eql([])
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   context "when brew-cask is installed" do
 | |
|     before do
 | |
|       Homebrew::Bundle::CaskDumper.reset!
 | |
|       allow(Homebrew::Bundle).to receive(:cask_installed?).and_return(true)
 | |
|     end
 | |
| 
 | |
|     describe ".outdated_casks" do
 | |
|       it "returns empty array" do
 | |
|         described_class.reset!
 | |
|         expect(described_class.outdated_casks).to eql([])
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when cask is installed" do
 | |
|       before do
 | |
|         Homebrew::Bundle::CaskDumper.reset!
 | |
|         allow(described_class).to receive(:installed_casks).and_return(["google-chrome"])
 | |
|       end
 | |
| 
 | |
|       it "skips" do
 | |
|         expect(Homebrew::Bundle).not_to receive(:system)
 | |
|         expect(described_class.preinstall("google-chrome")).to be(false)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when cask is outdated" do
 | |
|       before do
 | |
|         allow(described_class).to receive_messages(installed_casks: ["google-chrome"],
 | |
|                                                    outdated_casks:  ["google-chrome"])
 | |
|       end
 | |
| 
 | |
|       it "upgrades" do
 | |
|         expect(Homebrew::Bundle).to \
 | |
|           receive(:system).with(HOMEBREW_BREW_FILE, "upgrade", "--cask", "google-chrome", verbose: false)
 | |
|                           .and_return(true)
 | |
|         expect(described_class.preinstall("google-chrome")).to be(true)
 | |
|         expect(described_class.install("google-chrome")).to be(true)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when cask is outdated and uses auto-update" do
 | |
|       before do
 | |
|         described_class.reset!
 | |
|         allow(Homebrew::Bundle::CaskDumper).to receive_messages(cask_names: ["opera"], outdated_cask_names: [])
 | |
|         allow(Homebrew::Bundle::CaskDumper).to receive(:cask_is_outdated_using_greedy?).with("opera").and_return(true)
 | |
|       end
 | |
| 
 | |
|       it "upgrades" do
 | |
|         expect(Homebrew::Bundle).to \
 | |
|           receive(:system).with(HOMEBREW_BREW_FILE, "upgrade", "--cask", "opera", verbose: false)
 | |
|                           .and_return(true)
 | |
|         expect(described_class.preinstall("opera", greedy: true)).to be(true)
 | |
|         expect(described_class.install("opera", greedy: true)).to be(true)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when cask is not installed" do
 | |
|       before do
 | |
|         allow(described_class).to receive(:installed_casks).and_return([])
 | |
|       end
 | |
| 
 | |
|       it "installs cask" do
 | |
|         expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "google-chrome", "--adopt",
 | |
|                                                         verbose: false)
 | |
|                                                   .and_return(true)
 | |
|         expect(described_class.preinstall("google-chrome")).to be(true)
 | |
|         expect(described_class.install("google-chrome")).to be(true)
 | |
|       end
 | |
| 
 | |
|       it "installs cask with arguments" do
 | |
|         expect(Homebrew::Bundle).to(
 | |
|           receive(:brew).with("install", "--cask", "firefox", "--appdir=/Applications", "--adopt",
 | |
|                               verbose: false)
 | |
|                           .and_return(true),
 | |
|         )
 | |
|         expect(described_class.preinstall("firefox", args: { appdir: "/Applications" })).to be(true)
 | |
|         expect(described_class.install("firefox", args: { appdir: "/Applications" })).to be(true)
 | |
|       end
 | |
| 
 | |
|       it "reports a failure" do
 | |
|         expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "google-chrome", "--adopt",
 | |
|                                                         verbose: false)
 | |
|                                                   .and_return(false)
 | |
|         expect(described_class.preinstall("google-chrome")).to be(true)
 | |
|         expect(described_class.install("google-chrome")).to be(false)
 | |
|       end
 | |
| 
 | |
|       context "with boolean arguments" do
 | |
|         it "includes a flag if true" do
 | |
|           expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "iterm", "--force",
 | |
|                                                           verbose: false)
 | |
|                                                     .and_return(true)
 | |
|           expect(described_class.preinstall("iterm", args: { force: true })).to be(true)
 | |
|           expect(described_class.install("iterm", args: { force: true })).to be(true)
 | |
|         end
 | |
| 
 | |
|         it "does not include a flag if false" do
 | |
|           expect(Homebrew::Bundle).to receive(:brew).with("install", "--cask", "iterm", "--adopt", verbose: false)
 | |
|                                                     .and_return(true)
 | |
|           expect(described_class.preinstall("iterm", args: { force: false })).to be(true)
 | |
|           expect(described_class.install("iterm", args: { force: false })).to be(true)
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     context "when the postinstall option is provided" do
 | |
|       before do
 | |
|         Homebrew::Bundle::CaskDumper.reset!
 | |
|         allow(Homebrew::Bundle::CaskDumper).to receive_messages(cask_names:          ["google-chrome"],
 | |
|                                                                 outdated_cask_names: ["google-chrome"])
 | |
|         allow(Homebrew::Bundle).to receive(:brew).and_return(true)
 | |
|         allow(described_class).to receive(:upgrading?).and_return(true)
 | |
|       end
 | |
| 
 | |
|       it "runs the postinstall command" do
 | |
|         expect(Kernel).to receive(:system).with("custom command").and_return(true)
 | |
|         expect(described_class.preinstall("google-chrome", postinstall: "custom command")).to be(true)
 | |
|         expect(described_class.install("google-chrome", postinstall: "custom command")).to be(true)
 | |
|       end
 | |
| 
 | |
|       it "reports a failure when postinstall fails" do
 | |
|         expect(Kernel).to receive(:system).with("custom command").and_return(false)
 | |
|         expect(described_class.preinstall("google-chrome", postinstall: "custom command")).to be(true)
 | |
|         expect(described_class.install("google-chrome", postinstall: "custom command")).to be(false)
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | 
