78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| def sudo(*args)
 | |
|   %w[/usr/bin/sudo -E --] + args.flatten
 | |
| end
 | |
| 
 | |
| module Hbc
 | |
|   class FakeSystemCommand
 | |
|     def self.responses
 | |
|       @responses ||= {}
 | |
|     end
 | |
| 
 | |
|     def self.expectations
 | |
|       @expectations ||= {}
 | |
|     end
 | |
| 
 | |
|     def self.system_calls
 | |
|       @system_calls ||= Hash.new(0)
 | |
|     end
 | |
| 
 | |
|     def self.clear
 | |
|       @responses    = nil
 | |
|       @expectations = nil
 | |
|       @system_calls = nil
 | |
|     end
 | |
| 
 | |
|     def self.stubs_command(command, response = "")
 | |
|       responses[command] = response
 | |
|     end
 | |
| 
 | |
|     def self.expects_command(command, response = "", times = 1)
 | |
|       stubs_command(command, response)
 | |
|       expectations[command] = times
 | |
|     end
 | |
| 
 | |
|     def self.expect_and_pass_through(command, times = 1)
 | |
|       pass_through = ->(cmd, opts) { Hbc::SystemCommand.run(cmd, opts) }
 | |
|       expects_command(command, pass_through, times)
 | |
|     end
 | |
| 
 | |
|     def self.verify_expectations!
 | |
|       expectations.each do |command, times|
 | |
|         unless system_calls[command] == times
 | |
|           raise("expected #{command.inspect} to be run #{times} times, but got #{system_calls[command]}")
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def self.run(command_string, options = {})
 | |
|       command = Hbc::SystemCommand.new(command_string, options).command
 | |
|       puts command
 | |
|       unless responses.key?(command)
 | |
|         raise("no response faked for #{command.inspect}, faked responses are: #{responses.inspect}")
 | |
|       end
 | |
|       system_calls[command] += 1
 | |
| 
 | |
|       response = responses[command]
 | |
|       if response.respond_to?(:call)
 | |
|         response.call(command_string, options)
 | |
|       else
 | |
|         Hbc::SystemCommand::Result.new(command, response, "", 0)
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def self.run!(command, options = {})
 | |
|       run(command, options.merge(must_succeed: true))
 | |
|     end
 | |
|   end
 | |
| end
 | |
| 
 | |
| RSpec.configure do |config|
 | |
|   config.after(:each) do
 | |
|     begin
 | |
|       Hbc::FakeSystemCommand.verify_expectations!
 | |
|     ensure
 | |
|       Hbc::FakeSystemCommand.clear
 | |
|     end
 | |
|   end
 | |
| end
 | 
