Skip to content

Commit 0b6c68b

Browse files
committed
Updating the user provider and the user_spec, much more coverage
1 parent 0c99f89 commit 0b6c68b

2 files changed

Lines changed: 192 additions & 54 deletions

File tree

chef/lib/chef/provider/user.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,12 @@ def action_manage
116116
end
117117

118118
def action_modify
119-
if @user_exists && compare_user
120-
manage_user
121-
@new_resource.updated = true
122-
Chef::Log.info("Modified #{@new_resource}")
119+
if @user_exists
120+
if compare_user
121+
manage_user
122+
@new_resource.updated = true
123+
Chef::Log.info("Modified #{@new_resource}")
124+
end
123125
else
124126
raise Chef::Exception::User, "Cannot modify #{@new_resource} - user does not exist!"
125127
end

chef/spec/unit/provider/user_spec.rb

Lines changed: 186 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,7 @@
169169

170170
it "should return false if the objects are identical" do
171171
@provider.compare_user.should eql(false)
172-
end
173-
172+
end
174173
end
175174

176175
describe Chef::Provider::User, "action_create" do
@@ -235,33 +234,16 @@
235234
@new_resource.should_receive(:updated=).with(true).and_return(true)
236235
@provider.action_create
237236
end
238-
239237
end
240238

241239
describe 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
@@ -291,48 +273,202 @@
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
337408
end
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

Comments
 (0)