chefspec 9.2.1 → 9.3.0
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/Gemfile +16 -9
- data/Rakefile +60 -52
- data/chefspec.gemspec +20 -20
- data/lib/chefspec.rb +29 -29
- data/lib/chefspec/api.rb +14 -14
- data/lib/chefspec/api/core.rb +3 -3
- data/lib/chefspec/api/described.rb +3 -5
- data/lib/chefspec/api/stubs.rb +2 -2
- data/lib/chefspec/api/stubs_for.rb +12 -12
- data/lib/chefspec/berkshelf.rb +4 -4
- data/lib/chefspec/cacher.rb +2 -2
- data/lib/chefspec/coverage.rb +35 -40
- data/lib/chefspec/coverage/filters.rb +18 -15
- data/lib/chefspec/deprecations.rb +3 -3
- data/lib/chefspec/errors.rb +7 -7
- data/lib/chefspec/expect_exception.rb +2 -1
- data/lib/chefspec/extensions.rb +14 -14
- data/lib/chefspec/extensions/chef/client.rb +3 -3
- data/lib/chefspec/extensions/chef/conditional.rb +2 -1
- data/lib/chefspec/extensions/chef/cookbook/gem_installer.rb +5 -4
- data/lib/chefspec/extensions/chef/cookbook_loader.rb +1 -0
- data/lib/chefspec/extensions/chef/cookbook_uploader.rb +1 -1
- data/lib/chefspec/extensions/chef/data_query.rb +3 -3
- data/lib/chefspec/extensions/chef/lwrp_base.rb +1 -0
- data/lib/chefspec/extensions/chef/provider.rb +8 -5
- data/lib/chefspec/extensions/chef/resource.rb +14 -9
- data/lib/chefspec/extensions/chef/resource/freebsd_package.rb +2 -1
- data/lib/chefspec/extensions/chef/run_context/cookbook_compiler.rb +12 -1
- data/lib/chefspec/extensions/chef/securable.rb +1 -1
- data/lib/chefspec/extensions/ohai/system.rb +1 -1
- data/lib/chefspec/file_cache_path_proxy.rb +3 -3
- data/lib/chefspec/formatter.rb +3 -3
- data/lib/chefspec/librarian.rb +7 -6
- data/lib/chefspec/matchers.rb +9 -9
- data/lib/chefspec/matchers/do_nothing_matcher.rb +15 -15
- data/lib/chefspec/matchers/include_any_recipe_matcher.rb +4 -4
- data/lib/chefspec/matchers/include_recipe_matcher.rb +1 -1
- data/lib/chefspec/matchers/link_to_matcher.rb +2 -2
- data/lib/chefspec/matchers/notifications_matcher.rb +5 -4
- data/lib/chefspec/matchers/render_file_matcher.rb +3 -3
- data/lib/chefspec/matchers/resource_matcher.rb +18 -16
- data/lib/chefspec/mixins/normalize.rb +1 -1
- data/lib/chefspec/policyfile.rb +6 -6
- data/lib/chefspec/renderer.rb +4 -4
- data/lib/chefspec/rspec.rb +1 -1
- data/lib/chefspec/server.rb +1 -1
- data/lib/chefspec/server_methods.rb +8 -8
- data/lib/chefspec/server_runner.rb +10 -10
- data/lib/chefspec/solo_runner.rb +26 -24
- data/lib/chefspec/stubs/command_registry.rb +1 -1
- data/lib/chefspec/stubs/command_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_item_stub.rb +1 -1
- data/lib/chefspec/stubs/data_bag_registry.rb +1 -1
- data/lib/chefspec/stubs/data_bag_stub.rb +1 -1
- data/lib/chefspec/stubs/registry.rb +1 -1
- data/lib/chefspec/stubs/search_registry.rb +2 -2
- data/lib/chefspec/stubs/search_stub.rb +2 -2
- data/lib/chefspec/util.rb +7 -7
- data/lib/chefspec/version.rb +1 -1
- data/lib/chefspec/zero_server.rb +3 -3
- data/spec/spec_helper.rb +3 -4
- data/spec/support/hash.rb +3 -3
- data/spec/unit/cacher_spec.rb +17 -17
- data/spec/unit/coverage/filters_spec.rb +16 -16
- data/spec/unit/deprecations_spec.rb +8 -9
- data/spec/unit/errors_spec.rb +15 -15
- data/spec/unit/expect_exception_spec.rb +9 -9
- data/spec/unit/macros_spec.rb +50 -50
- data/spec/unit/matchers/do_nothing_matcher.rb +1 -1
- data/spec/unit/matchers/include_any_recipe_matcher_spec.rb +23 -23
- data/spec/unit/matchers/include_recipe_matcher_spec.rb +15 -15
- data/spec/unit/matchers/link_to_matcher_spec.rb +18 -18
- data/spec/unit/matchers/notifications_matcher_spec.rb +15 -16
- data/spec/unit/matchers/render_file_matcher_spec.rb +26 -26
- data/spec/unit/matchers/resource_matcher_spec.rb +1 -1
- data/spec/unit/matchers/state_attrs_matcher_spec.rb +24 -24
- data/spec/unit/matchers/subscribes_matcher_spec.rb +27 -29
- data/spec/unit/renderer_spec.rb +36 -36
- data/spec/unit/server_runner_spec.rb +6 -6
- data/spec/unit/solo_runner_spec.rb +69 -69
- data/spec/unit/stubs/command_registry_spec.rb +11 -11
- data/spec/unit/stubs/command_stub_spec.rb +26 -26
- data/spec/unit/stubs/data_bag_item_registry_spec.rb +17 -17
- data/spec/unit/stubs/data_bag_item_stub_spec.rb +14 -14
- data/spec/unit/stubs/data_bag_registry_spec.rb +16 -16
- data/spec/unit/stubs/data_bag_stub_spec.rb +13 -13
- data/spec/unit/stubs/registry_spec.rb +9 -9
- data/spec/unit/stubs/search_registry_spec.rb +17 -17
- data/spec/unit/stubs/search_stub_spec.rb +14 -14
- data/spec/unit/stubs/stub_spec.rb +22 -22
- metadata +6 -6
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rspec/matchers/expecteds_for_multiple_diffs"
|
2
|
+
require "rspec/expectations/fail_with"
|
3
3
|
|
4
4
|
module ChefSpec::Matchers
|
5
5
|
class ResourceMatcher
|
@@ -15,13 +15,15 @@ module ChefSpec::Matchers
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def at_compile_time
|
18
|
-
raise ArgumentError,
|
18
|
+
raise ArgumentError, "Cannot specify both .at_converge_time and .at_compile_time!" if @converge_time
|
19
|
+
|
19
20
|
@compile_time = true
|
20
21
|
self
|
21
22
|
end
|
22
23
|
|
23
24
|
def at_converge_time
|
24
|
-
raise ArgumentError,
|
25
|
+
raise ArgumentError, "Cannot specify both .at_compile_time and .at_converge_time!" if @compile_time
|
26
|
+
|
25
27
|
@converge_time = true
|
26
28
|
self
|
27
29
|
end
|
@@ -55,20 +57,20 @@ module ChefSpec::Matchers
|
|
55
57
|
if resource
|
56
58
|
if unmatched_parameters.empty?
|
57
59
|
if @compile_time
|
58
|
-
%Q{expected "#{resource
|
60
|
+
%Q{expected "#{resource}" to be run at compile time}
|
59
61
|
else
|
60
|
-
%Q{expected "#{resource
|
62
|
+
%Q{expected "#{resource}" to be run at converge time}
|
61
63
|
end
|
62
64
|
else
|
63
|
-
message = %Q{expected "#{resource
|
65
|
+
message = %Q{expected "#{resource}" to have parameters:} \
|
64
66
|
"\n\n" \
|
65
67
|
" " + unmatched_parameters.collect { |parameter, h|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
msg = "#{parameter} #{h[:expected].inspect}, was #{h[:actual].inspect}"
|
69
|
+
diff = ::RSpec::Matchers::ExpectedsForMultipleDiffs.from(h[:expected]) \
|
70
|
+
.message_with_diff(message, ::RSpec::Expectations.differ, h[:actual])
|
71
|
+
msg += diff if diff
|
72
|
+
msg
|
73
|
+
}.join("\n ")
|
72
74
|
end
|
73
75
|
else
|
74
76
|
%Q{expected "#{@resource_name}[#{@expected_identity}]"} \
|
@@ -81,9 +83,9 @@ module ChefSpec::Matchers
|
|
81
83
|
|
82
84
|
def failure_message_when_negated
|
83
85
|
if resource
|
84
|
-
message = %Q{expected "#{resource
|
86
|
+
message = %Q{expected "#{resource}" actions #{resource.performed_actions.inspect} to not exist}
|
85
87
|
else
|
86
|
-
message = %Q{expected "#{resource
|
88
|
+
message = %Q{expected "#{resource}" to not exist}
|
87
89
|
end
|
88
90
|
|
89
91
|
message << " at compile time" if @compile_time
|
@@ -115,7 +117,7 @@ module ChefSpec::Matchers
|
|
115
117
|
if parameter == :source
|
116
118
|
# Chef 11+ stores the source parameter internally as an Array
|
117
119
|
Array(expected) == Array(value)
|
118
|
-
elsif expected.
|
120
|
+
elsif expected.is_a?(Class)
|
119
121
|
# Ruby can't compare classes with ===
|
120
122
|
expected == value
|
121
123
|
else
|
data/lib/chefspec/policyfile.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
begin
|
2
|
-
require
|
3
|
-
require
|
2
|
+
require "chef-cli/policyfile_services/export_repo"
|
3
|
+
require "chef-cli/policyfile_services/install"
|
4
4
|
rescue LoadError
|
5
|
-
raise ChefSpec::Error::GemLoadError.new(gem:
|
5
|
+
raise ChefSpec::Error::GemLoadError.new(gem: "chef-cli", name: "ChefCLI")
|
6
6
|
end
|
7
7
|
|
8
8
|
module ChefSpec
|
@@ -24,7 +24,7 @@ module ChefSpec
|
|
24
24
|
def setup!
|
25
25
|
policyfile_path = RSpec.configuration.policyfile_path
|
26
26
|
if policyfile_path.nil?
|
27
|
-
policyfile_path = File.join(Dir.pwd,
|
27
|
+
policyfile_path = File.join(Dir.pwd, "Policyfile.rb")
|
28
28
|
end
|
29
29
|
|
30
30
|
installer = ChefCLI::PolicyfileServices::Install.new(
|
@@ -44,8 +44,8 @@ module ChefSpec
|
|
44
44
|
|
45
45
|
::RSpec.configure do |config|
|
46
46
|
config.cookbook_path = [
|
47
|
-
File.join(@tmpdir,
|
48
|
-
File.join(@tmpdir,
|
47
|
+
File.join(@tmpdir, "cookbooks"),
|
48
|
+
File.join(@tmpdir, "cookbook_artifacts"),
|
49
49
|
]
|
50
50
|
end
|
51
51
|
end
|
data/lib/chefspec/renderer.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
begin
|
2
|
-
require
|
3
|
-
require
|
2
|
+
require "chef/mixin/template"
|
3
|
+
require "chef/provider/template_finder"
|
4
4
|
rescue LoadError
|
5
5
|
end
|
6
6
|
|
@@ -67,8 +67,8 @@ module ChefSpec
|
|
67
67
|
if Chef::Mixin::Template.const_defined?(:TemplateContext) # Chef 11+
|
68
68
|
template_context = Chef::Mixin::Template::TemplateContext.new([])
|
69
69
|
template_context.update({
|
70
|
-
:
|
71
|
-
:
|
70
|
+
node: chef_run.node,
|
71
|
+
template_finder: template_finder(chef_run, cookbook_name),
|
72
72
|
}.merge(template.variables))
|
73
73
|
if template.respond_to?(:helper_modules) # Chef 11.4+
|
74
74
|
template_context._extend_modules(template.helper_modules)
|
data/lib/chefspec/rspec.rb
CHANGED
data/lib/chefspec/server.rb
CHANGED
@@ -88,11 +88,11 @@ module ChefSpec
|
|
88
88
|
EOH
|
89
89
|
end
|
90
90
|
|
91
|
-
entity :client, Chef::Client,
|
92
|
-
entity :data_bag, Chef::DataBag,
|
93
|
-
entity :environment, Chef::Environment,
|
94
|
-
entity :node, Chef::Node,
|
95
|
-
entity :role, Chef::Role,
|
91
|
+
entity :client, Chef::Client, "clients"
|
92
|
+
entity :data_bag, Chef::DataBag, "data"
|
93
|
+
entity :environment, Chef::Environment, "environments"
|
94
|
+
entity :node, Chef::Node, "nodes"
|
95
|
+
entity :role, Chef::Role, "roles"
|
96
96
|
|
97
97
|
#
|
98
98
|
# Create a new data_bag on the Chef Server. This overrides the method
|
@@ -104,7 +104,7 @@ module ChefSpec
|
|
104
104
|
# the data to load into the data bag
|
105
105
|
#
|
106
106
|
def create_data_bag(name, data = {})
|
107
|
-
load_data(name,
|
107
|
+
load_data(name, "data", data)
|
108
108
|
end
|
109
109
|
|
110
110
|
#
|
@@ -138,7 +138,7 @@ module ChefSpec
|
|
138
138
|
data = JSON.fast_generate(data)
|
139
139
|
end
|
140
140
|
|
141
|
-
load_data(name,
|
141
|
+
load_data(name, "nodes", data)
|
142
142
|
end
|
143
143
|
alias_method :update_node, :create_node
|
144
144
|
|
@@ -161,7 +161,7 @@ module ChefSpec
|
|
161
161
|
# Get the path to an item in the data store.
|
162
162
|
#
|
163
163
|
def get(*args)
|
164
|
-
args.unshift(
|
164
|
+
args.unshift("organizations", "chef")
|
165
165
|
|
166
166
|
if args.size == 3
|
167
167
|
server.data_store.list(args)
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "chef/cookbook_loader"
|
2
|
+
require "chef/cookbook_uploader"
|
3
3
|
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
4
|
+
require_relative "zero_server"
|
5
|
+
require_relative "file_cache_path_proxy"
|
6
|
+
require_relative "server_methods"
|
7
|
+
require_relative "solo_runner"
|
8
8
|
|
9
9
|
module ChefSpec
|
10
10
|
class ServerRunner < SoloRunner
|
@@ -54,8 +54,8 @@ module ChefSpec
|
|
54
54
|
#
|
55
55
|
def client_key
|
56
56
|
tmp = Dir.mktmpdir
|
57
|
-
path = File.join(tmp,
|
58
|
-
File.open(path,
|
57
|
+
path = File.join(tmp, "client.pem")
|
58
|
+
File.open(path, "wb") { |f| f.write(ChefZero::PRIVATE_KEY) }
|
59
59
|
at_exit { FileUtils.rm_rf(tmp) }
|
60
60
|
path
|
61
61
|
end
|
@@ -64,8 +64,8 @@ module ChefSpec
|
|
64
64
|
def apply_chef_config!
|
65
65
|
super
|
66
66
|
Chef::Config[:client_key] = client_key
|
67
|
-
Chef::Config[:client_name] =
|
68
|
-
Chef::Config[:node_name] =
|
67
|
+
Chef::Config[:client_name] = "chefspec"
|
68
|
+
Chef::Config[:node_name] = "chefspec"
|
69
69
|
Chef::Config[:solo] = false
|
70
70
|
Chef::Config[:solo_legacy_mode] = false
|
71
71
|
|
data/lib/chefspec/solo_runner.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require "fauxhai"
|
2
|
+
require "chef/client"
|
3
|
+
require "chef/cookbook/metadata"
|
4
|
+
require "chef/mash"
|
5
|
+
require "chef/providers"
|
6
|
+
require "chef/resources"
|
7
7
|
|
8
8
|
module ChefSpec
|
9
9
|
class SoloRunner
|
@@ -123,6 +123,7 @@ module ChefSpec
|
|
123
123
|
if converge_val.is_a?(Exception)
|
124
124
|
raise converge_val
|
125
125
|
end
|
126
|
+
|
126
127
|
self
|
127
128
|
end
|
128
129
|
|
@@ -136,7 +137,7 @@ module ChefSpec
|
|
136
137
|
#
|
137
138
|
def converge_block(&block)
|
138
139
|
converge do
|
139
|
-
recipe = Chef::Recipe.new(cookbook_name,
|
140
|
+
recipe = Chef::Recipe.new(cookbook_name, "_test", run_context)
|
140
141
|
recipe.instance_exec(&block)
|
141
142
|
end
|
142
143
|
end
|
@@ -149,7 +150,8 @@ module ChefSpec
|
|
149
150
|
#
|
150
151
|
def preload!
|
151
152
|
# Flag to disable preloading for situations where it doesn't make sense.
|
152
|
-
return if ENV[
|
153
|
+
return if ENV["CHEFSPEC_NO_PRELOAD"]
|
154
|
+
|
153
155
|
begin
|
154
156
|
old_preload = $CHEFSPEC_PRELOAD
|
155
157
|
$CHEFSPEC_PRELOAD = true
|
@@ -292,7 +294,8 @@ module ChefSpec
|
|
292
294
|
# Respond to custom matchers defined by the user.
|
293
295
|
#
|
294
296
|
def method_missing(m, *args, &block)
|
295
|
-
|
297
|
+
block = ChefSpec.matchers[resource_name(m.to_sym)]
|
298
|
+
if block
|
296
299
|
instance_exec(args.first, &block)
|
297
300
|
else
|
298
301
|
super
|
@@ -358,11 +361,11 @@ module ChefSpec
|
|
358
361
|
# @return [String]
|
359
362
|
#
|
360
363
|
def calling_cookbook_root(options, kaller)
|
361
|
-
calling_spec = options[:spec_declaration_locations] || kaller.find { |line| line =~
|
364
|
+
calling_spec = options[:spec_declaration_locations] || kaller.find { |line| line =~ %r{/spec} }
|
362
365
|
raise Error::CookbookPathNotFound if calling_spec.nil?
|
363
366
|
|
364
367
|
bits = calling_spec.split(/:[0-9]/, 2).first.split(File::SEPARATOR)
|
365
|
-
spec_dir = bits.index(
|
368
|
+
spec_dir = bits.index("spec") || 0
|
366
369
|
|
367
370
|
File.join(bits.slice(0, spec_dir))
|
368
371
|
end
|
@@ -378,7 +381,7 @@ module ChefSpec
|
|
378
381
|
# @return [String]
|
379
382
|
#
|
380
383
|
def calling_cookbook_path(options, kaller)
|
381
|
-
File.expand_path(File.join(calling_cookbook_root(options, kaller),
|
384
|
+
File.expand_path(File.join(calling_cookbook_root(options, kaller), ".."))
|
382
385
|
end
|
383
386
|
|
384
387
|
#
|
@@ -388,7 +391,7 @@ module ChefSpec
|
|
388
391
|
#
|
389
392
|
def default_role_path
|
390
393
|
Pathname.new(Dir.pwd).ascend do |path|
|
391
|
-
possible = File.join(path,
|
394
|
+
possible = File.join(path, "roles")
|
392
395
|
return possible if File.exist?(possible)
|
393
396
|
end
|
394
397
|
|
@@ -402,7 +405,7 @@ module ChefSpec
|
|
402
405
|
#
|
403
406
|
def default_environment_path
|
404
407
|
Pathname.new(Dir.pwd).ascend do |path|
|
405
|
-
possible = File.join(path,
|
408
|
+
possible = File.join(path, "environments")
|
406
409
|
return possible if File.exist?(possible)
|
407
410
|
end
|
408
411
|
|
@@ -459,7 +462,7 @@ module ChefSpec
|
|
459
462
|
# @return [Chef::Cookbook::Metadata]
|
460
463
|
#
|
461
464
|
def cookbook
|
462
|
-
@cookbook ||= Chef::Cookbook::Metadata.new.tap {|m| m.from_file("#{options[:cookbook_root]}/metadata.rb") }
|
465
|
+
@cookbook ||= Chef::Cookbook::Metadata.new.tap { |m| m.from_file("#{options[:cookbook_root]}/metadata.rb") }
|
463
466
|
end
|
464
467
|
|
465
468
|
#
|
@@ -470,12 +473,11 @@ module ChefSpec
|
|
470
473
|
def cookbook_name
|
471
474
|
# Try to figure out the name of this cookbook, pretending this block
|
472
475
|
# is in the name context as the cookbook under test.
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
end
|
476
|
+
|
477
|
+
cookbook.name
|
478
|
+
rescue IOError
|
479
|
+
# Old cookbook, has no metadata, use the folder name I guess.
|
480
|
+
File.basename(options[:cookbook_root])
|
479
481
|
end
|
480
482
|
|
481
483
|
#
|
@@ -489,8 +491,8 @@ module ChefSpec
|
|
489
491
|
|
490
492
|
Chef::Config.reset!
|
491
493
|
Chef::Config.formatters.clear
|
492
|
-
Chef::Config.add_formatter(
|
493
|
-
Chef::Config[:cache_type] =
|
494
|
+
Chef::Config.add_formatter("chefspec")
|
495
|
+
Chef::Config[:cache_type] = "Memory"
|
494
496
|
Chef::Config[:client_key] = nil
|
495
497
|
Chef::Config[:client_name] = nil
|
496
498
|
Chef::Config[:node_name] = nil
|
@@ -506,7 +508,7 @@ module ChefSpec
|
|
506
508
|
Chef::Config[:force_logger] = true
|
507
509
|
Chef::Config[:solo] = true
|
508
510
|
Chef::Config[:solo_legacy_mode] = true
|
509
|
-
Chef::Config[:use_policyfile]
|
511
|
+
Chef::Config[:use_policyfile] = false
|
510
512
|
Chef::Config[:environment_path] = @options[:environment_path]
|
511
513
|
end
|
512
514
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "registry"
|
2
2
|
|
3
3
|
module ChefSpec
|
4
4
|
module Stubs
|
5
5
|
class SearchRegistry < Registry
|
6
|
-
def stub_for(type, query =
|
6
|
+
def stub_for(type, query = "*:*")
|
7
7
|
@stubs.find do |stub|
|
8
8
|
stub.type.to_s == type.to_s && stub.query === query
|
9
9
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative
|
1
|
+
require_relative "stub"
|
2
2
|
|
3
3
|
module ChefSpec
|
4
4
|
module Stubs
|
@@ -7,7 +7,7 @@ module ChefSpec
|
|
7
7
|
attr_reader :query
|
8
8
|
attr_reader :type
|
9
9
|
|
10
|
-
def initialize(type, query =
|
10
|
+
def initialize(type, query = "*:*", &block)
|
11
11
|
@type = type.to_s
|
12
12
|
@query = query
|
13
13
|
@block = block
|