From abd973080207906c32831ff315b9f7a6d2bcb872 Mon Sep 17 00:00:00 2001 From: Bruce Williams Date: Fri, 12 Mar 2010 18:34:03 -0800 Subject: Tests for Git revision property, cleanup --- lib/puppet/provider/vcsrepo/git.rb | 18 ++++---- lib/puppet/provider/vcsrepo/svn.rb | 4 +- spec/unit/puppet/provider/vcsrepo/git_spec.rb | 63 +++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/lib/puppet/provider/vcsrepo/git.rb b/lib/puppet/provider/vcsrepo/git.rb index 7290387..670d8de 100644 --- a/lib/puppet/provider/vcsrepo/git.rb +++ b/lib/puppet/provider/vcsrepo/git.rb @@ -21,12 +21,8 @@ Puppet::Type.type(:vcsrepo).provide(:git) do end def revision - current = Dir.chdir(@resource.value(:path)) do - git('rev-parse', 'HEAD') - end - canonical = Dir.chdir(@resource.value(:path)) do - git('rev-parse', @resource.value(:revision)) - end + current = at_path { git('rev-parse', 'HEAD') } + canonical = at_path { git('rev-parse', @resource.value(:revision)) } if current == canonical @resource.value(:revision) else @@ -64,8 +60,14 @@ Puppet::Type.type(:vcsrepo).provide(:git) do end end - def at_path(&block) - Dir.chdir(@resource.value(:path), &block) + # Note: We don't rely on Dir.chdir's behavior of automatically returning the + # value of the last statement -- for easier stubbing. + def at_path(&block) #:nodoc: + value = nil + Dir.chdir(@resource.value(:path)) do + value = yield + end + value end end diff --git a/lib/puppet/provider/vcsrepo/svn.rb b/lib/puppet/provider/vcsrepo/svn.rb index fef7b62..0e38769 100644 --- a/lib/puppet/provider/vcsrepo/svn.rb +++ b/lib/puppet/provider/vcsrepo/svn.rb @@ -60,7 +60,9 @@ Puppet::Type.type(:vcsrepo).provide(:svn) do end end - def at_path(&block) + # Note: We don't rely on Dir.chdir's behavior of automatically returning the + # value of the last statement -- for easier stubbing. + def at_path(&block) #:nodoc: value = nil Dir.chdir(@resource.value(:path)) do value = yield diff --git a/spec/unit/puppet/provider/vcsrepo/git_spec.rb b/spec/unit/puppet/provider/vcsrepo/git_spec.rb index d859004..a5ed753 100644 --- a/spec/unit/puppet/provider/vcsrepo/git_spec.rb +++ b/spec/unit/puppet/provider/vcsrepo/git_spec.rb @@ -10,7 +10,7 @@ describe provider_class do @path = '/tmp/vcsrepo' end - context 'when creating' do + describe 'when creating' do context "when a source is given" do context "and when a revision is given" do it "should execute 'git clone' and 'git reset'" do @@ -44,7 +44,7 @@ describe provider_class do end end - context 'when destroying' do + 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) @@ -52,7 +52,7 @@ describe provider_class do end end - context "when checking existence" do + describe "when checking existence" do it "should check for the directory" do @resource.expects(:value).with(:path).returns(@path) File.expects(:directory?).with(@path) @@ -60,6 +60,61 @@ describe provider_class do end end - context "when checking 'revision' property" + 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 + 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' + 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' + 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('fetch', 'origin') + Dir.expects(:chdir).with(@path).at_least_once.yields + @provider.expects('git').with('reset', '--hard', 'carcar') + @provider.revision = 'carcar' + end + end end -- cgit v1.2.3