(PUP-6856) Always define facts
[puppet-modules/puppetlabs-apt.git] / spec / defines / ppa_spec.rb
1 require 'spec_helper'
2 describe 'apt::ppa' do
3   let :pre_condition do
4     'class { "apt": }'
5   end
6
7   describe 'defaults' do
8     let :facts do
9       {
10         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '11', :full => '11.04' }},
11         :lsbdistrelease  => '11.04',
12         :lsbdistcodename => 'natty',
13         :operatingsystem => 'Ubuntu',
14         :osfamily        => 'Debian',
15         :lsbdistid       => 'Ubuntu',
16         :puppetversion   => Puppet.version,
17       }
18     end
19
20     let(:title) { 'ppa:needs/such.substitution/wow+type' }
21     it { is_expected.to_not contain_package('python-software-properties') }
22     it { is_expected.to contain_exec('add-apt-repository-ppa:needs/such.substitution/wow+type').that_notifies('Class[Apt::Update]').with({
23       :environment => [],
24       :command     => '/usr/bin/add-apt-repository -y ppa:needs/such.substitution/wow+type',
25       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/needs-such_substitution-wow_type-natty.list',
26       :user        => 'root',
27       :logoutput   => 'on_failure',
28     })
29     }
30   end
31
32   describe 'Ubuntu 15.10 sources.list filename' do
33     let :facts do
34       {
35         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '15', :full => '15.10' }},
36         :lsbdistrelease  => '15.10',
37         :lsbdistcodename => 'wily',
38         :operatingsystem => 'Ubuntu',
39         :osfamily        => 'Debian',
40         :lsbdistid       => 'Ubuntu',
41         :puppetversion   => Puppet.version,
42       }
43     end
44
45     let(:title) { 'ppa:user/foo' }
46     it { is_expected.to contain_exec('add-apt-repository-ppa:user/foo').that_notifies('Class[Apt::Update]').with({
47       :environment => [],
48       :command     => '/usr/bin/add-apt-repository -y ppa:user/foo',
49       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/user-ubuntu-foo-wily.list',
50       :user        => 'root',
51       :logoutput   => 'on_failure',
52     })
53     }
54   end
55
56   describe 'ppa depending on ppa, MODULES-1156' do
57     let :pre_condition do
58       'class { "apt": }'
59     end
60   end
61
62   describe 'package_name => software-properties-common' do
63     let :pre_condition do
64       'class { "apt": }'
65     end
66     let :params do
67       {
68         :package_name   => 'software-properties-common',
69         :package_manage => true,
70       }
71     end
72     let :facts do
73       {
74         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '11', :full => '11.04' }},
75         :lsbdistrelease  => '11.04',
76         :lsbdistcodename => 'natty',
77         :operatingsystem => 'Ubuntu',
78         :osfamily        => 'Debian',
79         :lsbdistid       => 'Ubuntu',
80         :puppetversion   => Puppet.version,
81       }
82     end
83
84     let(:title) { 'ppa:needs/such.substitution/wow' }
85     it { is_expected.to contain_package('software-properties-common') }
86     it { is_expected.to contain_exec('add-apt-repository-ppa:needs/such.substitution/wow').that_notifies('Class[Apt::Update]').with({
87       'environment' => [],
88       'command'     => '/usr/bin/add-apt-repository -y ppa:needs/such.substitution/wow',
89       'unless'      => '/usr/bin/test -f /etc/apt/sources.list.d/needs-such_substitution-wow-natty.list',
90       'user'        => 'root',
91       'logoutput'   => 'on_failure',
92     })
93     }
94
95     it { is_expected.to contain_file('/etc/apt/sources.list.d/needs-such_substitution-wow-natty.list').that_requires('Exec[add-apt-repository-ppa:needs/such.substitution/wow]').with({
96       'ensure' => 'file',
97     })
98     }
99   end
100
101   describe 'package_manage => true, multiple ppas, MODULES-2873' do
102     let :pre_condition do
103       'class { "apt": }
104        apt::ppa {"ppa:user/foo":
105          package_manage => true
106        }'
107     end
108     let :facts do
109       {
110         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '11', :full => '11.04' }},
111         :lsbdistrelease  => '11.04',
112         :lsbdistcodename => 'natty',
113         :operatingsystem => 'Ubuntu',
114         :osfamily        => 'Debian',
115         :lsbdistid       => 'Ubuntu',
116         :puppetversion   => Puppet.version,
117       }
118     end
119     let :params do
120       {
121         :package_manage => true,
122       }
123     end
124
125     let(:title) { 'ppa:user/bar' }
126     it { is_expected.to contain_package('python-software-properties') }
127     it { is_expected.to contain_exec('add-apt-repository-ppa:user/bar').that_notifies('Class[Apt::Update]').with({
128       'environment' => [],
129       'command'     => '/usr/bin/add-apt-repository -y ppa:user/bar',
130       'unless'      => '/usr/bin/test -f /etc/apt/sources.list.d/user-bar-natty.list',
131       'user'        => 'root',
132       'logoutput'   => 'on_failure',
133     })
134     }
135
136     it { is_expected.to contain_file('/etc/apt/sources.list.d/user-bar-natty.list').that_requires('Exec[add-apt-repository-ppa:user/bar]').with({
137       'ensure' => 'file',
138     })
139     }
140   end
141
142   describe 'package_manage => false' do
143     let :pre_condition do
144       'class { "apt": }'
145     end
146     let :facts do
147       {
148         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '11', :full => '11.04' }},
149         :lsbdistrelease  => '11.04',
150         :lsbdistcodename => 'natty',
151         :operatingsystem => 'Ubuntu',
152         :osfamily        => 'Debian',
153         :lsbdistid       => 'Ubuntu',
154         :puppetversion   => Puppet.version,
155       }
156     end
157     let :params do
158       {
159         :package_manage => false,
160       }
161     end
162
163     let(:title) { 'ppa:needs/such.substitution/wow' }
164     it { is_expected.to_not contain_package('python-software-properties') }
165     it { is_expected.to contain_exec('add-apt-repository-ppa:needs/such.substitution/wow').that_notifies('Class[Apt::Update]').with({
166       'environment' => [],
167       'command'     => '/usr/bin/add-apt-repository -y ppa:needs/such.substitution/wow',
168       'unless'      => '/usr/bin/test -f /etc/apt/sources.list.d/needs-such_substitution-wow-natty.list',
169       'user'        => 'root',
170       'logoutput'   => 'on_failure',
171     })
172     }
173
174     it { is_expected.to contain_file('/etc/apt/sources.list.d/needs-such_substitution-wow-natty.list').that_requires('Exec[add-apt-repository-ppa:needs/such.substitution/wow]').with({
175       'ensure' => 'file',
176     })
177     }
178   end
179
180   describe 'apt included, no proxy' do
181     let :pre_condition do
182       'class { "apt": }
183       apt::ppa { "ppa:user/foo2": }
184       '
185     end
186     let :facts do
187       {
188         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
189         :lsbdistrelease  => '14.04',
190         :lsbdistcodename => 'trusty',
191         :operatingsystem => 'Ubuntu',
192         :lsbdistid       => 'Ubuntu',
193         :osfamily        => 'Debian',
194         :puppetversion   => Puppet.version,
195       }
196     end
197     let :params do
198       {
199         :options        => '',
200         :package_manage => true,
201         :require        => 'Apt::Ppa[ppa:user/foo2]',
202       }
203     end
204     let(:title) { 'ppa:user/foo' }
205     it { is_expected.to compile.with_all_deps }
206     it { is_expected.to contain_package('software-properties-common') }
207     it { is_expected.to contain_exec('add-apt-repository-ppa:user/foo').that_notifies('Class[Apt::Update]').with({
208       :environment => [],
209       :command     => '/usr/bin/add-apt-repository  ppa:user/foo',
210       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/user-foo-trusty.list',
211       :user        => 'root',
212       :logoutput   => 'on_failure',
213     })
214     }
215   end
216
217   describe 'apt included, proxy host' do
218     let :pre_condition do
219       'class { "apt":
220         proxy => { "host" => "localhost" },
221       }'
222     end
223     let :facts do
224       {
225         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
226         :lsbdistrelease  => '14.04',
227         :lsbdistcodename => 'trusty',
228         :operatingsystem => 'Ubuntu',
229         :lsbdistid       => 'Ubuntu',
230         :osfamily        => 'Debian',
231         :puppetversion   => Puppet.version,
232       }
233     end
234     let :params do
235       {
236         'options' => '',
237         'package_manage' => true,
238       }
239     end
240     let(:title) { 'ppa:user/foo' }
241     it { is_expected.to contain_package('software-properties-common') }
242     it { is_expected.to contain_exec('add-apt-repository-ppa:user/foo').that_notifies('Class[Apt::Update]').with({
243       :environment => ['http_proxy=http://localhost:8080'],
244       :command     => '/usr/bin/add-apt-repository  ppa:user/foo',
245       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/user-foo-trusty.list',
246       :user        => 'root',
247       :logoutput   => 'on_failure',
248     })
249     }
250   end
251
252   describe 'apt included, proxy host and port' do
253     let :pre_condition do
254       'class { "apt":
255         proxy => { "host" => "localhost", "port" => 8180 },
256       }'
257     end
258     let :facts do
259       {
260         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
261         :lsbdistrelease  => '14.04',
262         :lsbdistcodename => 'trusty',
263         :operatingsystem => 'Ubuntu',
264         :lsbdistid       => 'Ubuntu',
265         :osfamily        => 'Debian',
266         :puppetversion   => Puppet.version,
267       }
268     end
269     let :params do
270       {
271         :options => '',
272         :package_manage => true,
273       }
274     end
275     let(:title) { 'ppa:user/foo' }
276     it { is_expected.to contain_package('software-properties-common') }
277     it { is_expected.to contain_exec('add-apt-repository-ppa:user/foo').that_notifies('Class[Apt::Update]').with({
278       :environment => ['http_proxy=http://localhost:8180'],
279       :command     => '/usr/bin/add-apt-repository  ppa:user/foo',
280       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/user-foo-trusty.list',
281       :user        => 'root',
282       :logoutput   => 'on_failure',
283     })
284     }
285   end
286
287   describe 'apt included, proxy host and port and https' do
288     let :pre_condition do
289       'class { "apt":
290         proxy => { "host" => "localhost", "port" => 8180, "https" => true },
291       }'
292     end
293     let :facts do
294       {
295         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
296         :lsbdistrelease  => '14.04',
297         :lsbdistcodename => 'trusty',
298         :operatingsystem => 'Ubuntu',
299         :lsbdistid       => 'Ubuntu',
300         :osfamily        => 'Debian',
301         :puppetversion   => Puppet.version,
302       }
303     end
304     let :params do
305       {
306         :options => '',
307         :package_manage => true,
308       }
309     end
310     let(:title) { 'ppa:user/foo' }
311     it { is_expected.to contain_package('software-properties-common') }
312     it { is_expected.to contain_exec('add-apt-repository-ppa:user/foo').that_notifies('Class[Apt::Update]').with({
313       :environment => ['http_proxy=http://localhost:8180', 'https_proxy=https://localhost:8180'],
314       :command     => '/usr/bin/add-apt-repository  ppa:user/foo',
315       :unless      => '/usr/bin/test -f /etc/apt/sources.list.d/user-foo-trusty.list',
316       :user        => 'root',
317       :logoutput   => 'on_failure',
318     })
319     }
320   end
321
322   describe 'ensure absent' do
323     let :pre_condition do
324       'class { "apt": }'
325     end
326     let :facts do
327       {
328         :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
329         :lsbdistrelease  => '14.04',
330         :lsbdistcodename => 'trusty',
331         :operatingsystem => 'Ubuntu',
332         :lsbdistid       => 'Ubuntu',
333         :osfamily        => 'Debian',
334         :puppetversion   => Puppet.version,
335       }
336     end
337     let(:title) { 'ppa:user/foo' }
338     let :params do
339       {
340         :ensure => 'absent'
341       }
342     end
343     it { is_expected.to contain_file('/etc/apt/sources.list.d/user-foo-trusty.list').that_notifies('Class[Apt::Update]').with({
344       :ensure => 'absent',
345     })
346     }
347   end
348
349   context 'validation' do
350     describe 'no release' do
351       let :facts do
352         {
353           :os => { :family => 'Debian', :name => 'Ubuntu', :release => { :major => '14', :full => '14.04' }},
354           :lsbdistrelease  => '14.04',
355           :operatingsystem => 'Ubuntu',
356           :lsbdistid       => 'Ubuntu',
357           :osfamily        => 'Debian',
358           :lsbdistcodeanme => nil,
359           :puppetversion   => Puppet.version,
360         }
361       end
362       let(:title) { 'ppa:user/foo' }
363       it do
364         expect {
365           subject.call
366         }.to raise_error(Puppet::Error, /lsbdistcodename fact not available: release parameter required/)
367       end
368     end
369
370     describe 'not ubuntu' do
371       let :facts do
372         {
373           :os => { :family => 'Debian', :name => 'Debian', :release => { :major => '6', :full => '6.0.7' }},
374           :lsbdistrelease  => '6.0.7',
375           :lsbdistcodename => 'wheezy',
376           :operatingsystem => 'Debian',
377           :lsbdistid       => 'debian',
378           :osfamily        => 'Debian',
379           :puppetversion   => Puppet.version,
380         }
381       end
382       let(:title) { 'ppa:user/foo' }
383       it do
384         expect {
385           subject.call
386         }.to raise_error(Puppet::Error, /not currently supported on Debian/)
387       end
388     end
389   end
390 end