Build ProviderExampleGroup for refactored provider tests
authorBruce Williams <bruce@codefluency.com>
Thu, 18 Mar 2010 03:23:22 +0000 (20:23 -0700)
committerBruce Williams <bruce@codefluency.com>
Thu, 18 Mar 2010 03:23:22 +0000 (20:23 -0700)
lib/puppet/provider/vcsrepo/git.rb
spec/spec_helper.rb
spec/support/fixture_helpers.rb [new file with mode: 0644]
spec/support/provider_subject.rb [new file with mode: 0644]
spec/support/resource_helpers.rb [new file with mode: 0644]
spec/support/vcsrepo_helpers.rb [new file with mode: 0644]
spec/unit/puppet/provider/vcsrepo/git_spec.rb
spec/unit/puppet/type/README.markdown [new file with mode: 0644]

index ba5065e..df85ff0 100644 (file)
@@ -37,7 +37,7 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
   end
 
   def revision=(desired)
-    pull
+    fetch
     reset(desired)
   end
 
@@ -78,9 +78,9 @@ Puppet::Type.type(:vcsrepo).provide(:git, :parent => Puppet::Provider::Vcsrepo)
     git(*args)
   end
 
-  def pull
+  def fetch
     at_path do
-      git('pull', 'origin')
+      git('fetch', 'origin')
     end
   end
 
index 1938658..40b79f1 100644 (file)
@@ -7,17 +7,14 @@ require 'puppet'
 gem 'rspec', '=1.2.9'
 require 'spec/autorun'
 
-module Helpers
-
-  def fixture(name, ext = '.txt')
-    File.read(File.join(File.dirname(__FILE__), 'fixtures', name.to_s + ext))
-  end
-  
+Dir[File.join(File.dirname(__FILE__), 'support', '*.rb')].each do |support_file|
+  require support_file
 end
 
 Spec::Runner.configure do |config|
   config.mock_with :mocha
-  config.include(Helpers)
+  config.include(FixtureHelpers)
+  config.include(VcsrepoHelpers)
 end
 
 # We need this because the RAL uses 'should' as a method.  This
diff --git a/spec/support/fixture_helpers.rb b/spec/support/fixture_helpers.rb
new file mode 100644 (file)
index 0000000..7b7b20a
--- /dev/null
@@ -0,0 +1,7 @@
+module FixtureHelpers
+
+  def fixture(name, ext = '.txt')
+    File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', name.to_s + ext))
+  end
+  
+end
diff --git a/spec/support/provider_subject.rb b/spec/support/provider_subject.rb
new file mode 100644 (file)
index 0000000..de7ce7c
--- /dev/null
@@ -0,0 +1,7 @@
+module ProviderSubject
+
+  def provider
+    subject
+  end
+
+end
diff --git a/spec/support/resource_helpers.rb b/spec/support/resource_helpers.rb
new file mode 100644 (file)
index 0000000..8327ec0
--- /dev/null
@@ -0,0 +1,27 @@
+class ProviderExampleGroup < Spec::Example::ExampleGroup
+
+  attr_reader :resource
+  
+  before :each do
+    resource_hash = example_group_hierarchy.inject({}) do |memo, klass|
+      memo.merge(klass.options[:resource] || {})
+    end
+    full_hash = resource_hash.merge(:provider => described_class.name)
+    @resource = described_class.resource_type.new(full_hash)
+  end
+  
+  subject { described_class.new(@resource) }
+  alias :provider :subject
+
+  def _(name)
+    resource.value(name)
+  end
+
+end
+
+Spec::Example::ExampleGroupFactory.register(:provider, ProviderExampleGroup)
+
+def describe_provider(type_name, provider_name, options = {}, &block)
+  provider_class = Puppet::Type.type(type_name).provider(provider_name)
+  describe(provider_class, options.merge(:type => :provider), &block)
+end
diff --git a/spec/support/vcsrepo_helpers.rb b/spec/support/vcsrepo_helpers.rb
new file mode 100644 (file)
index 0000000..e0b9beb
--- /dev/null
@@ -0,0 +1,12 @@
+module VcsrepoHelpers
+
+  def expects_chdir
+    Dir.expects(:chdir).with(resource.value(:path)).at_least_once.yields
+  end
+  
+  def expects_mkdir
+    Dir.expects(:mkdir).with(resource.value(:path)).at_least_once
+  end
+
+  
+end
index 0e16e60..c18490f 100644 (file)
 require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end }
 
-provider_class = Puppet::Type.type(:vcsrepo).provider(:git)
-
-describe provider_class do
-
-  before :each do
-    @resource = stub("resource")
-    @provider = provider_class.new(@resource)
-    @path = '/tmp/vcsrepo'
-  end
-
-  describe 'when creating' do
-    context "and when a source is given" do
-      before do
-        @resource.expects(:value).with(:source).returns('git://example.com/repo.git').at_least_once
-      end
-      context "and when ensure = present" do
-        before do
-          @resource.expects(:value).with(:ensure).returns(:present).at_least_once
-        end
-        context "and when a revision is given" do
-          it "should execute 'git clone' and 'git reset'" do
-            @resource.expects(:value).with(:path).returns(@path).at_least_once
-            @provider.expects(:git).with('clone', 'git://example.com/repo.git', @path)
-            @resource.expects(:value).with(:revision).returns('abcdef').at_least_once
-            Dir.expects(:chdir).with(@path).yields
-            @provider.expects('git').with('reset', '--hard', 'abcdef')
-            @provider.create
-          end        
+describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
+  
+  context 'when creating' do
+    context "when a source is given", :resource => {:source => 'git://example.com/repo.git'} do
+      context "when ensure => present", :resource => {:ensure => :present} do
+        context "when a revision is given", :resource => {:revision => 'abcdef'} do
+          it "should execute 'git clone' and 'git reset --hard'" do
+            provider.expects('git').with('clone', resource.value(:source), resource.value(:path))
+            expects_chdir
+            provider.expects('git').with('reset', '--hard', 'abcdef')
+            provider.create
+          end
         end
-        context "and when a revision is not given" do
+        
+        context "when a revision is not given" do
           it "should just execute 'git clone'" do
-            @resource.expects(:value).with(:path).returns(@path).at_least_once
-            @resource.expects(:value).with(:revision).returns(nil).at_least_once
-            @provider.expects(:git).with('clone', 'git://example.com/repo.git', @path)
-            @provider.create
-          end        
+            provider.expects(:git).with('clone', 'git://example.com/repo.git', resource.value(:path))
+            provider.create
+          end
         end
       end
-      context "and when ensure = bare" do
-        before do
-          @resource.expects(:value).with(:ensure).returns(:bare).at_least_once
-        end
-        context "and when a revision is given" do
+      
+      context "when ensure => bare", :resource => {:ensure => :bare} do
+        context "when a revision is given", :resource => {:revision => 'abcdef'} do
           it "should just execute 'git clone --bare'" do
-            @resource.expects(:value).with(:path).returns(@path).at_least_once
-            @resource.expects(:value).with(:revision).returns(nil).at_least_once
-            @provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path)
-            @provider.create
-          end        
+            subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path))
+            subject.create
+          end
         end
-        context "and when a revision is not given" do
+        
+        context "when a revision is not given" do
           it "should just execute 'git clone --bare'" do
-            @resource.expects(:value).with(:path).returns(@path).at_least_once
-            @resource.expects(:value).with(:revision).returns(nil).at_least_once
-            @provider.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', @path)
-            @provider.create
-          end        
+            subject.expects(:git).with('clone', '--bare', 'git://example.com/repo.git', resource.value(:path))
+            subject.create
+          end
         end
       end
-
     end
+    
     context "when a source is not given" do
-      before do
-        @resource.expects(:value).with(:path).returns(@path).at_least_once
-        @resource.expects(:value).with(:source).returns(nil)
-      end
-      context "when ensure = present" do
-        before { @resource.expects(:value).with(:ensure).returns(:present).at_least_once }
+      context "when ensure => present", :resource => {:ensure => :present} do
         context "when the path does not exist" do
           it "should execute 'git init'" do
-            Dir.expects(:mkdir).with(@path)
-            Dir.expects(:chdir).with(@path).yields
-            @provider.expects(:bare_exists?).returns(false)
-            File.expects(:directory?).with(@path).returns(false)
-            @provider.expects(:git).with('init')
-            @provider.create
+            expects_mkdir
+            expects_chdir
+            provider.expects(:bare_exists?).returns(false)
+            File.expects(:directory?).with(resource.value(:path)).returns(false)
+            provider.expects(:git).with('init')
+            provider.create
           end
         end
+        
         context "when the path is a bare repository" do
           it "should convert it to a working copy" do
-            @provider.expects(:bare_exists?).returns(true)
-            @provider.expects(:convert_bare_to_working_copy)
-            @provider.create
+            provider.expects(:bare_exists?).returns(true)
+            provider.expects(:convert_bare_to_working_copy)
+            provider.create
           end
         end
+        
         context "when the path is not a repository" do
           it "should raise an exception" do
-            File.expects(:directory?).with(@path).returns(true)
-            @provider.expects(:bare_exists?).returns(false)
-            proc {
-              @provider.create
-            }.should raise_error(Puppet::Error)
+            File.expects(:directory?).with(resource.value(:path)).returns(true)
+            provider.expects(:bare_exists?).returns(false)
+            proc { provider.create }.should raise_error(Puppet::Error)
           end
         end
       end
-      context "when ensure = bare" do
-        before { @resource.expects(:value).with(:ensure).returns(:bare).at_least_once } 
+      
+      context "when ensure = bare", :resource => {:ensure => :bare} do
         context "when the path does not exist" do
           it "should execute 'git init --bare'" do
-            Dir.expects(:chdir).with(@path).yields
-            File.expects(:directory?).with(@path).returns(false)
-            FileUtils.expects(:mkdir).with(@path)
-            @provider.expects(:working_copy_exists?).returns(false)
-            @provider.expects(:git).with('init', '--bare')
-            @provider.create
+            expects_chdir
+            expects_mkdir
+            File.expects(:directory?).with(resource.value(:path)).returns(false)
+            provider.expects(:working_copy_exists?).returns(false)
+            provider.expects(:git).with('init', '--bare')
+            provider.create
           end
         end
+        
         context "when the path is a working copy repository" do
           it "should convert it to a bare repository" do
-            @provider.expects(:working_copy_exists?).returns(true)
-            @provider.expects(:convert_working_copy_to_bare)
-            @provider.create
+            provider.expects(:working_copy_exists?).returns(true)
+            provider.expects(:convert_working_copy_to_bare)
+            provider.create
           end
         end
+        
         context "when the path is not a repository" do
           it "should raise an exception" do
-            File.expects(:directory?).with(@path).returns(true)
-            @provider.expects(:working_copy_exists?).returns(false)
-            proc {
-              @provider.create
-            }.should raise_error(Puppet::Error)
+            File.expects(:directory?).with(resource.value(:path)).returns(true)
+            provider.expects(:working_copy_exists?).returns(false)
+            proc { provider.create }.should raise_error(Puppet::Error)
           end
         end
       end
     end
-  end
-
-  describe 'when destroying' do
-    it "it should remove the directory" do
-      @resource.expects(:value).with(:path).returns(@path).at_least_once
-      FileUtils.expects(:rm_rf).with(@path)
-      @provider.destroy
-    end
-  end
-
-  describe "when checking the revision property" do
-    context "when given a non-SHA ref as the resource revision" do
-      context "when its SHA is not different than the curent SHA" do
-        it "should return the ref" do
-          @resource.expects(:value).with(:path).returns(@path).at_least_once
-          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
-          @resource.expects(:value).with(:revision).returns('a-tag').at_least_once
-          @provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha')
-          Dir.expects(:chdir).with(@path).twice.yields
-          @provider.revision.should == 'a-tag'
-        end
-      end
-      context "when its SHA is different than the current SHA" do
-        it "should return the current SHA" do
-          @resource.expects(:value).with(:path).returns(@path).at_least_once
-          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
-          @resource.expects(:value).with(:revision).returns('a-tag').at_least_once
-          @provider.expects(:git).with('rev-parse', 'a-tag').returns('othersha')
-          Dir.expects(:chdir).with(@path).twice.yields
-          @provider.revision.should == 'currentsha'
-        end          
+    
+    context 'when destroying' do
+      it "it should remove the directory" do
+        FileUtils.expects(:rm_rf).with(resource.value(:path))
+        provider.destroy
       end
     end
-    context "when given a SHA ref as the resource revision" do
-      context "when it is the same as the current SHA" do
-        it "should return it" do
-          @resource.expects(:value).with(:path).returns(@path).at_least_once
-          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
-          @resource.expects(:value).with(:revision).returns('currentsha').at_least_once
-          @provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha')
-          Dir.expects(:chdir).with(@path).twice.yields
-          @provider.revision.should == 'currentsha'
+    
+    context "when checking the revision property" do
+      context "when given a non-SHA ref as the resource revision", :resource => {:revision => 'a-tag'} do
+        context "when its SHA is not different than the current SHA" do
+          it "should return the ref" do
+            expects_chdir
+            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
+            provider.expects(:git).with('rev-parse', 'a-tag').returns('currentsha')
+            provider.revision.should == 'a-tag'
+          end
+        end
+        
+        context "when its SHA is different than the current SHA" do
+          it "should return the current SHA" do
+            expects_chdir
+            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
+            provider.expects(:git).with('rev-parse', 'a-tag').returns('othersha')
+            provider.revision.should == 'currentsha'
+          end
         end
       end
-      context "when it is not the same as the current SHA" do
-        it "should return the current SHA" do
-          @resource.expects(:value).with(:path).returns(@path).at_least_once
-          @provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
-          @resource.expects(:value).with(:revision).returns('othersha').at_least_once
-          @provider.expects(:git).with('rev-parse', 'othersha').returns('othersha')
-          Dir.expects(:chdir).with(@path).twice.yields
-          @provider.revision.should == 'currentsha'
+      
+      context "when given a SHA ref as the resource revision" do
+        context "when it is the same as the current SHA", :resource => {:revision => 'currentsha'} do
+          it "should return it" do
+            expects_chdir
+            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
+            provider.expects(:git).with('rev-parse', 'currentsha').returns('currentsha')
+            provider.revision.should == 'currentsha'
+          end
+        end
+        
+        context "when it is not the same as the current SHA", :resource => {:revision => 'othersha'} do
+          it "should return the current SHA" do
+            expects_chdir
+            provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
+            provider.expects(:git).with('rev-parse', 'othersha').returns('othersha')
+            provider.revision.should == 'currentsha'
+          end
         end
       end
     end
-  end
-
-  describe "when setting the revision property" do
-    it "should use 'git fetch' and 'git reset'" do
-      @resource.expects(:value).with(:path).returns(@path).at_least_once
-      @provider.expects('git').with('pull', 'origin')
-      Dir.expects(:chdir).with(@path).at_least_once.yields
-      @provider.expects('git').with('reset', '--hard', 'carcar')
-      @provider.revision = 'carcar'
+    
+    context "when setting the revision property" do
+      it "should use 'git fetch' and 'git reset'" do
+        expects_chdir
+        provider.expects('git').with('fetch', 'origin')
+        provider.expects('git').with('reset', '--hard', 'carcar')
+        provider.revision = 'carcar'
+      end
     end
+    
+    context "when updating references" do
+      it "should use 'git fetch --tags'" do
+        expects_chdir
+        provider.expects('git').with('fetch', '--tags', 'origin')
+        provider.update_references
+      end
+    end
+    
   end
-
-  describe "when updating references" do
-    it "should use 'git fetch --tags'" do
-      @resource.expects(:value).with(:path).returns(@path).at_least_once
-      @provider.expects('git').with('fetch', '--tags', 'origin')
-      Dir.expects(:chdir).with(@path).at_least_once.yields
-      @provider.update_references
-    end    
-  end
-
 end
diff --git a/spec/unit/puppet/type/README.markdown b/spec/unit/puppet/type/README.markdown
new file mode 100644 (file)
index 0000000..1ee19ac
--- /dev/null
@@ -0,0 +1,4 @@
+Resource Type Specs
+===================
+
+Define specs for your resource types in this directory.