Merge pull request #31 from ghoneycutt/noticket/master/missing_trailing_comma
[puppet_vcsrepo.git] / spec / unit / puppet / provider / vcsrepo / git_spec.rb
1 require 'pathname'; Pathname.new(__FILE__).realpath.ascend { |x| begin; require (x + 'spec_helper.rb'); break; rescue LoadError; end }
2
3 describe_provider :vcsrepo, :git, :resource => {:path => '/tmp/vcsrepo'} do
4
5   context 'creating' do
6     resource_with :source do
7       resource_with :ensure => :present do
8         context "with a revision that is a remote branch", :resource => {:revision => 'only/remote'} do
9           it "should execute 'git clone' and 'git checkout -b'" do
10             provider.expects('git').with('clone', resource.value(:source), resource.value(:path))
11             expects_chdir
12             provider.expects(:remote_revision_branch?).returns(true)
13             provider.expects(:git).with('checkout', '-b', resource.value(:revision), '--track', "origin/#{resource.value(:revision)}")
14             provider.expects(:update_submodules)
15             provider.create
16           end
17         end
18         context "with a revision that is not a remote branch", :resource => {:revision => 'a-commit-or-tag'} do
19           it "should execute 'git clone' and 'git reset --hard'" do
20             provider.expects('git').with('clone', resource.value(:source), resource.value(:path))
21             expects_chdir
22             provider.expects(:remote_revision_branch?).returns(false)
23             provider.expects('git').with('reset', '--hard', resource.value(:revision))
24             provider.expects(:update_submodules)
25             provider.create
26           end
27         end        
28         resource_without :revision do
29           it "should execute 'git clone' and submodule commands" do
30             provider.expects(:git).with('clone', resource.value(:source), resource.value(:path))
31             provider.expects(:update_submodules)
32             provider.create
33           end
34         end
35       end
36       
37       resource_with :ensure => :bare do
38         resource_with :revision do
39           it "should just execute 'git clone --bare'" do
40             provider.expects(:git).with('clone', '--bare', resource.value(:source), resource.value(:path))
41             provider.create
42           end
43         end
44         
45         resource_without :revision do
46           it "should just execute 'git clone --bare'" do
47             provider.expects(:git).with('clone', '--bare', resource.value(:source), resource.value(:path))
48             provider.create
49           end
50         end
51       end
52     end
53     
54     context "when a source is not given" do
55       resource_with :ensure => :present do
56         context "when the path does not exist" do
57           it "should execute 'git init'" do
58             expects_mkdir
59             expects_chdir
60             expects_directory?(false)
61             provider.expects(:bare_exists?).returns(false)
62             provider.expects(:git).with('init')
63             provider.create
64           end
65         end
66         
67         context "when the path is a bare repository" do
68           it "should convert it to a working copy" do
69             provider.expects(:bare_exists?).returns(true)
70             provider.expects(:convert_bare_to_working_copy)
71             provider.create
72           end
73         end
74         
75         context "when the path is not a repository" do
76           it "should raise an exception" do
77             expects_directory?(true)
78             provider.expects(:bare_exists?).returns(false)
79             proc { provider.create }.should raise_error(Puppet::Error)
80           end
81         end
82       end
83       
84       resource_with :ensure => :bare do
85         context "when the path does not exist" do
86           it "should execute 'git init --bare'" do
87             expects_chdir
88             expects_mkdir
89             expects_directory?(false)
90             provider.expects(:working_copy_exists?).returns(false)
91             provider.expects(:git).with('init', '--bare')
92             provider.create
93           end
94         end
95         
96         context "when the path is a working copy repository" do
97           it "should convert it to a bare repository" do
98             provider.expects(:working_copy_exists?).returns(true)
99             provider.expects(:convert_working_copy_to_bare)
100             provider.create
101           end
102         end
103         
104         context "when the path is not a repository" do
105           it "should raise an exception" do
106             expects_directory?(true)
107             provider.expects(:working_copy_exists?).returns(false)
108             proc { provider.create }.should raise_error(Puppet::Error)
109           end
110         end
111       end
112     end
113
114   end
115   
116   context 'destroying' do
117     it "it should remove the directory" do
118       expects_rm_rf
119       provider.destroy
120     end
121   end
122   
123   context "checking the revision property" do
124     resource_with :revision do
125       before do
126         expects_chdir
127         provider.expects(:git).with('rev-parse', 'HEAD').returns('currentsha')
128       end
129       
130       context "when its SHA is not different than the current SHA" do
131         it "should return the ref" do
132           provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('currentsha')
133           provider.revision.should == resource.value(:revision)
134         end
135       end
136       
137       context "when its SHA is different than the current SHA" do
138         it "should return the current SHA" do
139           provider.expects(:git).with('rev-parse', resource.value(:revision)).returns('othersha')
140           provider.revision.should == 'currentsha'
141         end
142       end
143     end
144   end
145   
146   context "setting the revision property" do
147     before do
148       expects_chdir
149       provider.expects(:git).with('fetch', 'origin')
150     end
151     context "when it's an existing local branch", :resource => {:revision => 'feature/foo'} do
152       it "should use 'git fetch' and 'git reset'" do
153         provider.expects(:local_revision_branch?).returns(true)
154         provider.expects(:git).with('checkout', resource.value(:revision))
155         provider.expects(:git).with('pull', 'origin')
156         provider.expects(:update_submodules)
157         provider.revision = resource.value(:revision)
158       end
159     end
160     context "when it's a remote branch", :resource => {:revision => 'only/remote'} do
161       it "should use 'git fetch' and 'git reset'" do
162         provider.expects(:local_revision_branch?).returns(false)
163         provider.expects(:remote_revision_branch?).returns(true)
164         provider.expects(:git).with('checkout',
165                                     '-b', resource.value(:revision),
166                                     '--track', "origin/#{resource.value(:revision)}")
167         provider.expects(:update_submodules)
168         provider.revision = resource.value(:revision)
169       end
170     end
171     context "when it's a commit or tag", :resource => {:revision => 'a-commit-or-tag'} do
172       it "should use 'git fetch' and 'git reset'" do
173         provider.expects(:local_revision_branch?).returns(false)
174         provider.expects(:remote_revision_branch?).returns(false)
175         provider.expects(:git).with('reset', '--hard', resource.value(:revision))
176         provider.expects(:git).with('submodule', 'init')
177         provider.expects(:git).with('submodule', 'update')
178         provider.revision = resource.value(:revision)
179       end
180     end    
181   end
182   
183   context "updating references" do
184     it "should use 'git fetch --tags'" do
185       expects_chdir
186       provider.expects(:git).with('fetch', '--tags', 'origin')
187       provider.update_references
188     end
189   end
190
191   context "checking if revision" do
192     before do
193       expects_chdir
194       provider.expects(:git).with('branch', '-a').returns(fixture(:git_branch_a))
195     end
196     context "is a local branch" do
197       context "when it's listed in 'git branch -a'", :resource => {:revision => 'feature/foo'} do
198         it "should return true" do
199           provider.should be_local_branch_revision
200         end
201       end
202       context "when it's not listed in 'git branch -a'" , :resource => {:revision => 'feature/notexist'}do
203         it "should return false" do
204           provider.should_not be_local_branch_revision
205         end
206       end
207     end
208     context "is a remote branch" do
209       context "when it's listed in 'git branch -a' with an 'origin/' prefix", :resource => {:revision => 'only/remote'} do
210         it "should return true" do
211           provider.should be_remote_branch_revision
212         end
213       end
214       context "when it's not listed in 'git branch -a' with an 'origin/' prefix" , :resource => {:revision => 'only/local'}do
215         it "should return false" do
216           provider.should_not be_remote_branch_revision
217         end
218       end
219     end    
220   end
221   
222 end