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