Merge pull request #46 from Paulche/master
[puppet_vcsrepo.git] / spec / unit / puppet / provider / vcsrepo / git_spec.rb
index c878941..68b6c0a 100644 (file)
@@ -8,6 +8,7 @@ describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
         context "with a revision that is a remote branch", :resource => {:revision => 'only/remote'} do
           it "should execute 'git clone' and 'git checkout -b'" do
             provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
+            expects_chdir('/')
             expects_chdir
             provider.expects(:update_submodules)
             provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
@@ -18,6 +19,7 @@ describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
         context "with a revision that is not a remote branch", :resource => {:revision => 'a-commit-or-tag'} do
           it "should execute 'git clone' and 'git reset --hard'" do
             provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
+            expects_chdir('/')
             expects_chdir
             provider.expects(:update_submodules)
             provider.expects(:git).with('branch', '-a').returns(resource.value(:revision))
@@ -127,9 +129,10 @@ describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
 
       context "when its SHA is not different than the current SHA" do
         it "should return the ref" do
+          provider.expects(:git).with('config', 'remote.origin.url').returns('')
           provider.expects(:git).with('fetch', 'origin') # FIXME
           provider.expects(:git).with('fetch', '--tags', 'origin')
-          provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha')
+          provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('currentsha')
           provider.expects(:git).with('tag', '-l').returns("Hello")
           provider.revision.should == resource.value(:revision)
         end
@@ -137,13 +140,52 @@ describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
 
       context "when its SHA is different than the current SHA" do
         it "should return the current SHA" do
+          provider.expects(:git).with('config', 'remote.origin.url').returns('')
           provider.expects(:git).with('fetch', 'origin') # FIXME
           provider.expects(:git).with('fetch', '--tags', 'origin')
-          provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('othersha')
+          provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('othersha')
           provider.expects(:git).with('tag', '-l').returns("Hello")
           provider.revision.should == 'currentsha'
         end
       end
+
+      context "when its a ref to a remote head" do
+        it "should return the revision" do
+          provider.expects(:git).with('config', 'remote.origin.url').returns('')
+          provider.expects(:git).with('fetch', 'origin') # FIXME
+          provider.expects(:git).with('fetch', '--tags', 'origin')
+          provider.expects(:git).with('tag', '-l').returns("Hello")
+          provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('')
+          provider.expects(:git).with('ls-remote', '--heads', '--tags', 'origin', resource.value(:revision)).returns("newsha refs/heads/#{resource.value(:revision)}")
+          provider.revision.should == 'currentsha'
+        end
+      end
+
+      context "when its a ref to non existant remote head" do
+        it "should fail" do
+          provider.expects(:git).with('config', 'remote.origin.url').returns('')
+          provider.expects(:git).with('fetch', 'origin') # FIXME
+          provider.expects(:git).with('fetch', '--tags', 'origin')
+          provider.expects(:git).with('tag', '-l').returns("Hello")
+          provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('')
+          provider.expects(:git).with('ls-remote', '--heads', '--tags', 'origin', resource.value(:revision)).returns('')
+          expect { provider.revision }.should raise_error(Puppet::Error, /not a local or remote ref$/)
+        end
+      end
+
+      context "when the source is modified" do
+        resource_with :source => 'git://git@foo.com/bar.git' do
+          it "should update the origin url" do
+            provider.expects(:git).with('config', 'remote.origin.url').returns('old')
+            provider.expects(:git).with('config', 'remote.origin.url', 'git://git@foo.com/bar.git')
+            provider.expects(:git).with('fetch', 'origin') # FIXME
+            provider.expects(:git).with('fetch', '--tags', 'origin')
+            provider.expects(:git).with('rev-parse', '--revs-only', resource.value(:revision)).returns('currentsha')
+            provider.expects(:git).with('tag', '-l').returns("Hello")
+            provider.revision.should == resource.value(:revision)
+          end
+        end
+      end
     end
   end
 
@@ -186,6 +228,7 @@ describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
   context "updating references" do
     it "should use 'git fetch --tags'" do
       expects_chdir
+      provider.expects(:git).with('config', 'remote.origin.url').returns('')
       provider.expects(:git).with('fetch', 'origin')
       provider.expects(:git).with('fetch', '--tags', 'origin')
       provider.update_references