summaryrefslogtreecommitdiff
path: root/spec/unit/puppet/provider/vcsrepo/git_spec.rb
blob: f7864c0afd43296aaf22ef4fb2278568ec01354d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end }

describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
  
  context 'creating' do
    resource_with :source do
      resource_with :ensure => :present do
        resource_with :revision 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', resource.value(:revision))
            provider.expects(:git).with('submodule', 'init')
            provider.expects(:git).with('submodule', 'update')
            provider.create
          end
        end
        
        resource_without :revision do
          it "should execute 'git clone' and submodule commands" do
            provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
            expects_chdir
            provider.expects(:git).with('submodule', 'init')
            provider.expects(:git).with('submodule', 'update')
            provider.create
          end
        end
      end
      
      resource_with :ensure => :bare do
        resource_with :revision do
          it "should just execute 'git clone --bare'" do
            provider.expects(:git).with('clone', '--bare', resource.value(:source), resource.value(:path))
            provider.create
          end
        end
        
        resource_without :revision do
          it "should just execute 'git clone --bare'" do
            provider.expects(:git).with('clone', '--bare', resource.value(:source), resource.value(:path))
            provider.create
          end
        end
      end
    end
    
    context "when a source is not given" do
      resource_with :ensure => :present do
        context "when the path does not exist" do
          it "should execute 'git init'" do
            expects_mkdir
            expects_chdir
            expects_directory?(false)
            provider.expects(:bare_exists?).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
          end
        end
        
        context "when the path is not a repository" do
          it "should raise an exception" do
            expects_directory?(true)
            provider.expects(:bare_exists?).returns(false)
            proc { provider.create }.should raise_error(Puppet::Error)
          end
        end
      end
      
      resource_with :ensure => :bare do
        context "when the path does not exist" do
          it "should execute 'git init --bare'" do
            expects_chdir
            expects_mkdir
            expects_directory?(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
          end
        end
        
        context "when the path is not a repository" do
          it "should raise an exception" do
            expects_directory?(true)
            provider.expects(:working_copy_exists?).returns(false)
            proc { provider.create }.should raise_error(Puppet::Error)
          end
        end
      end
    end

  end
  
  context 'destroying' do
    it "it should remove the directory" do
      expects_rm_rf
      provider.destroy
    end
  end
  
  context "checking the revision property" do
    resource_with :revision do
      before do
        expects_chdir
        provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
      end
      
      context "when its SHA is not different than the current SHA" do
        it "should return the ref" do
          provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha')
          provider.revision.should == resource.value(:revision)
        end
      end
      
      context "when its SHA is different than the current SHA" do
        it "should return the current SHA" do
          provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('othersha')
          provider.revision.should == 'currentsha'
        end
      end
    end
  end
  
  context "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.expects(:git).with('submodule', 'init')
      provider.expects(:git).with('submodule', 'update')
      provider.revision = 'carcar'
    end
  end
  
  context "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