74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | class Hbc::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 | ||
|  |     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 | ||
|  | 
 | ||
|  | module FakeSystemCommandHooks | ||
|  |   def after_teardown | ||
|  |     super | ||
|  |     Hbc::FakeSystemCommand.verify_expectations! | ||
|  |   ensure | ||
|  |     Hbc::FakeSystemCommand.clear | ||
|  |   end | ||
|  | end | ||
|  | 
 | ||
|  | class MiniTest::Spec | ||
|  |   include FakeSystemCommandHooks | ||
|  | end |