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