rspec-puppet 2.12.0 → 3.0.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +139 -483
- data/README.md +18 -5
- data/bin/rspec-puppet-init +4 -3
- data/lib/rspec-puppet/adapters.rb +67 -61
- data/lib/rspec-puppet/cache.rb +3 -2
- data/lib/rspec-puppet/consts.rb +16 -14
- data/lib/rspec-puppet/coverage.rb +37 -42
- data/lib/rspec-puppet/errors.rb +6 -6
- data/lib/rspec-puppet/example/application_example_group.rb +3 -1
- data/lib/rspec-puppet/example/class_example_group.rb +3 -1
- data/lib/rspec-puppet/example/define_example_group.rb +3 -1
- data/lib/rspec-puppet/example/function_example_group.rb +28 -23
- data/lib/rspec-puppet/example/host_example_group.rb +3 -1
- data/lib/rspec-puppet/example/provider_example_group.rb +2 -0
- data/lib/rspec-puppet/example/type_alias_example_group.rb +4 -2
- data/lib/rspec-puppet/example/type_example_group.rb +3 -1
- data/lib/rspec-puppet/example.rb +6 -7
- data/lib/rspec-puppet/facter_impl.rb +11 -10
- data/lib/rspec-puppet/matchers/allow_value.rb +10 -10
- data/lib/rspec-puppet/matchers/compile.rb +54 -61
- data/lib/rspec-puppet/matchers/count_generic.rb +18 -18
- data/lib/rspec-puppet/matchers/create_generic.rb +66 -78
- data/lib/rspec-puppet/matchers/dynamic_matchers.rb +13 -2
- data/lib/rspec-puppet/matchers/include_class.rb +5 -4
- data/lib/rspec-puppet/matchers/parameter_matcher.rb +11 -12
- data/lib/rspec-puppet/matchers/raise_error.rb +5 -1
- data/lib/rspec-puppet/matchers/run.rb +41 -44
- data/lib/rspec-puppet/matchers/type_matchers.rb +37 -48
- data/lib/rspec-puppet/matchers.rb +2 -0
- data/lib/rspec-puppet/monkey_patches/win32/registry.rb +7 -5
- data/lib/rspec-puppet/monkey_patches/win32/taskscheduler.rb +3 -1
- data/lib/rspec-puppet/monkey_patches/windows/taskschedulerconstants.rb +208 -205
- data/lib/rspec-puppet/monkey_patches.rb +56 -56
- data/lib/rspec-puppet/rake_task.rb +6 -4
- data/lib/rspec-puppet/raw_string.rb +2 -0
- data/lib/rspec-puppet/sensitive.rb +9 -7
- data/lib/rspec-puppet/setup.rb +43 -48
- data/lib/rspec-puppet/spec_helper.rb +2 -0
- data/lib/rspec-puppet/support.rb +133 -134
- data/lib/rspec-puppet/tasks/release_test.rb +8 -5
- data/lib/rspec-puppet/version.rb +5 -0
- data/lib/rspec-puppet.rb +43 -51
- metadata +11 -9
data/README.md
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
# RSpec tests for your Puppet manifests & modules
|
2
|
-
[](https://travis-ci.org/rodjek/rspec-puppet)
|
3
|
-
[](https://coveralls.io/r/rodjek/rspec-puppet?branch=master)
|
4
2
|
|
5
3
|
#### Table of Contents
|
6
4
|
|
@@ -617,6 +615,11 @@ be translated to `undef` when compiling. For example:
|
|
617
615
|
let(:params) { {'user' => :undef, ...} }
|
618
616
|
```
|
619
617
|
|
618
|
+
For passing a sensitive value you can use the sensitive function with a value in brackets. For example
|
619
|
+
```ruby
|
620
|
+
let(:params) { {'password' =>sensitive('secret') } }
|
621
|
+
```
|
622
|
+
|
620
623
|
For references to nodes or resources as seen when using `require` or `before` properties,
|
621
624
|
or an `application` resource you can pass the string as an argument to the `ref` helper:
|
622
625
|
|
@@ -982,8 +985,17 @@ Some complex functions require access to the current parser's scope, e.g. for
|
|
982
985
|
stubbing other parts of the system.
|
983
986
|
|
984
987
|
```ruby
|
985
|
-
|
986
|
-
|
988
|
+
context 'when called with top-scope vars foo and bar set' do
|
989
|
+
before do
|
990
|
+
# :lookupvar is the method on scope that puppet calls internally to
|
991
|
+
# resolve the value of a variable.
|
992
|
+
allow(scope).to receive(:lookupvar).and_call_original
|
993
|
+
allow(scope).to receive(:lookupvar).with('::foo').and_return('Hello')
|
994
|
+
allow(scope).to receive(:lookupvar).with('::bar').and_return('World')
|
995
|
+
end
|
996
|
+
|
997
|
+
it { is_expected.to run.with_params().and_return('Hello World') }
|
998
|
+
end
|
987
999
|
```
|
988
1000
|
|
989
1001
|
Note that this does not work when testing manifests which use custom functions. Instead,
|
@@ -1115,4 +1127,5 @@ be excluded from the coverage report.
|
|
1115
1127
|
* [rspec-puppet-osmash](https://github.com/Aethylred/rspec-puppet-osmash): Provides Operation System hashes and validations for rspec-puppet
|
1116
1128
|
* [puppet_spec_facts](https://github.com/danieldreier/puppet_spec_facts): Gem to provide puppet fact hashes for rspec-puppet testing
|
1117
1129
|
|
1118
|
-
For a list of other module development tools see https://
|
1130
|
+
For a list of other module development tools see https://voxpupuli.org/plugins/
|
1131
|
+
|
data/bin/rspec-puppet-init
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
4
5
|
|
5
6
|
require 'rspec-puppet'
|
6
7
|
require 'optparse'
|
7
8
|
|
8
9
|
options = {
|
9
|
-
:
|
10
|
+
module_name: nil
|
10
11
|
}
|
11
12
|
|
12
13
|
OptionParser.new do |opts|
|
13
|
-
opts.banner =
|
14
|
+
opts.banner = 'Usage: rspec-puppet-init [options]'
|
14
15
|
|
15
16
|
opts.on('-n', '--name NAME', 'The name of the module (override autodetection)') do |v|
|
16
17
|
options[:module_name] = v
|
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rspec-puppet/facter_impl'
|
2
4
|
|
3
5
|
module RSpec::Puppet
|
4
6
|
module Adapters
|
5
|
-
|
6
7
|
class Base
|
7
8
|
# Set up all Puppet settings applicable for this Puppet version as
|
8
9
|
# application defaults.
|
@@ -44,12 +45,16 @@ module RSpec::Puppet
|
|
44
45
|
settings = settings_map.map do |puppet_setting, rspec_setting|
|
45
46
|
[puppet_setting, get_setting(example_group, rspec_setting)]
|
46
47
|
end.flatten
|
47
|
-
default_hash = {:
|
48
|
+
default_hash = { confdir: '/dev/null', vardir: '/dev/null' }
|
48
49
|
if defined?(Puppet::Test::TestHelper) && Puppet::Test::TestHelper.respond_to?(:app_defaults_for_tests, true)
|
49
50
|
default_hash.merge!(Puppet::Test::TestHelper.send(:app_defaults_for_tests))
|
50
51
|
end
|
51
52
|
settings_hash = default_hash.merge(Hash[*settings])
|
52
|
-
|
53
|
+
if Gem.win_platform?
|
54
|
+
settings_hash.each_with_object(settings_hash) do |(k, v), h|
|
55
|
+
h[k] = v == '/dev/null' ? 'c:/nul/' : v
|
56
|
+
end
|
57
|
+
end
|
53
58
|
|
54
59
|
if Puppet.settings.respond_to?(:initialize_app_defaults)
|
55
60
|
Puppet.settings.initialize_app_defaults(settings_hash)
|
@@ -83,7 +88,7 @@ module RSpec::Puppet
|
|
83
88
|
# Use the compiler directly to skip the filtering done by the indirector
|
84
89
|
Puppet::Parser::Compiler.compile(node).filter { |r| !r.exported? }
|
85
90
|
else
|
86
|
-
Puppet::Resource::Catalog.indirection.find(node.name, :
|
91
|
+
Puppet::Resource::Catalog.indirection.find(node.name, use_node: node)
|
87
92
|
end
|
88
93
|
end
|
89
94
|
|
@@ -93,9 +98,9 @@ module RSpec::Puppet
|
|
93
98
|
|
94
99
|
def settings_map
|
95
100
|
[
|
96
|
-
[
|
97
|
-
[
|
98
|
-
[
|
101
|
+
%i[modulepath module_path],
|
102
|
+
%i[config config],
|
103
|
+
%i[confdir confdir]
|
99
104
|
]
|
100
105
|
end
|
101
106
|
|
@@ -128,15 +133,15 @@ module RSpec::Puppet
|
|
128
133
|
def setup_puppet(example_group)
|
129
134
|
super
|
130
135
|
|
131
|
-
if rspec_modulepath = RSpec.configuration.module_path
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
136
|
+
modulepath = if (rspec_modulepath = RSpec.configuration.module_path)
|
137
|
+
rspec_modulepath.split(File::PATH_SEPARATOR)
|
138
|
+
else
|
139
|
+
Puppet[:environmentpath].split(File::PATH_SEPARATOR).map do |path|
|
140
|
+
File.join(path, 'fixtures', 'modules')
|
141
|
+
end
|
142
|
+
end
|
138
143
|
|
139
|
-
if rspec_manifest = RSpec.configuration.manifest
|
144
|
+
if (rspec_manifest = RSpec.configuration.manifest)
|
140
145
|
manifest = rspec_manifest
|
141
146
|
else
|
142
147
|
manifest_paths = Puppet[:environmentpath].split(File::PATH_SEPARATOR).map do |path|
|
@@ -155,28 +160,31 @@ module RSpec::Puppet
|
|
155
160
|
|
156
161
|
Puppet.push_context(
|
157
162
|
{
|
158
|
-
:
|
159
|
-
:
|
160
|
-
:
|
163
|
+
environments: loader,
|
164
|
+
current_environment: env,
|
165
|
+
loaders: (Puppet::Pops::Loaders.new(env) if Gem::Version.new(Puppet.version) >= Gem::Version.new('6.0.0'))
|
161
166
|
},
|
162
|
-
|
167
|
+
'Setup rspec-puppet environments'
|
163
168
|
)
|
164
169
|
end
|
165
170
|
|
166
171
|
def settings_map
|
167
|
-
super.
|
168
|
-
[
|
169
|
-
[
|
170
|
-
[
|
171
|
-
[
|
172
|
-
|
172
|
+
super.push(
|
173
|
+
%i[environmentpath environmentpath],
|
174
|
+
%i[hiera_config hiera_config],
|
175
|
+
%i[strict_variables strict_variables],
|
176
|
+
%i[manifest manifest]
|
177
|
+
)
|
173
178
|
end
|
174
179
|
|
175
180
|
def catalog(node, exported)
|
176
181
|
node.environment = current_environment
|
177
182
|
# Override $::environment to workaround PUP-5835, where Puppet otherwise
|
178
183
|
# stores a symbol for the parameter
|
179
|
-
|
184
|
+
if node.parameters['environment'] != node.parameters['environment'].to_s
|
185
|
+
node.parameters['environment'] =
|
186
|
+
current_environment.name.to_s
|
187
|
+
end
|
180
188
|
super
|
181
189
|
end
|
182
190
|
|
@@ -210,9 +218,9 @@ module RSpec::Puppet
|
|
210
218
|
end
|
211
219
|
|
212
220
|
def settings_map
|
213
|
-
super.
|
214
|
-
[
|
215
|
-
|
221
|
+
super.push(
|
222
|
+
%i[trusted_server_facts trusted_server_facts]
|
223
|
+
)
|
216
224
|
end
|
217
225
|
end
|
218
226
|
|
@@ -229,7 +237,7 @@ module RSpec::Puppet
|
|
229
237
|
begin
|
230
238
|
Puppet.runtime[:facter]
|
231
239
|
@supports_facter_runtime = true
|
232
|
-
rescue
|
240
|
+
rescue StandardError
|
233
241
|
@supports_facter_runtime = false
|
234
242
|
end
|
235
243
|
end
|
@@ -260,10 +268,10 @@ module RSpec::Puppet
|
|
260
268
|
end
|
261
269
|
|
262
270
|
def settings_map
|
263
|
-
super.
|
264
|
-
[
|
265
|
-
[
|
266
|
-
|
271
|
+
super.push(
|
272
|
+
%i[basemodulepath basemodulepath],
|
273
|
+
%i[vendormoduledir vendormoduledir]
|
274
|
+
)
|
267
275
|
end
|
268
276
|
|
269
277
|
def catalog(node, _exported)
|
@@ -275,55 +283,55 @@ module RSpec::Puppet
|
|
275
283
|
|
276
284
|
class Adapter30 < Base
|
277
285
|
def settings_map
|
278
|
-
super.
|
279
|
-
[
|
280
|
-
[
|
281
|
-
[
|
282
|
-
[
|
283
|
-
|
286
|
+
super.push(
|
287
|
+
%i[manifestdir manifest_dir],
|
288
|
+
%i[manifest manifest],
|
289
|
+
%i[templatedir template_dir],
|
290
|
+
%i[hiera_config hiera_config]
|
291
|
+
)
|
284
292
|
end
|
285
293
|
end
|
286
294
|
|
287
295
|
class Adapter32 < Adapter30
|
288
296
|
def settings_map
|
289
|
-
super.
|
290
|
-
[
|
291
|
-
|
297
|
+
super.push(
|
298
|
+
%i[parser parser]
|
299
|
+
)
|
292
300
|
end
|
293
301
|
end
|
294
302
|
|
295
303
|
class Adapter33 < Adapter32
|
296
304
|
def settings_map
|
297
|
-
super.
|
298
|
-
[
|
299
|
-
[
|
300
|
-
|
305
|
+
super.push(
|
306
|
+
%i[ordering ordering],
|
307
|
+
%i[stringify_facts stringify_facts]
|
308
|
+
)
|
301
309
|
end
|
302
310
|
end
|
303
311
|
|
304
312
|
class Adapter34 < Adapter33
|
305
313
|
def settings_map
|
306
|
-
super.
|
307
|
-
[
|
308
|
-
|
314
|
+
super.push(
|
315
|
+
%i[trusted_node_data trusted_node_data]
|
316
|
+
)
|
309
317
|
end
|
310
318
|
end
|
311
319
|
|
312
320
|
class Adapter35 < Adapter34
|
313
321
|
def settings_map
|
314
|
-
super.
|
315
|
-
[
|
316
|
-
|
322
|
+
super.push(
|
323
|
+
%i[strict_variables strict_variables]
|
324
|
+
)
|
317
325
|
end
|
318
326
|
end
|
319
327
|
|
320
328
|
class Adapter27 < Base
|
321
329
|
def settings_map
|
322
|
-
super.
|
323
|
-
[
|
324
|
-
[
|
325
|
-
[
|
326
|
-
|
330
|
+
super.push(
|
331
|
+
%i[manifestdir manifest_dir],
|
332
|
+
%i[manifest manifest],
|
333
|
+
%i[templatedir template_dir]
|
334
|
+
)
|
327
335
|
end
|
328
336
|
end
|
329
337
|
|
@@ -339,9 +347,7 @@ module RSpec::Puppet
|
|
339
347
|
['3.0', Adapter30],
|
340
348
|
['2.7', Adapter27]
|
341
349
|
].each do |(version, klass)|
|
342
|
-
if Puppet::Util::Package.versioncmp(Puppet.version, version) >= 0
|
343
|
-
return klass.new
|
344
|
-
end
|
350
|
+
return klass.new if Puppet::Util::Package.versioncmp(Puppet.version, version) >= 0
|
345
351
|
end
|
346
352
|
raise "Puppet version #{Puppet.version} is not supported."
|
347
353
|
end
|
data/lib/rspec-puppet/cache.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet
|
2
4
|
class Cache
|
3
|
-
|
4
5
|
MAX_ENTRIES = 16
|
5
6
|
|
6
7
|
# @param [Proc] default_proc The default proc to use to fetch objects on cache miss
|
@@ -12,7 +13,7 @@ module RSpec::Puppet
|
|
12
13
|
|
13
14
|
def get(*args, &blk)
|
14
15
|
key = Marshal.load(Marshal.dump(args))
|
15
|
-
if @cache.
|
16
|
+
if @cache.key?(key)
|
16
17
|
# Cache hit
|
17
18
|
# move that entry last to make it "most recenty used"
|
18
19
|
@lra.insert(-1, @lra.delete_at(@lra.index(args)))
|
data/lib/rspec-puppet/consts.rb
CHANGED
@@ -1,27 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet::Consts
|
2
4
|
STUBBED_CONSTS = {
|
3
|
-
:
|
5
|
+
posix: {
|
4
6
|
'File::PATH_SEPARATOR' => ':',
|
5
7
|
'File::ALT_SEPARATOR' => nil,
|
6
|
-
'Pathname::SEPARATOR_PAT' => /#{Regexp.quote('/')}
|
8
|
+
'Pathname::SEPARATOR_PAT' => /#{Regexp.quote('/')}/
|
7
9
|
},
|
8
|
-
:
|
10
|
+
windows: {
|
9
11
|
'File::PATH_SEPARATOR' => ';',
|
10
|
-
'File::ALT_SEPARATOR' =>
|
11
|
-
'Pathname::SEPARATOR_PAT' => /[#{Regexp.quote("\\")}#{Regexp.quote('/')}]
|
12
|
+
'File::ALT_SEPARATOR' => '\\',
|
13
|
+
'Pathname::SEPARATOR_PAT' => /[#{Regexp.quote("\\")}#{Regexp.quote('/')}]/
|
12
14
|
}
|
13
|
-
}
|
15
|
+
}.freeze
|
14
16
|
|
15
17
|
FEATURES = {
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
},
|
20
|
-
:windows => {
|
21
|
-
:posix => false,
|
22
|
-
:microsoft_windows => true,
|
18
|
+
posix: {
|
19
|
+
posix: true,
|
20
|
+
microsoft_windows: false
|
23
21
|
},
|
24
|
-
|
22
|
+
windows: {
|
23
|
+
posix: false,
|
24
|
+
microsoft_windows: true
|
25
|
+
}
|
26
|
+
}.freeze
|
25
27
|
|
26
28
|
def self.stub_consts_for(platform)
|
27
29
|
STUBBED_CONSTS[platform].each do |const_name, const_value|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'tmpdir'
|
2
4
|
require 'digest'
|
3
5
|
require 'json'
|
@@ -16,23 +18,22 @@ end
|
|
16
18
|
|
17
19
|
module RSpec::Puppet
|
18
20
|
class Coverage
|
19
|
-
|
20
21
|
attr_accessor :filters, :filters_regex
|
21
22
|
|
22
23
|
class << self
|
23
24
|
extend Forwardable
|
24
25
|
|
25
|
-
delegated_methods = [
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
delegated_methods = %i[
|
27
|
+
instance
|
28
|
+
add
|
29
|
+
cover!
|
30
|
+
report!
|
31
|
+
filters
|
32
|
+
filters_regex
|
33
|
+
add_filter
|
34
|
+
add_filter_regex
|
35
|
+
add_from_catalog
|
36
|
+
results
|
36
37
|
]
|
37
38
|
|
38
39
|
def_delegators(*delegated_methods)
|
@@ -112,23 +113,21 @@ module RSpec::Puppet
|
|
112
113
|
end
|
113
114
|
|
114
115
|
def add(resource)
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
return unless !exists?(resource) && !filtered?(resource)
|
117
|
+
|
118
|
+
@collection[resource.to_s] = ResourceWrapper.new(resource)
|
118
119
|
end
|
119
120
|
|
120
121
|
def add_filter(type, title)
|
121
122
|
type = capitalize_name(type)
|
122
123
|
|
123
|
-
if type == 'Class'
|
124
|
-
title = capitalize_name(title)
|
125
|
-
end
|
124
|
+
title = capitalize_name(title) if type == 'Class'
|
126
125
|
|
127
126
|
@filters << "#{type}[#{title}]"
|
128
127
|
end
|
129
128
|
|
130
129
|
def add_filter_regex(type, pattern)
|
131
|
-
raise ArgumentError
|
130
|
+
raise ArgumentError, 'pattern argument must be a Regexp' unless pattern.is_a?(Regexp)
|
132
131
|
|
133
132
|
type = capitalize_name(type)
|
134
133
|
|
@@ -145,7 +144,7 @@ module RSpec::Puppet
|
|
145
144
|
|
146
145
|
# match an even number of backslashes before the anchor - this indicates that the anchor was not escaped
|
147
146
|
# note the necessity for the negative lookbehind `(?<!)` to assert that there is no backslash before this
|
148
|
-
src = if
|
147
|
+
src = if /(?<!\\)(\\\\)*(?:\\[zZ]|\$)\z/.match?(src)
|
149
148
|
src.gsub(/(?:\\[zZ]|\$)\z/, '')
|
150
149
|
else
|
151
150
|
# no anchor at the end
|
@@ -157,7 +156,9 @@ module RSpec::Puppet
|
|
157
156
|
|
158
157
|
# add all resources from catalog declared in module test_module
|
159
158
|
def add_from_catalog(catalog, test_module)
|
160
|
-
coverable_resources = catalog.to_a.reject
|
159
|
+
coverable_resources = catalog.to_a.reject do |resource|
|
160
|
+
!test_module.nil? && filter_resource?(resource, test_module)
|
161
|
+
end
|
161
162
|
coverable_resources.each do |resource|
|
162
163
|
add(resource)
|
163
164
|
end
|
@@ -171,9 +172,9 @@ module RSpec::Puppet
|
|
171
172
|
end
|
172
173
|
|
173
174
|
def cover!(resource)
|
174
|
-
|
175
|
-
|
176
|
-
|
175
|
+
return unless !filtered?(resource) && (wrapper = find(resource))
|
176
|
+
|
177
|
+
wrapper.touch!
|
177
178
|
end
|
178
179
|
|
179
180
|
def report!(coverage_desired = nil)
|
@@ -213,9 +214,9 @@ module RSpec::Puppet
|
|
213
214
|
coverage_desired ||= 0
|
214
215
|
|
215
216
|
if coverage_desired.is_a?(Numeric) && coverage_desired.to_f <= 100.00 && coverage_desired.to_f >= 0.0
|
216
|
-
coverage_test = RSpec.describe(
|
217
|
+
coverage_test = RSpec.describe('Code coverage')
|
217
218
|
coverage_results = coverage_test.example("must cover at least #{coverage_desired}% of resources") do
|
218
|
-
expect(
|
219
|
+
expect(coverage_actual.to_f).to be >= coverage_desired.to_f
|
219
220
|
end
|
220
221
|
coverage_test.run(RSpec.configuration.reporter)
|
221
222
|
|
@@ -248,8 +249,8 @@ module RSpec::Puppet
|
|
248
249
|
report[:touched] = @collection.count { |_, resource| resource.touched? }
|
249
250
|
report[:untouched] = report[:total] - report[:touched]
|
250
251
|
|
251
|
-
coverage = report[:total].to_f
|
252
|
-
report[:coverage] =
|
252
|
+
coverage = report[:total].to_f.positive? ? ((report[:touched].to_f / report[:total]) * 100) : 100.0
|
253
|
+
report[:coverage] = '%5.2f' % coverage
|
253
254
|
|
254
255
|
report[:resources] = Hash[*@collection.map do |name, wrapper|
|
255
256
|
[name, wrapper.to_hash]
|
@@ -258,10 +259,10 @@ module RSpec::Puppet
|
|
258
259
|
text = [
|
259
260
|
"Total resources: #{report[:total]}",
|
260
261
|
"Touched resources: #{report[:touched]}",
|
261
|
-
"Resource coverage: #{report[:coverage]}%"
|
262
|
+
"Resource coverage: #{report[:coverage]}%"
|
262
263
|
]
|
263
264
|
|
264
|
-
if report[:untouched]
|
265
|
+
if (report[:untouched]).positive?
|
265
266
|
text += ['', 'Untouched resources:']
|
266
267
|
untouched_resources = report[:resources].reject { |_, r| r[:touched] }
|
267
268
|
text += untouched_resources.map { |name, _| " #{name}" }.sort
|
@@ -288,25 +289,19 @@ module RSpec::Puppet
|
|
288
289
|
# @param test_module [String] The name of the module under test
|
289
290
|
# @return [true, false]
|
290
291
|
def filter_resource?(resource, test_module)
|
291
|
-
if filtered?(resource)
|
292
|
-
return true
|
293
|
-
end
|
292
|
+
return true if filtered?(resource)
|
294
293
|
|
295
294
|
if resource.type == 'Class'
|
296
295
|
module_name = resource.title.split('::').first.downcase
|
297
|
-
if module_name != test_module
|
298
|
-
return true
|
299
|
-
end
|
296
|
+
return true if module_name != test_module
|
300
297
|
end
|
301
298
|
|
302
299
|
if resource.file
|
303
300
|
paths = module_paths(test_module)
|
304
|
-
unless paths.any? { |path| resource.file.include?(path) }
|
305
|
-
return true
|
306
|
-
end
|
301
|
+
return true unless paths.any? { |path| resource.file.include?(path) }
|
307
302
|
end
|
308
303
|
|
309
|
-
|
304
|
+
false
|
310
305
|
end
|
311
306
|
|
312
307
|
# Find all paths that may contain testable resources for a module.
|
@@ -330,7 +325,7 @@ module RSpec::Puppet
|
|
330
325
|
end
|
331
326
|
|
332
327
|
def capitalize_name(name)
|
333
|
-
name.split('::').map
|
328
|
+
name.split('::').map(&:capitalize).join('::')
|
334
329
|
end
|
335
330
|
|
336
331
|
class ResourceWrapper
|
@@ -346,7 +341,7 @@ module RSpec::Puppet
|
|
346
341
|
|
347
342
|
def to_hash
|
348
343
|
{
|
349
|
-
:
|
344
|
+
touched: touched?
|
350
345
|
}
|
351
346
|
end
|
352
347
|
|
data/lib/rspec-puppet/errors.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet
|
2
4
|
module Errors
|
3
5
|
class MatchError < StandardError
|
@@ -11,18 +13,16 @@ module RSpec::Puppet
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def message
|
14
|
-
if @param.to_s == 'content'
|
16
|
+
if (@param.to_s == 'content') && expected.is_a?(String)
|
15
17
|
if negative == true
|
16
18
|
"#{param} not set to supplied string"
|
17
19
|
else
|
18
20
|
"#{param} set to supplied string"
|
19
21
|
end
|
22
|
+
elsif negative == true
|
23
|
+
"#{param} not set to #{expected.inspect} but it is set to #{actual.inspect}"
|
20
24
|
else
|
21
|
-
|
22
|
-
"#{param} not set to #{expected.inspect} but it is set to #{actual.inspect}"
|
23
|
-
else
|
24
|
-
"#{param} set to #{expected.inspect} but it is set to #{actual.inspect}"
|
25
|
-
end
|
25
|
+
"#{param} set to #{expected.inspect} but it is set to #{actual.inspect}"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet
|
2
4
|
# This module provides support for the application type
|
3
5
|
module ApplicationExampleGroup
|
@@ -9,7 +11,7 @@ module RSpec::Puppet
|
|
9
11
|
end
|
10
12
|
|
11
13
|
def exported_resources
|
12
|
-
|
14
|
+
-> { load_catalogue(:application, true) }
|
13
15
|
end
|
14
16
|
|
15
17
|
def rspec_puppet_cleanup
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet
|
2
4
|
module ClassExampleGroup
|
3
5
|
include RSpec::Puppet::ManifestMatchers
|
@@ -8,7 +10,7 @@ module RSpec::Puppet
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def exported_resources
|
11
|
-
|
13
|
+
-> { load_catalogue(:class, true) }
|
12
14
|
end
|
13
15
|
|
14
16
|
def rspec_puppet_cleanup
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RSpec::Puppet
|
2
4
|
module DefineExampleGroup
|
3
5
|
include RSpec::Puppet::ManifestMatchers
|
@@ -8,7 +10,7 @@ module RSpec::Puppet
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def exported_resources
|
11
|
-
|
13
|
+
-> { load_catalogue(:define, true) }
|
12
14
|
end
|
13
15
|
|
14
16
|
def rspec_puppet_cleanup
|