chefspec 9.2.1 → 9.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|