(maint) Remove duplicated fact declarations (#828)
[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     }
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 'ensure => refreshed' do
103       let :params do
104         {
105           ensure: 'refreshed',
106         }
107       end
108
109       it 'contains the apt_key with refresh => true' do
110         is_expected.to contain_apt_key(title).with(
111           ensure: 'present',
112           refresh: true,
113         )
114       end
115     end
116
117     describe 'set a bunch of things!' do
118       let :params do
119         {
120           content: 'GPG key content',
121           source: 'http://apt.puppetlabs.com/pubkey.gpg',
122           server: 'pgp.mit.edu',
123           options: 'debug',
124         }
125       end
126
127       it 'contains the apt_key' do
128         is_expected.to contain_apt_key(title).with(bunch_things_apt_key_example(title, params))
129       end
130       it 'contains the apt_key present anchor' do
131         is_expected.to contain_anchor("apt_key #{title} present")
132       end
133     end
134
135     context 'when domain with dash' do
136       let(:params) do
137         {
138           server: 'p-gp.m-it.edu',
139         }
140       end
141
142       it 'contains the apt_key' do
143         is_expected.to contain_apt_key(title).with(id: title,
144                                                    server: 'p-gp.m-it.edu')
145       end
146     end
147
148     context 'with url' do
149       let :params do
150         {
151           server: 'hkp://pgp.mit.edu',
152         }
153       end
154
155       it 'contains the apt_key' do
156         is_expected.to contain_apt_key(title).with(id: title,
157                                                    server: 'hkp://pgp.mit.edu')
158       end
159     end
160     context 'when url with port number' do
161       let :params do
162         {
163           server: 'hkp://pgp.mit.edu:80',
164         }
165       end
166
167       it 'contains the apt_key' do
168         is_expected.to contain_apt_key(title).with(id: title,
169                                                    server: 'hkp://pgp.mit.edu:80')
170       end
171     end
172   end
173
174   describe 'validation' do
175     context 'when domain begin with dash' do
176       let(:params) do
177         {
178           server: '-pgp.mit.edu',
179         }
180       end
181
182       it 'fails' do
183         is_expected .to raise_error(%r{expects a match})
184       end
185     end
186
187     context 'when domain begin with dot' do
188       let(:params) do
189         {
190           server: '.pgp.mit.edu',
191         }
192       end
193
194       it 'fails' do
195         is_expected .to raise_error(%r{expects a match})
196       end
197     end
198
199     context 'when domain end with dot' do
200       let(:params) do
201         {
202           server: 'pgp.mit.edu.',
203         }
204       end
205
206       it 'fails' do
207         is_expected .to raise_error(%r{expects a match})
208       end
209     end
210     context 'when character url exceeded' do
211       let :params do
212         {
213           server: 'hkp://pgpiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.mit.edu',
214         }
215       end
216
217       it 'fails' do
218         is_expected.to raise_error(%r{expects a match})
219       end
220     end
221     context 'with incorrect port number url' do
222       let :params do
223         {
224           server: 'hkp://pgp.mit.edu:8008080',
225         }
226       end
227
228       it 'fails' do
229         is_expected.to raise_error(%r{expects a match})
230       end
231     end
232     context 'with incorrect protocol for url' do
233       let :params do
234         {
235           server: 'abc://pgp.mit.edu:80',
236         }
237       end
238
239       it 'fails' do
240         is_expected.to raise_error(%r{expects a match})
241       end
242     end
243     context 'with missing port number url' do
244       let :params do
245         {
246           server: 'hkp://pgp.mit.edu:',
247         }
248       end
249
250       it 'fails' do
251         is_expected.to raise_error(%r{expects a match})
252       end
253     end
254     context 'with url ending with a dot' do
255       let :params do
256         {
257           server: 'hkp://pgp.mit.edu.',
258         }
259       end
260
261       it 'fails' do
262         is_expected.to raise_error(%r{expects a match})
263       end
264     end
265     context 'when url begins with a dash' do
266       let(:params) do
267         {
268           server: 'hkp://-pgp.mit.edu',
269         }
270       end
271
272       it 'fails' do
273         is_expected.to raise_error(%r{expects a match})
274       end
275     end
276     context 'with invalid key' do
277       let :title do
278         'Out of rum. Why? Why are we out of rum?'
279       end
280
281       it 'fails' do
282         is_expected.to raise_error(%r{expects a match})
283       end
284     end
285
286     context 'with invalid source' do
287       let :params do
288         {
289           source: 'afp://puppetlabs.com/key.gpg',
290         }
291       end
292
293       it 'fails' do
294         is_expected.to raise_error(%r{evaluating a Resource})
295       end
296     end
297
298     context 'with invalid content' do
299       let :params do
300         {
301           content: [],
302         }
303       end
304
305       it 'fails' do
306         is_expected.to raise_error(%r{expects a})
307       end
308     end
309
310     context 'with invalid server' do
311       let :params do
312         {
313           server: 'two bottles of rum',
314         }
315       end
316
317       it 'fails' do
318         is_expected.to raise_error(%r{expects a match})
319       end
320     end
321
322     context 'with invalid options' do
323       let :params do
324         {
325           options: {},
326         }
327       end
328
329       it 'fails' do
330         is_expected.to raise_error(%r{expects a})
331       end
332     end
333
334     context 'with invalid ensure' do
335       ['foo', 'aabsent', 'absenta', 'apresent', 'presenta', 'refresh', 'arefreshed', 'refresheda'].each do |param|
336         let :params do
337           {
338             ensure: param,
339           }
340         end
341
342         it 'fails' do
343           is_expected.to raise_error(%r{for Enum\['absent', 'present', 'refreshed'\], got})
344         end
345       end
346     end
347
348     describe 'duplication - two apt::key resources for same key, different titles' do
349       let :pre_condition do
350         "class { 'apt': }
351         apt::key { 'duplicate': id => '#{title}', }"
352       end
353
354       it 'contains two apt::key resource - duplicate' do
355         is_expected.to contain_apt__key('duplicate').with(id: title,
356                                                           ensure: 'present')
357       end
358       it 'contains two apt::key resource - title' do
359         is_expected.to contain_apt__key(title).with(id: title,
360                                                     ensure: 'present')
361       end
362
363       it 'contains only a single apt_key - duplicate' do
364         is_expected.to contain_apt_key('duplicate').with(default_apt_key_example(title))
365       end
366       it 'contains only a single apt_key - no title' do
367         is_expected.not_to contain_apt_key(title)
368       end
369     end
370
371     describe 'duplication - two apt::key resources, different ensure' do
372       let :pre_condition do
373         "class { 'apt': }
374         apt::key { 'duplicate': id => '#{title}', ensure => 'absent', }"
375       end
376
377       it 'informs the user of the impossibility' do
378         is_expected.to raise_error(%r{already ensured as absent})
379       end
380     end
381   end
382 end