Added default refresh value to apt::key default unit test
[puppet-modules/puppetlabs-apt.git] / spec / defines / key_spec.rb
1 require 'spec_helper'
2
3 GPG_KEY_ID = '6F6B15509CF8E59E6E469F327F438280EF8D349F'.freeze
4
5 title_key_example = { id: GPG_KEY_ID,
6                       ensure: 'present',
7                       source: nil,
8                       server: 'keyserver.ubuntu.com',
9                       content: nil,
10                       options: nil }
11
12 def default_apt_key_example(title)
13   { id: title,
14     ensure: 'present',
15     source: nil,
16     server: 'keyserver.ubuntu.com',
17     content: nil,
18     options: nil,
19     refresh: false }
20 end
21
22 def bunch_things_apt_key_example(title, params)
23   { id: title,
24     ensure: 'present',
25     source: 'http://apt.puppetlabs.com/pubkey.gpg',
26     server: 'pgp.mit.edu',
27     content: params[:content],
28     options: 'debug' }
29 end
30
31 def absent_apt_key(title)
32   { id: title,
33     ensure: 'absent',
34     source: nil,
35     server: 'keyserver.ubuntu.com',
36     content: nil,
37     keyserver: nil }
38 end
39
40 describe 'apt::key' do
41   let :pre_condition do
42     'class { "apt": }'
43   end
44
45   let(:facts) do
46     {
47       os: { family: 'Debian', name: 'Debian', release: { major: '8', full: '8.0' } },
48       lsbdistid: 'Debian',
49       osfamily: 'Debian',
50       lsbdistcodename: 'jessie',
51       puppetversion: Puppet.version,
52     }
53   end
54
55   let :title do
56     GPG_KEY_ID
57   end
58
59   describe 'normal operation' do
60     describe 'default options' do
61       it 'contains the apt_key' do
62         is_expected.to contain_apt_key(title).with(default_apt_key_example(title))
63       end
64       it 'contains the apt_key present anchor' do
65         is_expected.to contain_anchor("apt_key #{title} present")
66       end
67     end
68
69     describe 'title and key =>' do
70       let :title do
71         'puppetlabs'
72       end
73
74       let :params do
75         {
76           id: GPG_KEY_ID,
77         }
78       end
79
80       it 'contains the apt_key' do
81         is_expected.to contain_apt_key(title).with(title_key_example)
82       end
83       it 'contains the apt_key present anchor' do
84         is_expected.to contain_anchor("apt_key #{GPG_KEY_ID} present")
85       end
86     end
87
88     describe 'ensure => absent' do
89       let :params do
90         {
91           ensure: 'absent',
92         }
93       end
94
95       it 'contains the apt_key' do
96         is_expected.to contain_apt_key(title).with(absent_apt_key(title))
97       end
98       it 'contains the apt_key absent anchor' do
99         is_expected.to contain_anchor("apt_key #{title} absent")
100       end
101     end
102
103     describe 'ensure => refreshed' do
104       let :params do
105         {
106           ensure: 'refreshed',
107         }
108       end
109
110       it 'contains the apt_key with refresh => true' do
111         is_expected.to contain_apt_key(title).with(
112           ensure: 'present',
113           refresh: true,
114         )
115       end
116     end
117
118     describe 'set a bunch of things!' do
119       let :params do
120         {
121           content: 'GPG key content',
122           source: 'http://apt.puppetlabs.com/pubkey.gpg',
123           server: 'pgp.mit.edu',
124           options: 'debug',
125         }
126       end
127
128       it 'contains the apt_key' do
129         is_expected.to contain_apt_key(title).with(bunch_things_apt_key_example(title, params))
130       end
131       it 'contains the apt_key present anchor' do
132         is_expected.to contain_anchor("apt_key #{title} present")
133       end
134     end
135
136     context 'when domain with dash' do
137       let(:params) do
138         {
139           server: 'p-gp.m-it.edu',
140         }
141       end
142
143       it 'contains the apt_key' do
144         is_expected.to contain_apt_key(title).with(id: title,
145                                                    server: 'p-gp.m-it.edu')
146       end
147     end
148
149     context 'with url' do
150       let :params do
151         {
152           server: 'hkp://pgp.mit.edu',
153         }
154       end
155
156       it 'contains the apt_key' do
157         is_expected.to contain_apt_key(title).with(id: title,
158                                                    server: 'hkp://pgp.mit.edu')
159       end
160     end
161     context 'when url with port number' do
162       let :params do
163         {
164           server: 'hkp://pgp.mit.edu:80',
165         }
166       end
167
168       it 'contains the apt_key' do
169         is_expected.to contain_apt_key(title).with(id: title,
170                                                    server: 'hkp://pgp.mit.edu:80')
171       end
172     end
173   end
174
175   describe 'validation' do
176     context 'when domain begin with dash' do
177       let(:params) do
178         {
179           server: '-pgp.mit.edu',
180         }
181       end
182
183       it 'fails' do
184         is_expected .to raise_error(%r{expects a match})
185       end
186     end
187
188     context 'when domain begin with dot' do
189       let(:params) do
190         {
191           server: '.pgp.mit.edu',
192         }
193       end
194
195       it 'fails' do
196         is_expected .to raise_error(%r{expects a match})
197       end
198     end
199
200     context 'when domain end with dot' do
201       let(:params) do
202         {
203           server: 'pgp.mit.edu.',
204         }
205       end
206
207       it 'fails' do
208         is_expected .to raise_error(%r{expects a match})
209       end
210     end
211     context 'when character url exceeded' do
212       let :params do
213         {
214           server: 'hkp://pgpiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.mit.edu',
215         }
216       end
217
218       it 'fails' do
219         is_expected.to raise_error(%r{expects a match})
220       end
221     end
222     context 'with incorrect port number url' do
223       let :params do
224         {
225           server: 'hkp://pgp.mit.edu:8008080',
226         }
227       end
228
229       it 'fails' do
230         is_expected.to raise_error(%r{expects a match})
231       end
232     end
233     context 'with incorrect protocol for url' do
234       let :params do
235         {
236           server: 'abc://pgp.mit.edu:80',
237         }
238       end
239
240       it 'fails' do
241         is_expected.to raise_error(%r{expects a match})
242       end
243     end
244     context 'with missing port number url' do
245       let :params do
246         {
247           server: 'hkp://pgp.mit.edu:',
248         }
249       end
250
251       it 'fails' do
252         is_expected.to raise_error(%r{expects a match})
253       end
254     end
255     context 'with url ending with a dot' do
256       let :params do
257         {
258           server: 'hkp://pgp.mit.edu.',
259         }
260       end
261
262       it 'fails' do
263         is_expected.to raise_error(%r{expects a match})
264       end
265     end
266     context 'when url begins with a dash' do
267       let(:params) do
268         {
269           server: 'hkp://-pgp.mit.edu',
270         }
271       end
272
273       it 'fails' do
274         is_expected.to raise_error(%r{expects a match})
275       end
276     end
277     context 'with invalid key' do
278       let :title do
279         'Out of rum. Why? Why are we out of rum?'
280       end
281
282       it 'fails' do
283         is_expected.to raise_error(%r{expects a match})
284       end
285     end
286
287     context 'with invalid source' do
288       let :params do
289         {
290           source: 'afp://puppetlabs.com/key.gpg',
291         }
292       end
293
294       it 'fails' do
295         is_expected.to raise_error(%r{evaluating a Resource})
296       end
297     end
298
299     context 'with invalid content' do
300       let :params do
301         {
302           content: [],
303         }
304       end
305
306       it 'fails' do
307         is_expected.to raise_error(%r{expects a})
308       end
309     end
310
311     context 'with invalid server' do
312       let :params do
313         {
314           server: 'two bottles of rum',
315         }
316       end
317
318       it 'fails' do
319         is_expected.to raise_error(%r{expects a match})
320       end
321     end
322
323     context 'with invalid options' do
324       let :params do
325         {
326           options: {},
327         }
328       end
329
330       it 'fails' do
331         is_expected.to raise_error(%r{expects a})
332       end
333     end
334
335     context 'with invalid ensure' do
336       ['foo', 'aabsent', 'absenta', 'apresent', 'presenta', 'refresh', 'arefreshed', 'refresheda'].each do |param|
337         let :params do
338           {
339             ensure: param,
340           }
341         end
342
343         it 'fails' do
344           is_expected.to raise_error(%r{for Enum\['absent', 'present', 'refreshed'\], got})
345         end
346       end
347     end
348
349     describe 'duplication - two apt::key resources for same key, different titles' do
350       let :pre_condition do
351         "class { 'apt': }
352         apt::key { 'duplicate': id => '#{title}', }"
353       end
354
355       it 'contains two apt::key resource - duplicate' do
356         is_expected.to contain_apt__key('duplicate').with(id: title,
357                                                           ensure: 'present')
358       end
359       it 'contains two apt::key resource - title' do
360         is_expected.to contain_apt__key(title).with(id: title,
361                                                     ensure: 'present')
362       end
363
364       it 'contains only a single apt_key - duplicate' do
365         is_expected.to contain_apt_key('duplicate').with(default_apt_key_example(title))
366       end
367       it 'contains only a single apt_key - no title' do
368         is_expected.not_to contain_apt_key(title)
369       end
370     end
371
372     describe 'duplication - two apt::key resources, different ensure' do
373       let :pre_condition do
374         "class { 'apt': }
375         apt::key { 'duplicate': id => '#{title}', ensure => 'absent', }"
376       end
377
378       it 'informs the user of the impossibility' do
379         is_expected.to raise_error(%r{already ensured as absent})
380       end
381     end
382   end
383 end