169169
170170 it "should return false if the objects are identical" do
171171 @provider . compare_user . should eql ( false )
172- end
173-
172+ end
174173end
175174
176175describe Chef ::Provider ::User , "action_create" do
235234 @new_resource . should_receive ( :updated= ) . with ( true ) . and_return ( true )
236235 @provider . action_create
237236 end
238-
239237end
240238
241239describe Chef ::Provider ::User , "action_remove" do
242240 before ( :each ) do
243241 @node = mock ( "Chef::Node" , :null_object => true )
244242 @new_resource = mock ( "Chef::Resource::User" ,
245- :null_object => true ,
246- :username => "adam" ,
247- :comment => "Adam Jacob" ,
248- :uid => 1000 ,
249- :gid => 1000 ,
250- :home => "/home/adam" ,
251- :shell => "/usr/bin/zsh" ,
252- :password => nil ,
253- :updated => nil
243+ :null_object => true
254244 )
255245 @current_resource = mock ( "Chef::Resource::User" ,
256- :null_object => true ,
257- :username => "adam" ,
258- :comment => "Adam Jacob" ,
259- :uid => 1000 ,
260- :gid => 1000 ,
261- :home => "/home/adam" ,
262- :shell => "/usr/bin/zsh" ,
263- :password => nil ,
264- :updated => nil
246+ :null_object => true
265247 )
266248 @provider = Chef ::Provider ::User . new ( @node , @new_resource )
267249 @provider . current_resource = @current_resource
291273 before ( :each ) do
292274 @node = mock ( "Chef::Node" , :null_object => true )
293275 @new_resource = mock ( "Chef::Resource::User" ,
294- :null_object => true ,
295- :username => "adam" ,
296- :comment => "Adam Jacob" ,
297- :uid => 1000 ,
298- :gid => 1000 ,
299- :home => "/home/adam" ,
300- :shell => "/usr/bin/zsh" ,
301- :password => nil ,
302- :updated => nil
276+ :null_object => true
303277 )
304278 @current_resource = mock ( "Chef::Resource::User" ,
305- :null_object => true ,
306- :username => "adam" ,
307- :comment => "Adam Jacob" ,
308- :uid => 1000 ,
309- :gid => 1000 ,
310- :home => "/home/adam" ,
311- :shell => "/usr/bin/zsh" ,
312- :password => nil ,
313- :updated => nil
279+ :null_object => true
314280 )
315281 @provider = Chef ::Provider ::User . new ( @node , @new_resource )
316282 @provider . current_resource = @current_resource
317- @provider . user_exists = false
318- @provider . stub! ( :remove_user ) . and_return ( true )
283+ @provider . user_exists = true
284+ @provider . stub! ( :manage_user ) . and_return ( true )
285+ end
286+
287+ it "should run manage_user if the user exists and has mismatched attributes" do
288+ @provider . should_receive ( :compare_user ) . and_return ( true )
289+ @provider . should_receive ( :manage_user ) . and_return ( true )
290+ @provider . action_manage
319291 end
320292
321- it "should not call remove_user if the user does not exist" do
322- @provider . should_not_receive ( :remove_user )
323- @provider . action_remove
293+ it "should set the new resources updated flag to true if manage_user is called" do
294+ @provider . stub! ( :compare_user ) . and_return ( true )
295+ @provider . stub! ( :manage_user ) . and_return ( true )
296+ @new_resource . should_receive ( :updated= ) . with ( true ) . and_return ( true )
297+ @provider . action_manage
324298 end
325299
326- it "should call remove_user if the user exists " do
327- @provider . user_exists = true
328- @provider . should_receive ( :remove_user )
329- @provider . action_remove
300+ it "should not run manage_user if the user does not exist " do
301+ @provider . user_exists = false
302+ @provider . should_not_receive ( :manage_user )
303+ @provider . action_manage
330304 end
331305
332- it "should set the new_resources updated flag to true if the user is removed" do
306+ it "should not run manage_user if the user exists but has no differing attributes" do
307+ @provider . should_receive ( :compare_user ) . and_return ( false )
308+ @provider . should_not_receive ( :manage_user )
309+ @provider . action_manage
310+ end
311+ end
312+
313+ describe Chef ::Provider ::User , "action_modify" do
314+ before ( :each ) do
315+ @node = mock ( "Chef::Node" , :null_object => true )
316+ @new_resource = mock ( "Chef::Resource::User" ,
317+ :null_object => true
318+ )
319+ @current_resource = mock ( "Chef::Resource::User" ,
320+ :null_object => true
321+ )
322+ @provider = Chef ::Provider ::User . new ( @node , @new_resource )
323+ @provider . current_resource = @current_resource
333324 @provider . user_exists = true
325+ @provider . stub! ( :manage_user ) . and_return ( true )
326+ end
327+
328+ it "should run manage_user if the user exists and has mismatched attributes" do
329+ @provider . should_receive ( :compare_user ) . and_return ( true )
330+ @provider . should_receive ( :manage_user ) . and_return ( true )
331+ @provider . action_modify
332+ end
333+
334+ it "should set the new resources updated flag to true if manage_user is called" do
335+ @provider . stub! ( :compare_user ) . and_return ( true )
336+ @provider . stub! ( :manage_user ) . and_return ( true )
334337 @new_resource . should_receive ( :updated= ) . with ( true ) . and_return ( true )
335- @provider . action_remove
338+ @provider . action_modify
339+ end
340+
341+ it "should not run manage_user if the user exists but has no differing attributes" do
342+ @provider . should_receive ( :compare_user ) . and_return ( false )
343+ @provider . should_not_receive ( :manage_user )
344+ @provider . action_modify
345+ end
346+
347+ it "should raise a Chef::Exception::User if the user doesn't exist" do
348+ @provider . user_exists = false
349+ lambda { @provider . action_modify } . should raise_error ( Chef ::Exception ::User )
350+ end
351+ end
352+
353+ describe Chef ::Provider ::User , "check_lock" do
354+ before ( :each ) do
355+ @node = mock ( "Chef::Node" , :null_object => true )
356+ @new_resource = mock ( "Chef::Resource::User" ,
357+ :null_object => true ,
358+ :username => "adam"
359+ )
360+ @status = mock ( "Status" , :exitstatus => 0 )
361+ @provider = Chef ::Provider ::User . new ( @node , @new_resource )
362+ @provider . stub! ( :popen4 ) . and_return ( @status )
363+ @stdin = mock ( "STDIN" , :null_object => true )
364+ @stdout = mock ( "STDOUT" , :null_object => true )
365+ @stdout . stub! ( :gets ) . and_return ( "root P 09/02/2008 0 99999 7 -1" )
366+ @stderr = mock ( "STDERR" , :null_object => true )
367+ @pid = mock ( "PID" , :null_object => true )
368+ end
369+
370+ it "should call passwd -S to check the lock status" do
371+ @provider . should_receive ( :popen4 ) . with ( "passwd -S #{ @new_resource . username } " ) . and_return ( @status )
372+ @provider . check_lock
373+ end
374+
375+ it "should close stdin on passwd -S" do
376+ @provider . should_receive ( :popen4 ) . and_yield ( @pid , @stdin , @stdout , @stderr ) . and_return ( @status )
377+ @stdin . should_receive ( :close ) . and_return ( true )
378+ @provider . check_lock
379+ end
380+
381+ it "should get the first line of passwd -S STDOUT" do
382+ @provider . should_receive ( :popen4 ) . and_yield ( @pid , @stdin , @stdout , @stderr ) . and_return ( @status )
383+ @stdout . should_receive ( :gets ) . and_return ( "root P 09/02/2008 0 99999 7 -1" )
384+ @provider . check_lock
385+ end
386+
387+ it "should return false if status begins with P" do
388+ @provider . should_receive ( :popen4 ) . and_yield ( @pid , @stdin , @stdout , @stderr ) . and_return ( @status )
389+ @provider . check_lock . should eql ( false )
390+ end
391+
392+ it "should return false if status begins with N" do
393+ @stdout . stub! ( :gets ) . and_return ( "root N" )
394+ @provider . should_receive ( :popen4 ) . and_yield ( @pid , @stdin , @stdout , @stderr ) . and_return ( @status )
395+ @provider . check_lock . should eql ( false )
396+ end
397+
398+ it "should return true if status begins with L" do
399+ @stdout . stub! ( :gets ) . and_return ( "root L" )
400+ @provider . should_receive ( :popen4 ) . and_yield ( @pid , @stdin , @stdout , @stderr ) . and_return ( @status )
401+ @provider . check_lock . should eql ( true )
402+ end
403+
404+ it "should raise a Chef::Exception::User if passwd -S fails" do
405+ @status . should_receive ( :exitstatus ) . and_return ( 1 )
406+ lambda { @provider . check_lock } . should raise_error ( Chef ::Exception ::User )
336407 end
337408end
338409
410+ describe Chef ::Provider ::User , "action_lock" do
411+ before ( :each ) do
412+ @node = mock ( "Chef::Node" , :null_object => true )
413+ @new_resource = mock ( "Chef::Resource::User" ,
414+ :null_object => true
415+ )
416+ @current_resource = mock ( "Chef::Resource::User" ,
417+ :null_object => true
418+ )
419+ @provider = Chef ::Provider ::User . new ( @node , @new_resource )
420+ @provider . current_resource = @current_resource
421+ @provider . user_exists = true
422+ @provider . stub! ( :check_lock ) . and_return ( true )
423+ @provider . stub! ( :lock_user ) . and_return ( true )
424+ end
425+
426+ it "should lock the user if it exists and is unlocked" do
427+ @provider . stub! ( :check_lock ) . and_return ( false )
428+ @provider . should_receive ( :lock_user ) . and_return ( true )
429+ @provider . action_lock
430+ end
431+
432+ it "should set the new resources updated flag to true if lock_user is called" do
433+ @provider . stub! ( :check_lock ) . and_return ( false )
434+ @new_resource . should_receive ( :updated= ) . with ( true )
435+ @provider . action_lock
436+ end
437+
438+ it "should raise a Chef::Exception::User if we try and lock a user that does not exist" do
439+ @provider . user_exists = false
440+ lambda { @provider . action_lock } . should raise_error ( Chef ::Exception ::User )
441+ end
442+ end
443+
444+ describe Chef ::Provider ::User , "action_unlock" do
445+ before ( :each ) do
446+ @node = mock ( "Chef::Node" , :null_object => true )
447+ @new_resource = mock ( "Chef::Resource::User" ,
448+ :null_object => true
449+ )
450+ @current_resource = mock ( "Chef::Resource::User" ,
451+ :null_object => true
452+ )
453+ @provider = Chef ::Provider ::User . new ( @node , @new_resource )
454+ @provider . current_resource = @current_resource
455+ @provider . user_exists = true
456+ @provider . stub! ( :check_lock ) . and_return ( true )
457+ @provider . stub! ( :unlock_user ) . and_return ( true )
458+ end
459+
460+ it "should unlock the user if it exists and is locked" do
461+ @provider . should_receive ( :unlock_user ) . and_return ( true )
462+ @provider . action_unlock
463+ end
464+
465+ it "should set the new resources updated flag to true if unlock_user is called" do
466+ @new_resource . should_receive ( :updated= ) . with ( true )
467+ @provider . action_unlock
468+ end
469+
470+ it "should raise a Chef::Exception::User if we try and unlock a user that does not exist" do
471+ @provider . user_exists = false
472+ lambda { @provider . action_unlock } . should raise_error ( Chef ::Exception ::User )
473+ end
474+ end
0 commit comments