diff --git a/lib/puppet/provider/user/useradd_win.rb
b/lib/puppet/provider/user/useradd_win.rb
new file mode 100644
index 0000000..cf9cae4
--- /dev/null
+++ b/lib/puppet/provider/user/useradd_win.rb
@@ -0,0 +1,49 @@
+require 'puppet/provider'
+
+Puppet::Type.type(:user).provide :useradd_win do
+    desc "User management for windows"
+
+    confine :true => Puppet.features.windows?
+    require 'puppet/util/windows_system'
+
+    has_features :manages_passwords
+
+    def user
+        @user = Puppet::Util::Windows::User.new(name) unless defined?(@user)
+        @user
+    end
+
+    def name
+        @resource[:name]
+    end
+
+    def password
+        password = @resource[:password]
+        user.password_is?(password) ?password :"" rescue :absent
+    end
+
+    def password=(pwd)
+        user.password = @resource[:password]
+    end
+
+    def groups
+        user.groups.join(',') rescue :absent
+    end
+
+    def groups=(groups)
+        user.set_groups(groups, @resource[:membership] == :minimum)
+    end
+
+    def create
+        @user = Puppet::Util::Windows::User.create(name, @resource[:password])
+        user.set_groups(@resource[:groups], @resource[:membership] == :minimum)
+    end
+
+    def exists?
+        return Puppet::Util::Windows::User.exists?(name)
+    end
+
+    def delete
+        Puppet::Util::Windows::User.delete(name)
+    end
+end
diff --git a/spec/integration/provider/user/useradd_win.rb
b/spec/integration/provider/user/useradd_win.rb
new file mode 100644
index 0000000..55cd094
--- /dev/null
+++ b/spec/integration/provider/user/useradd_win.rb
@@ -0,0 +1,82 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "Provider for windows users" do
+    confine :true => Puppet.features.windows?
+
+    require 'windowstest'
+    include WindowsTest
+
+    def user_provider(resource_configuration)
+        provider = Puppet::Type.type(:user).provider(:useradd_win).new
+        provider.resource = resource_configuration
+        return provider
+    end
+
+    after(:each) do
+        clear
+    end
+
+    it 'should add a user with the given password and group membership' do
+        expected_groups = ["randomgroup1", "randomgroup2"]
+        username = "testuser"
+        password = "1234"
+
+        mkgroups(expected_groups)
+        register_user username
+
+        provider = user_provider :name => username, :password =>
password, :groups => expected_groups.join(",")
+        provider.create
+
+        testuser = user(username)
+        testuser.password_is?(password).should be_true
+
+        groups = testuser.groups
+
+        expected_groups.each {|expected_group|
groups.include?(expected_group).should be_true }
+        expected_groups.length.should be_eql(groups.length)
+    end
+
+    describe "when a user belongs to groups named randomgroup1,
randomgroup2," do
+        before(:all) do
+            expected_groups = ["randomgroup1", "randomgroup2"]
+            username = "testuser"
+
+            mkgroups expected_groups
+            mkuser username
+
+            @provider = user_provider :name => username
+            @provider.groups = expected_groups.join(",")
+
+            groups = @provider.groups.split(',').collect {|group| group.strip }
+            groups.length.should be_eql(expected_groups.length)
+            groups.each {|group|
expected_groups.include?(group).should be_true }
+        end
+
+        describe "after setting membership to randomgroup1 only, " do
+            before(:all) do
+                @provider.groups = "randomgroup1"
+            end
+
+            it "the user should no more be a member of randomgroup 2" do
+                groups = @provider.groups
+
+                groups.index(',').should be_nil
+                groups.should be_eql("randomgroup1")
+            end
+        end
+    end
+
+    it 'should set a users password' do
+        username = "testuser"
+        password = "11112222"
+
+        testuser = mkuser username, password
+
+        provider = user_provider :name => username, :password => password
+        provider.password = password
+
+        testuser.password_is?(password).should be_true
+    end
+end
diff --git a/spec/unit/provider/user/useradd_win.rb
b/spec/unit/provider/user/useradd_win.rb
new file mode 100644
index 0000000..587a7af
--- /dev/null
+++ b/spec/unit/provider/user/useradd_win.rb
@@ -0,0 +1,79 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../../spec_helper'
+
+describe "User management for Windows: useradd_win" do
+    confine :true => Puppet.features.windows?
+
+    before(:each) do
+        @resource = stub('resource')
+        @resource.stubs(:[]).with(:name).returns('testuser')
+        @resource.stubs(:[]).with(:password).returns('pwd')
+
+        provider_class = Puppet::Type.type(:user).provider(:useradd_win)
+        @provider = provider_class.new(@resource)
+
+        @user_mock = mock('user')
+        @provider.stubs(:user).returns @user_mock
+    end
+
+    it 'should be able to verify a users password using User::password_is?' do
+        @user_mock.expects(:password_is?).with('pwd').returns true
+        @provider.password.should be_eql('pwd')
+
+        @user_mock.expects(:password_is?).with('pwd').returns false
+        @provider.password.should be_eql('')
+    end
+
+    it 'should be able to set a users password using User::password' do
+        @user_mock.expects(:password=).with('pwd')
+        @provider.password = 'pwd'
+    end
+
+    describe 'when asked for a list of groups of which the user is a member' do
+        it 'should return the list of groups as a csv' do
+            @user_mock.expects(:groups).returns ['group1', 'group2', 'group3']
+            @provider.groups.should be_eql('group1,group2,group3')
+        end
+
+        it 'should return :absent if any error is raised while
fetching the list' do
+            @user_mock.expects(:groups).raises("ERROR")
+            @provider.groups.should be_eql(:absent)
+        end
+    end
+
+    it 'should be able to add a user to a set of groups' do
+        @resource.expects(:[]).with(:membership).returns(:minimum)
+        @user_mock.expects(:set_groups).with('group1,group2', true)
+
+        @provider.groups = 'group1,group2'
+
+        @resource.expects(:[]).with(:membership).returns(:inclusive)
+        @user_mock.expects(:set_groups).with('group1,group2', false)
+
+        @provider.groups = 'group1,group2'
+    end
+
+    it 'should be able to create a user' do
+        @resource.expects(:[]).with(:groups).returns('group1,group2')
+        @resource.expects(:[]).with(:membership).returns(:minimum)
+
+        Puppet::Util::Windows::User.expects(:create).with('testuser',
'pwd').returns @user_mock
+        @user_mock.expects(:set_groups).with('group1,group2', true)
+
+        @provider.create
+    end
+
+    it 'should be able to test whether a user exists' do
+        Puppet::Util::Windows::User.expects(:exists?).with('testuser').returns
true
+        @provider.exists?.should be_true
+
+        Puppet::Util::Windows::User.expects(:exists?).with('testuser').returns
false
+        @provider.exists?.should be_false
+    end
+
+    it 'should be able to delete a user' do
+        Puppet::Util::Windows::User.expects(:delete).with('testuser')
+        @provider.delete
+    end
+end

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to