halyard-puppet-lint 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +10 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE +20 -0
  6. data/README.md +210 -0
  7. data/Rakefile +7 -0
  8. data/bin/puppet-lint +7 -0
  9. data/lib/puppet-lint.rb +214 -0
  10. data/lib/puppet-lint/bin.rb +79 -0
  11. data/lib/puppet-lint/checkplugin.rb +176 -0
  12. data/lib/puppet-lint/checks.rb +91 -0
  13. data/lib/puppet-lint/configuration.rb +153 -0
  14. data/lib/puppet-lint/data.rb +521 -0
  15. data/lib/puppet-lint/lexer.rb +373 -0
  16. data/lib/puppet-lint/lexer/token.rb +101 -0
  17. data/lib/puppet-lint/monkeypatches.rb +2 -0
  18. data/lib/puppet-lint/monkeypatches/string_percent.rb +52 -0
  19. data/lib/puppet-lint/monkeypatches/string_prepend.rb +13 -0
  20. data/lib/puppet-lint/optparser.rb +118 -0
  21. data/lib/puppet-lint/plugins.rb +74 -0
  22. data/lib/puppet-lint/plugins/check_classes.rb +285 -0
  23. data/lib/puppet-lint/plugins/check_comments.rb +55 -0
  24. data/lib/puppet-lint/plugins/check_conditionals.rb +65 -0
  25. data/lib/puppet-lint/plugins/check_documentation.rb +31 -0
  26. data/lib/puppet-lint/plugins/check_nodes.rb +29 -0
  27. data/lib/puppet-lint/plugins/check_resources.rb +194 -0
  28. data/lib/puppet-lint/plugins/check_strings.rb +174 -0
  29. data/lib/puppet-lint/plugins/check_variables.rb +19 -0
  30. data/lib/puppet-lint/plugins/check_whitespace.rb +170 -0
  31. data/lib/puppet-lint/tasks/puppet-lint.rb +91 -0
  32. data/lib/puppet-lint/version.rb +3 -0
  33. data/puppet-lint.gemspec +24 -0
  34. data/spec/fixtures/test/manifests/fail.pp +2 -0
  35. data/spec/fixtures/test/manifests/ignore.pp +1 -0
  36. data/spec/fixtures/test/manifests/ignore_multiple_block.pp +6 -0
  37. data/spec/fixtures/test/manifests/ignore_multiple_line.pp +2 -0
  38. data/spec/fixtures/test/manifests/ignore_reason.pp +1 -0
  39. data/spec/fixtures/test/manifests/init.pp +3 -0
  40. data/spec/fixtures/test/manifests/malformed.pp +1 -0
  41. data/spec/fixtures/test/manifests/url_interpolation.pp +12 -0
  42. data/spec/fixtures/test/manifests/warning.pp +2 -0
  43. data/spec/puppet-lint/bin_spec.rb +326 -0
  44. data/spec/puppet-lint/configuration_spec.rb +56 -0
  45. data/spec/puppet-lint/ignore_overrides_spec.rb +109 -0
  46. data/spec/puppet-lint/lexer/token_spec.rb +18 -0
  47. data/spec/puppet-lint/lexer_spec.rb +783 -0
  48. data/spec/puppet-lint/plugins/check_classes/autoloader_layout_spec.rb +105 -0
  49. data/spec/puppet-lint/plugins/check_classes/class_inherits_from_params_class_spec.rb +35 -0
  50. data/spec/puppet-lint/plugins/check_classes/inherits_across_namespaces_spec.rb +33 -0
  51. data/spec/puppet-lint/plugins/check_classes/names_containing_dash_spec.rb +45 -0
  52. data/spec/puppet-lint/plugins/check_classes/nested_classes_or_defines_spec.rb +76 -0
  53. data/spec/puppet-lint/plugins/check_classes/parameter_order_spec.rb +73 -0
  54. data/spec/puppet-lint/plugins/check_classes/right_to_left_relationship_spec.rb +25 -0
  55. data/spec/puppet-lint/plugins/check_classes/variable_scope_spec.rb +196 -0
  56. data/spec/puppet-lint/plugins/check_comments/slash_comments_spec.rb +45 -0
  57. data/spec/puppet-lint/plugins/check_comments/star_comments_spec.rb +84 -0
  58. data/spec/puppet-lint/plugins/check_conditionals/case_without_default_spec.rb +98 -0
  59. data/spec/puppet-lint/plugins/check_conditionals/selector_inside_resource_spec.rb +36 -0
  60. data/spec/puppet-lint/plugins/check_documentation/documentation_spec.rb +52 -0
  61. data/spec/puppet-lint/plugins/check_nodes/unquoted_node_name_spec.rb +146 -0
  62. data/spec/puppet-lint/plugins/check_resources/duplicate_params_spec.rb +100 -0
  63. data/spec/puppet-lint/plugins/check_resources/ensure_first_param_spec.rb +55 -0
  64. data/spec/puppet-lint/plugins/check_resources/ensure_not_symlink_target_spec.rb +89 -0
  65. data/spec/puppet-lint/plugins/check_resources/file_mode_spec.rb +113 -0
  66. data/spec/puppet-lint/plugins/check_resources/unquoted_file_mode_spec.rb +45 -0
  67. data/spec/puppet-lint/plugins/check_resources/unquoted_resource_title_spec.rb +216 -0
  68. data/spec/puppet-lint/plugins/check_strings/double_quoted_strings_spec.rb +199 -0
  69. data/spec/puppet-lint/plugins/check_strings/only_variable_string_spec.rb +114 -0
  70. data/spec/puppet-lint/plugins/check_strings/puppet_url_without_modules_spec.rb +62 -0
  71. data/spec/puppet-lint/plugins/check_strings/quoted_booleans_spec.rb +129 -0
  72. data/spec/puppet-lint/plugins/check_strings/single_quote_string_with_variables_spec.rb +17 -0
  73. data/spec/puppet-lint/plugins/check_strings/variables_not_enclosed_spec.rb +73 -0
  74. data/spec/puppet-lint/plugins/check_variables/variable_contains_dash_spec.rb +37 -0
  75. data/spec/puppet-lint/plugins/check_whitespace/2sp_soft_tabs_spec.rb +21 -0
  76. data/spec/puppet-lint/plugins/check_whitespace/80chars_spec.rb +54 -0
  77. data/spec/puppet-lint/plugins/check_whitespace/arrow_alignment_spec.rb +524 -0
  78. data/spec/puppet-lint/plugins/check_whitespace/hard_tabs_spec.rb +45 -0
  79. data/spec/puppet-lint/plugins/check_whitespace/trailing_whitespace_spec.rb +101 -0
  80. data/spec/puppet-lint_spec.rb +20 -0
  81. data/spec/spec_helper.rb +129 -0
  82. metadata +229 -0
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'single_quote_string_with_variables' do
4
+ let(:msg) { 'single quoted string containing a variable found' }
5
+
6
+ context 'multiple strings in a line' do
7
+ let(:code) { "\"aoeu\" '${foo}'" }
8
+
9
+ it 'should only detect a single problem' do
10
+ expect(problems).to have(1).problem
11
+ end
12
+
13
+ it 'should create an error' do
14
+ expect(problems).to contain_error(msg).on_line(1).in_column(8)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'variables_not_enclosed' do
4
+ let(:msg) { 'variable not enclosed in {}' }
5
+
6
+ context 'with fix disabled' do
7
+ context 'variable not enclosed in {}' do
8
+ let(:code) { '" $gronk"' }
9
+
10
+ it 'should only detect a single problem' do
11
+ expect(problems).to have(1).problem
12
+ end
13
+
14
+ it 'should create a warning' do
15
+ expect(problems).to contain_warning(msg).on_line(1).in_column(3)
16
+ end
17
+ end
18
+
19
+ context 'variable not enclosed in {} after many tokens' do
20
+ let(:code) { ("'groovy'\n" * 20) + '" $gronk"' }
21
+
22
+ it 'should only detect a single problem' do
23
+ expect(problems).to have(1).problem
24
+ end
25
+
26
+ it 'should create a warning' do
27
+ expect(problems).to contain_warning(msg).on_line(21).in_column(3)
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'with fix enabled' do
33
+ before do
34
+ PuppetLint.configuration.fix = true
35
+ end
36
+
37
+ after do
38
+ PuppetLint.configuration.fix = false
39
+ end
40
+
41
+ context 'variable not enclosed in {}' do
42
+ let(:code) { '" $gronk"' }
43
+
44
+ it 'should only detect a single problem' do
45
+ expect(problems).to have(1).problem
46
+ end
47
+
48
+ it 'should fix the manifest' do
49
+ expect(problems).to contain_fixed(msg).on_line(1).in_column(3)
50
+ end
51
+
52
+ it 'should enclose the variable in braces' do
53
+ expect(manifest).to eq('" ${gronk}"')
54
+ end
55
+ end
56
+
57
+ context 'variable not enclosed in {} after many tokens' do
58
+ let(:code) { ("'groovy'\n" * 20) + '" $gronk"' }
59
+
60
+ it 'should only detect a single problem' do
61
+ expect(problems).to have(1).problem
62
+ end
63
+
64
+ it 'should fix the manifest' do
65
+ expect(problems).to contain_fixed(msg).on_line(21).in_column(3)
66
+ end
67
+
68
+ it 'should enclose the variable in braces' do
69
+ expect(manifest).to eq(("'groovy'\n" * 20) + '" ${gronk}"')
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'variable_contains_dash' do
4
+ let(:msg) { 'variable contains a dash' }
5
+
6
+ context 'a variable containing a dash' do
7
+ let(:code) { '$foo-bar' }
8
+
9
+ it 'should only detect a single problem' do
10
+ expect(problems).to have(1).problem
11
+ end
12
+
13
+ it 'should create a warning' do
14
+ expect(problems).to contain_warning(msg).on_line(1).in_column(1)
15
+ end
16
+ end
17
+
18
+ context 'variable containing a dash' do
19
+ let(:code) { '" $foo-bar"' }
20
+
21
+ it 'should only detect a single problem' do
22
+ expect(problems).to have(1).problem
23
+ end
24
+
25
+ it 'should create a warning' do
26
+ expect(problems).to contain_warning(msg).on_line(1).in_column(3)
27
+ end
28
+ end
29
+
30
+ context 'variable with an array reference containing a dash' do
31
+ let(:code) { "$foo[bar-baz]" }
32
+
33
+ it 'should not detect any problems' do
34
+ expect(problems).to be_empty
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe '2sp_soft_tabs' do
4
+ let(:msg) { 'two-space soft tabs not used' }
5
+
6
+ context 'when a line is indented by 3 spaces' do
7
+ let(:code) { "
8
+ file { 'foo':
9
+ foo => bar,
10
+ }"
11
+ }
12
+
13
+ it 'should only detect a single problem' do
14
+ expect(problems).to have(1).problem
15
+ end
16
+
17
+ it 'should create an error' do
18
+ expect(problems).to contain_error(msg).on_line(3).in_column(1)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe '80chars' do
5
+ let(:msg) { 'line has more than 80 characters' }
6
+
7
+ context 'file resource with a source line > 80c' do
8
+ let(:code) { "
9
+ file {
10
+ source => 'puppet:///modules/certificates/etc/ssl/private/wildcard.example.com.crt',
11
+ }"
12
+ }
13
+
14
+ it 'should not detect any problems' do
15
+ expect(problems).to have(0).problems
16
+ end
17
+ end
18
+
19
+ context 'file resource with a template line > 80c' do
20
+ let(:code) { "
21
+ file {
22
+ content => template('mymodule/this/is/a/truely/absurdly/long/path/that/should/make/you/feel/bad'),
23
+ }"
24
+ }
25
+
26
+ it 'should not detect any problems' do
27
+ expect(problems).to have(0).problems
28
+ end
29
+ end
30
+
31
+ context 'length of lines with UTF-8 characters' do
32
+ let(:code) { "
33
+ # ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
34
+ # ┃ Configuration ┃
35
+ # ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
36
+ }
37
+
38
+ it 'should not detect any problems' do
39
+ expect(problems).to have(0).problems
40
+ end
41
+ end
42
+
43
+ context '81 character line' do
44
+ let(:code) { 'a' * 81 }
45
+
46
+ it 'should only detect a single problem' do
47
+ expect(problems).to have(1).problem
48
+ end
49
+
50
+ it 'should create a warning' do
51
+ expect(problems).to contain_warning(msg).on_line(1).in_column(80)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,524 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'arrow_alignment' do
4
+ let(:msg) { 'indentation of => is not properly aligned' }
5
+
6
+ context 'with fix disabled' do
7
+ context 'selectors inside a resource' do
8
+ let(:code) { "
9
+ file { 'foo':
10
+ ensure => $ensure,
11
+ require => $ensure ? {
12
+ present => Class['tomcat::install'],
13
+ absent => undef;
14
+ },
15
+ foo => bar,
16
+ }"
17
+ }
18
+
19
+ it 'should not detect any problems' do
20
+ expect(problems).to have(0).problems
21
+ end
22
+ end
23
+
24
+ context 'selectors in the middle of a resource' do
25
+ let(:code) { "
26
+ file { 'foo':
27
+ ensure => $ensure ? {
28
+ present => directory,
29
+ absent => undef,
30
+ },
31
+ owner => 'tomcat6',
32
+ }"
33
+ }
34
+
35
+ it 'should not detect any problems' do
36
+ expect(problems).to have(0).problems
37
+ end
38
+ end
39
+
40
+ context 'selector inside a resource' do
41
+ let(:code) { "
42
+ ensure => $ensure ? {
43
+ present => directory,
44
+ absent => undef,
45
+ },
46
+ owner => 'foo4',
47
+ group => 'foo4',
48
+ mode => '0755'," }
49
+
50
+ it 'should not detect any problems' do
51
+ expect(problems).to have(0).problems
52
+ end
53
+ end
54
+
55
+ context 'selector inside a hash inside a resource' do
56
+ let(:code) { "
57
+ server => {
58
+ ensure => ensure => $ensure ? {
59
+ present => directory,
60
+ absent => undef,
61
+ },
62
+ ip => '192.168.1.1'
63
+ },
64
+ owner => 'foo4',
65
+ group => 'foo4',
66
+ mode => '0755'," }
67
+
68
+ it 'should not detect any problems' do
69
+ expect(problems).to have(0).problems
70
+ end
71
+ end
72
+
73
+ context 'nested hashes with correct indentation' do
74
+ let(:code) { "
75
+ class { 'lvs::base':
76
+ virtualeservers => {
77
+ '192.168.2.13' => {
78
+ vport => '11025',
79
+ service => 'smtp',
80
+ scheduler => 'wlc',
81
+ protocol => 'tcp',
82
+ checktype => 'external',
83
+ checkcommand => '/path/to/checkscript',
84
+ real_servers => {
85
+ 'server01' => {
86
+ real_server => '192.168.2.14',
87
+ real_port => '25',
88
+ forwarding => 'masq',
89
+ },
90
+ 'server02' => {
91
+ real_server => '192.168.2.15',
92
+ real_port => '25',
93
+ forwarding => 'masq',
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }"
99
+ }
100
+
101
+ it 'should not detect any problems' do
102
+ expect(problems).to have(0).problems
103
+ end
104
+ end
105
+
106
+ context 'single resource with a misaligned =>' do
107
+ let(:code) { "
108
+ file { '/tmp/foo':
109
+ foo => 1,
110
+ bar => 2,
111
+ gronk => 3,
112
+ baz => 4,
113
+ meh => 5,
114
+ }"
115
+ }
116
+
117
+ it 'should detect four problems' do
118
+ expect(problems).to have(4).problems
119
+ end
120
+
121
+ it 'should create four warnings' do
122
+ expect(problems).to contain_warning(msg).on_line(3).in_column(15)
123
+ expect(problems).to contain_warning(msg).on_line(4).in_column(15)
124
+ expect(problems).to contain_warning(msg).on_line(6).in_column(16)
125
+ expect(problems).to contain_warning(msg).on_line(7).in_column(15)
126
+ end
127
+ end
128
+
129
+ context 'complex resource with a misaligned =>' do
130
+ let(:code) { "
131
+ file { '/tmp/foo':
132
+ foo => 1,
133
+ bar => $baz ? {
134
+ gronk => 2,
135
+ meh => 3,
136
+ },
137
+ meep => 4,
138
+ bah => 5,
139
+ }"
140
+ }
141
+
142
+ it 'should detect three problems' do
143
+ expect(problems).to have(3).problems
144
+ end
145
+
146
+ it 'should create three warnings' do
147
+ expect(problems).to contain_warning(msg).on_line(3).in_column(15)
148
+ expect(problems).to contain_warning(msg).on_line(6).in_column(17)
149
+ expect(problems).to contain_warning(msg).on_line(9).in_column(15)
150
+ end
151
+ end
152
+
153
+ context 'multi-resource with a misaligned =>' do
154
+ let(:code) { "
155
+ file {
156
+ '/tmp/foo': ;
157
+ '/tmp/bar':
158
+ foo => 'bar';
159
+ '/tmp/baz':
160
+ gronk => 'bah',
161
+ meh => 'no'
162
+ }"
163
+ }
164
+
165
+ it 'should only detect a single problem' do
166
+ expect(problems).to have(1).problem
167
+ end
168
+
169
+ it 'should create a warning' do
170
+ expect(problems).to contain_warning(msg).on_line(8).in_column(17)
171
+ end
172
+ end
173
+
174
+ context 'multiple single line resources' do
175
+ let(:code) { "
176
+ file { 'foo': ensure => file }
177
+ package { 'bar': ensure => present }"
178
+ }
179
+
180
+ it 'should not detect any problems' do
181
+ expect(problems).to have(0).problems
182
+ end
183
+ end
184
+
185
+ context 'resource with unaligned => in commented line' do
186
+ let(:code) { "
187
+ file { 'foo':
188
+ ensure => directory,
189
+ # purge => true,
190
+ }"
191
+ }
192
+
193
+ it 'should not detect any problems' do
194
+ expect(problems).to have(0).problems
195
+ end
196
+ end
197
+
198
+ context 'single line resource spread out on multiple lines' do
199
+ let(:code) {"
200
+ file {
201
+ 'foo': ensure => present,
202
+ }"
203
+ }
204
+
205
+ it 'should not detect any problems' do
206
+ expect(problems).to have(0).problems
207
+ end
208
+ end
209
+
210
+ context 'multiline resource with a single line of params' do
211
+ let(:code) { "
212
+ mymodule::do_thing { 'some thing':
213
+ whatever => { foo => 'bar', one => 'two' },
214
+ }"
215
+ }
216
+
217
+ it 'should not detect any problems' do
218
+ expect(problems).to have(0).problems
219
+ end
220
+ end
221
+
222
+ context 'resource with aligned => too far out' do
223
+ let(:code) { "
224
+ file { '/tmp/foo':
225
+ ensure => file,
226
+ mode => '0444',
227
+ }"
228
+ }
229
+
230
+ it 'should detect 2 problems' do
231
+ expect(problems).to have(2).problems
232
+ end
233
+
234
+ it 'should create 2 warnings' do
235
+ expect(problems).to contain_warning(msg).on_line(3).in_column(19)
236
+ expect(problems).to contain_warning(msg).on_line(4).in_column(19)
237
+ end
238
+ end
239
+
240
+ context 'resource with multiple params where one is an empty hash' do
241
+ let(:code) { "
242
+ foo { 'foo':
243
+ a => true,
244
+ b => {
245
+ }
246
+ }
247
+ "}
248
+
249
+ it 'should not detect any problems' do
250
+ expect(problems).to have(0).problems
251
+ end
252
+ end
253
+
254
+ context 'multiline resource with multiple params on a line' do
255
+ let(:code) { "
256
+ user { 'test':
257
+ a => 'foo', bb => 'bar',
258
+ ccc => 'baz',
259
+ }
260
+ " }
261
+
262
+ it 'should detect 2 problems' do
263
+ expect(problems).to have(2).problems
264
+ end
265
+
266
+ it 'should create 2 warnings' do
267
+ expect(problems).to contain_warning(msg).on_line(3).in_column(13)
268
+ expect(problems).to contain_warning(msg).on_line(3).in_column(26)
269
+ end
270
+ end
271
+
272
+ context 'resource param containing a single-element same-line hash' do
273
+ let(:code) { "
274
+ foo { 'foo':
275
+ a => true,
276
+ b => { 'a' => 'b' }
277
+ }
278
+ "}
279
+
280
+ it 'should not detect any problems' do
281
+ expect(problems).to have(0).problems
282
+ end
283
+ end
284
+
285
+ end
286
+
287
+ context 'with fix enabled' do
288
+ before do
289
+ PuppetLint.configuration.fix = true
290
+ end
291
+
292
+ after do
293
+ PuppetLint.configuration.fix = false
294
+ end
295
+
296
+ context 'single resource with a misaligned =>' do
297
+ let(:code) { "
298
+ file { '/tmp/foo':
299
+ foo => 1,
300
+ bar => 2,
301
+ gronk => 3,
302
+ baz => 4,
303
+ meh => 5,
304
+ }"
305
+ }
306
+ let(:fixed) { "
307
+ file { '/tmp/foo':
308
+ foo => 1,
309
+ bar => 2,
310
+ gronk => 3,
311
+ baz => 4,
312
+ meh => 5,
313
+ }"
314
+ }
315
+
316
+ it 'should detect four problems' do
317
+ expect(problems).to have(4).problems
318
+ end
319
+
320
+ it 'should fix the manifest' do
321
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(15)
322
+ expect(problems).to contain_fixed(msg).on_line(4).in_column(15)
323
+ expect(problems).to contain_fixed(msg).on_line(6).in_column(16)
324
+ expect(problems).to contain_fixed(msg).on_line(7).in_column(15)
325
+ end
326
+
327
+ it 'should align the arrows' do
328
+ expect(manifest).to eq(fixed)
329
+ end
330
+ end
331
+
332
+ context 'complex resource with a misaligned =>' do
333
+ let(:code) { "
334
+ file { '/tmp/foo':
335
+ foo => 1,
336
+ bar => $baz ? {
337
+ gronk => 2,
338
+ meh => 3,
339
+ },
340
+ meep => 4,
341
+ bah => 5,
342
+ }"
343
+ }
344
+ let(:fixed) { "
345
+ file { '/tmp/foo':
346
+ foo => 1,
347
+ bar => $baz ? {
348
+ gronk => 2,
349
+ meh => 3,
350
+ },
351
+ meep => 4,
352
+ bah => 5,
353
+ }"
354
+ }
355
+
356
+ it 'should detect three problems' do
357
+ expect(problems).to have(3).problems
358
+ end
359
+
360
+ it 'should fix the manifest' do
361
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(15)
362
+ expect(problems).to contain_fixed(msg).on_line(6).in_column(17)
363
+ expect(problems).to contain_fixed(msg).on_line(9).in_column(15)
364
+ end
365
+
366
+ it 'should align the arrows' do
367
+ expect(manifest).to eq(fixed)
368
+ end
369
+ end
370
+
371
+ context 'multi-resource with a misaligned =>' do
372
+ let(:code) { "
373
+ file {
374
+ '/tmp/foo': ;
375
+ '/tmp/bar':
376
+ foo => 'bar';
377
+ '/tmp/baz':
378
+ gronk => 'bah',
379
+ meh => 'no'
380
+ }"
381
+ }
382
+ let(:fixed) { "
383
+ file {
384
+ '/tmp/foo': ;
385
+ '/tmp/bar':
386
+ foo => 'bar';
387
+ '/tmp/baz':
388
+ gronk => 'bah',
389
+ meh => 'no'
390
+ }"
391
+ }
392
+
393
+ it 'should only detect a single problem' do
394
+ expect(problems).to have(1).problem
395
+ end
396
+
397
+ it 'should fix the manifest' do
398
+ expect(problems).to contain_fixed(msg).on_line(8).in_column(17)
399
+ end
400
+
401
+ it 'should align the arrows' do
402
+ expect(manifest).to eq(fixed)
403
+ end
404
+ end
405
+
406
+ context 'resource with aligned => too far out' do
407
+ let(:code) { "
408
+ file { '/tmp/foo':
409
+ ensure => file,
410
+ mode => '0444',
411
+ }"
412
+ }
413
+
414
+ let(:fixed) { "
415
+ file { '/tmp/foo':
416
+ ensure => file,
417
+ mode => '0444',
418
+ }"
419
+ }
420
+
421
+ it 'should detect 2 problems' do
422
+ expect(problems).to have(2).problems
423
+ end
424
+
425
+ it 'should create 2 warnings' do
426
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(19)
427
+ expect(problems).to contain_fixed(msg).on_line(4).in_column(19)
428
+ end
429
+
430
+ it 'should realign the arrows with the minimum whitespace' do
431
+ expect(manifest).to eq(fixed)
432
+ end
433
+ end
434
+
435
+ context 'resource with unaligned => and no whitespace between param and =>' do
436
+ let(:code) { "
437
+ user { 'test':
438
+ param1 => 'foo',
439
+ param2=> 'bar',
440
+ }
441
+ " }
442
+
443
+ let(:fixed) { "
444
+ user { 'test':
445
+ param1 => 'foo',
446
+ param2 => 'bar',
447
+ }
448
+ " }
449
+
450
+ it 'should detect 1 problem' do
451
+ expect(problems).to have(1).problem
452
+ end
453
+
454
+ it 'should fix the problem' do
455
+ expect(problems).to contain_fixed(msg).on_line(4).in_column(17)
456
+ end
457
+
458
+ it 'should add whitespace between the param and the arrow' do
459
+ expect(manifest).to eq(fixed)
460
+ end
461
+ end
462
+
463
+ context 'multiline resource with multiple params on a line' do
464
+ let(:code) { "
465
+ user { 'test':
466
+ a => 'foo', bb => 'bar',
467
+ ccc => 'baz',
468
+ }
469
+ " }
470
+
471
+ let(:fixed) { "
472
+ user { 'test':
473
+ a => 'foo',
474
+ bb => 'bar',
475
+ ccc => 'baz',
476
+ }
477
+ " }
478
+
479
+ it 'should detect 2 problems' do
480
+ expect(problems).to have(2).problems
481
+ end
482
+
483
+ it 'should fix 2 problems' do
484
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(13)
485
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(26)
486
+ end
487
+
488
+ it 'should move the extra param onto its own line and realign' do
489
+ expect(manifest).to eq(fixed)
490
+ end
491
+ end
492
+
493
+ context 'multiline resource with multiple params on a line, extra one longer' do
494
+ let(:code) { "
495
+ user { 'test':
496
+ a => 'foo', bbccc => 'bar',
497
+ ccc => 'baz',
498
+ }
499
+ " }
500
+
501
+ let(:fixed) { "
502
+ user { 'test':
503
+ a => 'foo',
504
+ bbccc => 'bar',
505
+ ccc => 'baz',
506
+ }
507
+ " }
508
+
509
+ it 'should detect 2 problems' do
510
+ expect(problems).to have(3).problems
511
+ end
512
+
513
+ it 'should fix 2 problems' do
514
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(13)
515
+ expect(problems).to contain_fixed(msg).on_line(3).in_column(29)
516
+ expect(problems).to contain_fixed(msg).on_line(4).in_column(15)
517
+ end
518
+
519
+ it 'should move the extra param onto its own line and realign' do
520
+ expect(manifest).to eq(fixed)
521
+ end
522
+ end
523
+ end
524
+ end