spec/symphony/tasks/ssh_spec.rb
changeset 4 3972315383b3
child 17 5db18679edcf
equal deleted inserted replaced
3:62196065e9ea 4:3972315383b3
       
     1 
       
     2 require_relative '../../helpers'
       
     3 require 'symphony/tasks/ssh'
       
     4 
       
     5 context Symphony::Task::SSH do
       
     6 	let( :ssh ) { (Pathname( __FILE__ ).dirname.parent.parent + 'fake_ssh').realpath }
       
     7 
       
     8 	before( :each ) do
       
     9 		described_class.configure(
       
    10 			path: ssh.to_s,
       
    11 			key:  '/tmp/sekrit.rsa',
       
    12 			user: 'symphony'
       
    13 		)
       
    14 	end
       
    15 
       
    16 	it_should_behave_like "an object with Configurability"
       
    17 
       
    18 	describe 'subclassed' do
       
    19 		let( :instance ) { Class.new(described_class).new('queue') }
       
    20 		let( :payload ) {
       
    21 			{ 'command' => 'woohoo', 'host' => 'example.com' }
       
    22 		}
       
    23 
       
    24 		it "aborts if there is no command in the payload" do
       
    25 			expect {
       
    26 				instance.work( {}, {} )
       
    27 			}.to raise_exception( ArgumentError, /missing required option 'command'/i )
       
    28 		end
       
    29 
       
    30 		it "aborts if there is no host in the payload" do
       
    31 			expect {
       
    32 				instance.work({ 'command' => 'boop' }, {} )
       
    33 			}.to raise_exception( ArgumentError, /missing required option 'host'/i )
       
    34 		end
       
    35 
       
    36 		it "builds the proper command line" do
       
    37 			pipe = double( :fake_pipes ).as_null_object
       
    38 			allow( IO ).to receive( :pipe ).and_return([ pipe, pipe ])
       
    39 
       
    40 			args = [
       
    41 				'-p', '22', '-i', '/tmp/sekrit.rsa', '-l', 'symphony', 'example.com'
       
    42 			]
       
    43 
       
    44 			expect( Process ).to receive( :spawn ).with(
       
    45 				*[ ssh.to_s, described_class.opts, args ].flatten,
       
    46 				:out => pipe, :in => pipe, :close_others => true
       
    47 			).and_return( 12 )
       
    48 
       
    49 			expect( Process ).to receive( :waitpid2 ).with( 12 ).and_return([ 12, 1 ])
       
    50 
       
    51 			code = instance.work( payload, {} )
       
    52 			expect( code ).to eq( 1 )
       
    53 		end
       
    54 
       
    55 		it "execs and captures output" do
       
    56 			code = instance.work( payload, {} )
       
    57 			expect( code ).to eq( 0 )
       
    58 
       
    59 			output = instance.instance_variable_get( :@output )
       
    60 			expect( output ).to eq( 'Hi there!' )
       
    61 		end
       
    62 	end
       
    63 end
       
    64