chefspec 9.2.0 → 9.3.2
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/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 +13 -13
- data/lib/chefspec/api.rb +14 -14
- data/lib/chefspec/berkshelf.rb +4 -4
- data/lib/chefspec/cacher.rb +2 -2
- data/lib/chefspec/coverage/filters.rb +18 -15
- data/lib/chefspec/coverage.rb +35 -40
- 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/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/freebsd_package.rb +2 -1
- data/lib/chefspec/extensions/chef/resource.rb +14 -9
- 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/extensions.rb +14 -14
- 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/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/matchers.rb +9 -9
- data/lib/chefspec/mixins/normalize.rb +1 -1
- data/lib/chefspec/policyfile.rb +10 -7
- 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 +27 -25
- 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 +4 -4
- data/lib/chefspec.rb +29 -29
- data/spec/spec_helper.rb +3 -4
- data/spec/support/hash.rb +4 -4
- 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 -8
- data/lib/chefspec/extensions/.DS_Store +0 -0
- data/lib/chefspec/extensions/chef/.DS_Store +0 -0
|
@@ -14,37 +14,37 @@ module ChefSpec::Matchers
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def description
|
|
17
|
-
|
|
17
|
+
"do nothing"
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def failure_message
|
|
21
21
|
if @resource
|
|
22
|
-
message =
|
|
23
|
-
message <<
|
|
24
|
-
message <<
|
|
22
|
+
message = %{expected #{@resource} to do nothing, but the following }
|
|
23
|
+
message << %{actions were performed:}
|
|
24
|
+
message << %{\n\n}
|
|
25
25
|
@resource.performed_actions.each do |action|
|
|
26
|
-
message <<
|
|
26
|
+
message << %{ :#{action}}
|
|
27
27
|
end
|
|
28
28
|
message
|
|
29
29
|
else
|
|
30
|
-
message =
|
|
31
|
-
message <<
|
|
32
|
-
message <<
|
|
33
|
-
message <<
|
|
34
|
-
message <<
|
|
35
|
-
message <<
|
|
30
|
+
message = %{expected _something_ to do nothing, but the _something_ }
|
|
31
|
+
message << %{you gave me was nil! If you are running a test like:}
|
|
32
|
+
message << %{\n\n}
|
|
33
|
+
message << %{ expect(_something_).to do_nothing}
|
|
34
|
+
message << %{\n\n}
|
|
35
|
+
message << %{make sure that `_something_` exists, because I got nil!}
|
|
36
36
|
message
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def failure_message_when_negated
|
|
41
41
|
if @resource
|
|
42
|
-
message =
|
|
43
|
-
message <<
|
|
42
|
+
message = %{expected #{@resource} to do something, but no actions }
|
|
43
|
+
message << %{were performed.}
|
|
44
44
|
message
|
|
45
45
|
else
|
|
46
|
-
message =
|
|
47
|
-
message <<
|
|
46
|
+
message = %{expected _something_ to do something, but no actions }
|
|
47
|
+
message << %{were performed.}
|
|
48
48
|
message
|
|
49
49
|
end
|
|
50
50
|
end
|
|
@@ -6,15 +6,15 @@ module ChefSpec::Matchers
|
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def description
|
|
9
|
-
|
|
9
|
+
"include any recipe"
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def failure_message
|
|
13
|
-
|
|
13
|
+
"expected to include any recipe"
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def failure_message_when_negated
|
|
17
|
-
|
|
17
|
+
"expected not to include any recipes"
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
private
|
|
@@ -36,7 +36,7 @@ module ChefSpec::Matchers
|
|
|
36
36
|
# @return [String]
|
|
37
37
|
#
|
|
38
38
|
def with_default(name)
|
|
39
|
-
name.include?(
|
|
39
|
+
name.include?("::") ? name : "#{name}::default"
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
#
|
|
@@ -14,8 +14,8 @@ module ChefSpec::Matchers
|
|
|
14
14
|
if @resource
|
|
15
15
|
block = Proc.new do |notified|
|
|
16
16
|
resource_name(notified.resource).to_s == @expected_resource_type &&
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
(@expected_resource_name === notified.resource.identity.to_s || @expected_resource_name === notified.resource.name.to_s) &&
|
|
18
|
+
matches_action?(notified)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
if @immediately
|
|
@@ -115,6 +115,7 @@ module ChefSpec::Matchers
|
|
|
115
115
|
|
|
116
116
|
def matches_action?(notification)
|
|
117
117
|
return true if @action.nil?
|
|
118
|
+
|
|
118
119
|
@action == notification.action.to_sym
|
|
119
120
|
end
|
|
120
121
|
|
|
@@ -130,12 +131,12 @@ module ChefSpec::Matchers
|
|
|
130
131
|
type = :delayed
|
|
131
132
|
end
|
|
132
133
|
|
|
133
|
-
%Q{ "#{notifying_resource
|
|
134
|
+
%Q{ "#{notifying_resource}" notifies "#{resource_name(resource)}[#{resource.name}]" to :#{notification.action}, :#{type}}
|
|
134
135
|
end
|
|
135
136
|
|
|
136
137
|
def format_notifications
|
|
137
138
|
all_notifications.map do |notification|
|
|
138
|
-
|
|
139
|
+
" " + format_notification(notification)
|
|
139
140
|
end.join("\n")
|
|
140
141
|
end
|
|
141
142
|
end
|
|
@@ -87,8 +87,8 @@ module ChefSpec::Matchers
|
|
|
87
87
|
|
|
88
88
|
def resource
|
|
89
89
|
@resource ||= @runner.find_resource(:cookbook_file, @path) ||
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
@runner.find_resource(:file, @path) ||
|
|
91
|
+
@runner.find_resource(:template, @path)
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
#
|
|
@@ -99,7 +99,7 @@ module ChefSpec::Matchers
|
|
|
99
99
|
# @return [true, false]
|
|
100
100
|
#
|
|
101
101
|
def has_create_action?
|
|
102
|
-
|
|
102
|
+
%i{create create_if_missing}.any? { |action| resource.performed_action?(action) }
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
#
|
|
@@ -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/matchers.rb
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
module ChefSpec
|
|
2
2
|
module Matchers
|
|
3
|
-
require_relative
|
|
4
|
-
require_relative
|
|
5
|
-
require_relative
|
|
6
|
-
require_relative
|
|
7
|
-
require_relative
|
|
8
|
-
require_relative
|
|
9
|
-
require_relative
|
|
10
|
-
require_relative
|
|
11
|
-
require_relative
|
|
3
|
+
require_relative "matchers/do_nothing_matcher"
|
|
4
|
+
require_relative "matchers/include_any_recipe_matcher"
|
|
5
|
+
require_relative "matchers/include_recipe_matcher"
|
|
6
|
+
require_relative "matchers/link_to_matcher"
|
|
7
|
+
require_relative "matchers/notifications_matcher"
|
|
8
|
+
require_relative "matchers/render_file_matcher"
|
|
9
|
+
require_relative "matchers/resource_matcher"
|
|
10
|
+
require_relative "matchers/state_attrs_matcher"
|
|
11
|
+
require_relative "matchers/subscribes_matcher"
|
|
12
12
|
end
|
|
13
13
|
end
|
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,12 +24,15 @@ 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
|
+
Chef::WorkstationConfigLoader.new(nil).load
|
|
31
|
+
|
|
30
32
|
installer = ChefCLI::PolicyfileServices::Install.new(
|
|
31
33
|
policyfile: policyfile_path,
|
|
32
|
-
ui: ChefCLI::UI.null
|
|
34
|
+
ui: ChefCLI::UI.null,
|
|
35
|
+
config: Chef::Config
|
|
33
36
|
)
|
|
34
37
|
|
|
35
38
|
installer.run
|
|
@@ -44,8 +47,8 @@ module ChefSpec
|
|
|
44
47
|
|
|
45
48
|
::RSpec.configure do |config|
|
|
46
49
|
config.cookbook_path = [
|
|
47
|
-
File.join(@tmpdir,
|
|
48
|
-
File.join(@tmpdir,
|
|
50
|
+
File.join(@tmpdir, "cookbooks"),
|
|
51
|
+
File.join(@tmpdir, "cookbook_artifacts"),
|
|
49
52
|
]
|
|
50
53
|
end
|
|
51
54
|
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
|
|
@@ -206,7 +208,7 @@ module ChefSpec
|
|
|
206
208
|
#
|
|
207
209
|
def find_resource(type, name, action = nil)
|
|
208
210
|
resource_collection.all_resources.reverse_each.find do |resource|
|
|
209
|
-
resource.declared_type == type.to_sym && (name === resource.
|
|
211
|
+
resource.declared_type == type.to_sym && (name === resource.name || name === resource.identity) && (action.nil? || resource.performed_action?(action))
|
|
210
212
|
end
|
|
211
213
|
end
|
|
212
214
|
|
|
@@ -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
|